genxai-framework 0.1.0__tar.gz → 0.1.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/ARCHITECTURE.md +2 -2
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/CONTRIBUTING.md +2 -2
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/GETTING_STARTED.md +2 -2
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/PKG-INFO +63 -12
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/README.md +62 -11
- genxai_framework-0.1.2/cli/commands/__init__.py +8 -0
- genxai_framework-0.1.2/cli/commands/connector.py +309 -0
- genxai_framework-0.1.2/cli/commands/workflow.py +80 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/main.py +3 -1
- genxai_framework-0.1.2/docs/API.md +94 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/API_REFERENCE.md +302 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/BENCHMARKING.md +1 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/CLI_USAGE.md +82 -0
- genxai_framework-0.1.2/docs/CONNECTOR_SDK.md +140 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/DOCS_INDEX.md +12 -4
- genxai_framework-0.1.2/docs/FLOWS.md +225 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/QUICK_START_TUTORIAL.md +71 -6
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/RELEASE_CHECKLIST.md +1 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/SECURITY_CHECKLIST.md +1 -0
- genxai_framework-0.1.2/docs/TOOL_CREATION.md +86 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/WORKFLOW_BEST_PRACTICES.md +51 -0
- genxai_framework-0.1.2/docs/WORKFLOW_EXECUTION.md +98 -0
- genxai_framework-0.1.2/examples/code/agent_presets_user_proxy_example.py +52 -0
- genxai_framework-0.1.2/examples/code/flow_auction_example.py +27 -0
- genxai_framework-0.1.2/examples/code/flow_conditional_example.py +32 -0
- genxai_framework-0.1.2/examples/code/flow_coordinator_worker_example.py +28 -0
- genxai_framework-0.1.2/examples/code/flow_critic_review_example.py +28 -0
- genxai_framework-0.1.2/examples/code/flow_ensemble_voting_example.py +27 -0
- genxai_framework-0.1.2/examples/code/flow_loop_example.py +26 -0
- genxai_framework-0.1.2/examples/code/flow_map_reduce_example.py +28 -0
- genxai_framework-0.1.2/examples/code/flow_p2p_example.py +27 -0
- genxai_framework-0.1.2/examples/code/flow_parallel_example.py +28 -0
- genxai_framework-0.1.2/examples/code/flow_round_robin_example.py +29 -0
- genxai_framework-0.1.2/examples/code/flow_router_example.py +32 -0
- genxai_framework-0.1.2/examples/code/flow_selector_example.py +33 -0
- genxai_framework-0.1.2/examples/code/flow_subworkflow_example.py +33 -0
- genxai_framework-0.1.2/examples/code/flow_user_proxy_graph_example.py +59 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/__init__.py +33 -0
- genxai_framework-0.1.2/genxai/agents/__init__.py +8 -0
- genxai_framework-0.1.2/genxai/agents/presets.py +53 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/__init__.py +10 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/base.py +3 -3
- genxai_framework-0.1.2/genxai/connectors/config_store.py +106 -0
- genxai_framework-0.1.2/genxai/connectors/github.py +117 -0
- genxai_framework-0.1.2/genxai/connectors/google_workspace.py +124 -0
- genxai_framework-0.1.2/genxai/connectors/jira.py +108 -0
- genxai_framework-0.1.2/genxai/connectors/notion.py +97 -0
- genxai_framework-0.1.2/genxai/connectors/slack.py +121 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/config_io.py +32 -1
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/runtime.py +41 -4
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/__init__.py +3 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/engine.py +218 -11
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/executor.py +103 -10
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/nodes.py +28 -0
- genxai_framework-0.1.2/genxai/core/graph/workflow_io.py +199 -0
- genxai_framework-0.1.2/genxai/flows/__init__.py +33 -0
- genxai_framework-0.1.2/genxai/flows/auction.py +66 -0
- genxai_framework-0.1.2/genxai/flows/base.py +134 -0
- genxai_framework-0.1.2/genxai/flows/conditional.py +45 -0
- genxai_framework-0.1.2/genxai/flows/coordinator_worker.py +62 -0
- genxai_framework-0.1.2/genxai/flows/critic_review.py +62 -0
- genxai_framework-0.1.2/genxai/flows/ensemble_voting.py +49 -0
- genxai_framework-0.1.2/genxai/flows/loop.py +42 -0
- genxai_framework-0.1.2/genxai/flows/map_reduce.py +61 -0
- genxai_framework-0.1.2/genxai/flows/p2p.py +146 -0
- genxai_framework-0.1.2/genxai/flows/parallel.py +27 -0
- genxai_framework-0.1.2/genxai/flows/round_robin.py +24 -0
- genxai_framework-0.1.2/genxai/flows/router.py +45 -0
- genxai_framework-0.1.2/genxai/flows/selector.py +63 -0
- genxai_framework-0.1.2/genxai/flows/subworkflow.py +35 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/factory.py +17 -10
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/anthropic.py +116 -1
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/observability/logging.py +2 -2
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/auth.py +10 -6
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/cost_control.py +6 -6
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/jwt.py +2 -2
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/pii.py +2 -2
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/__init__.py +3 -0
- genxai_framework-0.1.2/genxai/tools/builtin/communication/human_input.py +32 -0
- genxai_framework-0.1.2/genxai/tools/custom/test-2.py +19 -0
- genxai_framework-0.1.2/genxai/tools/custom/test_tool_ui.py +9 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/persistence/service.py +3 -3
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/schedule.py +2 -2
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/utils/tokens.py +6 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/PKG-INFO +63 -12
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/SOURCES.txt +48 -3
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/pyproject.toml +1 -1
- genxai_framework-0.1.0/IMPLEMENTATION_PLAN.md +0 -647
- genxai_framework-0.1.0/cli/commands/__init__.py +0 -6
- genxai_framework-0.1.0/docs/CONNECTOR_SDK.md +0 -46
- genxai_framework-0.1.0/docs/ENTERPRISE_ROADMAP_BACKLOG.md +0 -90
- genxai_framework-0.1.0/docs/LAUNCH_PLAN.md +0 -165
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/LICENSE +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/MANIFEST.in +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/REQUIREMENTS.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/TOOLS_DESIGN.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/commands/approval.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/commands/audit.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/commands/metrics.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/cli/commands/tool.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/AGENT_TOOL_INTEGRATION.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/AUDIT_LOGGING.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/COLLABORATION_PROTOCOLS.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/COMPETITIVE_MATRIX.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/GOVERNANCE_POLICY.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/GRAPH_VISUALIZATION.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/LLM_INTEGRATION.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/MCP_SETUP.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/PUBLISHING.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/docs/WORKER_QUEUE_ENGINE.md +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/agent_registry_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/agent_with_memory_tools_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/agent_with_tools_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/end_to_end_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/function_calling_tools_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/graph_visualization_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/llm_agent_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/memory_system_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/routed_llm_provider_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/simple_workflow.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/testable_workflow.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/tool_execution_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/tool_registry_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/code/workflow_engine_example.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/graph_visualization_demo.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/01_sequential_pattern.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/02_conditional_branching.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/03_parallel_execution.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/04_coordinator_delegator_worker.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/05_cyclic_iterative.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/examples/patterns/06_peer_to_peer.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/api/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/api/app.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/config/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/config/settings.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/kafka.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/postgres_cdc.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/registry.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/sqs.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/connectors/webhook.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/base.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/agent/registry.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/communication/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/communication/collaboration.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/communication/message_bus.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/communication/protocols.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/execution/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/execution/metadata.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/execution/queue.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/checkpoints.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/edges.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/graph/trigger_runner.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/base.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/embedding.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/episodic.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/long_term.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/manager.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/persistence.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/procedural.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/semantic.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/shared.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/short_term.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/vector_store.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/memory/working.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/state/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/state/manager.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/core/state/schema.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/base.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/cohere.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/google.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/ollama.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/providers/openai.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/llm/routing.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/observability/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/observability/metrics.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/observability/tracing.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/performance/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/performance/cache.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/performance/pooling.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/audit.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/default_policies.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/oauth.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/policy_engine.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/rate_limit.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/rbac.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/security/validation.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/base.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/email_sender.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/notification_manager.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/slack_notifier.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/sms_sender.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/communication/webhook_caller.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/calculator.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/code_executor.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/data_validator.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/hash_generator.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/computation/regex_matcher.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/csv_processor.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/data_transformer.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/json_processor.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/text_analyzer.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/data/xml_processor.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/database_inspector.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/mongodb_query.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/redis_cache.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/sql_query.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/database/vector_search.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/directory_scanner.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/file_compressor.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/file_reader.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/file_writer.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/image_processor.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/file/pdf_parser.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/async_simulator.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/data_transformer.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/error_generator.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/simple_math.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/test/string_processor.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/api_caller.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/html_parser.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/http_client.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/url_validator.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/builtin/web/web_scraper.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/custom/my_test_tool_2.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/dynamic.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/mcp_server.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/persistence/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/persistence/models.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/registry.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/security/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/security/limits.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/security/policy.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/security/sandbox.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/tools/templates.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/base.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/file_watcher.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/queue.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/registry.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/triggers/webhook.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai/utils/__init__.py +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/dependency_links.txt +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/entry_points.txt +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/requires.txt +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/genxai_framework.egg-info/top_level.txt +0 -0
- {genxai_framework-0.1.0 → genxai_framework-0.1.2}/setup.cfg +0 -0
|
@@ -40,8 +40,8 @@ Thank you for your interest in contributing to GenXAI! This document provides gu
|
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
42
|
# Clone the repository
|
|
43
|
-
git clone https://github.com/
|
|
44
|
-
cd
|
|
43
|
+
git clone https://github.com/irsal2012/GenXAI.git
|
|
44
|
+
cd GenXAI
|
|
45
45
|
|
|
46
46
|
# Create virtual environment
|
|
47
47
|
python3 -m venv venv
|
|
@@ -8,8 +8,8 @@ Welcome to GenXAI - an advanced agentic AI framework with graph-based orchestrat
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
# Clone the repository
|
|
11
|
-
git clone https://github.com/
|
|
12
|
-
cd
|
|
11
|
+
git clone https://github.com/irsal2012/GenXAI.git
|
|
12
|
+
cd GenXAI
|
|
13
13
|
|
|
14
14
|
# Install dependencies
|
|
15
15
|
pip install -e ".[dev,llm]"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: genxai-framework
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.2
|
|
4
4
|
Summary: Advanced Agentic AI Framework with Graph-Based Orchestration
|
|
5
5
|
Author-email: GenXAI Team <team@genxai.dev>
|
|
6
6
|
License: MIT
|
|
@@ -81,9 +81,9 @@ Dynamic: license-file
|
|
|
81
81
|
|
|
82
82
|
# GenXAI - Advanced Agentic AI Framework
|
|
83
83
|
|
|
84
|
-
**Version:** 1.0.0
|
|
85
|
-
**Status:**
|
|
86
|
-
**License:** MIT
|
|
84
|
+
**Version:** 1.0.0
|
|
85
|
+
**Status:** Active Development
|
|
86
|
+
**License:** MIT
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
@@ -155,7 +155,7 @@ Comprehensive documentation is available in the following files:
|
|
|
155
155
|
|
|
156
156
|
- **[ARCHITECTURE.md](./ARCHITECTURE.md)** - Complete system architecture and design principles
|
|
157
157
|
- **[REQUIREMENTS.md](./REQUIREMENTS.md)** - Detailed functional and non-functional requirements
|
|
158
|
-
- **[IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md)** -
|
|
158
|
+
- **[IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md)** - Development roadmap
|
|
159
159
|
- **[TOOLS_DESIGN.md](./TOOLS_DESIGN.md)** - Tool system architecture and 50+ built-in tools
|
|
160
160
|
- **[MEMORY_DESIGN.md](./MEMORY_DESIGN.md)** - Multi-layered memory system design
|
|
161
161
|
|
|
@@ -229,7 +229,7 @@ See [ARCHITECTURE.md](./ARCHITECTURE.md) for complete details.
|
|
|
229
229
|
- Beta testing
|
|
230
230
|
- Official launch 🚀
|
|
231
231
|
|
|
232
|
-
See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for
|
|
232
|
+
See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for the timeline.
|
|
233
233
|
|
|
234
234
|
---
|
|
235
235
|
|
|
@@ -286,6 +286,48 @@ graph.add_edge(Edge(source="support", target="end"))
|
|
|
286
286
|
result = await graph.run(input_data="My app crashed")
|
|
287
287
|
```
|
|
288
288
|
|
|
289
|
+
### Flow Orchestrator Examples
|
|
290
|
+
|
|
291
|
+
GenXAI also ships with lightweight flow orchestrators for common patterns:
|
|
292
|
+
|
|
293
|
+
```python
|
|
294
|
+
from genxai import AgentFactory, RoundRobinFlow, SelectorFlow, P2PFlow
|
|
295
|
+
|
|
296
|
+
agents = [
|
|
297
|
+
AgentFactory.create_agent(id="analyst", role="Analyst", goal="Analyze"),
|
|
298
|
+
AgentFactory.create_agent(id="writer", role="Writer", goal="Write"),
|
|
299
|
+
]
|
|
300
|
+
|
|
301
|
+
# Round-robin flow
|
|
302
|
+
round_robin = RoundRobinFlow(agents)
|
|
303
|
+
|
|
304
|
+
# Selector flow
|
|
305
|
+
def choose_next(state, agent_ids):
|
|
306
|
+
return agent_ids[state.get("selector_hop", 0) % len(agent_ids)]
|
|
307
|
+
|
|
308
|
+
selector = SelectorFlow(agents, selector=choose_next, max_hops=3)
|
|
309
|
+
|
|
310
|
+
# P2P flow
|
|
311
|
+
p2p = P2PFlow(agents, max_rounds=4, consensus_threshold=0.7)
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
See runnable examples in:
|
|
315
|
+
- `examples/code/flow_round_robin_example.py`
|
|
316
|
+
- `examples/code/flow_selector_example.py`
|
|
317
|
+
- `examples/code/flow_p2p_example.py`
|
|
318
|
+
- `examples/code/flow_parallel_example.py`
|
|
319
|
+
- `examples/code/flow_conditional_example.py`
|
|
320
|
+
- `examples/code/flow_loop_example.py`
|
|
321
|
+
- `examples/code/flow_router_example.py`
|
|
322
|
+
- `examples/code/flow_ensemble_voting_example.py`
|
|
323
|
+
- `examples/code/flow_critic_review_example.py`
|
|
324
|
+
- `examples/code/flow_coordinator_worker_example.py`
|
|
325
|
+
- `examples/code/flow_map_reduce_example.py`
|
|
326
|
+
- `examples/code/flow_subworkflow_example.py`
|
|
327
|
+
- `examples/code/flow_auction_example.py`
|
|
328
|
+
|
|
329
|
+
Full flow documentation: [docs/FLOWS.md](./docs/FLOWS.md)
|
|
330
|
+
|
|
289
331
|
### Trigger SDK Quick Start
|
|
290
332
|
|
|
291
333
|
```python
|
|
@@ -350,6 +392,16 @@ workflow:
|
|
|
350
392
|
condition: "category == 'technical'"
|
|
351
393
|
```
|
|
352
394
|
|
|
395
|
+
Shared memory template:
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
genxai workflow run examples/nocode/shared_memory_workflow.yaml \
|
|
399
|
+
--input '{"task": "Draft a short response"}'
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
See no-code templates (including a shared memory example) in:
|
|
403
|
+
- `examples/nocode/README.md`
|
|
404
|
+
|
|
353
405
|
---
|
|
354
406
|
|
|
355
407
|
## 🛠️ Technology Stack
|
|
@@ -443,10 +495,9 @@ workflow:
|
|
|
443
495
|
|
|
444
496
|
## 🤝 Contributing
|
|
445
497
|
|
|
446
|
-
We welcome contributions! This project is
|
|
498
|
+
We welcome contributions! This project is in active development. We provide:
|
|
447
499
|
|
|
448
500
|
- Contributing guidelines
|
|
449
|
-
- Code of conduct
|
|
450
501
|
- Development setup instructions
|
|
451
502
|
- Issue templates
|
|
452
503
|
- Pull request templates
|
|
@@ -455,7 +506,7 @@ We welcome contributions! This project is currently in the design phase. Once im
|
|
|
455
506
|
|
|
456
507
|
## 📜 License
|
|
457
508
|
|
|
458
|
-
MIT License
|
|
509
|
+
MIT License
|
|
459
510
|
|
|
460
511
|
---
|
|
461
512
|
|
|
@@ -486,9 +537,9 @@ Inspired by:
|
|
|
486
537
|
|
|
487
538
|
## 📈 Project Status
|
|
488
539
|
|
|
489
|
-
**Current Phase**:
|
|
490
|
-
**Next Milestone**:
|
|
491
|
-
**Expected Launch**:
|
|
540
|
+
**Current Phase**: Active Development
|
|
541
|
+
**Next Milestone**: Complete visual editor + studio polish
|
|
542
|
+
**Expected Launch**: TBD
|
|
492
543
|
|
|
493
544
|
---
|
|
494
545
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# GenXAI - Advanced Agentic AI Framework
|
|
2
2
|
|
|
3
|
-
**Version:** 1.0.0
|
|
4
|
-
**Status:**
|
|
5
|
-
**License:** MIT
|
|
3
|
+
**Version:** 1.0.0
|
|
4
|
+
**Status:** Active Development
|
|
5
|
+
**License:** MIT
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -74,7 +74,7 @@ Comprehensive documentation is available in the following files:
|
|
|
74
74
|
|
|
75
75
|
- **[ARCHITECTURE.md](./ARCHITECTURE.md)** - Complete system architecture and design principles
|
|
76
76
|
- **[REQUIREMENTS.md](./REQUIREMENTS.md)** - Detailed functional and non-functional requirements
|
|
77
|
-
- **[IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md)** -
|
|
77
|
+
- **[IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md)** - Development roadmap
|
|
78
78
|
- **[TOOLS_DESIGN.md](./TOOLS_DESIGN.md)** - Tool system architecture and 50+ built-in tools
|
|
79
79
|
- **[MEMORY_DESIGN.md](./MEMORY_DESIGN.md)** - Multi-layered memory system design
|
|
80
80
|
|
|
@@ -148,7 +148,7 @@ See [ARCHITECTURE.md](./ARCHITECTURE.md) for complete details.
|
|
|
148
148
|
- Beta testing
|
|
149
149
|
- Official launch 🚀
|
|
150
150
|
|
|
151
|
-
See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for
|
|
151
|
+
See [IMPLEMENTATION_PLAN.md](./IMPLEMENTATION_PLAN.md) for the timeline.
|
|
152
152
|
|
|
153
153
|
---
|
|
154
154
|
|
|
@@ -205,6 +205,48 @@ graph.add_edge(Edge(source="support", target="end"))
|
|
|
205
205
|
result = await graph.run(input_data="My app crashed")
|
|
206
206
|
```
|
|
207
207
|
|
|
208
|
+
### Flow Orchestrator Examples
|
|
209
|
+
|
|
210
|
+
GenXAI also ships with lightweight flow orchestrators for common patterns:
|
|
211
|
+
|
|
212
|
+
```python
|
|
213
|
+
from genxai import AgentFactory, RoundRobinFlow, SelectorFlow, P2PFlow
|
|
214
|
+
|
|
215
|
+
agents = [
|
|
216
|
+
AgentFactory.create_agent(id="analyst", role="Analyst", goal="Analyze"),
|
|
217
|
+
AgentFactory.create_agent(id="writer", role="Writer", goal="Write"),
|
|
218
|
+
]
|
|
219
|
+
|
|
220
|
+
# Round-robin flow
|
|
221
|
+
round_robin = RoundRobinFlow(agents)
|
|
222
|
+
|
|
223
|
+
# Selector flow
|
|
224
|
+
def choose_next(state, agent_ids):
|
|
225
|
+
return agent_ids[state.get("selector_hop", 0) % len(agent_ids)]
|
|
226
|
+
|
|
227
|
+
selector = SelectorFlow(agents, selector=choose_next, max_hops=3)
|
|
228
|
+
|
|
229
|
+
# P2P flow
|
|
230
|
+
p2p = P2PFlow(agents, max_rounds=4, consensus_threshold=0.7)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
See runnable examples in:
|
|
234
|
+
- `examples/code/flow_round_robin_example.py`
|
|
235
|
+
- `examples/code/flow_selector_example.py`
|
|
236
|
+
- `examples/code/flow_p2p_example.py`
|
|
237
|
+
- `examples/code/flow_parallel_example.py`
|
|
238
|
+
- `examples/code/flow_conditional_example.py`
|
|
239
|
+
- `examples/code/flow_loop_example.py`
|
|
240
|
+
- `examples/code/flow_router_example.py`
|
|
241
|
+
- `examples/code/flow_ensemble_voting_example.py`
|
|
242
|
+
- `examples/code/flow_critic_review_example.py`
|
|
243
|
+
- `examples/code/flow_coordinator_worker_example.py`
|
|
244
|
+
- `examples/code/flow_map_reduce_example.py`
|
|
245
|
+
- `examples/code/flow_subworkflow_example.py`
|
|
246
|
+
- `examples/code/flow_auction_example.py`
|
|
247
|
+
|
|
248
|
+
Full flow documentation: [docs/FLOWS.md](./docs/FLOWS.md)
|
|
249
|
+
|
|
208
250
|
### Trigger SDK Quick Start
|
|
209
251
|
|
|
210
252
|
```python
|
|
@@ -269,6 +311,16 @@ workflow:
|
|
|
269
311
|
condition: "category == 'technical'"
|
|
270
312
|
```
|
|
271
313
|
|
|
314
|
+
Shared memory template:
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
genxai workflow run examples/nocode/shared_memory_workflow.yaml \
|
|
318
|
+
--input '{"task": "Draft a short response"}'
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
See no-code templates (including a shared memory example) in:
|
|
322
|
+
- `examples/nocode/README.md`
|
|
323
|
+
|
|
272
324
|
---
|
|
273
325
|
|
|
274
326
|
## 🛠️ Technology Stack
|
|
@@ -362,10 +414,9 @@ workflow:
|
|
|
362
414
|
|
|
363
415
|
## 🤝 Contributing
|
|
364
416
|
|
|
365
|
-
We welcome contributions! This project is
|
|
417
|
+
We welcome contributions! This project is in active development. We provide:
|
|
366
418
|
|
|
367
419
|
- Contributing guidelines
|
|
368
|
-
- Code of conduct
|
|
369
420
|
- Development setup instructions
|
|
370
421
|
- Issue templates
|
|
371
422
|
- Pull request templates
|
|
@@ -374,7 +425,7 @@ We welcome contributions! This project is currently in the design phase. Once im
|
|
|
374
425
|
|
|
375
426
|
## 📜 License
|
|
376
427
|
|
|
377
|
-
MIT License
|
|
428
|
+
MIT License
|
|
378
429
|
|
|
379
430
|
---
|
|
380
431
|
|
|
@@ -405,9 +456,9 @@ Inspired by:
|
|
|
405
456
|
|
|
406
457
|
## 📈 Project Status
|
|
407
458
|
|
|
408
|
-
**Current Phase**:
|
|
409
|
-
**Next Milestone**:
|
|
410
|
-
**Expected Launch**:
|
|
459
|
+
**Current Phase**: Active Development
|
|
460
|
+
**Next Milestone**: Complete visual editor + studio polish
|
|
461
|
+
**Expected Launch**: TBD
|
|
411
462
|
|
|
412
463
|
---
|
|
413
464
|
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"""Connector management CLI commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import json
|
|
7
|
+
from typing import Any, Dict, Optional
|
|
8
|
+
|
|
9
|
+
import click
|
|
10
|
+
from rich.console import Console
|
|
11
|
+
from rich.table import Table
|
|
12
|
+
|
|
13
|
+
from genxai.connectors import (
|
|
14
|
+
Connector,
|
|
15
|
+
KafkaConnector,
|
|
16
|
+
SQSConnector,
|
|
17
|
+
PostgresCDCConnector,
|
|
18
|
+
WebhookConnector,
|
|
19
|
+
SlackConnector,
|
|
20
|
+
GitHubConnector,
|
|
21
|
+
NotionConnector,
|
|
22
|
+
JiraConnector,
|
|
23
|
+
GoogleWorkspaceConnector,
|
|
24
|
+
)
|
|
25
|
+
from genxai.connectors.config_store import ConnectorConfigEntry, ConnectorConfigStore
|
|
26
|
+
|
|
27
|
+
console = Console()
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
CONNECTOR_CATALOG: Dict[str, Dict[str, Any]] = {
|
|
31
|
+
"kafka": {
|
|
32
|
+
"class": KafkaConnector,
|
|
33
|
+
"required": ["topic", "bootstrap_servers"],
|
|
34
|
+
"description": "Kafka consumer connector",
|
|
35
|
+
},
|
|
36
|
+
"sqs": {
|
|
37
|
+
"class": SQSConnector,
|
|
38
|
+
"required": ["queue_url"],
|
|
39
|
+
"description": "AWS SQS connector",
|
|
40
|
+
},
|
|
41
|
+
"postgres_cdc": {
|
|
42
|
+
"class": PostgresCDCConnector,
|
|
43
|
+
"required": ["dsn"],
|
|
44
|
+
"description": "Postgres CDC connector",
|
|
45
|
+
},
|
|
46
|
+
"webhook": {
|
|
47
|
+
"class": WebhookConnector,
|
|
48
|
+
"required": [],
|
|
49
|
+
"description": "Inbound webhook connector",
|
|
50
|
+
},
|
|
51
|
+
"slack": {
|
|
52
|
+
"class": SlackConnector,
|
|
53
|
+
"required": ["bot_token"],
|
|
54
|
+
"description": "Slack Web API connector",
|
|
55
|
+
},
|
|
56
|
+
"github": {
|
|
57
|
+
"class": GitHubConnector,
|
|
58
|
+
"required": ["token"],
|
|
59
|
+
"description": "GitHub REST API connector",
|
|
60
|
+
},
|
|
61
|
+
"notion": {
|
|
62
|
+
"class": NotionConnector,
|
|
63
|
+
"required": ["token"],
|
|
64
|
+
"description": "Notion API connector",
|
|
65
|
+
},
|
|
66
|
+
"jira": {
|
|
67
|
+
"class": JiraConnector,
|
|
68
|
+
"required": ["email", "api_token", "base_url"],
|
|
69
|
+
"description": "Jira Cloud REST API connector",
|
|
70
|
+
},
|
|
71
|
+
"google_workspace": {
|
|
72
|
+
"class": GoogleWorkspaceConnector,
|
|
73
|
+
"required": ["access_token"],
|
|
74
|
+
"description": "Google Workspace APIs connector",
|
|
75
|
+
},
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@click.group()
|
|
80
|
+
def connector() -> None:
|
|
81
|
+
"""Manage GenXAI connectors."""
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
@connector.command("list")
|
|
86
|
+
@click.option("--format", "output_format", type=click.Choice(["table", "json"]), default="table")
|
|
87
|
+
def list_connectors(output_format: str) -> None:
|
|
88
|
+
"""List available connector types."""
|
|
89
|
+
if output_format == "json":
|
|
90
|
+
payload = {
|
|
91
|
+
name: {
|
|
92
|
+
"required": meta["required"],
|
|
93
|
+
"description": meta["description"],
|
|
94
|
+
}
|
|
95
|
+
for name, meta in CONNECTOR_CATALOG.items()
|
|
96
|
+
}
|
|
97
|
+
click.echo(json.dumps(payload, indent=2))
|
|
98
|
+
return
|
|
99
|
+
|
|
100
|
+
table = Table(title="GenXAI Connectors")
|
|
101
|
+
table.add_column("Type", style="cyan")
|
|
102
|
+
table.add_column("Required Fields", style="green")
|
|
103
|
+
table.add_column("Description", style="white")
|
|
104
|
+
for name, meta in CONNECTOR_CATALOG.items():
|
|
105
|
+
table.add_row(name, ", ".join(meta["required"]) or "(none)", meta["description"])
|
|
106
|
+
console.print(table)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
@connector.command("validate")
|
|
110
|
+
@click.option("--type", "connector_type", required=True, help="Connector type")
|
|
111
|
+
@click.option("--connector-id", default="connector", show_default=True)
|
|
112
|
+
@click.option("--config", help="JSON config payload for the connector")
|
|
113
|
+
@click.option("--config-name", help="Use a saved connector config")
|
|
114
|
+
def validate(
|
|
115
|
+
connector_type: str,
|
|
116
|
+
connector_id: str,
|
|
117
|
+
config: Optional[str],
|
|
118
|
+
config_name: Optional[str],
|
|
119
|
+
) -> None:
|
|
120
|
+
"""Validate connector configuration without starting it."""
|
|
121
|
+
connector_meta = CONNECTOR_CATALOG.get(connector_type)
|
|
122
|
+
if not connector_meta:
|
|
123
|
+
raise click.ClickException(
|
|
124
|
+
f"Unknown connector type '{connector_type}'. Use 'genxai connector list' to see options."
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
config_data = _load_config(config, config_name)
|
|
128
|
+
missing = [field for field in connector_meta["required"] if field not in config_data]
|
|
129
|
+
if missing:
|
|
130
|
+
raise click.ClickException(f"Missing required fields: {', '.join(missing)}")
|
|
131
|
+
|
|
132
|
+
connector_instance = _build_connector(connector_id, connector_meta["class"], config_data)
|
|
133
|
+
try:
|
|
134
|
+
asyncio.run(connector_instance.validate_config())
|
|
135
|
+
console.print("[green]✓ Connector configuration valid[/green]")
|
|
136
|
+
except Exception as exc:
|
|
137
|
+
raise click.ClickException(str(exc)) from exc
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
@connector.command("start")
|
|
141
|
+
@click.option("--type", "connector_type", required=True, help="Connector type")
|
|
142
|
+
@click.option("--connector-id", default="connector", show_default=True)
|
|
143
|
+
@click.option("--config", help="JSON config payload for the connector")
|
|
144
|
+
@click.option("--config-name", help="Use a saved connector config")
|
|
145
|
+
def start(connector_type: str, connector_id: str, config: Optional[str], config_name: Optional[str]) -> None:
|
|
146
|
+
"""Start a connector instance for quick validation."""
|
|
147
|
+
connector_instance = _build_from_cli(connector_type, connector_id, config, config_name)
|
|
148
|
+
try:
|
|
149
|
+
asyncio.run(connector_instance.start())
|
|
150
|
+
console.print("[green]✓ Connector started[/green]")
|
|
151
|
+
except Exception as exc:
|
|
152
|
+
raise click.ClickException(str(exc)) from exc
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
@connector.command("stop")
|
|
156
|
+
@click.option("--type", "connector_type", required=True, help="Connector type")
|
|
157
|
+
@click.option("--connector-id", default="connector", show_default=True)
|
|
158
|
+
@click.option("--config", help="JSON config payload for the connector")
|
|
159
|
+
@click.option("--config-name", help="Use a saved connector config")
|
|
160
|
+
def stop(connector_type: str, connector_id: str, config: Optional[str], config_name: Optional[str]) -> None:
|
|
161
|
+
"""Stop a connector instance for quick validation."""
|
|
162
|
+
connector_instance = _build_from_cli(connector_type, connector_id, config, config_name)
|
|
163
|
+
try:
|
|
164
|
+
asyncio.run(connector_instance.stop())
|
|
165
|
+
console.print("[green]✓ Connector stopped[/green]")
|
|
166
|
+
except Exception as exc:
|
|
167
|
+
raise click.ClickException(str(exc)) from exc
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
@connector.command("health")
|
|
171
|
+
@click.option("--type", "connector_type", required=True, help="Connector type")
|
|
172
|
+
@click.option("--connector-id", default="connector", show_default=True)
|
|
173
|
+
@click.option("--config", help="JSON config payload for the connector")
|
|
174
|
+
@click.option("--format", "output_format", type=click.Choice(["json", "table"]), default="json")
|
|
175
|
+
@click.option("--config-name", help="Use a saved connector config")
|
|
176
|
+
def health(
|
|
177
|
+
connector_type: str,
|
|
178
|
+
connector_id: str,
|
|
179
|
+
config: Optional[str],
|
|
180
|
+
output_format: str,
|
|
181
|
+
config_name: Optional[str],
|
|
182
|
+
) -> None:
|
|
183
|
+
"""Run a connector health check without starting it."""
|
|
184
|
+
connector_instance = _build_from_cli(connector_type, connector_id, config, config_name)
|
|
185
|
+
try:
|
|
186
|
+
payload = asyncio.run(connector_instance.health_check())
|
|
187
|
+
except Exception as exc:
|
|
188
|
+
raise click.ClickException(str(exc)) from exc
|
|
189
|
+
|
|
190
|
+
if output_format == "json":
|
|
191
|
+
click.echo(json.dumps(payload, indent=2))
|
|
192
|
+
return
|
|
193
|
+
|
|
194
|
+
table = Table(title="Connector Health")
|
|
195
|
+
table.add_column("Field", style="cyan")
|
|
196
|
+
table.add_column("Value", style="white")
|
|
197
|
+
for key, value in payload.items():
|
|
198
|
+
table.add_row(str(key), str(value))
|
|
199
|
+
console.print(table)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
@connector.command("save")
|
|
203
|
+
@click.option("--name", "config_name", required=True, help="Name for the saved config")
|
|
204
|
+
@click.option("--type", "connector_type", required=True, help="Connector type")
|
|
205
|
+
@click.option("--config", required=True, help="JSON config payload")
|
|
206
|
+
def save(config_name: str, connector_type: str, config: str) -> None:
|
|
207
|
+
"""Save a connector config for reuse."""
|
|
208
|
+
connector_meta = CONNECTOR_CATALOG.get(connector_type)
|
|
209
|
+
if not connector_meta:
|
|
210
|
+
raise click.ClickException(
|
|
211
|
+
f"Unknown connector type '{connector_type}'. Use 'genxai connector list' to see options."
|
|
212
|
+
)
|
|
213
|
+
config_data = _load_config(config, None)
|
|
214
|
+
missing = [field for field in connector_meta["required"] if field not in config_data]
|
|
215
|
+
if missing:
|
|
216
|
+
raise click.ClickException(f"Missing required fields: {', '.join(missing)}")
|
|
217
|
+
|
|
218
|
+
store = ConnectorConfigStore()
|
|
219
|
+
store.save(
|
|
220
|
+
ConnectorConfigEntry(
|
|
221
|
+
name=config_name,
|
|
222
|
+
connector_type=connector_type,
|
|
223
|
+
config=config_data,
|
|
224
|
+
)
|
|
225
|
+
)
|
|
226
|
+
console.print(f"[green]✓ Saved connector config '{config_name}'[/green]")
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
@connector.command("saved")
|
|
230
|
+
@click.option("--format", "output_format", type=click.Choice(["table", "json"]), default="table")
|
|
231
|
+
def list_saved(output_format: str) -> None:
|
|
232
|
+
"""List saved connector configs."""
|
|
233
|
+
store = ConnectorConfigStore()
|
|
234
|
+
entries = store.list()
|
|
235
|
+
if output_format == "json":
|
|
236
|
+
payload = {
|
|
237
|
+
name: {"connector_type": entry.connector_type, "config": entry.config}
|
|
238
|
+
for name, entry in entries.items()
|
|
239
|
+
}
|
|
240
|
+
click.echo(json.dumps(payload, indent=2))
|
|
241
|
+
return
|
|
242
|
+
|
|
243
|
+
table = Table(title="Saved Connector Configs")
|
|
244
|
+
table.add_column("Name", style="cyan")
|
|
245
|
+
table.add_column("Type", style="green")
|
|
246
|
+
table.add_column("Config", style="white")
|
|
247
|
+
for name, entry in entries.items():
|
|
248
|
+
table.add_row(name, entry.connector_type, json.dumps(entry.config))
|
|
249
|
+
console.print(table)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
@connector.command("remove")
|
|
253
|
+
@click.option("--name", "config_name", required=True, help="Saved config name")
|
|
254
|
+
def remove(config_name: str) -> None:
|
|
255
|
+
"""Remove a saved connector config."""
|
|
256
|
+
store = ConnectorConfigStore()
|
|
257
|
+
if not store.delete(config_name):
|
|
258
|
+
raise click.ClickException(f"Config '{config_name}' not found")
|
|
259
|
+
console.print(f"[green]✓ Removed connector config '{config_name}'[/green]")
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
@connector.command("keygen")
|
|
263
|
+
def keygen() -> None:
|
|
264
|
+
"""Generate a Fernet key for encrypted connector configs."""
|
|
265
|
+
try:
|
|
266
|
+
from cryptography.fernet import Fernet
|
|
267
|
+
except ImportError as exc:
|
|
268
|
+
raise click.ClickException(
|
|
269
|
+
"cryptography is required for key generation. Install with: pip install cryptography"
|
|
270
|
+
) from exc
|
|
271
|
+
key = Fernet.generate_key().decode()
|
|
272
|
+
click.echo(key)
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def _build_connector(connector_id: str, connector_class: type[Connector], config: Dict[str, Any]) -> Connector:
|
|
276
|
+
params = {"connector_id": connector_id, **config}
|
|
277
|
+
return connector_class(**params)
|
|
278
|
+
|
|
279
|
+
|
|
280
|
+
def _build_from_cli(
|
|
281
|
+
connector_type: str,
|
|
282
|
+
connector_id: str,
|
|
283
|
+
config: Optional[str],
|
|
284
|
+
config_name: Optional[str],
|
|
285
|
+
) -> Connector:
|
|
286
|
+
connector_meta = CONNECTOR_CATALOG.get(connector_type)
|
|
287
|
+
if not connector_meta:
|
|
288
|
+
raise click.ClickException(
|
|
289
|
+
f"Unknown connector type '{connector_type}'. Use 'genxai connector list' to see options."
|
|
290
|
+
)
|
|
291
|
+
config_data = _load_config(config, config_name)
|
|
292
|
+
missing = [field for field in connector_meta["required"] if field not in config_data]
|
|
293
|
+
if missing:
|
|
294
|
+
raise click.ClickException(f"Missing required fields: {', '.join(missing)}")
|
|
295
|
+
return _build_connector(connector_id, connector_meta["class"], config_data)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _load_config(config: Optional[str], config_name: Optional[str]) -> Dict[str, Any]:
|
|
299
|
+
if config_name:
|
|
300
|
+
store = ConnectorConfigStore()
|
|
301
|
+
entry = store.get(config_name)
|
|
302
|
+
if not entry:
|
|
303
|
+
raise click.ClickException(f"Config '{config_name}' not found")
|
|
304
|
+
return entry.config
|
|
305
|
+
return json.loads(config) if config else {}
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
if __name__ == "__main__":
|
|
309
|
+
connector()
|