kubiya-control-plane-api 0.9.15__py3-none-any.whl
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.
- control_plane_api/LICENSE +676 -0
- control_plane_api/README.md +350 -0
- control_plane_api/__init__.py +4 -0
- control_plane_api/__version__.py +8 -0
- control_plane_api/alembic/README +1 -0
- control_plane_api/alembic/env.py +121 -0
- control_plane_api/alembic/script.py.mako +28 -0
- control_plane_api/alembic/versions/2613c65c3dbe_initial_database_setup.py +32 -0
- control_plane_api/alembic/versions/2df520d4927d_merge_heads.py +28 -0
- control_plane_api/alembic/versions/43abf98d6a01_add_paused_status_to_executions.py +73 -0
- control_plane_api/alembic/versions/6289854264cb_merge_multiple_heads.py +28 -0
- control_plane_api/alembic/versions/6a4d4dc3d8dc_generate_execution_transitions.py +50 -0
- control_plane_api/alembic/versions/87d11cf0a783_add_disconnected_status_to_worker_.py +44 -0
- control_plane_api/alembic/versions/add_ephemeral_queue_support.py +85 -0
- control_plane_api/alembic/versions/add_model_type_to_llm_models.py +31 -0
- control_plane_api/alembic/versions/add_plan_executions_table.py +114 -0
- control_plane_api/alembic/versions/add_trace_span_tables.py +154 -0
- control_plane_api/alembic/versions/add_user_info_to_traces.py +36 -0
- control_plane_api/alembic/versions/adjusting_foreign_keys.py +32 -0
- control_plane_api/alembic/versions/b4983d976db2_initial_tables.py +1128 -0
- control_plane_api/alembic/versions/d181a3b40e71_rename_custom_metadata_to_metadata_in_.py +50 -0
- control_plane_api/alembic/versions/df9117888e82_add_missing_columns.py +82 -0
- control_plane_api/alembic/versions/f25de6ad895a_missing_migrations.py +34 -0
- control_plane_api/alembic/versions/f71305fb69b9_fix_ephemeral_queue_deletion_foreign_key.py +54 -0
- control_plane_api/alembic/versions/mark_local_exec_queues_as_ephemeral.py +68 -0
- control_plane_api/alembic.ini +148 -0
- control_plane_api/api/index.py +12 -0
- control_plane_api/app/__init__.py +11 -0
- control_plane_api/app/activities/__init__.py +20 -0
- control_plane_api/app/activities/agent_activities.py +384 -0
- control_plane_api/app/activities/plan_generation_activities.py +499 -0
- control_plane_api/app/activities/team_activities.py +424 -0
- control_plane_api/app/activities/temporal_cloud_activities.py +588 -0
- control_plane_api/app/config/__init__.py +35 -0
- control_plane_api/app/config/api_config.py +469 -0
- control_plane_api/app/config/config_loader.py +224 -0
- control_plane_api/app/config/model_pricing.py +323 -0
- control_plane_api/app/config/storage_config.py +159 -0
- control_plane_api/app/config.py +115 -0
- control_plane_api/app/controllers/__init__.py +0 -0
- control_plane_api/app/controllers/execution_environment_controller.py +1315 -0
- control_plane_api/app/database.py +135 -0
- control_plane_api/app/exceptions.py +408 -0
- control_plane_api/app/lib/__init__.py +11 -0
- control_plane_api/app/lib/environment.py +65 -0
- control_plane_api/app/lib/event_bus/__init__.py +17 -0
- control_plane_api/app/lib/event_bus/base.py +136 -0
- control_plane_api/app/lib/event_bus/manager.py +335 -0
- control_plane_api/app/lib/event_bus/providers/__init__.py +6 -0
- control_plane_api/app/lib/event_bus/providers/http_provider.py +166 -0
- control_plane_api/app/lib/event_bus/providers/nats_provider.py +324 -0
- control_plane_api/app/lib/event_bus/providers/redis_provider.py +233 -0
- control_plane_api/app/lib/event_bus/providers/websocket_provider.py +497 -0
- control_plane_api/app/lib/job_executor.py +330 -0
- control_plane_api/app/lib/kubiya_client.py +293 -0
- control_plane_api/app/lib/litellm_pricing.py +166 -0
- control_plane_api/app/lib/mcp_validation.py +163 -0
- control_plane_api/app/lib/nats/__init__.py +13 -0
- control_plane_api/app/lib/nats/credentials_manager.py +288 -0
- control_plane_api/app/lib/nats/listener.py +374 -0
- control_plane_api/app/lib/planning_prompt_builder.py +153 -0
- control_plane_api/app/lib/planning_tools/__init__.py +41 -0
- control_plane_api/app/lib/planning_tools/agents.py +409 -0
- control_plane_api/app/lib/planning_tools/agno_toolkit.py +836 -0
- control_plane_api/app/lib/planning_tools/base.py +119 -0
- control_plane_api/app/lib/planning_tools/cognitive_memory_tools.py +403 -0
- control_plane_api/app/lib/planning_tools/context_graph_tools.py +545 -0
- control_plane_api/app/lib/planning_tools/environments.py +218 -0
- control_plane_api/app/lib/planning_tools/knowledge.py +204 -0
- control_plane_api/app/lib/planning_tools/models.py +93 -0
- control_plane_api/app/lib/planning_tools/planning_service.py +646 -0
- control_plane_api/app/lib/planning_tools/resources.py +242 -0
- control_plane_api/app/lib/planning_tools/teams.py +334 -0
- control_plane_api/app/lib/policy_enforcer_client.py +1016 -0
- control_plane_api/app/lib/redis_client.py +803 -0
- control_plane_api/app/lib/sqlalchemy_utils.py +486 -0
- control_plane_api/app/lib/state_transition_tools/__init__.py +7 -0
- control_plane_api/app/lib/state_transition_tools/execution_context.py +388 -0
- control_plane_api/app/lib/storage/__init__.py +20 -0
- control_plane_api/app/lib/storage/base_provider.py +274 -0
- control_plane_api/app/lib/storage/provider_factory.py +157 -0
- control_plane_api/app/lib/storage/vercel_blob_provider.py +468 -0
- control_plane_api/app/lib/supabase.py +71 -0
- control_plane_api/app/lib/supabase_utils.py +138 -0
- control_plane_api/app/lib/task_planning/__init__.py +138 -0
- control_plane_api/app/lib/task_planning/agent_factory.py +308 -0
- control_plane_api/app/lib/task_planning/agents.py +389 -0
- control_plane_api/app/lib/task_planning/cache.py +218 -0
- control_plane_api/app/lib/task_planning/entity_resolver.py +273 -0
- control_plane_api/app/lib/task_planning/helpers.py +293 -0
- control_plane_api/app/lib/task_planning/hooks.py +474 -0
- control_plane_api/app/lib/task_planning/models.py +503 -0
- control_plane_api/app/lib/task_planning/plan_validator.py +166 -0
- control_plane_api/app/lib/task_planning/planning_workflow.py +2911 -0
- control_plane_api/app/lib/task_planning/runner.py +656 -0
- control_plane_api/app/lib/task_planning/streaming_hook.py +213 -0
- control_plane_api/app/lib/task_planning/workflow.py +424 -0
- control_plane_api/app/lib/templating/__init__.py +88 -0
- control_plane_api/app/lib/templating/compiler.py +278 -0
- control_plane_api/app/lib/templating/engine.py +178 -0
- control_plane_api/app/lib/templating/parsers/__init__.py +29 -0
- control_plane_api/app/lib/templating/parsers/base.py +96 -0
- control_plane_api/app/lib/templating/parsers/env.py +85 -0
- control_plane_api/app/lib/templating/parsers/graph.py +112 -0
- control_plane_api/app/lib/templating/parsers/secret.py +87 -0
- control_plane_api/app/lib/templating/parsers/simple.py +81 -0
- control_plane_api/app/lib/templating/resolver.py +366 -0
- control_plane_api/app/lib/templating/types.py +214 -0
- control_plane_api/app/lib/templating/validator.py +201 -0
- control_plane_api/app/lib/temporal_client.py +232 -0
- control_plane_api/app/lib/temporal_credentials_cache.py +178 -0
- control_plane_api/app/lib/temporal_credentials_service.py +203 -0
- control_plane_api/app/lib/validation/__init__.py +24 -0
- control_plane_api/app/lib/validation/runtime_validation.py +388 -0
- control_plane_api/app/main.py +531 -0
- control_plane_api/app/middleware/__init__.py +10 -0
- control_plane_api/app/middleware/auth.py +645 -0
- control_plane_api/app/middleware/exception_handler.py +267 -0
- control_plane_api/app/middleware/prometheus_middleware.py +173 -0
- control_plane_api/app/middleware/rate_limiting.py +384 -0
- control_plane_api/app/middleware/request_id.py +202 -0
- control_plane_api/app/models/__init__.py +40 -0
- control_plane_api/app/models/agent.py +90 -0
- control_plane_api/app/models/analytics.py +206 -0
- control_plane_api/app/models/associations.py +107 -0
- control_plane_api/app/models/auth_user.py +73 -0
- control_plane_api/app/models/context.py +161 -0
- control_plane_api/app/models/custom_integration.py +99 -0
- control_plane_api/app/models/environment.py +64 -0
- control_plane_api/app/models/execution.py +125 -0
- control_plane_api/app/models/execution_transition.py +50 -0
- control_plane_api/app/models/job.py +159 -0
- control_plane_api/app/models/llm_model.py +78 -0
- control_plane_api/app/models/orchestration.py +66 -0
- control_plane_api/app/models/plan_execution.py +102 -0
- control_plane_api/app/models/presence.py +49 -0
- control_plane_api/app/models/project.py +61 -0
- control_plane_api/app/models/project_management.py +85 -0
- control_plane_api/app/models/session.py +29 -0
- control_plane_api/app/models/skill.py +155 -0
- control_plane_api/app/models/system_tables.py +43 -0
- control_plane_api/app/models/task_planning.py +372 -0
- control_plane_api/app/models/team.py +86 -0
- control_plane_api/app/models/trace.py +257 -0
- control_plane_api/app/models/user_profile.py +54 -0
- control_plane_api/app/models/worker.py +221 -0
- control_plane_api/app/models/workflow.py +161 -0
- control_plane_api/app/models/workspace.py +50 -0
- control_plane_api/app/observability/__init__.py +177 -0
- control_plane_api/app/observability/context_logging.py +475 -0
- control_plane_api/app/observability/decorators.py +337 -0
- control_plane_api/app/observability/local_span_processor.py +702 -0
- control_plane_api/app/observability/metrics.py +303 -0
- control_plane_api/app/observability/middleware.py +246 -0
- control_plane_api/app/observability/optional.py +115 -0
- control_plane_api/app/observability/tracing.py +382 -0
- control_plane_api/app/policies/README.md +149 -0
- control_plane_api/app/policies/approved_users.rego +62 -0
- control_plane_api/app/policies/business_hours.rego +51 -0
- control_plane_api/app/policies/rate_limiting.rego +100 -0
- control_plane_api/app/policies/tool_enforcement/README.md +336 -0
- control_plane_api/app/policies/tool_enforcement/bash_command_validation.rego +71 -0
- control_plane_api/app/policies/tool_enforcement/business_hours_enforcement.rego +82 -0
- control_plane_api/app/policies/tool_enforcement/mcp_tool_allowlist.rego +58 -0
- control_plane_api/app/policies/tool_enforcement/production_safeguards.rego +80 -0
- control_plane_api/app/policies/tool_enforcement/role_based_tool_access.rego +44 -0
- control_plane_api/app/policies/tool_restrictions.rego +86 -0
- control_plane_api/app/routers/__init__.py +4 -0
- control_plane_api/app/routers/agents.py +382 -0
- control_plane_api/app/routers/agents_v2.py +1598 -0
- control_plane_api/app/routers/analytics.py +1310 -0
- control_plane_api/app/routers/auth.py +59 -0
- control_plane_api/app/routers/client_config.py +57 -0
- control_plane_api/app/routers/context_graph.py +561 -0
- control_plane_api/app/routers/context_manager.py +577 -0
- control_plane_api/app/routers/custom_integrations.py +490 -0
- control_plane_api/app/routers/enforcer.py +132 -0
- control_plane_api/app/routers/environment_context.py +252 -0
- control_plane_api/app/routers/environments.py +761 -0
- control_plane_api/app/routers/execution_environment.py +847 -0
- control_plane_api/app/routers/executions/__init__.py +28 -0
- control_plane_api/app/routers/executions/router.py +286 -0
- control_plane_api/app/routers/executions/services/__init__.py +22 -0
- control_plane_api/app/routers/executions/services/demo_worker_health.py +156 -0
- control_plane_api/app/routers/executions/services/status_service.py +420 -0
- control_plane_api/app/routers/executions/services/test_worker_health.py +480 -0
- control_plane_api/app/routers/executions/services/worker_health.py +514 -0
- control_plane_api/app/routers/executions/streaming/__init__.py +22 -0
- control_plane_api/app/routers/executions/streaming/deduplication.py +352 -0
- control_plane_api/app/routers/executions/streaming/event_buffer.py +353 -0
- control_plane_api/app/routers/executions/streaming/event_formatter.py +964 -0
- control_plane_api/app/routers/executions/streaming/history_loader.py +588 -0
- control_plane_api/app/routers/executions/streaming/live_source.py +693 -0
- control_plane_api/app/routers/executions/streaming/streamer.py +849 -0
- control_plane_api/app/routers/executions.py +4888 -0
- control_plane_api/app/routers/health.py +165 -0
- control_plane_api/app/routers/health_v2.py +394 -0
- control_plane_api/app/routers/integration_templates.py +496 -0
- control_plane_api/app/routers/integrations.py +287 -0
- control_plane_api/app/routers/jobs.py +1809 -0
- control_plane_api/app/routers/metrics.py +517 -0
- control_plane_api/app/routers/models.py +82 -0
- control_plane_api/app/routers/models_v2.py +628 -0
- control_plane_api/app/routers/plan_executions.py +1481 -0
- control_plane_api/app/routers/plan_generation_async.py +304 -0
- control_plane_api/app/routers/policies.py +669 -0
- control_plane_api/app/routers/presence.py +234 -0
- control_plane_api/app/routers/projects.py +987 -0
- control_plane_api/app/routers/runners.py +379 -0
- control_plane_api/app/routers/runtimes.py +172 -0
- control_plane_api/app/routers/secrets.py +171 -0
- control_plane_api/app/routers/skills.py +1010 -0
- control_plane_api/app/routers/skills_definitions.py +140 -0
- control_plane_api/app/routers/storage.py +456 -0
- control_plane_api/app/routers/task_planning.py +611 -0
- control_plane_api/app/routers/task_queues.py +650 -0
- control_plane_api/app/routers/team_context.py +274 -0
- control_plane_api/app/routers/teams.py +1747 -0
- control_plane_api/app/routers/templates.py +248 -0
- control_plane_api/app/routers/traces.py +571 -0
- control_plane_api/app/routers/websocket_client.py +479 -0
- control_plane_api/app/routers/websocket_executions_status.py +437 -0
- control_plane_api/app/routers/websocket_gateway.py +323 -0
- control_plane_api/app/routers/websocket_traces.py +576 -0
- control_plane_api/app/routers/worker_queues.py +2555 -0
- control_plane_api/app/routers/worker_websocket.py +419 -0
- control_plane_api/app/routers/workers.py +1004 -0
- control_plane_api/app/routers/workflows.py +204 -0
- control_plane_api/app/runtimes/__init__.py +6 -0
- control_plane_api/app/runtimes/validation.py +344 -0
- control_plane_api/app/schemas/__init__.py +1 -0
- control_plane_api/app/schemas/job_schemas.py +302 -0
- control_plane_api/app/schemas/mcp_schemas.py +311 -0
- control_plane_api/app/schemas/template_schemas.py +133 -0
- control_plane_api/app/schemas/trace_schemas.py +168 -0
- control_plane_api/app/schemas/worker_queue_observability_schemas.py +165 -0
- control_plane_api/app/services/__init__.py +1 -0
- control_plane_api/app/services/agno_planning_strategy.py +233 -0
- control_plane_api/app/services/agno_service.py +838 -0
- control_plane_api/app/services/claude_code_planning_service.py +203 -0
- control_plane_api/app/services/context_graph_client.py +224 -0
- control_plane_api/app/services/custom_integration_service.py +415 -0
- control_plane_api/app/services/integration_resolution_service.py +345 -0
- control_plane_api/app/services/litellm_service.py +394 -0
- control_plane_api/app/services/plan_generator.py +79 -0
- control_plane_api/app/services/planning_strategy.py +66 -0
- control_plane_api/app/services/planning_strategy_factory.py +118 -0
- control_plane_api/app/services/policy_service.py +615 -0
- control_plane_api/app/services/state_transition_service.py +755 -0
- control_plane_api/app/services/storage_service.py +593 -0
- control_plane_api/app/services/temporal_cloud_provisioning.py +150 -0
- control_plane_api/app/services/toolsets/context_graph_skill.py +432 -0
- control_plane_api/app/services/trace_retention.py +354 -0
- control_plane_api/app/services/worker_queue_metrics_service.py +190 -0
- control_plane_api/app/services/workflow_cancellation_manager.py +135 -0
- control_plane_api/app/services/workflow_operations_service.py +611 -0
- control_plane_api/app/skills/__init__.py +100 -0
- control_plane_api/app/skills/base.py +239 -0
- control_plane_api/app/skills/builtin/__init__.py +37 -0
- control_plane_api/app/skills/builtin/agent_communication/__init__.py +8 -0
- control_plane_api/app/skills/builtin/agent_communication/skill.py +246 -0
- control_plane_api/app/skills/builtin/code_ingestion/__init__.py +4 -0
- control_plane_api/app/skills/builtin/code_ingestion/skill.py +267 -0
- control_plane_api/app/skills/builtin/cognitive_memory/__init__.py +4 -0
- control_plane_api/app/skills/builtin/cognitive_memory/skill.py +174 -0
- control_plane_api/app/skills/builtin/contextual_awareness/__init__.py +4 -0
- control_plane_api/app/skills/builtin/contextual_awareness/skill.py +387 -0
- control_plane_api/app/skills/builtin/data_visualization/__init__.py +4 -0
- control_plane_api/app/skills/builtin/data_visualization/skill.py +154 -0
- control_plane_api/app/skills/builtin/docker/__init__.py +4 -0
- control_plane_api/app/skills/builtin/docker/skill.py +104 -0
- control_plane_api/app/skills/builtin/file_generation/__init__.py +4 -0
- control_plane_api/app/skills/builtin/file_generation/skill.py +94 -0
- control_plane_api/app/skills/builtin/file_system/__init__.py +4 -0
- control_plane_api/app/skills/builtin/file_system/skill.py +110 -0
- control_plane_api/app/skills/builtin/knowledge_api/__init__.py +5 -0
- control_plane_api/app/skills/builtin/knowledge_api/skill.py +124 -0
- control_plane_api/app/skills/builtin/python/__init__.py +4 -0
- control_plane_api/app/skills/builtin/python/skill.py +92 -0
- control_plane_api/app/skills/builtin/remote_filesystem/__init__.py +5 -0
- control_plane_api/app/skills/builtin/remote_filesystem/skill.py +170 -0
- control_plane_api/app/skills/builtin/shell/__init__.py +4 -0
- control_plane_api/app/skills/builtin/shell/skill.py +161 -0
- control_plane_api/app/skills/builtin/slack/__init__.py +3 -0
- control_plane_api/app/skills/builtin/slack/skill.py +302 -0
- control_plane_api/app/skills/builtin/workflow_executor/__init__.py +4 -0
- control_plane_api/app/skills/builtin/workflow_executor/skill.py +469 -0
- control_plane_api/app/skills/business_intelligence.py +189 -0
- control_plane_api/app/skills/config.py +63 -0
- control_plane_api/app/skills/loaders/__init__.py +14 -0
- control_plane_api/app/skills/loaders/base.py +73 -0
- control_plane_api/app/skills/loaders/filesystem_loader.py +199 -0
- control_plane_api/app/skills/registry.py +125 -0
- control_plane_api/app/utils/helpers.py +12 -0
- control_plane_api/app/utils/workflow_executor.py +354 -0
- control_plane_api/app/workflows/__init__.py +11 -0
- control_plane_api/app/workflows/agent_execution.py +520 -0
- control_plane_api/app/workflows/agent_execution_with_skills.py +223 -0
- control_plane_api/app/workflows/namespace_provisioning.py +326 -0
- control_plane_api/app/workflows/plan_generation.py +254 -0
- control_plane_api/app/workflows/team_execution.py +442 -0
- control_plane_api/scripts/seed_models.py +240 -0
- control_plane_api/scripts/validate_existing_tool_names.py +492 -0
- control_plane_api/shared/__init__.py +8 -0
- control_plane_api/shared/version.py +17 -0
- control_plane_api/test_deduplication.py +274 -0
- control_plane_api/test_executor_deduplication_e2e.py +309 -0
- control_plane_api/test_job_execution_e2e.py +283 -0
- control_plane_api/test_real_integration.py +193 -0
- control_plane_api/version.py +38 -0
- control_plane_api/worker/__init__.py +0 -0
- control_plane_api/worker/activities/__init__.py +0 -0
- control_plane_api/worker/activities/agent_activities.py +1585 -0
- control_plane_api/worker/activities/approval_activities.py +234 -0
- control_plane_api/worker/activities/job_activities.py +199 -0
- control_plane_api/worker/activities/runtime_activities.py +1167 -0
- control_plane_api/worker/activities/skill_activities.py +282 -0
- control_plane_api/worker/activities/team_activities.py +479 -0
- control_plane_api/worker/agent_runtime_server.py +370 -0
- control_plane_api/worker/binary_manager.py +333 -0
- control_plane_api/worker/config/__init__.py +31 -0
- control_plane_api/worker/config/worker_config.py +273 -0
- control_plane_api/worker/control_plane_client.py +1491 -0
- control_plane_api/worker/examples/analytics_integration_example.py +362 -0
- control_plane_api/worker/health_monitor.py +159 -0
- control_plane_api/worker/metrics.py +237 -0
- control_plane_api/worker/models/__init__.py +1 -0
- control_plane_api/worker/models/error_events.py +105 -0
- control_plane_api/worker/models/inputs.py +89 -0
- control_plane_api/worker/runtimes/__init__.py +35 -0
- control_plane_api/worker/runtimes/agent_runtime/runtime.py +485 -0
- control_plane_api/worker/runtimes/agno/__init__.py +34 -0
- control_plane_api/worker/runtimes/agno/config.py +248 -0
- control_plane_api/worker/runtimes/agno/hooks.py +385 -0
- control_plane_api/worker/runtimes/agno/mcp_builder.py +195 -0
- control_plane_api/worker/runtimes/agno/runtime.py +1063 -0
- control_plane_api/worker/runtimes/agno/utils.py +163 -0
- control_plane_api/worker/runtimes/base.py +979 -0
- control_plane_api/worker/runtimes/claude_code/__init__.py +38 -0
- control_plane_api/worker/runtimes/claude_code/cleanup.py +184 -0
- control_plane_api/worker/runtimes/claude_code/client_pool.py +529 -0
- control_plane_api/worker/runtimes/claude_code/config.py +829 -0
- control_plane_api/worker/runtimes/claude_code/hooks.py +482 -0
- control_plane_api/worker/runtimes/claude_code/litellm_proxy.py +1702 -0
- control_plane_api/worker/runtimes/claude_code/mcp_builder.py +467 -0
- control_plane_api/worker/runtimes/claude_code/mcp_discovery.py +558 -0
- control_plane_api/worker/runtimes/claude_code/runtime.py +1546 -0
- control_plane_api/worker/runtimes/claude_code/tool_mapper.py +403 -0
- control_plane_api/worker/runtimes/claude_code/utils.py +149 -0
- control_plane_api/worker/runtimes/factory.py +173 -0
- control_plane_api/worker/runtimes/model_utils.py +107 -0
- control_plane_api/worker/runtimes/validation.py +93 -0
- control_plane_api/worker/services/__init__.py +1 -0
- control_plane_api/worker/services/agent_communication_tools.py +908 -0
- control_plane_api/worker/services/agent_executor.py +485 -0
- control_plane_api/worker/services/agent_executor_v2.py +793 -0
- control_plane_api/worker/services/analytics_collector.py +457 -0
- control_plane_api/worker/services/analytics_service.py +464 -0
- control_plane_api/worker/services/approval_tools.py +310 -0
- control_plane_api/worker/services/approval_tools_agno.py +207 -0
- control_plane_api/worker/services/cancellation_manager.py +177 -0
- control_plane_api/worker/services/code_ingestion_tools.py +465 -0
- control_plane_api/worker/services/contextual_awareness_tools.py +405 -0
- control_plane_api/worker/services/data_visualization.py +834 -0
- control_plane_api/worker/services/event_publisher.py +531 -0
- control_plane_api/worker/services/jira_tools.py +257 -0
- control_plane_api/worker/services/remote_filesystem_tools.py +498 -0
- control_plane_api/worker/services/runtime_analytics.py +328 -0
- control_plane_api/worker/services/session_service.py +365 -0
- control_plane_api/worker/services/skill_context_enhancement.py +181 -0
- control_plane_api/worker/services/skill_factory.py +471 -0
- control_plane_api/worker/services/system_prompt_enhancement.py +410 -0
- control_plane_api/worker/services/team_executor.py +715 -0
- control_plane_api/worker/services/team_executor_v2.py +1866 -0
- control_plane_api/worker/services/tool_enforcement.py +254 -0
- control_plane_api/worker/services/workflow_executor/__init__.py +52 -0
- control_plane_api/worker/services/workflow_executor/event_processor.py +287 -0
- control_plane_api/worker/services/workflow_executor/event_publisher.py +210 -0
- control_plane_api/worker/services/workflow_executor/executors/__init__.py +15 -0
- control_plane_api/worker/services/workflow_executor/executors/base.py +270 -0
- control_plane_api/worker/services/workflow_executor/executors/json_executor.py +50 -0
- control_plane_api/worker/services/workflow_executor/executors/python_executor.py +50 -0
- control_plane_api/worker/services/workflow_executor/models.py +142 -0
- control_plane_api/worker/services/workflow_executor_tools.py +1748 -0
- control_plane_api/worker/skills/__init__.py +12 -0
- control_plane_api/worker/skills/builtin/context_graph_search/README.md +213 -0
- control_plane_api/worker/skills/builtin/context_graph_search/__init__.py +5 -0
- control_plane_api/worker/skills/builtin/context_graph_search/agno_impl.py +808 -0
- control_plane_api/worker/skills/builtin/context_graph_search/skill.yaml +67 -0
- control_plane_api/worker/skills/builtin/contextual_awareness/__init__.py +4 -0
- control_plane_api/worker/skills/builtin/contextual_awareness/agno_impl.py +62 -0
- control_plane_api/worker/skills/builtin/data_visualization/agno_impl.py +18 -0
- control_plane_api/worker/skills/builtin/data_visualization/skill.yaml +84 -0
- control_plane_api/worker/skills/builtin/docker/agno_impl.py +65 -0
- control_plane_api/worker/skills/builtin/docker/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/file_generation/agno_impl.py +47 -0
- control_plane_api/worker/skills/builtin/file_generation/skill.yaml +64 -0
- control_plane_api/worker/skills/builtin/file_system/agno_impl.py +32 -0
- control_plane_api/worker/skills/builtin/file_system/skill.yaml +54 -0
- control_plane_api/worker/skills/builtin/knowledge_api/__init__.py +4 -0
- control_plane_api/worker/skills/builtin/knowledge_api/agno_impl.py +50 -0
- control_plane_api/worker/skills/builtin/knowledge_api/skill.yaml +66 -0
- control_plane_api/worker/skills/builtin/python/agno_impl.py +25 -0
- control_plane_api/worker/skills/builtin/python/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/schema_fix_mixin.py +260 -0
- control_plane_api/worker/skills/builtin/shell/agno_impl.py +31 -0
- control_plane_api/worker/skills/builtin/shell/skill.yaml +60 -0
- control_plane_api/worker/skills/builtin/slack/__init__.py +3 -0
- control_plane_api/worker/skills/builtin/slack/agno_impl.py +1282 -0
- control_plane_api/worker/skills/builtin/slack/skill.yaml +276 -0
- control_plane_api/worker/skills/builtin/workflow_executor/agno_impl.py +62 -0
- control_plane_api/worker/skills/builtin/workflow_executor/skill.yaml +79 -0
- control_plane_api/worker/skills/loaders/__init__.py +5 -0
- control_plane_api/worker/skills/loaders/base.py +23 -0
- control_plane_api/worker/skills/loaders/filesystem_loader.py +357 -0
- control_plane_api/worker/skills/registry.py +208 -0
- control_plane_api/worker/tests/__init__.py +1 -0
- control_plane_api/worker/tests/conftest.py +12 -0
- control_plane_api/worker/tests/e2e/__init__.py +0 -0
- control_plane_api/worker/tests/e2e/test_context_graph_real_api.py +338 -0
- control_plane_api/worker/tests/e2e/test_context_graph_templates_e2e.py +523 -0
- control_plane_api/worker/tests/e2e/test_enforcement_e2e.py +344 -0
- control_plane_api/worker/tests/e2e/test_execution_flow.py +571 -0
- control_plane_api/worker/tests/e2e/test_single_execution_mode.py +656 -0
- control_plane_api/worker/tests/integration/__init__.py +0 -0
- control_plane_api/worker/tests/integration/test_builtin_skills_fixes.py +245 -0
- control_plane_api/worker/tests/integration/test_context_graph_search_integration.py +365 -0
- control_plane_api/worker/tests/integration/test_control_plane_integration.py +308 -0
- control_plane_api/worker/tests/integration/test_hook_enforcement_integration.py +579 -0
- control_plane_api/worker/tests/integration/test_scheduled_job_workflow.py +237 -0
- control_plane_api/worker/tests/integration/test_system_prompt_enhancement_integration.py +343 -0
- control_plane_api/worker/tests/unit/__init__.py +0 -0
- control_plane_api/worker/tests/unit/test_builtin_skill_autoload.py +396 -0
- control_plane_api/worker/tests/unit/test_context_graph_search.py +450 -0
- control_plane_api/worker/tests/unit/test_context_graph_templates.py +403 -0
- control_plane_api/worker/tests/unit/test_control_plane_client.py +401 -0
- control_plane_api/worker/tests/unit/test_control_plane_client_jobs.py +345 -0
- control_plane_api/worker/tests/unit/test_job_activities.py +353 -0
- control_plane_api/worker/tests/unit/test_skill_context_enhancement.py +321 -0
- control_plane_api/worker/tests/unit/test_system_prompt_enhancement.py +415 -0
- control_plane_api/worker/tests/unit/test_tool_enforcement.py +324 -0
- control_plane_api/worker/utils/__init__.py +1 -0
- control_plane_api/worker/utils/chunk_batcher.py +330 -0
- control_plane_api/worker/utils/environment.py +65 -0
- control_plane_api/worker/utils/error_publisher.py +260 -0
- control_plane_api/worker/utils/event_batcher.py +256 -0
- control_plane_api/worker/utils/logging_config.py +335 -0
- control_plane_api/worker/utils/logging_helper.py +326 -0
- control_plane_api/worker/utils/parameter_validator.py +120 -0
- control_plane_api/worker/utils/retry_utils.py +60 -0
- control_plane_api/worker/utils/streaming_utils.py +665 -0
- control_plane_api/worker/utils/tool_validation.py +332 -0
- control_plane_api/worker/utils/workspace_manager.py +163 -0
- control_plane_api/worker/websocket_client.py +393 -0
- control_plane_api/worker/worker.py +1297 -0
- control_plane_api/worker/workflows/__init__.py +0 -0
- control_plane_api/worker/workflows/agent_execution.py +909 -0
- control_plane_api/worker/workflows/scheduled_job_wrapper.py +332 -0
- control_plane_api/worker/workflows/team_execution.py +611 -0
- kubiya_control_plane_api-0.9.15.dist-info/METADATA +354 -0
- kubiya_control_plane_api-0.9.15.dist-info/RECORD +479 -0
- kubiya_control_plane_api-0.9.15.dist-info/WHEEL +5 -0
- kubiya_control_plane_api-0.9.15.dist-info/entry_points.txt +5 -0
- kubiya_control_plane_api-0.9.15.dist-info/licenses/LICENSE +676 -0
- kubiya_control_plane_api-0.9.15.dist-info/top_level.txt +3 -0
- scripts/__init__.py +1 -0
- scripts/migrations.py +39 -0
- scripts/seed_worker_queues.py +128 -0
- scripts/setup_agent_runtime.py +142 -0
- worker_internal/__init__.py +1 -0
- worker_internal/planner/__init__.py +1 -0
- worker_internal/planner/activities.py +1499 -0
- worker_internal/planner/agent_tools.py +197 -0
- worker_internal/planner/event_models.py +148 -0
- worker_internal/planner/event_publisher.py +67 -0
- worker_internal/planner/models.py +199 -0
- worker_internal/planner/retry_logic.py +134 -0
- worker_internal/planner/worker.py +300 -0
- worker_internal/planner/workflows.py +970 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Base classes and utilities for planning tools
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import Optional, Dict, Any, List
|
|
6
|
+
from agno.tools.toolkit import Toolkit
|
|
7
|
+
from sqlalchemy.orm import Session
|
|
8
|
+
import structlog
|
|
9
|
+
import json
|
|
10
|
+
|
|
11
|
+
logger = structlog.get_logger()
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BasePlanningTools(Toolkit):
|
|
15
|
+
"""
|
|
16
|
+
Base class for all planning tools with common utilities
|
|
17
|
+
|
|
18
|
+
Provides:
|
|
19
|
+
- Database session for direct data access
|
|
20
|
+
- Common error handling
|
|
21
|
+
- Response formatting
|
|
22
|
+
- Logging utilities
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self,
|
|
27
|
+
db: Optional[Session] = None,
|
|
28
|
+
organization_id: Optional[str] = None,
|
|
29
|
+
):
|
|
30
|
+
"""
|
|
31
|
+
Initialize base planning tools
|
|
32
|
+
|
|
33
|
+
Args:
|
|
34
|
+
db: Database session for direct data access
|
|
35
|
+
organization_id: Organization context for filtering
|
|
36
|
+
"""
|
|
37
|
+
super().__init__(name="base_planning_tools")
|
|
38
|
+
self.db = db
|
|
39
|
+
self.organization_id = organization_id
|
|
40
|
+
|
|
41
|
+
def _get_db(self) -> Session:
|
|
42
|
+
"""Get database session, creating one if needed"""
|
|
43
|
+
if self.db is None:
|
|
44
|
+
from control_plane_api.app.database import get_db
|
|
45
|
+
# Create a new session
|
|
46
|
+
self.db = next(get_db())
|
|
47
|
+
return self.db
|
|
48
|
+
|
|
49
|
+
def _format_list_response(
|
|
50
|
+
self,
|
|
51
|
+
items: List[Dict[str, Any]],
|
|
52
|
+
title: str,
|
|
53
|
+
key_fields: List[str],
|
|
54
|
+
) -> str:
|
|
55
|
+
"""
|
|
56
|
+
Format a list of items as a readable string
|
|
57
|
+
|
|
58
|
+
For LLM consumption, we want to preserve as much structured data as possible
|
|
59
|
+
rather than summarizing it.
|
|
60
|
+
|
|
61
|
+
Args:
|
|
62
|
+
items: List of items to format
|
|
63
|
+
title: Title for the list
|
|
64
|
+
key_fields: Fields to include in the output
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Formatted string representation with full data
|
|
68
|
+
"""
|
|
69
|
+
if not items:
|
|
70
|
+
return f"{title}: None available"
|
|
71
|
+
|
|
72
|
+
output = [f"{title} ({len(items)} total):"]
|
|
73
|
+
for idx, item in enumerate(items, 1):
|
|
74
|
+
output.append(f"\n{idx}. {item.get('name', 'Unnamed')} (ID: {item.get('id', 'N/A')})")
|
|
75
|
+
for field in key_fields:
|
|
76
|
+
if field in item and item[field]:
|
|
77
|
+
value = item[field]
|
|
78
|
+
# Format nested objects - preserve full data for LLM
|
|
79
|
+
if isinstance(value, dict):
|
|
80
|
+
# Keep full JSON for dicts (execution_environment, etc.)
|
|
81
|
+
value = json.dumps(value, indent=2)
|
|
82
|
+
elif isinstance(value, list):
|
|
83
|
+
# For lists, show full data as JSON if items are dicts/objects
|
|
84
|
+
# This is critical for skills, projects, environments, etc.
|
|
85
|
+
if value and isinstance(value[0], dict):
|
|
86
|
+
value = json.dumps(value, indent=2)
|
|
87
|
+
else:
|
|
88
|
+
value = json.dumps(value)
|
|
89
|
+
output.append(f" - {field}: {value}")
|
|
90
|
+
|
|
91
|
+
return "\n".join(output)
|
|
92
|
+
|
|
93
|
+
def _format_detail_response(
|
|
94
|
+
self,
|
|
95
|
+
item: Dict[str, Any],
|
|
96
|
+
title: str,
|
|
97
|
+
) -> str:
|
|
98
|
+
"""
|
|
99
|
+
Format a single item as a readable string
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
item: Item to format
|
|
103
|
+
title: Title for the item
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
Formatted string representation
|
|
107
|
+
"""
|
|
108
|
+
if not item:
|
|
109
|
+
return f"{title}: Not found"
|
|
110
|
+
|
|
111
|
+
output = [f"{title}:"]
|
|
112
|
+
for key, value in item.items():
|
|
113
|
+
if isinstance(value, dict):
|
|
114
|
+
value = json.dumps(value, indent=2)
|
|
115
|
+
elif isinstance(value, list):
|
|
116
|
+
value = f"{len(value)} items: {', '.join([str(v) for v in value[:3]])}{'...' if len(value) > 3 else ''}"
|
|
117
|
+
output.append(f" {key}: {value}")
|
|
118
|
+
|
|
119
|
+
return "\n".join(output)
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Cognitive Memory Planning Tools
|
|
3
|
+
|
|
4
|
+
Provides intelligent memory and context graph operations for planning agents.
|
|
5
|
+
|
|
6
|
+
This tool enables the planning agent to:
|
|
7
|
+
1. Memorize important context and insights
|
|
8
|
+
2. Recall relevant memories based on semantic queries
|
|
9
|
+
3. Search context graphs for knowledge
|
|
10
|
+
4. Extract insights from accumulated knowledge
|
|
11
|
+
5. Query organizational memory
|
|
12
|
+
|
|
13
|
+
Following the same pattern used by workers and skills for tool-based discovery.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import structlog
|
|
17
|
+
from typing import Optional, List, Dict, Any
|
|
18
|
+
import httpx
|
|
19
|
+
|
|
20
|
+
from control_plane_api.app.lib.planning_tools.base import BasePlanningTools
|
|
21
|
+
|
|
22
|
+
logger = structlog.get_logger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class CognitiveMemoryPlanningTools(BasePlanningTools):
|
|
26
|
+
"""
|
|
27
|
+
Cognitive memory tools for intelligent context and knowledge operations during planning.
|
|
28
|
+
|
|
29
|
+
Usage pattern:
|
|
30
|
+
1. AI analyzes task and context
|
|
31
|
+
2. AI memorizes important information for future reference
|
|
32
|
+
3. AI recalls relevant memories when needed
|
|
33
|
+
4. AI searches semantic memory for related knowledge
|
|
34
|
+
5. AI extracts insights from accumulated context
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
def __init__(
|
|
38
|
+
self,
|
|
39
|
+
db=None,
|
|
40
|
+
organization_id: Optional[str] = None,
|
|
41
|
+
api_token: Optional[str] = None,
|
|
42
|
+
context_graph_api_base: Optional[str] = None,
|
|
43
|
+
):
|
|
44
|
+
"""
|
|
45
|
+
Initialize cognitive memory planning tools
|
|
46
|
+
|
|
47
|
+
Args:
|
|
48
|
+
db: Database session for direct data access
|
|
49
|
+
organization_id: Organization context for filtering
|
|
50
|
+
api_token: API token for context graph authentication
|
|
51
|
+
context_graph_api_base: Context graph API base URL
|
|
52
|
+
"""
|
|
53
|
+
super().__init__(db=db, organization_id=organization_id)
|
|
54
|
+
self.name = "cognitive_memory_planning_tools"
|
|
55
|
+
self.api_token = api_token
|
|
56
|
+
self.context_graph_api_base = (
|
|
57
|
+
context_graph_api_base or "https://graph.kubiya.ai"
|
|
58
|
+
).rstrip("/")
|
|
59
|
+
|
|
60
|
+
# HTTP client for API calls
|
|
61
|
+
self._client = httpx.AsyncClient(
|
|
62
|
+
base_url=self.context_graph_api_base,
|
|
63
|
+
timeout=httpx.Timeout(timeout=60.0),
|
|
64
|
+
headers={
|
|
65
|
+
"Authorization": f"Bearer {api_token}" if api_token else "",
|
|
66
|
+
"Content-Type": "application/json",
|
|
67
|
+
},
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
async def memorize_context(
|
|
71
|
+
self,
|
|
72
|
+
context: str,
|
|
73
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
74
|
+
dataset_id: Optional[str] = None,
|
|
75
|
+
) -> str:
|
|
76
|
+
"""
|
|
77
|
+
Memorize important context for future recall.
|
|
78
|
+
|
|
79
|
+
Use this to store significant insights, decisions, or information that
|
|
80
|
+
may be relevant for future tasks or conversations.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
context: The context or information to memorize
|
|
84
|
+
metadata: Optional metadata (tags, categories, etc.)
|
|
85
|
+
dataset_id: Optional dataset ID for scoped storage
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
JSON string with memorization result:
|
|
89
|
+
{
|
|
90
|
+
"status": "success",
|
|
91
|
+
"memory_id": "mem_...",
|
|
92
|
+
"message": "Context memorized successfully"
|
|
93
|
+
}
|
|
94
|
+
"""
|
|
95
|
+
try:
|
|
96
|
+
logger.info(
|
|
97
|
+
"memorize_context",
|
|
98
|
+
organization_id=self.organization_id,
|
|
99
|
+
has_metadata=bool(metadata),
|
|
100
|
+
has_dataset=bool(dataset_id),
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
payload = {
|
|
104
|
+
"context": {"text": context},
|
|
105
|
+
"metadata": metadata or {},
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if dataset_id:
|
|
109
|
+
payload["dataset_id"] = dataset_id
|
|
110
|
+
|
|
111
|
+
response = await self._client.post(
|
|
112
|
+
f"/api/v1/organizations/{self.organization_id}/memory/memorize",
|
|
113
|
+
json=payload,
|
|
114
|
+
)
|
|
115
|
+
response.raise_for_status()
|
|
116
|
+
|
|
117
|
+
result = response.json()
|
|
118
|
+
return self._format_detail_response(
|
|
119
|
+
result,
|
|
120
|
+
"Memory Stored",
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
except Exception as e:
|
|
124
|
+
logger.error(
|
|
125
|
+
"memorize_context_failed",
|
|
126
|
+
error=str(e),
|
|
127
|
+
organization_id=self.organization_id,
|
|
128
|
+
)
|
|
129
|
+
return self._format_error("Failed to memorize context", str(e))
|
|
130
|
+
|
|
131
|
+
async def recall_memories(
|
|
132
|
+
self,
|
|
133
|
+
query: str,
|
|
134
|
+
limit: int = 5,
|
|
135
|
+
dataset_ids: Optional[List[str]] = None,
|
|
136
|
+
) -> str:
|
|
137
|
+
"""
|
|
138
|
+
Recall memories relevant to a query.
|
|
139
|
+
|
|
140
|
+
Use this to retrieve previously memorized context, insights, or information
|
|
141
|
+
that may be relevant to the current task.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
query: Natural language query describing what to recall
|
|
145
|
+
limit: Maximum number of memories to return (default: 5)
|
|
146
|
+
dataset_ids: Optional list of dataset IDs to filter by
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
JSON string with relevant memories:
|
|
150
|
+
[
|
|
151
|
+
{
|
|
152
|
+
"id": "mem_...",
|
|
153
|
+
"content": "Previously memorized context...",
|
|
154
|
+
"metadata": {...},
|
|
155
|
+
"created_at": "2025-01-15T10:30:00Z",
|
|
156
|
+
"relevance_score": 0.95
|
|
157
|
+
},
|
|
158
|
+
...
|
|
159
|
+
]
|
|
160
|
+
"""
|
|
161
|
+
try:
|
|
162
|
+
logger.info(
|
|
163
|
+
"recall_memories",
|
|
164
|
+
query_length=len(query),
|
|
165
|
+
limit=limit,
|
|
166
|
+
organization_id=self.organization_id,
|
|
167
|
+
has_dataset_filter=bool(dataset_ids),
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
params = {
|
|
171
|
+
"query": query,
|
|
172
|
+
"limit": limit,
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if dataset_ids:
|
|
176
|
+
params["dataset_ids"] = ",".join(dataset_ids)
|
|
177
|
+
|
|
178
|
+
response = await self._client.get(
|
|
179
|
+
f"/api/v1/organizations/{self.organization_id}/memory/recall",
|
|
180
|
+
params=params,
|
|
181
|
+
)
|
|
182
|
+
response.raise_for_status()
|
|
183
|
+
|
|
184
|
+
memories = response.json()
|
|
185
|
+
|
|
186
|
+
if not memories:
|
|
187
|
+
return self._format_list_response(
|
|
188
|
+
[],
|
|
189
|
+
f"No relevant memories found for: {query}",
|
|
190
|
+
[],
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
return self._format_list_response(
|
|
194
|
+
memories,
|
|
195
|
+
f"Relevant Memories ({len(memories)} found)",
|
|
196
|
+
["id", "content", "created_at"],
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
except Exception as e:
|
|
200
|
+
logger.error(
|
|
201
|
+
"recall_memories_failed",
|
|
202
|
+
error=str(e),
|
|
203
|
+
organization_id=self.organization_id,
|
|
204
|
+
)
|
|
205
|
+
return self._format_error("Failed to recall memories", str(e))
|
|
206
|
+
|
|
207
|
+
async def search_semantic_memory(
|
|
208
|
+
self,
|
|
209
|
+
query: str,
|
|
210
|
+
search_type: str = "GRAPH_COMPLETION",
|
|
211
|
+
limit: int = 10,
|
|
212
|
+
dataset_ids: Optional[List[str]] = None,
|
|
213
|
+
) -> str:
|
|
214
|
+
"""
|
|
215
|
+
Search semantic memory using advanced graph-based search.
|
|
216
|
+
|
|
217
|
+
Use this for intelligent search that understands relationships and context,
|
|
218
|
+
not just keyword matching.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
query: Natural language search query
|
|
222
|
+
search_type: Type of search (GRAPH_COMPLETION, RAG_COMPLETION, CHUNKS)
|
|
223
|
+
limit: Maximum results to return (default: 10)
|
|
224
|
+
dataset_ids: Optional list of dataset IDs to filter by
|
|
225
|
+
|
|
226
|
+
Returns:
|
|
227
|
+
JSON string with search results:
|
|
228
|
+
[
|
|
229
|
+
{
|
|
230
|
+
"text": "Result text...",
|
|
231
|
+
"metadata": {...},
|
|
232
|
+
"relevance_score": 0.92
|
|
233
|
+
},
|
|
234
|
+
...
|
|
235
|
+
]
|
|
236
|
+
"""
|
|
237
|
+
try:
|
|
238
|
+
logger.info(
|
|
239
|
+
"search_semantic_memory",
|
|
240
|
+
query_length=len(query),
|
|
241
|
+
search_type=search_type,
|
|
242
|
+
limit=limit,
|
|
243
|
+
organization_id=self.organization_id,
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
payload = {
|
|
247
|
+
"query": query,
|
|
248
|
+
"search_type": search_type,
|
|
249
|
+
"limit": limit,
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if dataset_ids:
|
|
253
|
+
payload["dataset_ids"] = dataset_ids
|
|
254
|
+
|
|
255
|
+
response = await self._client.post(
|
|
256
|
+
f"/api/v1/organizations/{self.organization_id}/memory/search",
|
|
257
|
+
json=payload,
|
|
258
|
+
)
|
|
259
|
+
response.raise_for_status()
|
|
260
|
+
|
|
261
|
+
results = response.json()
|
|
262
|
+
|
|
263
|
+
if not results:
|
|
264
|
+
return self._format_list_response(
|
|
265
|
+
[],
|
|
266
|
+
f"No results found for: {query}",
|
|
267
|
+
[],
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
return self._format_list_response(
|
|
271
|
+
results.get("results", results),
|
|
272
|
+
f"Search Results ({len(results.get('results', results))} found)",
|
|
273
|
+
["text"],
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
except Exception as e:
|
|
277
|
+
logger.error(
|
|
278
|
+
"search_semantic_memory_failed",
|
|
279
|
+
error=str(e),
|
|
280
|
+
organization_id=self.organization_id,
|
|
281
|
+
)
|
|
282
|
+
return self._format_error("Failed to search semantic memory", str(e))
|
|
283
|
+
|
|
284
|
+
async def get_memory_insights(
|
|
285
|
+
self,
|
|
286
|
+
dataset_ids: Optional[List[str]] = None,
|
|
287
|
+
insight_type: str = "patterns",
|
|
288
|
+
) -> str:
|
|
289
|
+
"""
|
|
290
|
+
Get cognitive insights from accumulated memories.
|
|
291
|
+
|
|
292
|
+
Use this to extract patterns, summaries, or insights from the knowledge base.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
dataset_ids: Optional list of dataset IDs to analyze
|
|
296
|
+
insight_type: Type of insights (patterns, summaries, trends)
|
|
297
|
+
|
|
298
|
+
Returns:
|
|
299
|
+
JSON string with insights:
|
|
300
|
+
{
|
|
301
|
+
"insights": [...],
|
|
302
|
+
"patterns": [...],
|
|
303
|
+
"summary": "..."
|
|
304
|
+
}
|
|
305
|
+
"""
|
|
306
|
+
try:
|
|
307
|
+
logger.info(
|
|
308
|
+
"get_memory_insights",
|
|
309
|
+
insight_type=insight_type,
|
|
310
|
+
organization_id=self.organization_id,
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
params = {
|
|
314
|
+
"insight_type": insight_type,
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if dataset_ids:
|
|
318
|
+
params["dataset_ids"] = ",".join(dataset_ids)
|
|
319
|
+
|
|
320
|
+
response = await self._client.get(
|
|
321
|
+
f"/api/v1/organizations/{self.organization_id}/memory/insights",
|
|
322
|
+
params=params,
|
|
323
|
+
)
|
|
324
|
+
response.raise_for_status()
|
|
325
|
+
|
|
326
|
+
insights = response.json()
|
|
327
|
+
return self._format_detail_response(
|
|
328
|
+
insights,
|
|
329
|
+
f"Memory Insights ({insight_type})",
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
except Exception as e:
|
|
333
|
+
logger.error(
|
|
334
|
+
"get_memory_insights_failed",
|
|
335
|
+
error=str(e),
|
|
336
|
+
organization_id=self.organization_id,
|
|
337
|
+
)
|
|
338
|
+
return self._format_error("Failed to get memory insights", str(e))
|
|
339
|
+
|
|
340
|
+
async def list_memory_datasets(self) -> str:
|
|
341
|
+
"""
|
|
342
|
+
List all memory datasets available to the organization.
|
|
343
|
+
|
|
344
|
+
Use this to discover what memory contexts are available.
|
|
345
|
+
|
|
346
|
+
Returns:
|
|
347
|
+
JSON string with datasets:
|
|
348
|
+
[
|
|
349
|
+
{
|
|
350
|
+
"id": "dataset_...",
|
|
351
|
+
"name": "project_alpha",
|
|
352
|
+
"description": "...",
|
|
353
|
+
"created_at": "2025-01-15T10:30:00Z",
|
|
354
|
+
"memory_count": 42
|
|
355
|
+
},
|
|
356
|
+
...
|
|
357
|
+
]
|
|
358
|
+
"""
|
|
359
|
+
try:
|
|
360
|
+
logger.info(
|
|
361
|
+
"list_memory_datasets",
|
|
362
|
+
organization_id=self.organization_id,
|
|
363
|
+
)
|
|
364
|
+
|
|
365
|
+
response = await self._client.get(
|
|
366
|
+
f"/api/v1/organizations/{self.organization_id}/memory/datasets",
|
|
367
|
+
)
|
|
368
|
+
response.raise_for_status()
|
|
369
|
+
|
|
370
|
+
datasets = response.json()
|
|
371
|
+
|
|
372
|
+
if not datasets:
|
|
373
|
+
return self._format_list_response(
|
|
374
|
+
[],
|
|
375
|
+
"No memory datasets found",
|
|
376
|
+
[],
|
|
377
|
+
)
|
|
378
|
+
|
|
379
|
+
return self._format_list_response(
|
|
380
|
+
datasets,
|
|
381
|
+
f"Memory Datasets ({len(datasets)} found)",
|
|
382
|
+
["id", "name", "memory_count", "created_at"],
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
except Exception as e:
|
|
386
|
+
logger.error(
|
|
387
|
+
"list_memory_datasets_failed",
|
|
388
|
+
error=str(e),
|
|
389
|
+
organization_id=self.organization_id,
|
|
390
|
+
)
|
|
391
|
+
return self._format_error("Failed to list memory datasets", str(e))
|
|
392
|
+
|
|
393
|
+
def _format_error(self, message: str, error: str) -> str:
|
|
394
|
+
"""Format error response"""
|
|
395
|
+
import json
|
|
396
|
+
return json.dumps({
|
|
397
|
+
"error": message,
|
|
398
|
+
"details": error,
|
|
399
|
+
}, indent=2)
|
|
400
|
+
|
|
401
|
+
async def close(self):
|
|
402
|
+
"""Close HTTP client"""
|
|
403
|
+
await self._client.aclose()
|