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,232 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
OpenTelemetry Tracing for Agent OS Kernel.
|
|
5
|
+
|
|
6
|
+
Every kernel operation emits traces for debugging and compliance.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from opentelemetry import trace
|
|
10
|
+
from opentelemetry.sdk.trace import TracerProvider
|
|
11
|
+
from opentelemetry.sdk.trace.export import BatchSpanProcessor
|
|
12
|
+
from opentelemetry.sdk.resources import Resource
|
|
13
|
+
from opentelemetry.trace import Status, StatusCode
|
|
14
|
+
from functools import wraps
|
|
15
|
+
from typing import Any, Callable, Optional
|
|
16
|
+
import time
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class KernelTracer:
|
|
20
|
+
"""
|
|
21
|
+
OpenTelemetry tracer for Agent OS kernel.
|
|
22
|
+
|
|
23
|
+
Usage:
|
|
24
|
+
tracer = KernelTracer(service_name="agent-os")
|
|
25
|
+
|
|
26
|
+
# Trace an operation
|
|
27
|
+
with tracer.span("policy_check", {"agent_id": "001", "action": "query"}):
|
|
28
|
+
result = policy_engine.check(action)
|
|
29
|
+
|
|
30
|
+
# Or use decorator
|
|
31
|
+
@tracer.trace("execute_action")
|
|
32
|
+
async def execute(action, params):
|
|
33
|
+
...
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
def __init__(
|
|
37
|
+
self,
|
|
38
|
+
service_name: str = "agent-os-kernel",
|
|
39
|
+
exporter=None,
|
|
40
|
+
attributes: Optional[dict] = None
|
|
41
|
+
):
|
|
42
|
+
"""
|
|
43
|
+
Initialize tracer.
|
|
44
|
+
|
|
45
|
+
Args:
|
|
46
|
+
service_name: Name of the service
|
|
47
|
+
exporter: OpenTelemetry exporter (default: console)
|
|
48
|
+
attributes: Additional resource attributes
|
|
49
|
+
"""
|
|
50
|
+
resource_attrs = {
|
|
51
|
+
"service.name": service_name,
|
|
52
|
+
"service.version": "0.4.0",
|
|
53
|
+
"deployment.environment": "production"
|
|
54
|
+
}
|
|
55
|
+
if attributes:
|
|
56
|
+
resource_attrs.update(attributes)
|
|
57
|
+
|
|
58
|
+
resource = Resource.create(resource_attrs)
|
|
59
|
+
provider = TracerProvider(resource=resource)
|
|
60
|
+
|
|
61
|
+
if exporter:
|
|
62
|
+
provider.add_span_processor(BatchSpanProcessor(exporter))
|
|
63
|
+
|
|
64
|
+
trace.set_tracer_provider(provider)
|
|
65
|
+
self.tracer = trace.get_tracer(__name__)
|
|
66
|
+
|
|
67
|
+
def span(self, name: str, attributes: Optional[dict] = None):
|
|
68
|
+
"""
|
|
69
|
+
Create a span context manager.
|
|
70
|
+
|
|
71
|
+
Usage:
|
|
72
|
+
with tracer.span("operation", {"key": "value"}):
|
|
73
|
+
do_work()
|
|
74
|
+
"""
|
|
75
|
+
span = self.tracer.start_span(name)
|
|
76
|
+
if attributes:
|
|
77
|
+
for key, value in attributes.items():
|
|
78
|
+
span.set_attribute(key, value)
|
|
79
|
+
return SpanContext(span)
|
|
80
|
+
|
|
81
|
+
def trace(self, name: str, extract_attributes: Optional[Callable] = None):
|
|
82
|
+
"""
|
|
83
|
+
Decorator to trace a function.
|
|
84
|
+
|
|
85
|
+
Usage:
|
|
86
|
+
@tracer.trace("my_function")
|
|
87
|
+
def my_function(x, y):
|
|
88
|
+
return x + y
|
|
89
|
+
"""
|
|
90
|
+
def decorator(func):
|
|
91
|
+
@wraps(func)
|
|
92
|
+
async def async_wrapper(*args, **kwargs):
|
|
93
|
+
attrs = {}
|
|
94
|
+
if extract_attributes:
|
|
95
|
+
attrs = extract_attributes(*args, **kwargs)
|
|
96
|
+
|
|
97
|
+
with self.span(name, attrs) as span:
|
|
98
|
+
try:
|
|
99
|
+
result = await func(*args, **kwargs)
|
|
100
|
+
span.set_attribute("status", "success")
|
|
101
|
+
return result
|
|
102
|
+
except Exception as e:
|
|
103
|
+
span.record_exception(e)
|
|
104
|
+
span.set_status(Status(StatusCode.ERROR, str(e)))
|
|
105
|
+
raise
|
|
106
|
+
|
|
107
|
+
@wraps(func)
|
|
108
|
+
def sync_wrapper(*args, **kwargs):
|
|
109
|
+
attrs = {}
|
|
110
|
+
if extract_attributes:
|
|
111
|
+
attrs = extract_attributes(*args, **kwargs)
|
|
112
|
+
|
|
113
|
+
with self.span(name, attrs) as span:
|
|
114
|
+
try:
|
|
115
|
+
result = func(*args, **kwargs)
|
|
116
|
+
span.set_attribute("status", "success")
|
|
117
|
+
return result
|
|
118
|
+
except Exception as e:
|
|
119
|
+
span.record_exception(e)
|
|
120
|
+
span.set_status(Status(StatusCode.ERROR, str(e)))
|
|
121
|
+
raise
|
|
122
|
+
|
|
123
|
+
import asyncio
|
|
124
|
+
if asyncio.iscoroutinefunction(func):
|
|
125
|
+
return async_wrapper
|
|
126
|
+
return sync_wrapper
|
|
127
|
+
|
|
128
|
+
return decorator
|
|
129
|
+
|
|
130
|
+
# =========================================================================
|
|
131
|
+
# Pre-built Kernel Traces
|
|
132
|
+
# =========================================================================
|
|
133
|
+
|
|
134
|
+
def trace_policy_check(self, agent_id: str, action: str, policies: list):
|
|
135
|
+
"""Start a policy check trace."""
|
|
136
|
+
return self.span("kernel.policy_check", {
|
|
137
|
+
"agent.id": agent_id,
|
|
138
|
+
"action": action,
|
|
139
|
+
"policies": ",".join(policies),
|
|
140
|
+
"kernel.component": "policy_engine"
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
def trace_execution(self, agent_id: str, action: str):
|
|
144
|
+
"""Start an execution trace."""
|
|
145
|
+
return self.span("kernel.execute", {
|
|
146
|
+
"agent.id": agent_id,
|
|
147
|
+
"action": action,
|
|
148
|
+
"kernel.component": "dispatcher"
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
def trace_signal(self, agent_id: str, signal: str, reason: str):
|
|
152
|
+
"""Start a signal trace."""
|
|
153
|
+
return self.span("kernel.signal", {
|
|
154
|
+
"agent.id": agent_id,
|
|
155
|
+
"signal": signal,
|
|
156
|
+
"reason": reason,
|
|
157
|
+
"kernel.component": "signal_dispatcher"
|
|
158
|
+
})
|
|
159
|
+
|
|
160
|
+
def trace_violation(self, agent_id: str, action: str, policy: str, reason: str):
|
|
161
|
+
"""Start a violation trace."""
|
|
162
|
+
return self.span("kernel.violation", {
|
|
163
|
+
"agent.id": agent_id,
|
|
164
|
+
"action": action,
|
|
165
|
+
"policy": policy,
|
|
166
|
+
"violation.reason": reason,
|
|
167
|
+
"kernel.component": "policy_engine",
|
|
168
|
+
"severity": "high"
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
class SpanContext:
|
|
173
|
+
"""Context manager for spans."""
|
|
174
|
+
|
|
175
|
+
def __init__(self, span):
|
|
176
|
+
self.span = span
|
|
177
|
+
self.start_time = None
|
|
178
|
+
|
|
179
|
+
def __enter__(self):
|
|
180
|
+
self.start_time = time.time()
|
|
181
|
+
return self
|
|
182
|
+
|
|
183
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
184
|
+
duration = time.time() - self.start_time
|
|
185
|
+
self.span.set_attribute("duration_ms", duration * 1000)
|
|
186
|
+
|
|
187
|
+
if exc_type:
|
|
188
|
+
self.span.record_exception(exc_val)
|
|
189
|
+
self.span.set_status(Status(StatusCode.ERROR, str(exc_val)))
|
|
190
|
+
else:
|
|
191
|
+
self.span.set_status(Status(StatusCode.OK))
|
|
192
|
+
|
|
193
|
+
self.span.end()
|
|
194
|
+
return False
|
|
195
|
+
|
|
196
|
+
def set_attribute(self, key: str, value: Any):
|
|
197
|
+
"""Set an attribute on the span."""
|
|
198
|
+
self.span.set_attribute(key, value)
|
|
199
|
+
|
|
200
|
+
def add_event(self, name: str, attributes: Optional[dict] = None):
|
|
201
|
+
"""Add an event to the span."""
|
|
202
|
+
self.span.add_event(name, attributes or {})
|
|
203
|
+
|
|
204
|
+
def record_exception(self, exception: Exception):
|
|
205
|
+
"""Record an exception."""
|
|
206
|
+
self.span.record_exception(exception)
|
|
207
|
+
|
|
208
|
+
def set_status(self, status):
|
|
209
|
+
"""Set the span status."""
|
|
210
|
+
self.span.set_status(status)
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def trace_operation(
|
|
214
|
+
tracer: KernelTracer,
|
|
215
|
+
name: str,
|
|
216
|
+
attributes: Optional[dict] = None
|
|
217
|
+
):
|
|
218
|
+
"""
|
|
219
|
+
Decorator to trace an operation.
|
|
220
|
+
|
|
221
|
+
Usage:
|
|
222
|
+
@trace_operation(tracer, "my_operation", {"key": "value"})
|
|
223
|
+
def my_function():
|
|
224
|
+
pass
|
|
225
|
+
"""
|
|
226
|
+
def decorator(func):
|
|
227
|
+
@wraps(func)
|
|
228
|
+
def wrapper(*args, **kwargs):
|
|
229
|
+
with tracer.span(name, attributes):
|
|
230
|
+
return func(*args, **kwargs)
|
|
231
|
+
return wrapper
|
|
232
|
+
return decorator
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Agent Primitives - Shared data models for Agent OS.
|
|
5
|
+
|
|
6
|
+
This is a Layer 1 primitive package providing foundational models
|
|
7
|
+
used across the Agent OS stack.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
__version__ = "3.1.0"
|
|
11
|
+
|
|
12
|
+
from .failures import (
|
|
13
|
+
FailureType,
|
|
14
|
+
FailureSeverity,
|
|
15
|
+
FailureTrace,
|
|
16
|
+
AgentFailure,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
__all__ = [
|
|
20
|
+
"FailureType",
|
|
21
|
+
"FailureSeverity",
|
|
22
|
+
"FailureTrace",
|
|
23
|
+
"AgentFailure",
|
|
24
|
+
]
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Failure models for Agent OS.
|
|
5
|
+
|
|
6
|
+
These are the foundational failure tracking primitives used across the stack.
|
|
7
|
+
Extracted to Layer 1 to allow proper dependency layering.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from typing import Dict, List, Optional, Any
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from enum import Enum
|
|
13
|
+
from pydantic import BaseModel, Field, ConfigDict
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class FailureType(str, Enum):
|
|
17
|
+
"""Types of agent failures."""
|
|
18
|
+
BLOCKED_BY_CONTROL_PLANE = "blocked_by_control_plane"
|
|
19
|
+
TIMEOUT = "timeout"
|
|
20
|
+
INVALID_ACTION = "invalid_action"
|
|
21
|
+
RESOURCE_EXHAUSTED = "resource_exhausted"
|
|
22
|
+
LOGIC_ERROR = "logic_error"
|
|
23
|
+
UNKNOWN = "unknown"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class FailureSeverity(str, Enum):
|
|
27
|
+
"""Severity levels for failures."""
|
|
28
|
+
LOW = "low"
|
|
29
|
+
MEDIUM = "medium"
|
|
30
|
+
HIGH = "high"
|
|
31
|
+
CRITICAL = "critical"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class FailureTrace(BaseModel):
|
|
35
|
+
"""Full trace of an agent failure including reasoning chain."""
|
|
36
|
+
|
|
37
|
+
user_prompt: str = Field(..., description="Original user prompt that led to failure")
|
|
38
|
+
chain_of_thought: List[str] = Field(default_factory=list, description="Agent's reasoning steps")
|
|
39
|
+
failed_action: Dict[str, Any] = Field(..., description="The action that failed")
|
|
40
|
+
error_details: str = Field(..., description="Detailed error information")
|
|
41
|
+
timestamp: datetime = Field(default_factory=datetime.utcnow)
|
|
42
|
+
|
|
43
|
+
model_config = ConfigDict(
|
|
44
|
+
json_schema_extra={
|
|
45
|
+
"example": {
|
|
46
|
+
"user_prompt": "Delete the recent user records",
|
|
47
|
+
"chain_of_thought": [
|
|
48
|
+
"User wants to delete records",
|
|
49
|
+
"I need to identify which records are 'recent'",
|
|
50
|
+
"I'll delete from users table"
|
|
51
|
+
],
|
|
52
|
+
"failed_action": {
|
|
53
|
+
"action": "execute_sql",
|
|
54
|
+
"query": "DELETE FROM users WHERE created_at > '2024-01-01'"
|
|
55
|
+
},
|
|
56
|
+
"error_details": "Action blocked by control plane: Dangerous SQL query"
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class AgentFailure(BaseModel):
|
|
63
|
+
"""Represents a failure detected in an agent."""
|
|
64
|
+
|
|
65
|
+
agent_id: str = Field(..., description="Unique identifier for the agent")
|
|
66
|
+
failure_type: FailureType = Field(..., description="Type of failure")
|
|
67
|
+
severity: FailureSeverity = Field(default=FailureSeverity.MEDIUM)
|
|
68
|
+
timestamp: datetime = Field(default_factory=datetime.utcnow)
|
|
69
|
+
error_message: str = Field(..., description="Error message from the failure")
|
|
70
|
+
context: Dict[str, Any] = Field(default_factory=dict, description="Additional context")
|
|
71
|
+
stack_trace: Optional[str] = Field(None, description="Stack trace if available")
|
|
72
|
+
failure_trace: Optional[FailureTrace] = Field(None, description="Full failure trace if available")
|
|
73
|
+
|
|
74
|
+
model_config = ConfigDict(
|
|
75
|
+
json_schema_extra={
|
|
76
|
+
"example": {
|
|
77
|
+
"agent_id": "agent-123",
|
|
78
|
+
"failure_type": "blocked_by_control_plane",
|
|
79
|
+
"severity": "high",
|
|
80
|
+
"error_message": "Agent action blocked by control plane policy",
|
|
81
|
+
"context": {"action": "delete_file", "resource": "/etc/passwd"}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
)
|
|
File without changes
|
amb_core/__init__.py
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
AMB Core - A lightweight, broker-agnostic message bus for AI Agents.
|
|
5
|
+
|
|
6
|
+
AMB (Agent Message Bus) provides a decoupled communication layer that allows
|
|
7
|
+
AI agents to emit signals, broadcast intentions, and coordinate without tight
|
|
8
|
+
coupling between senders and receivers.
|
|
9
|
+
|
|
10
|
+
Key Features:
|
|
11
|
+
- Broker-agnostic: Works with Redis, RabbitMQ, Kafka, or in-memory
|
|
12
|
+
- Async-first: Built on asyncio/anyio for non-blocking operation
|
|
13
|
+
- Multiple patterns: Fire-and-forget, acknowledgment, request-response
|
|
14
|
+
- Type-safe: Full type hints with Pydantic validation
|
|
15
|
+
|
|
16
|
+
New in v0.2.0:
|
|
17
|
+
- Message persistence for replay capability (AMB-001)
|
|
18
|
+
- Dead Letter Queue for failed messages (AMB-002)
|
|
19
|
+
- Schema validation via SchemaRegistry (AMB-003)
|
|
20
|
+
- Distributed tracing support (AMB-004)
|
|
21
|
+
- Message prioritization (AMB-005)
|
|
22
|
+
- Message TTL/expiration (AMB-007)
|
|
23
|
+
|
|
24
|
+
Quick Start:
|
|
25
|
+
>>> import asyncio
|
|
26
|
+
>>> from amb_core import MessageBus, Message
|
|
27
|
+
>>>
|
|
28
|
+
>>> async def main():
|
|
29
|
+
... async with MessageBus() as bus:
|
|
30
|
+
... await bus.publish("agent.thoughts", {"thought": "Hello!"})
|
|
31
|
+
>>>
|
|
32
|
+
>>> asyncio.run(main())
|
|
33
|
+
|
|
34
|
+
Advanced Usage:
|
|
35
|
+
>>> from amb_core import MessageBus, SchemaRegistry, Priority
|
|
36
|
+
>>> from pydantic import BaseModel
|
|
37
|
+
>>>
|
|
38
|
+
>>> class FraudAlert(BaseModel):
|
|
39
|
+
... transaction_id: str
|
|
40
|
+
... risk_score: float
|
|
41
|
+
>>>
|
|
42
|
+
>>> schemas = SchemaRegistry()
|
|
43
|
+
>>> schemas.register("fraud.alerts", FraudAlert)
|
|
44
|
+
>>>
|
|
45
|
+
>>> async def main():
|
|
46
|
+
... bus = MessageBus(
|
|
47
|
+
... persistence=True,
|
|
48
|
+
... schema_registry=schemas,
|
|
49
|
+
... dlq_enabled=True
|
|
50
|
+
... )
|
|
51
|
+
... async with bus:
|
|
52
|
+
... await bus.publish(
|
|
53
|
+
... "fraud.alerts",
|
|
54
|
+
... {"transaction_id": "tx123", "risk_score": 0.95},
|
|
55
|
+
... priority=Priority.CRITICAL,
|
|
56
|
+
... ttl_seconds=300
|
|
57
|
+
... )
|
|
58
|
+
|
|
59
|
+
For more information, see: https://github.com/microsoft/agent-governance-toolkit
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
from __future__ import annotations
|
|
63
|
+
|
|
64
|
+
__version__ = "3.1.0"
|
|
65
|
+
__author__ = "Microsoft Corporation"
|
|
66
|
+
__license__ = "MIT"
|
|
67
|
+
|
|
68
|
+
# Core models
|
|
69
|
+
from amb_core.models import Message, MessagePriority, Priority, MessageStatus
|
|
70
|
+
|
|
71
|
+
# Main bus
|
|
72
|
+
from amb_core.bus import MessageBus
|
|
73
|
+
|
|
74
|
+
# Broker interface
|
|
75
|
+
from amb_core.broker import BrokerAdapter, MessageHandler
|
|
76
|
+
from amb_core.memory_broker import InMemoryBroker
|
|
77
|
+
|
|
78
|
+
# Schema validation (AMB-003)
|
|
79
|
+
from amb_core.schema import (
|
|
80
|
+
SchemaRegistry,
|
|
81
|
+
Schema,
|
|
82
|
+
PydanticSchema,
|
|
83
|
+
DictSchema,
|
|
84
|
+
CallableSchema,
|
|
85
|
+
SchemaValidationError,
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# Dead Letter Queue (AMB-002)
|
|
89
|
+
from amb_core.dlq import (
|
|
90
|
+
DeadLetterQueue,
|
|
91
|
+
DLQEntry,
|
|
92
|
+
DLQReason,
|
|
93
|
+
DLQHandler,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# Persistence (AMB-001)
|
|
97
|
+
from amb_core.persistence import (
|
|
98
|
+
MessageStore,
|
|
99
|
+
InMemoryMessageStore,
|
|
100
|
+
FileMessageStore,
|
|
101
|
+
PersistedMessage,
|
|
102
|
+
MessageStatus as PersistenceMessageStatus,
|
|
103
|
+
)
|
|
104
|
+
|
|
105
|
+
# Tracing (AMB-004)
|
|
106
|
+
from amb_core.tracing import (
|
|
107
|
+
TraceContext,
|
|
108
|
+
TraceSpan,
|
|
109
|
+
get_current_trace,
|
|
110
|
+
inject_trace,
|
|
111
|
+
extract_trace,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# CloudEvents support (AMB-008)
|
|
115
|
+
from amb_core.cloudevents import (
|
|
116
|
+
CloudEvent,
|
|
117
|
+
CloudEventBatch,
|
|
118
|
+
to_cloudevent,
|
|
119
|
+
from_cloudevent,
|
|
120
|
+
to_http_headers,
|
|
121
|
+
from_http_headers,
|
|
122
|
+
topic_to_type,
|
|
123
|
+
type_to_topic,
|
|
124
|
+
CLOUDEVENTS_SPEC_VERSION,
|
|
125
|
+
CLOUDEVENTS_CONTENT_TYPE,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
__all__ = [
|
|
129
|
+
# Version info
|
|
130
|
+
"__version__",
|
|
131
|
+
"__author__",
|
|
132
|
+
"__license__",
|
|
133
|
+
# Core classes
|
|
134
|
+
"Message",
|
|
135
|
+
"MessagePriority",
|
|
136
|
+
"Priority",
|
|
137
|
+
"MessageStatus",
|
|
138
|
+
"MessageBus",
|
|
139
|
+
# Broker interface
|
|
140
|
+
"BrokerAdapter",
|
|
141
|
+
"MessageHandler",
|
|
142
|
+
"InMemoryBroker",
|
|
143
|
+
# Schema validation
|
|
144
|
+
"SchemaRegistry",
|
|
145
|
+
"Schema",
|
|
146
|
+
"PydanticSchema",
|
|
147
|
+
"DictSchema",
|
|
148
|
+
"CallableSchema",
|
|
149
|
+
"SchemaValidationError",
|
|
150
|
+
# DLQ
|
|
151
|
+
"DeadLetterQueue",
|
|
152
|
+
"DLQEntry",
|
|
153
|
+
"DLQReason",
|
|
154
|
+
"DLQHandler",
|
|
155
|
+
# Persistence
|
|
156
|
+
"MessageStore",
|
|
157
|
+
"InMemoryMessageStore",
|
|
158
|
+
"FileMessageStore",
|
|
159
|
+
"PersistedMessage",
|
|
160
|
+
# Tracing
|
|
161
|
+
"TraceContext",
|
|
162
|
+
"TraceSpan",
|
|
163
|
+
"get_current_trace",
|
|
164
|
+
"inject_trace",
|
|
165
|
+
"extract_trace",
|
|
166
|
+
# CloudEvents
|
|
167
|
+
"CloudEvent",
|
|
168
|
+
"CloudEventBatch",
|
|
169
|
+
"to_cloudevent",
|
|
170
|
+
"from_cloudevent",
|
|
171
|
+
"to_http_headers",
|
|
172
|
+
"from_http_headers",
|
|
173
|
+
"topic_to_type",
|
|
174
|
+
"type_to_topic",
|
|
175
|
+
"CLOUDEVENTS_SPEC_VERSION",
|
|
176
|
+
"CLOUDEVENTS_CONTENT_TYPE",
|
|
177
|
+
]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Broker adapters package for AMB.
|
|
5
|
+
|
|
6
|
+
This module provides optional adapters for different message brokers.
|
|
7
|
+
Each adapter requires its corresponding extra dependencies.
|
|
8
|
+
|
|
9
|
+
Available Adapters:
|
|
10
|
+
- RedisBroker: pip install amb-core[redis]
|
|
11
|
+
- RabbitMQBroker: pip install amb-core[rabbitmq]
|
|
12
|
+
- KafkaBroker: pip install amb-core[kafka]
|
|
13
|
+
- NATSBroker: pip install amb-core[nats]
|
|
14
|
+
- AzureServiceBusBroker: pip install amb-core[azure]
|
|
15
|
+
- AWSSQSBroker: pip install amb-core[aws]
|
|
16
|
+
|
|
17
|
+
Example:
|
|
18
|
+
>>> from amb_core.adapters.redis_broker import RedisBroker
|
|
19
|
+
>>> broker = RedisBroker(url="redis://localhost:6379/0")
|
|
20
|
+
|
|
21
|
+
>>> from amb_core.adapters.nats_broker import NATSBroker
|
|
22
|
+
>>> broker = NATSBroker(servers=["nats://localhost:4222"])
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from typing import TYPE_CHECKING, List
|
|
26
|
+
|
|
27
|
+
__all__: List[str] = [
|
|
28
|
+
"RedisBroker",
|
|
29
|
+
"RabbitMQBroker",
|
|
30
|
+
"KafkaBroker",
|
|
31
|
+
"NATSBroker",
|
|
32
|
+
"AzureServiceBusBroker",
|
|
33
|
+
"AWSSQSBroker",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def __getattr__(name: str):
|
|
38
|
+
"""Lazy import adapters to avoid import errors when dependencies missing."""
|
|
39
|
+
if name == "RedisBroker":
|
|
40
|
+
from amb_core.adapters.redis_broker import RedisBroker
|
|
41
|
+
return RedisBroker
|
|
42
|
+
elif name == "RabbitMQBroker":
|
|
43
|
+
from amb_core.adapters.rabbitmq_broker import RabbitMQBroker
|
|
44
|
+
return RabbitMQBroker
|
|
45
|
+
elif name == "KafkaBroker":
|
|
46
|
+
from amb_core.adapters.kafka_broker import KafkaBroker
|
|
47
|
+
return KafkaBroker
|
|
48
|
+
elif name == "NATSBroker":
|
|
49
|
+
from amb_core.adapters.nats_broker import NATSBroker
|
|
50
|
+
return NATSBroker
|
|
51
|
+
elif name == "AzureServiceBusBroker":
|
|
52
|
+
from amb_core.adapters.azure_servicebus_broker import AzureServiceBusBroker
|
|
53
|
+
return AzureServiceBusBroker
|
|
54
|
+
elif name == "AWSSQSBroker":
|
|
55
|
+
from amb_core.adapters.aws_sqs_broker import AWSSQSBroker
|
|
56
|
+
return AWSSQSBroker
|
|
57
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|