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
emk/store.py
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
# Public Preview — basic context/memory management
|
|
4
|
+
"""
|
|
5
|
+
Store — Abstract interfaces and mutable file-based implementation for episodic memory.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from abc import ABC, abstractmethod
|
|
9
|
+
from typing import List, Optional, Dict, Any
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
import json
|
|
12
|
+
import numpy as np
|
|
13
|
+
|
|
14
|
+
from emk.schema import Episode
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class VectorStoreAdapter(ABC):
|
|
18
|
+
"""Abstract interface for vector store implementations."""
|
|
19
|
+
|
|
20
|
+
@abstractmethod
|
|
21
|
+
def store(self, episode: Episode, embedding: Optional[np.ndarray] = None) -> str:
|
|
22
|
+
"""Store an episode. Returns the episode_id."""
|
|
23
|
+
pass
|
|
24
|
+
|
|
25
|
+
@abstractmethod
|
|
26
|
+
def retrieve(
|
|
27
|
+
self,
|
|
28
|
+
query_embedding: Optional[np.ndarray] = None,
|
|
29
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
30
|
+
limit: int = 10,
|
|
31
|
+
) -> List[Episode]:
|
|
32
|
+
"""Retrieve episodes, optionally filtered."""
|
|
33
|
+
pass
|
|
34
|
+
|
|
35
|
+
@abstractmethod
|
|
36
|
+
def get_by_id(self, episode_id: str) -> Optional[Episode]:
|
|
37
|
+
"""Retrieve a specific episode by ID."""
|
|
38
|
+
pass
|
|
39
|
+
|
|
40
|
+
def update(self, episode_id: str, episode: Episode) -> bool:
|
|
41
|
+
"""Update an existing episode. Returns True if found and updated."""
|
|
42
|
+
raise NotImplementedError
|
|
43
|
+
|
|
44
|
+
def delete(self, episode_id: str) -> bool:
|
|
45
|
+
"""Delete an episode by ID. Returns True if found and deleted."""
|
|
46
|
+
raise NotImplementedError
|
|
47
|
+
|
|
48
|
+
def retrieve_failures(
|
|
49
|
+
self,
|
|
50
|
+
query_embedding: Optional[np.ndarray] = None,
|
|
51
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
52
|
+
limit: int = 10,
|
|
53
|
+
) -> List[Episode]:
|
|
54
|
+
"""Retrieve episodes marked as failures."""
|
|
55
|
+
failure_filters = filters.copy() if filters else {}
|
|
56
|
+
failure_filters["is_failure"] = True
|
|
57
|
+
return self.retrieve(query_embedding=query_embedding, filters=failure_filters, limit=limit)
|
|
58
|
+
|
|
59
|
+
def retrieve_successes(
|
|
60
|
+
self,
|
|
61
|
+
query_embedding: Optional[np.ndarray] = None,
|
|
62
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
63
|
+
limit: int = 10,
|
|
64
|
+
) -> List[Episode]:
|
|
65
|
+
"""Retrieve episodes that are NOT failures."""
|
|
66
|
+
batch_size = min(limit * 3, 1000)
|
|
67
|
+
all_episodes = self.retrieve(query_embedding=query_embedding, filters=filters, limit=batch_size)
|
|
68
|
+
return [ep for ep in all_episodes if not ep.is_failure()][:limit]
|
|
69
|
+
|
|
70
|
+
def retrieve_with_anti_patterns(
|
|
71
|
+
self,
|
|
72
|
+
query_embedding: Optional[np.ndarray] = None,
|
|
73
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
74
|
+
limit: int = 10,
|
|
75
|
+
include_failures: bool = True,
|
|
76
|
+
) -> Dict[str, List[Episode]]:
|
|
77
|
+
"""Retrieve both successes and failures."""
|
|
78
|
+
result: Dict[str, List[Episode]] = {"successes": [], "failures": []}
|
|
79
|
+
result["successes"] = self.retrieve_successes(query_embedding=query_embedding, filters=filters, limit=limit)
|
|
80
|
+
if include_failures:
|
|
81
|
+
result["failures"] = self.retrieve_failures(query_embedding=query_embedding, filters=filters, limit=limit)
|
|
82
|
+
return result
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class FileAdapter(VectorStoreAdapter):
|
|
86
|
+
"""
|
|
87
|
+
Mutable JSONL-based file storage adapter.
|
|
88
|
+
|
|
89
|
+
Supports store, retrieve, get_by_id, update and delete.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
def __init__(self, filepath: str = "episodes.jsonl"):
|
|
93
|
+
self.filepath = Path(filepath)
|
|
94
|
+
self.filepath.parent.mkdir(parents=True, exist_ok=True)
|
|
95
|
+
if not self.filepath.exists():
|
|
96
|
+
self.filepath.touch()
|
|
97
|
+
|
|
98
|
+
# -- helpers -----------------------------------------------------------
|
|
99
|
+
|
|
100
|
+
def _read_all(self) -> List[Episode]:
|
|
101
|
+
episodes: List[Episode] = []
|
|
102
|
+
if not self.filepath.exists() or self.filepath.stat().st_size == 0:
|
|
103
|
+
return episodes
|
|
104
|
+
with open(self.filepath, "r") as f:
|
|
105
|
+
for line in f:
|
|
106
|
+
line = line.strip()
|
|
107
|
+
if not line:
|
|
108
|
+
continue
|
|
109
|
+
try:
|
|
110
|
+
episodes.append(Episode.from_json(line))
|
|
111
|
+
except Exception:
|
|
112
|
+
continue
|
|
113
|
+
return episodes
|
|
114
|
+
|
|
115
|
+
def _write_all(self, episodes: List[Episode]) -> None:
|
|
116
|
+
with open(self.filepath, "w") as f:
|
|
117
|
+
for ep in episodes:
|
|
118
|
+
f.write(ep.to_json() + "\n")
|
|
119
|
+
|
|
120
|
+
# -- core API ----------------------------------------------------------
|
|
121
|
+
|
|
122
|
+
def store(self, episode: Episode, embedding: Optional[np.ndarray] = None) -> str:
|
|
123
|
+
with open(self.filepath, "a") as f:
|
|
124
|
+
f.write(episode.to_json() + "\n")
|
|
125
|
+
return episode.episode_id
|
|
126
|
+
|
|
127
|
+
def retrieve(
|
|
128
|
+
self,
|
|
129
|
+
query_embedding: Optional[np.ndarray] = None,
|
|
130
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
131
|
+
limit: int = 10,
|
|
132
|
+
) -> List[Episode]:
|
|
133
|
+
episodes = self._read_all()
|
|
134
|
+
if filters:
|
|
135
|
+
episodes = [
|
|
136
|
+
ep for ep in episodes
|
|
137
|
+
if all(ep.metadata.get(k) == v for k, v in filters.items())
|
|
138
|
+
]
|
|
139
|
+
episodes.reverse()
|
|
140
|
+
return episodes[:limit]
|
|
141
|
+
|
|
142
|
+
def get_by_id(self, episode_id: str) -> Optional[Episode]:
|
|
143
|
+
for ep in self._read_all():
|
|
144
|
+
if ep.episode_id == episode_id:
|
|
145
|
+
return ep
|
|
146
|
+
return None
|
|
147
|
+
|
|
148
|
+
def update(self, episode_id: str, episode: Episode) -> bool:
|
|
149
|
+
"""Replace the episode with the given ID."""
|
|
150
|
+
episodes = self._read_all()
|
|
151
|
+
for i, ep in enumerate(episodes):
|
|
152
|
+
if ep.episode_id == episode_id:
|
|
153
|
+
episodes[i] = episode
|
|
154
|
+
self._write_all(episodes)
|
|
155
|
+
return True
|
|
156
|
+
return False
|
|
157
|
+
|
|
158
|
+
def delete(self, episode_id: str) -> bool:
|
|
159
|
+
"""Remove the episode with the given ID."""
|
|
160
|
+
episodes = self._read_all()
|
|
161
|
+
new_episodes = [ep for ep in episodes if ep.episode_id != episode_id]
|
|
162
|
+
if len(new_episodes) == len(episodes):
|
|
163
|
+
return False
|
|
164
|
+
self._write_all(new_episodes)
|
|
165
|
+
return True
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
try:
|
|
169
|
+
import chromadb
|
|
170
|
+
from chromadb.config import Settings
|
|
171
|
+
|
|
172
|
+
class ChromaDBAdapter(VectorStoreAdapter):
|
|
173
|
+
"""
|
|
174
|
+
ChromaDB-based vector storage adapter.
|
|
175
|
+
|
|
176
|
+
Uses ChromaDB for vector similarity search and efficient retrieval
|
|
177
|
+
of episodes based on embeddings.
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
def __init__(
|
|
181
|
+
self,
|
|
182
|
+
collection_name: str = "episodes",
|
|
183
|
+
persist_directory: str = "./chroma_data",
|
|
184
|
+
):
|
|
185
|
+
self.client = chromadb.Client(Settings(
|
|
186
|
+
persist_directory=persist_directory,
|
|
187
|
+
anonymized_telemetry=False,
|
|
188
|
+
))
|
|
189
|
+
self.collection = self.client.get_or_create_collection(
|
|
190
|
+
name=collection_name,
|
|
191
|
+
metadata={"description": "Episodic memory storage"},
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
def store(self, episode: Episode, embedding: Optional[np.ndarray] = None) -> str:
|
|
195
|
+
if embedding is None:
|
|
196
|
+
text = f"{episode.goal} {episode.action} {episode.result} {episode.reflection}"
|
|
197
|
+
else:
|
|
198
|
+
text = None
|
|
199
|
+
|
|
200
|
+
self.collection.add(
|
|
201
|
+
ids=[episode.episode_id],
|
|
202
|
+
documents=[text] if text else None,
|
|
203
|
+
embeddings=[embedding.tolist()] if embedding is not None else None,
|
|
204
|
+
metadatas=[{
|
|
205
|
+
"goal": episode.goal,
|
|
206
|
+
"action": episode.action,
|
|
207
|
+
"result": episode.result,
|
|
208
|
+
"reflection": episode.reflection,
|
|
209
|
+
"timestamp": episode.timestamp.isoformat(),
|
|
210
|
+
**episode.metadata,
|
|
211
|
+
}],
|
|
212
|
+
)
|
|
213
|
+
return episode.episode_id
|
|
214
|
+
|
|
215
|
+
def retrieve(
|
|
216
|
+
self,
|
|
217
|
+
query_embedding: Optional[np.ndarray] = None,
|
|
218
|
+
filters: Optional[Dict[str, Any]] = None,
|
|
219
|
+
limit: int = 10,
|
|
220
|
+
) -> List[Episode]:
|
|
221
|
+
if query_embedding is not None:
|
|
222
|
+
results = self.collection.query(
|
|
223
|
+
query_embeddings=[query_embedding.tolist()],
|
|
224
|
+
n_results=limit,
|
|
225
|
+
where=filters,
|
|
226
|
+
)
|
|
227
|
+
else:
|
|
228
|
+
results = self.collection.get(limit=limit, where=filters)
|
|
229
|
+
|
|
230
|
+
episodes = []
|
|
231
|
+
if 'metadatas' in results and results['metadatas']:
|
|
232
|
+
if isinstance(results['metadatas'][0], list) if results['metadatas'] else False:
|
|
233
|
+
metadatas = results['metadatas'][0]
|
|
234
|
+
else:
|
|
235
|
+
metadatas = results['metadatas']
|
|
236
|
+
else:
|
|
237
|
+
metadatas = []
|
|
238
|
+
|
|
239
|
+
for metadata in metadatas:
|
|
240
|
+
episode_metadata = {
|
|
241
|
+
k: v for k, v in metadata.items()
|
|
242
|
+
if k not in ('goal', 'action', 'result', 'reflection', 'timestamp')
|
|
243
|
+
}
|
|
244
|
+
try:
|
|
245
|
+
episode = Episode(
|
|
246
|
+
goal=metadata.get("goal", ""),
|
|
247
|
+
action=metadata.get("action", ""),
|
|
248
|
+
result=metadata.get("result", ""),
|
|
249
|
+
reflection=metadata.get("reflection", ""),
|
|
250
|
+
timestamp=metadata.get("timestamp", None),
|
|
251
|
+
metadata=episode_metadata,
|
|
252
|
+
)
|
|
253
|
+
episodes.append(episode)
|
|
254
|
+
except Exception:
|
|
255
|
+
continue
|
|
256
|
+
return episodes
|
|
257
|
+
|
|
258
|
+
def get_by_id(self, episode_id: str) -> Optional[Episode]:
|
|
259
|
+
try:
|
|
260
|
+
results = self.collection.get(ids=[episode_id])
|
|
261
|
+
if not results['ids']:
|
|
262
|
+
return None
|
|
263
|
+
metadata = results['metadatas'][0]
|
|
264
|
+
episode_metadata = {
|
|
265
|
+
k: v for k, v in metadata.items()
|
|
266
|
+
if k not in ('goal', 'action', 'result', 'reflection', 'timestamp')
|
|
267
|
+
}
|
|
268
|
+
return Episode(
|
|
269
|
+
goal=metadata.get("goal", ""),
|
|
270
|
+
action=metadata.get("action", ""),
|
|
271
|
+
result=metadata.get("result", ""),
|
|
272
|
+
reflection=metadata.get("reflection", ""),
|
|
273
|
+
timestamp=metadata.get("timestamp", None),
|
|
274
|
+
metadata=episode_metadata,
|
|
275
|
+
)
|
|
276
|
+
except Exception:
|
|
277
|
+
return None
|
|
278
|
+
|
|
279
|
+
except ImportError:
|
|
280
|
+
# ChromaDB not installed — adapter will not be available
|
|
281
|
+
pass
|
iatp/__init__.py
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Inter-Agent Trust Protocol (IATP).
|
|
5
|
+
|
|
6
|
+
A sidecar-based service mesh for preventing cascading hallucinations
|
|
7
|
+
in autonomous agent networks. IATP provides the missing "governance layer"
|
|
8
|
+
for multi-agent LLM systems.
|
|
9
|
+
|
|
10
|
+
Core Features:
|
|
11
|
+
- **Discovery**: Capability manifest exchange via `/.well-known/agent-manifest`
|
|
12
|
+
- **Trust**: Dynamic trust scoring and security validation
|
|
13
|
+
- **Reversibility**: Enforced transaction rollback requirements
|
|
14
|
+
- **Privacy**: Data retention and handling policy enforcement
|
|
15
|
+
- **Telemetry**: Distributed tracing via Flight Recorder
|
|
16
|
+
|
|
17
|
+
Quick Start:
|
|
18
|
+
>>> from iatp import CapabilityManifest, TrustLevel, SidecarProxy
|
|
19
|
+
>>> manifest = CapabilityManifest(
|
|
20
|
+
... agent_id="my-agent",
|
|
21
|
+
... trust_level=TrustLevel.TRUSTED,
|
|
22
|
+
... capabilities=AgentCapabilities(reversibility=ReversibilityLevel.FULL),
|
|
23
|
+
... privacy_contract=PrivacyContract(retention=RetentionPolicy.EPHEMERAL),
|
|
24
|
+
... )
|
|
25
|
+
>>> print(f"Trust Score: {manifest.calculate_trust_score()}/10")
|
|
26
|
+
|
|
27
|
+
CLI Usage:
|
|
28
|
+
.. code-block:: bash
|
|
29
|
+
|
|
30
|
+
# Verify a manifest
|
|
31
|
+
iatp verify manifest.json
|
|
32
|
+
|
|
33
|
+
# Run the sidecar
|
|
34
|
+
uvicorn iatp.main:app --host 0.0.0.0 --port 8081
|
|
35
|
+
|
|
36
|
+
Docker:
|
|
37
|
+
.. code-block:: bash
|
|
38
|
+
|
|
39
|
+
docker run -p 8081:8081 -e IATP_AGENT_URL=http://my-agent:8000 iatp-sidecar
|
|
40
|
+
|
|
41
|
+
For more information, see:
|
|
42
|
+
- Documentation: https://github.com/microsoft/agent-governance-toolkit
|
|
43
|
+
- Paper: paper/whitepaper.md
|
|
44
|
+
|
|
45
|
+
Example:
|
|
46
|
+
Basic trust score calculation::
|
|
47
|
+
|
|
48
|
+
from iatp import (
|
|
49
|
+
CapabilityManifest,
|
|
50
|
+
AgentCapabilities,
|
|
51
|
+
PrivacyContract,
|
|
52
|
+
TrustLevel,
|
|
53
|
+
ReversibilityLevel,
|
|
54
|
+
RetentionPolicy,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
manifest = CapabilityManifest(
|
|
58
|
+
agent_id="secure-bank-agent",
|
|
59
|
+
trust_level=TrustLevel.VERIFIED_PARTNER,
|
|
60
|
+
capabilities=AgentCapabilities(
|
|
61
|
+
reversibility=ReversibilityLevel.FULL,
|
|
62
|
+
idempotency=True,
|
|
63
|
+
),
|
|
64
|
+
privacy_contract=PrivacyContract(
|
|
65
|
+
retention=RetentionPolicy.EPHEMERAL,
|
|
66
|
+
),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
score = manifest.calculate_trust_score()
|
|
70
|
+
print(f"Trust Score: {score}/10") # Output: Trust Score: 10/10
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
from __future__ import annotations
|
|
74
|
+
|
|
75
|
+
__version__ = "3.1.0"
|
|
76
|
+
__author__ = "Microsoft Corporation"
|
|
77
|
+
__license__ = "MIT"
|
|
78
|
+
|
|
79
|
+
# Core Models
|
|
80
|
+
# Attestation & Reputation
|
|
81
|
+
from iatp.attestation import AttestationValidator, ReputationManager
|
|
82
|
+
from iatp.models import (
|
|
83
|
+
AgentCapabilities,
|
|
84
|
+
AttestationRecord,
|
|
85
|
+
CapabilityManifest,
|
|
86
|
+
PrivacyContract,
|
|
87
|
+
QuarantineSession,
|
|
88
|
+
ReputationEvent,
|
|
89
|
+
ReputationScore,
|
|
90
|
+
RetentionPolicy,
|
|
91
|
+
ReversibilityLevel,
|
|
92
|
+
TracingContext,
|
|
93
|
+
TrustLevel,
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
# Engines
|
|
97
|
+
from iatp.policy_engine import IATPPolicyEngine
|
|
98
|
+
from iatp.recovery import IATPRecoveryEngine
|
|
99
|
+
|
|
100
|
+
# Security & Privacy
|
|
101
|
+
from iatp.security import PrivacyScrubber, SecurityValidator
|
|
102
|
+
|
|
103
|
+
# Sidecar Components
|
|
104
|
+
from iatp.sidecar import SidecarProxy, create_sidecar
|
|
105
|
+
|
|
106
|
+
# Telemetry & Tracing
|
|
107
|
+
from iatp.telemetry import FlightRecorder, TraceIDGenerator
|
|
108
|
+
|
|
109
|
+
# IPC Pipes - Typed inter-agent communication (v0.4.0)
|
|
110
|
+
from iatp.ipc_pipes import (
|
|
111
|
+
TypedPipe,
|
|
112
|
+
PipeMessage,
|
|
113
|
+
PipeConfig,
|
|
114
|
+
PipeState,
|
|
115
|
+
PolicyCheckPipe,
|
|
116
|
+
Pipeline,
|
|
117
|
+
AgentPipelineStage,
|
|
118
|
+
create_pipeline,
|
|
119
|
+
pipe_agents,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
# Public API exports - controls what is visible via `from iatp import *`
|
|
123
|
+
__all__ = [
|
|
124
|
+
# Package metadata
|
|
125
|
+
"__version__",
|
|
126
|
+
"__author__",
|
|
127
|
+
"__license__",
|
|
128
|
+
# Models - Core data structures for capability manifests
|
|
129
|
+
"CapabilityManifest",
|
|
130
|
+
"AgentCapabilities",
|
|
131
|
+
"PrivacyContract",
|
|
132
|
+
"TrustLevel",
|
|
133
|
+
"ReversibilityLevel",
|
|
134
|
+
"RetentionPolicy",
|
|
135
|
+
"QuarantineSession",
|
|
136
|
+
"TracingContext",
|
|
137
|
+
"AttestationRecord",
|
|
138
|
+
"ReputationScore",
|
|
139
|
+
"ReputationEvent",
|
|
140
|
+
# Sidecar - The proxy that wraps agents
|
|
141
|
+
"SidecarProxy",
|
|
142
|
+
"create_sidecar",
|
|
143
|
+
# Security - Validation and privacy enforcement
|
|
144
|
+
"SecurityValidator",
|
|
145
|
+
"PrivacyScrubber",
|
|
146
|
+
# Attestation & Reputation
|
|
147
|
+
"AttestationValidator",
|
|
148
|
+
"ReputationManager",
|
|
149
|
+
# Telemetry - Distributed tracing and audit logging
|
|
150
|
+
"FlightRecorder",
|
|
151
|
+
"TraceIDGenerator",
|
|
152
|
+
# Policy Engine - Rule-based policy evaluation
|
|
153
|
+
"IATPPolicyEngine",
|
|
154
|
+
# Recovery Engine - Compensating transaction support (scak integration)
|
|
155
|
+
"IATPRecoveryEngine",
|
|
156
|
+
# IPC Pipes - Typed inter-agent communication (v0.4.0)
|
|
157
|
+
"TypedPipe",
|
|
158
|
+
"PipeMessage",
|
|
159
|
+
"PipeConfig",
|
|
160
|
+
"PipeState",
|
|
161
|
+
"PolicyCheckPipe",
|
|
162
|
+
"Pipeline",
|
|
163
|
+
"AgentPipelineStage",
|
|
164
|
+
"create_pipeline",
|
|
165
|
+
"pipe_agents",
|
|
166
|
+
]
|