agent_os_kernel 3.1.0__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.
- agent_control_plane/__init__.py +662 -0
- agent_control_plane/a2a_adapter.py +543 -0
- agent_control_plane/adapter.py +417 -0
- agent_control_plane/agent_hibernation.py +394 -0
- agent_control_plane/agent_kernel.py +470 -0
- agent_control_plane/compliance.py +720 -0
- agent_control_plane/constraint_graphs.py +478 -0
- agent_control_plane/control_plane.py +854 -0
- agent_control_plane/example_executors.py +195 -0
- agent_control_plane/execution_engine.py +231 -0
- agent_control_plane/flight_recorder.py +846 -0
- agent_control_plane/governance_layer.py +435 -0
- agent_control_plane/hf_utils.py +563 -0
- agent_control_plane/interfaces/__init__.py +55 -0
- agent_control_plane/interfaces/kernel_interface.py +361 -0
- agent_control_plane/interfaces/plugin_interface.py +497 -0
- agent_control_plane/interfaces/protocol_interfaces.py +387 -0
- agent_control_plane/kernel_space.py +1009 -0
- agent_control_plane/langchain_adapter.py +424 -0
- agent_control_plane/lifecycle.py +3113 -0
- agent_control_plane/mcp_adapter.py +653 -0
- agent_control_plane/ml_safety.py +563 -0
- agent_control_plane/multimodal.py +727 -0
- agent_control_plane/mute_agent.py +422 -0
- agent_control_plane/observability.py +787 -0
- agent_control_plane/orchestrator.py +482 -0
- agent_control_plane/plugin_registry.py +750 -0
- agent_control_plane/policy_engine.py +954 -0
- agent_control_plane/process_isolation.py +777 -0
- agent_control_plane/shadow_mode.py +310 -0
- agent_control_plane/signals.py +493 -0
- agent_control_plane/supervisor_agents.py +430 -0
- agent_control_plane/time_travel_debugger.py +557 -0
- agent_control_plane/tool_registry.py +452 -0
- agent_control_plane/vfs.py +697 -0
- agent_kernel/__init__.py +69 -0
- agent_kernel/analyzer.py +435 -0
- agent_kernel/auditor.py +36 -0
- agent_kernel/completeness_auditor.py +237 -0
- agent_kernel/detector.py +203 -0
- agent_kernel/kernel.py +744 -0
- agent_kernel/memory_manager.py +85 -0
- agent_kernel/models.py +374 -0
- agent_kernel/nudge_mechanism.py +263 -0
- agent_kernel/outcome_analyzer.py +338 -0
- agent_kernel/patcher.py +582 -0
- agent_kernel/semantic_analyzer.py +316 -0
- agent_kernel/semantic_purge.py +349 -0
- agent_kernel/simulator.py +449 -0
- agent_kernel/teacher.py +85 -0
- agent_kernel/triage.py +152 -0
- agent_os/__init__.py +409 -0
- agent_os/_adversarial_impl.py +200 -0
- agent_os/_circuit_breaker_impl.py +232 -0
- agent_os/_mcp_metrics.py +193 -0
- agent_os/adversarial.py +20 -0
- agent_os/agents_compat.py +490 -0
- agent_os/audit_logger.py +135 -0
- agent_os/base_agent.py +651 -0
- agent_os/circuit_breaker.py +34 -0
- agent_os/cli/__init__.py +659 -0
- agent_os/cli/cmd_audit.py +128 -0
- agent_os/cli/cmd_init.py +152 -0
- agent_os/cli/cmd_policy.py +41 -0
- agent_os/cli/cmd_policy_gen.py +180 -0
- agent_os/cli/cmd_validate.py +258 -0
- agent_os/cli/mcp_scan.py +265 -0
- agent_os/cli/output.py +192 -0
- agent_os/cli/policy_checker.py +330 -0
- agent_os/compat.py +74 -0
- agent_os/constraint_graph.py +234 -0
- agent_os/content_governance.py +140 -0
- agent_os/context_budget.py +305 -0
- agent_os/credential_redactor.py +224 -0
- agent_os/diff_policy.py +89 -0
- agent_os/egress_policy.py +159 -0
- agent_os/escalation.py +276 -0
- agent_os/event_bus.py +124 -0
- agent_os/exceptions.py +180 -0
- agent_os/execution_context_policy.py +141 -0
- agent_os/github_enterprise.py +96 -0
- agent_os/health.py +20 -0
- agent_os/integrations/__init__.py +279 -0
- agent_os/integrations/a2a_adapter.py +279 -0
- agent_os/integrations/agent_lightning/__init__.py +30 -0
- agent_os/integrations/anthropic_adapter.py +420 -0
- agent_os/integrations/autogen_adapter.py +620 -0
- agent_os/integrations/base.py +1137 -0
- agent_os/integrations/compat.py +229 -0
- agent_os/integrations/config.py +98 -0
- agent_os/integrations/conversation_guardian.py +957 -0
- agent_os/integrations/crewai_adapter.py +467 -0
- agent_os/integrations/drift_detector.py +425 -0
- agent_os/integrations/dry_run.py +124 -0
- agent_os/integrations/escalation.py +582 -0
- agent_os/integrations/gemini_adapter.py +364 -0
- agent_os/integrations/google_adk_adapter.py +633 -0
- agent_os/integrations/guardrails_adapter.py +394 -0
- agent_os/integrations/health.py +197 -0
- agent_os/integrations/langchain_adapter.py +654 -0
- agent_os/integrations/llamafirewall.py +343 -0
- agent_os/integrations/llamaindex_adapter.py +188 -0
- agent_os/integrations/logging.py +191 -0
- agent_os/integrations/maf_adapter.py +631 -0
- agent_os/integrations/mistral_adapter.py +365 -0
- agent_os/integrations/openai_adapter.py +816 -0
- agent_os/integrations/openai_agents_sdk.py +406 -0
- agent_os/integrations/policy_compose.py +171 -0
- agent_os/integrations/profiling.py +144 -0
- agent_os/integrations/pydantic_ai_adapter.py +420 -0
- agent_os/integrations/rate_limiter.py +130 -0
- agent_os/integrations/rbac.py +143 -0
- agent_os/integrations/registry.py +113 -0
- agent_os/integrations/scope_guard.py +303 -0
- agent_os/integrations/semantic_kernel_adapter.py +769 -0
- agent_os/integrations/smolagents_adapter.py +629 -0
- agent_os/integrations/templates.py +178 -0
- agent_os/integrations/token_budget.py +134 -0
- agent_os/integrations/tool_aliases.py +190 -0
- agent_os/integrations/webhooks.py +177 -0
- agent_os/lite.py +208 -0
- agent_os/mcp_gateway.py +385 -0
- agent_os/mcp_message_signer.py +273 -0
- agent_os/mcp_protocols.py +161 -0
- agent_os/mcp_response_scanner.py +232 -0
- agent_os/mcp_security.py +924 -0
- agent_os/mcp_session_auth.py +231 -0
- agent_os/mcp_sliding_rate_limiter.py +184 -0
- agent_os/memory_guard.py +409 -0
- agent_os/metrics.py +134 -0
- agent_os/mute.py +428 -0
- agent_os/mute_agent.py +209 -0
- agent_os/policies/__init__.py +77 -0
- agent_os/policies/async_evaluator.py +275 -0
- agent_os/policies/backends.py +670 -0
- agent_os/policies/bridge.py +169 -0
- agent_os/policies/budget.py +85 -0
- agent_os/policies/cli.py +294 -0
- agent_os/policies/conflict_resolution.py +270 -0
- agent_os/policies/data_classification.py +252 -0
- agent_os/policies/evaluator.py +239 -0
- agent_os/policies/policy_schema.json +228 -0
- agent_os/policies/rate_limiting.py +145 -0
- agent_os/policies/schema.py +115 -0
- agent_os/policies/shared.py +331 -0
- agent_os/prompt_injection.py +694 -0
- agent_os/providers.py +182 -0
- agent_os/py.typed +0 -0
- agent_os/retry.py +81 -0
- agent_os/reversibility.py +251 -0
- agent_os/sandbox.py +432 -0
- agent_os/sandbox_provider.py +140 -0
- agent_os/secure_codegen.py +525 -0
- agent_os/security_skills.py +538 -0
- agent_os/semantic_policy.py +422 -0
- agent_os/server/__init__.py +15 -0
- agent_os/server/__main__.py +25 -0
- agent_os/server/app.py +277 -0
- agent_os/server/models.py +104 -0
- agent_os/shift_left_metrics.py +130 -0
- agent_os/stateless.py +742 -0
- agent_os/supervisor.py +148 -0
- agent_os/task_outcome.py +148 -0
- agent_os/transparency.py +181 -0
- agent_os/trust_root.py +128 -0
- agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
- agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
- agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
- agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
- agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
- agent_os_observability/__init__.py +27 -0
- agent_os_observability/dashboards.py +898 -0
- agent_os_observability/metrics.py +398 -0
- agent_os_observability/server.py +223 -0
- agent_os_observability/tracer.py +232 -0
- agent_primitives/__init__.py +24 -0
- agent_primitives/failures.py +84 -0
- agent_primitives/py.typed +0 -0
- amb_core/__init__.py +177 -0
- amb_core/adapters/__init__.py +57 -0
- amb_core/adapters/aws_sqs_broker.py +376 -0
- amb_core/adapters/azure_servicebus_broker.py +340 -0
- amb_core/adapters/kafka_broker.py +260 -0
- amb_core/adapters/nats_broker.py +285 -0
- amb_core/adapters/rabbitmq_broker.py +235 -0
- amb_core/adapters/redis_broker.py +262 -0
- amb_core/broker.py +145 -0
- amb_core/bus.py +481 -0
- amb_core/cloudevents.py +509 -0
- amb_core/dlq.py +345 -0
- amb_core/hf_utils.py +536 -0
- amb_core/memory_broker.py +410 -0
- amb_core/models.py +141 -0
- amb_core/persistence.py +529 -0
- amb_core/schema.py +294 -0
- amb_core/tracing.py +358 -0
- atr/__init__.py +640 -0
- atr/access.py +348 -0
- atr/composition.py +645 -0
- atr/decorator.py +357 -0
- atr/executor.py +384 -0
- atr/health.py +557 -0
- atr/hf_utils.py +449 -0
- atr/injection.py +422 -0
- atr/metrics.py +440 -0
- atr/policies.py +403 -0
- atr/py.typed +2 -0
- atr/registry.py +452 -0
- atr/schema.py +480 -0
- atr/tools/safe/__init__.py +75 -0
- atr/tools/safe/calculator.py +467 -0
- atr/tools/safe/datetime_tool.py +443 -0
- atr/tools/safe/file_reader.py +402 -0
- atr/tools/safe/http_client.py +316 -0
- atr/tools/safe/json_parser.py +374 -0
- atr/tools/safe/text_tool.py +537 -0
- atr/tools/safe/toolkit.py +175 -0
- caas/__init__.py +162 -0
- caas/api/__init__.py +7 -0
- caas/api/server.py +1328 -0
- caas/caching.py +834 -0
- caas/cli.py +210 -0
- caas/conversation.py +223 -0
- caas/decay.py +72 -0
- caas/detection/__init__.py +9 -0
- caas/detection/detector.py +238 -0
- caas/enrichment.py +130 -0
- caas/gateway/__init__.py +27 -0
- caas/gateway/trust_gateway.py +474 -0
- caas/hf_utils.py +479 -0
- caas/ingestion/__init__.py +23 -0
- caas/ingestion/processors.py +253 -0
- caas/ingestion/structure_parser.py +188 -0
- caas/models.py +356 -0
- caas/pragmatic_truth.py +444 -0
- caas/routing/__init__.py +10 -0
- caas/routing/heuristic_router.py +58 -0
- caas/storage/__init__.py +9 -0
- caas/storage/store.py +389 -0
- caas/triad.py +213 -0
- caas/tuning/__init__.py +9 -0
- caas/tuning/tuner.py +329 -0
- caas/vfs/__init__.py +14 -0
- caas/vfs/filesystem.py +452 -0
- cmvk/__init__.py +218 -0
- cmvk/audit.py +402 -0
- cmvk/benchmarks.py +478 -0
- cmvk/constitutional.py +904 -0
- cmvk/hf_utils.py +301 -0
- cmvk/metrics.py +473 -0
- cmvk/profiles.py +300 -0
- cmvk/py.typed +0 -0
- cmvk/types.py +12 -0
- cmvk/verification.py +956 -0
- emk/__init__.py +89 -0
- emk/causal.py +352 -0
- emk/hf_utils.py +421 -0
- emk/indexer.py +83 -0
- emk/py.typed +0 -0
- emk/schema.py +204 -0
- emk/sleep_cycle.py +347 -0
- emk/store.py +281 -0
- iatp/__init__.py +166 -0
- iatp/attestation.py +461 -0
- iatp/cli.py +317 -0
- iatp/hf_utils.py +472 -0
- iatp/ipc_pipes.py +580 -0
- iatp/main.py +412 -0
- iatp/models/__init__.py +447 -0
- iatp/policy_engine.py +337 -0
- iatp/py.typed +2 -0
- iatp/recovery.py +321 -0
- iatp/security/__init__.py +270 -0
- iatp/sidecar/__init__.py +519 -0
- iatp/telemetry/__init__.py +164 -0
- iatp/tests/__init__.py +1 -0
- iatp/tests/test_attestation.py +370 -0
- iatp/tests/test_cli.py +131 -0
- iatp/tests/test_ed25519_attestation.py +211 -0
- iatp/tests/test_models.py +130 -0
- iatp/tests/test_policy_engine.py +347 -0
- iatp/tests/test_recovery.py +281 -0
- iatp/tests/test_security.py +222 -0
- iatp/tests/test_sidecar.py +167 -0
- iatp/tests/test_telemetry.py +175 -0
- mcp_kernel_server/__init__.py +28 -0
- mcp_kernel_server/cli.py +274 -0
- mcp_kernel_server/resources.py +217 -0
- mcp_kernel_server/server.py +564 -0
- mcp_kernel_server/tools.py +1174 -0
- mute_agent/__init__.py +68 -0
- mute_agent/core/__init__.py +1 -0
- mute_agent/core/execution_agent.py +166 -0
- mute_agent/core/handshake_protocol.py +201 -0
- mute_agent/core/reasoning_agent.py +238 -0
- mute_agent/knowledge_graph/__init__.py +1 -0
- mute_agent/knowledge_graph/graph_elements.py +65 -0
- mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
- mute_agent/knowledge_graph/subgraph.py +224 -0
- mute_agent/listener/__init__.py +43 -0
- mute_agent/listener/adapters/__init__.py +31 -0
- mute_agent/listener/adapters/base_adapter.py +189 -0
- mute_agent/listener/adapters/caas_adapter.py +344 -0
- mute_agent/listener/adapters/control_plane_adapter.py +436 -0
- mute_agent/listener/adapters/iatp_adapter.py +332 -0
- mute_agent/listener/adapters/scak_adapter.py +251 -0
- mute_agent/listener/listener.py +610 -0
- mute_agent/listener/state_observer.py +436 -0
- mute_agent/listener/threshold_config.py +313 -0
- mute_agent/super_system/__init__.py +1 -0
- mute_agent/super_system/router.py +204 -0
- mute_agent/visualization/__init__.py +10 -0
- mute_agent/visualization/graph_debugger.py +502 -0
- nexus/README.md +60 -0
- nexus/__init__.py +51 -0
- nexus/arbiter.py +359 -0
- nexus/client.py +466 -0
- nexus/dmz.py +444 -0
- nexus/escrow.py +430 -0
- nexus/exceptions.py +286 -0
- nexus/pyproject.toml +36 -0
- nexus/registry.py +393 -0
- nexus/reputation.py +425 -0
- nexus/schemas/__init__.py +51 -0
- nexus/schemas/compliance.py +276 -0
- nexus/schemas/escrow.py +251 -0
- nexus/schemas/manifest.py +225 -0
- nexus/schemas/receipt.py +208 -0
- nexus/tests/__init__.py +0 -0
- nexus/tests/conftest.py +146 -0
- nexus/tests/test_arbiter.py +192 -0
- nexus/tests/test_dmz.py +194 -0
- nexus/tests/test_escrow.py +276 -0
- nexus/tests/test_exceptions.py +225 -0
- nexus/tests/test_registry.py +232 -0
- nexus/tests/test_reputation.py +328 -0
- nexus/tests/test_schemas.py +295 -0
|
@@ -0,0 +1,482 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Agent Orchestrator - Multi-Agent Coordination and Communication
|
|
5
|
+
|
|
6
|
+
The Orchestrator manages coordination, communication, and workflow execution
|
|
7
|
+
across multiple agents. This addresses the gap in multi-agent support noted
|
|
8
|
+
in competitive analysis.
|
|
9
|
+
|
|
10
|
+
Research Foundations:
|
|
11
|
+
- Multi-agent coordination patterns from "Multi-Agent Systems: A Survey"
|
|
12
|
+
(arXiv:2308.05391, 2023) - hierarchical control, message passing
|
|
13
|
+
- Agent-to-Agent communication protocols (A2A standard)
|
|
14
|
+
- Graph-based workflow execution inspired by LangGraph
|
|
15
|
+
- Fault tolerance patterns from "Fault-Tolerant Multi-Agent Systems"
|
|
16
|
+
(IEEE Trans. SMC, 2024)
|
|
17
|
+
|
|
18
|
+
See docs/RESEARCH_FOUNDATION.md for complete references.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from typing import Any, Dict, List, Optional, Callable, Set, Tuple
|
|
22
|
+
from dataclasses import dataclass, field
|
|
23
|
+
from enum import Enum
|
|
24
|
+
from datetime import datetime
|
|
25
|
+
import uuid
|
|
26
|
+
import asyncio
|
|
27
|
+
from collections import defaultdict
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class AgentRole(Enum):
|
|
31
|
+
"""Roles agents can play in orchestrated workflows"""
|
|
32
|
+
WORKER = "worker"
|
|
33
|
+
SUPERVISOR = "supervisor"
|
|
34
|
+
COORDINATOR = "coordinator"
|
|
35
|
+
SPECIALIST = "specialist"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class MessageType(Enum):
|
|
39
|
+
"""Types of inter-agent messages"""
|
|
40
|
+
REQUEST = "request"
|
|
41
|
+
RESPONSE = "response"
|
|
42
|
+
NOTIFICATION = "notification"
|
|
43
|
+
ERROR = "error"
|
|
44
|
+
HANDOFF = "handoff"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class OrchestrationType(Enum):
|
|
48
|
+
"""Patterns for agent orchestration"""
|
|
49
|
+
SEQUENTIAL = "sequential" # Agents execute in sequence
|
|
50
|
+
PARALLEL = "parallel" # Agents execute in parallel
|
|
51
|
+
HIERARCHICAL = "hierarchical" # Supervisor-worker pattern
|
|
52
|
+
GRAPH = "graph" # Graph-based workflow (like LangGraph)
|
|
53
|
+
SWARM = "swarm" # Emergent coordination
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
@dataclass
|
|
57
|
+
class Message:
|
|
58
|
+
"""Inter-agent message"""
|
|
59
|
+
message_id: str
|
|
60
|
+
from_agent: str
|
|
61
|
+
to_agent: str
|
|
62
|
+
message_type: MessageType
|
|
63
|
+
content: Dict[str, Any]
|
|
64
|
+
timestamp: datetime = field(default_factory=datetime.now)
|
|
65
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@dataclass
|
|
69
|
+
class AgentNode:
|
|
70
|
+
"""
|
|
71
|
+
A node in the orchestration graph representing an agent.
|
|
72
|
+
|
|
73
|
+
Attributes:
|
|
74
|
+
agent_id: Unique identifier for the agent
|
|
75
|
+
role: Role of the agent in the workflow
|
|
76
|
+
capabilities: List of capabilities this agent provides
|
|
77
|
+
dependencies: Agent IDs this agent depends on
|
|
78
|
+
metadata: Additional agent metadata
|
|
79
|
+
"""
|
|
80
|
+
agent_id: str
|
|
81
|
+
role: AgentRole
|
|
82
|
+
capabilities: List[str] = field(default_factory=list)
|
|
83
|
+
dependencies: Set[str] = field(default_factory=set)
|
|
84
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@dataclass
|
|
88
|
+
class WorkflowState:
|
|
89
|
+
"""State of an orchestrated workflow"""
|
|
90
|
+
workflow_id: str
|
|
91
|
+
status: str # "pending", "running", "completed", "failed"
|
|
92
|
+
agents: Dict[str, AgentNode]
|
|
93
|
+
messages: List[Message]
|
|
94
|
+
results: Dict[str, Any]
|
|
95
|
+
errors: List[str]
|
|
96
|
+
started_at: Optional[datetime] = None
|
|
97
|
+
completed_at: Optional[datetime] = None
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class AgentOrchestrator:
|
|
101
|
+
"""
|
|
102
|
+
Orchestrator for multi-agent coordination and workflows.
|
|
103
|
+
|
|
104
|
+
Features:
|
|
105
|
+
- Sequential, parallel, and hierarchical agent execution patterns
|
|
106
|
+
- Inter-agent message passing and communication
|
|
107
|
+
- Graph-based workflow definition (inspired by LangGraph)
|
|
108
|
+
- Fault tolerance with circuit breakers and retries
|
|
109
|
+
- Supervision hierarchies to prevent cascade failures
|
|
110
|
+
|
|
111
|
+
Usage:
|
|
112
|
+
orchestrator = AgentOrchestrator(control_plane)
|
|
113
|
+
|
|
114
|
+
# Register agents
|
|
115
|
+
orchestrator.register_agent("retriever", AgentRole.SPECIALIST, ["document_search"])
|
|
116
|
+
orchestrator.register_agent("reasoner", AgentRole.SPECIALIST, ["analysis"])
|
|
117
|
+
orchestrator.register_agent("supervisor", AgentRole.SUPERVISOR, ["oversight"])
|
|
118
|
+
|
|
119
|
+
# Define workflow
|
|
120
|
+
workflow = orchestrator.create_workflow("rag_pipeline")
|
|
121
|
+
workflow.add_agent("retriever")
|
|
122
|
+
workflow.add_agent("reasoner", dependencies={"retriever"})
|
|
123
|
+
workflow.add_supervisor("supervisor", watches=["retriever", "reasoner"])
|
|
124
|
+
|
|
125
|
+
# Execute
|
|
126
|
+
result = await orchestrator.execute_workflow(workflow.workflow_id, input_data)
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
def __init__(self, control_plane=None):
|
|
130
|
+
"""
|
|
131
|
+
Initialize the orchestrator.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
control_plane: Optional AgentControlPlane for governance integration
|
|
135
|
+
"""
|
|
136
|
+
self.control_plane = control_plane
|
|
137
|
+
self._agents: Dict[str, AgentNode] = {}
|
|
138
|
+
self._workflows: Dict[str, WorkflowState] = {}
|
|
139
|
+
self._message_queue: asyncio.Queue = asyncio.Queue()
|
|
140
|
+
self._supervisors: Dict[str, List[str]] = {} # supervisor_id -> [watched_agent_ids]
|
|
141
|
+
|
|
142
|
+
def register_agent(
|
|
143
|
+
self,
|
|
144
|
+
agent_id: str,
|
|
145
|
+
role: AgentRole,
|
|
146
|
+
capabilities: Optional[List[str]] = None,
|
|
147
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
148
|
+
) -> AgentNode:
|
|
149
|
+
"""
|
|
150
|
+
Register an agent for orchestration.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
agent_id: Unique identifier
|
|
154
|
+
role: Agent's role
|
|
155
|
+
capabilities: List of capabilities
|
|
156
|
+
metadata: Additional metadata
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
AgentNode representing the registered agent
|
|
160
|
+
"""
|
|
161
|
+
if agent_id in self._agents:
|
|
162
|
+
raise ValueError(f"Agent '{agent_id}' already registered")
|
|
163
|
+
|
|
164
|
+
agent = AgentNode(
|
|
165
|
+
agent_id=agent_id,
|
|
166
|
+
role=role,
|
|
167
|
+
capabilities=capabilities or [],
|
|
168
|
+
metadata=metadata or {}
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
self._agents[agent_id] = agent
|
|
172
|
+
return agent
|
|
173
|
+
|
|
174
|
+
def unregister_agent(self, agent_id: str) -> bool:
|
|
175
|
+
"""Remove an agent from the orchestrator"""
|
|
176
|
+
if agent_id in self._agents:
|
|
177
|
+
del self._agents[agent_id]
|
|
178
|
+
return True
|
|
179
|
+
return False
|
|
180
|
+
|
|
181
|
+
def create_workflow(
|
|
182
|
+
self,
|
|
183
|
+
name: str,
|
|
184
|
+
orchestration_type: OrchestrationType = OrchestrationType.SEQUENTIAL
|
|
185
|
+
) -> WorkflowState:
|
|
186
|
+
"""
|
|
187
|
+
Create a new workflow.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
name: Workflow name
|
|
191
|
+
orchestration_type: How agents should be coordinated
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
WorkflowState for the new workflow
|
|
195
|
+
"""
|
|
196
|
+
workflow_id = str(uuid.uuid4())
|
|
197
|
+
|
|
198
|
+
workflow = WorkflowState(
|
|
199
|
+
workflow_id=workflow_id,
|
|
200
|
+
status="pending",
|
|
201
|
+
agents={},
|
|
202
|
+
messages=[],
|
|
203
|
+
results={},
|
|
204
|
+
errors=[]
|
|
205
|
+
)
|
|
206
|
+
|
|
207
|
+
self._workflows[workflow_id] = workflow
|
|
208
|
+
return workflow
|
|
209
|
+
|
|
210
|
+
def add_agent_to_workflow(
|
|
211
|
+
self,
|
|
212
|
+
workflow_id: str,
|
|
213
|
+
agent_id: str,
|
|
214
|
+
dependencies: Optional[Set[str]] = None
|
|
215
|
+
) -> bool:
|
|
216
|
+
"""
|
|
217
|
+
Add an agent to a workflow.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
workflow_id: Workflow ID
|
|
221
|
+
agent_id: Agent to add
|
|
222
|
+
dependencies: Other agents this depends on
|
|
223
|
+
|
|
224
|
+
Returns:
|
|
225
|
+
True if added successfully
|
|
226
|
+
"""
|
|
227
|
+
if workflow_id not in self._workflows:
|
|
228
|
+
raise ValueError(f"Workflow '{workflow_id}' not found")
|
|
229
|
+
|
|
230
|
+
if agent_id not in self._agents:
|
|
231
|
+
raise ValueError(f"Agent '{agent_id}' not registered")
|
|
232
|
+
|
|
233
|
+
workflow = self._workflows[workflow_id]
|
|
234
|
+
agent = self._agents[agent_id]
|
|
235
|
+
|
|
236
|
+
# Create a copy with dependencies
|
|
237
|
+
agent_copy = AgentNode(
|
|
238
|
+
agent_id=agent.agent_id,
|
|
239
|
+
role=agent.role,
|
|
240
|
+
capabilities=agent.capabilities.copy(),
|
|
241
|
+
dependencies=dependencies or set(),
|
|
242
|
+
metadata=agent.metadata.copy()
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
workflow.agents[agent_id] = agent_copy
|
|
246
|
+
return True
|
|
247
|
+
|
|
248
|
+
def add_supervisor(
|
|
249
|
+
self,
|
|
250
|
+
supervisor_id: str,
|
|
251
|
+
watched_agents: List[str]
|
|
252
|
+
):
|
|
253
|
+
"""
|
|
254
|
+
Add a supervisor agent to watch other agents.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
supervisor_id: ID of the supervisor agent
|
|
258
|
+
watched_agents: List of agent IDs to supervise
|
|
259
|
+
"""
|
|
260
|
+
if supervisor_id not in self._agents:
|
|
261
|
+
raise ValueError(f"Supervisor '{supervisor_id}' not registered")
|
|
262
|
+
|
|
263
|
+
supervisor = self._agents[supervisor_id]
|
|
264
|
+
if supervisor.role != AgentRole.SUPERVISOR:
|
|
265
|
+
raise ValueError(f"Agent '{supervisor_id}' is not a supervisor")
|
|
266
|
+
|
|
267
|
+
self._supervisors[supervisor_id] = watched_agents
|
|
268
|
+
|
|
269
|
+
async def send_message(
|
|
270
|
+
self,
|
|
271
|
+
from_agent: str,
|
|
272
|
+
to_agent: str,
|
|
273
|
+
message_type: MessageType,
|
|
274
|
+
content: Dict[str, Any],
|
|
275
|
+
metadata: Optional[Dict[str, Any]] = None
|
|
276
|
+
) -> Message:
|
|
277
|
+
"""
|
|
278
|
+
Send a message from one agent to another.
|
|
279
|
+
|
|
280
|
+
Args:
|
|
281
|
+
from_agent: Sender agent ID
|
|
282
|
+
to_agent: Recipient agent ID
|
|
283
|
+
message_type: Type of message
|
|
284
|
+
content: Message content
|
|
285
|
+
metadata: Optional metadata
|
|
286
|
+
|
|
287
|
+
Returns:
|
|
288
|
+
The sent message
|
|
289
|
+
"""
|
|
290
|
+
message = Message(
|
|
291
|
+
message_id=str(uuid.uuid4()),
|
|
292
|
+
from_agent=from_agent,
|
|
293
|
+
to_agent=to_agent,
|
|
294
|
+
message_type=message_type,
|
|
295
|
+
content=content,
|
|
296
|
+
metadata=metadata or {}
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
await self._message_queue.put(message)
|
|
300
|
+
return message
|
|
301
|
+
|
|
302
|
+
async def execute_workflow(
|
|
303
|
+
self,
|
|
304
|
+
workflow_id: str,
|
|
305
|
+
input_data: Dict[str, Any],
|
|
306
|
+
timeout: Optional[float] = None
|
|
307
|
+
) -> Dict[str, Any]:
|
|
308
|
+
"""
|
|
309
|
+
Execute a workflow.
|
|
310
|
+
|
|
311
|
+
Args:
|
|
312
|
+
workflow_id: Workflow to execute
|
|
313
|
+
input_data: Input data for the workflow
|
|
314
|
+
timeout: Optional timeout in seconds
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
Results dictionary
|
|
318
|
+
"""
|
|
319
|
+
if workflow_id not in self._workflows:
|
|
320
|
+
raise ValueError(f"Workflow '{workflow_id}' not found")
|
|
321
|
+
|
|
322
|
+
workflow = self._workflows[workflow_id]
|
|
323
|
+
workflow.status = "running"
|
|
324
|
+
workflow.started_at = datetime.now()
|
|
325
|
+
|
|
326
|
+
try:
|
|
327
|
+
# Execute based on workflow structure
|
|
328
|
+
# This is a simplified implementation
|
|
329
|
+
# In production, would use proper graph execution engine
|
|
330
|
+
|
|
331
|
+
results = await self._execute_agents_in_order(workflow, input_data)
|
|
332
|
+
|
|
333
|
+
workflow.status = "completed"
|
|
334
|
+
workflow.results = results
|
|
335
|
+
workflow.completed_at = datetime.now()
|
|
336
|
+
|
|
337
|
+
return {
|
|
338
|
+
"success": True,
|
|
339
|
+
"results": results,
|
|
340
|
+
"workflow_id": workflow_id
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
except Exception as e:
|
|
344
|
+
workflow.status = "failed"
|
|
345
|
+
workflow.errors.append(str(e))
|
|
346
|
+
workflow.completed_at = datetime.now()
|
|
347
|
+
|
|
348
|
+
return {
|
|
349
|
+
"success": False,
|
|
350
|
+
"error": str(e),
|
|
351
|
+
"workflow_id": workflow_id
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
async def _execute_agents_in_order(
|
|
355
|
+
self,
|
|
356
|
+
workflow: WorkflowState,
|
|
357
|
+
input_data: Dict[str, Any]
|
|
358
|
+
) -> Dict[str, Any]:
|
|
359
|
+
"""
|
|
360
|
+
Execute agents respecting dependencies.
|
|
361
|
+
(Simplified topological sort execution)
|
|
362
|
+
"""
|
|
363
|
+
results = {}
|
|
364
|
+
executed = set()
|
|
365
|
+
|
|
366
|
+
# Simple execution order: agents without dependencies first
|
|
367
|
+
while len(executed) < len(workflow.agents):
|
|
368
|
+
made_progress = False
|
|
369
|
+
|
|
370
|
+
for agent_id, agent in workflow.agents.items():
|
|
371
|
+
if agent_id in executed:
|
|
372
|
+
continue
|
|
373
|
+
|
|
374
|
+
# Check if dependencies are satisfied
|
|
375
|
+
if agent.dependencies.issubset(executed):
|
|
376
|
+
# Execute this agent
|
|
377
|
+
# In production, this would call the actual agent
|
|
378
|
+
results[agent_id] = {
|
|
379
|
+
"agent_id": agent_id,
|
|
380
|
+
"status": "completed",
|
|
381
|
+
"timestamp": datetime.now().isoformat()
|
|
382
|
+
}
|
|
383
|
+
executed.add(agent_id)
|
|
384
|
+
made_progress = True
|
|
385
|
+
|
|
386
|
+
if not made_progress:
|
|
387
|
+
raise RuntimeError("Circular dependency detected in workflow")
|
|
388
|
+
|
|
389
|
+
return results
|
|
390
|
+
|
|
391
|
+
def get_workflow_status(self, workflow_id: str) -> Optional[Dict[str, Any]]:
|
|
392
|
+
"""Get the current status of a workflow"""
|
|
393
|
+
workflow = self._workflows.get(workflow_id)
|
|
394
|
+
if not workflow:
|
|
395
|
+
return None
|
|
396
|
+
|
|
397
|
+
return {
|
|
398
|
+
"workflow_id": workflow.workflow_id,
|
|
399
|
+
"status": workflow.status,
|
|
400
|
+
"agents": list(workflow.agents.keys()),
|
|
401
|
+
"started_at": workflow.started_at.isoformat() if workflow.started_at else None,
|
|
402
|
+
"completed_at": workflow.completed_at.isoformat() if workflow.completed_at else None,
|
|
403
|
+
"results": workflow.results,
|
|
404
|
+
"errors": workflow.errors
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
def get_agent_info(self, agent_id: str) -> Optional[Dict[str, Any]]:
|
|
408
|
+
"""Get information about a registered agent"""
|
|
409
|
+
agent = self._agents.get(agent_id)
|
|
410
|
+
if not agent:
|
|
411
|
+
return None
|
|
412
|
+
|
|
413
|
+
return {
|
|
414
|
+
"agent_id": agent.agent_id,
|
|
415
|
+
"role": agent.role.value,
|
|
416
|
+
"capabilities": agent.capabilities,
|
|
417
|
+
"metadata": agent.metadata
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
def list_agents(self) -> List[Dict[str, Any]]:
|
|
421
|
+
"""List all registered agents"""
|
|
422
|
+
return [self.get_agent_info(aid) for aid in self._agents.keys()]
|
|
423
|
+
|
|
424
|
+
def list_workflows(self) -> List[Dict[str, Any]]:
|
|
425
|
+
"""List all workflows"""
|
|
426
|
+
return [
|
|
427
|
+
{
|
|
428
|
+
"workflow_id": wid,
|
|
429
|
+
"status": w.status,
|
|
430
|
+
"agent_count": len(w.agents)
|
|
431
|
+
}
|
|
432
|
+
for wid, w in self._workflows.items()
|
|
433
|
+
]
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
def create_rag_pipeline(orchestrator: AgentOrchestrator) -> str:
|
|
437
|
+
"""
|
|
438
|
+
Example: Create a RAG (Retrieval-Augmented Generation) pipeline.
|
|
439
|
+
|
|
440
|
+
Args:
|
|
441
|
+
orchestrator: AgentOrchestrator instance
|
|
442
|
+
|
|
443
|
+
Returns:
|
|
444
|
+
workflow_id for the created pipeline
|
|
445
|
+
"""
|
|
446
|
+
# Register agents
|
|
447
|
+
orchestrator.register_agent(
|
|
448
|
+
"retriever",
|
|
449
|
+
AgentRole.SPECIALIST,
|
|
450
|
+
capabilities=["document_search", "vector_search"]
|
|
451
|
+
)
|
|
452
|
+
|
|
453
|
+
orchestrator.register_agent(
|
|
454
|
+
"reasoner",
|
|
455
|
+
AgentRole.SPECIALIST,
|
|
456
|
+
capabilities=["analysis", "generation"]
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
orchestrator.register_agent(
|
|
460
|
+
"validator",
|
|
461
|
+
AgentRole.SUPERVISOR,
|
|
462
|
+
capabilities=["quality_check", "safety_check"]
|
|
463
|
+
)
|
|
464
|
+
|
|
465
|
+
# Create workflow
|
|
466
|
+
workflow = orchestrator.create_workflow(
|
|
467
|
+
"rag_pipeline",
|
|
468
|
+
OrchestrationType.SEQUENTIAL
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
# Add agents in order
|
|
472
|
+
orchestrator.add_agent_to_workflow(workflow.workflow_id, "retriever")
|
|
473
|
+
orchestrator.add_agent_to_workflow(
|
|
474
|
+
workflow.workflow_id,
|
|
475
|
+
"reasoner",
|
|
476
|
+
dependencies={"retriever"}
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
# Add supervisor
|
|
480
|
+
orchestrator.add_supervisor("validator", ["retriever", "reasoner"])
|
|
481
|
+
|
|
482
|
+
return workflow.workflow_id
|