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.
Files changed (337) hide show
  1. agent_control_plane/__init__.py +662 -0
  2. agent_control_plane/a2a_adapter.py +543 -0
  3. agent_control_plane/adapter.py +417 -0
  4. agent_control_plane/agent_hibernation.py +394 -0
  5. agent_control_plane/agent_kernel.py +470 -0
  6. agent_control_plane/compliance.py +720 -0
  7. agent_control_plane/constraint_graphs.py +478 -0
  8. agent_control_plane/control_plane.py +854 -0
  9. agent_control_plane/example_executors.py +195 -0
  10. agent_control_plane/execution_engine.py +231 -0
  11. agent_control_plane/flight_recorder.py +846 -0
  12. agent_control_plane/governance_layer.py +435 -0
  13. agent_control_plane/hf_utils.py +563 -0
  14. agent_control_plane/interfaces/__init__.py +55 -0
  15. agent_control_plane/interfaces/kernel_interface.py +361 -0
  16. agent_control_plane/interfaces/plugin_interface.py +497 -0
  17. agent_control_plane/interfaces/protocol_interfaces.py +387 -0
  18. agent_control_plane/kernel_space.py +1009 -0
  19. agent_control_plane/langchain_adapter.py +424 -0
  20. agent_control_plane/lifecycle.py +3113 -0
  21. agent_control_plane/mcp_adapter.py +653 -0
  22. agent_control_plane/ml_safety.py +563 -0
  23. agent_control_plane/multimodal.py +727 -0
  24. agent_control_plane/mute_agent.py +422 -0
  25. agent_control_plane/observability.py +787 -0
  26. agent_control_plane/orchestrator.py +482 -0
  27. agent_control_plane/plugin_registry.py +750 -0
  28. agent_control_plane/policy_engine.py +954 -0
  29. agent_control_plane/process_isolation.py +777 -0
  30. agent_control_plane/shadow_mode.py +310 -0
  31. agent_control_plane/signals.py +493 -0
  32. agent_control_plane/supervisor_agents.py +430 -0
  33. agent_control_plane/time_travel_debugger.py +557 -0
  34. agent_control_plane/tool_registry.py +452 -0
  35. agent_control_plane/vfs.py +697 -0
  36. agent_kernel/__init__.py +69 -0
  37. agent_kernel/analyzer.py +435 -0
  38. agent_kernel/auditor.py +36 -0
  39. agent_kernel/completeness_auditor.py +237 -0
  40. agent_kernel/detector.py +203 -0
  41. agent_kernel/kernel.py +744 -0
  42. agent_kernel/memory_manager.py +85 -0
  43. agent_kernel/models.py +374 -0
  44. agent_kernel/nudge_mechanism.py +263 -0
  45. agent_kernel/outcome_analyzer.py +338 -0
  46. agent_kernel/patcher.py +582 -0
  47. agent_kernel/semantic_analyzer.py +316 -0
  48. agent_kernel/semantic_purge.py +349 -0
  49. agent_kernel/simulator.py +449 -0
  50. agent_kernel/teacher.py +85 -0
  51. agent_kernel/triage.py +152 -0
  52. agent_os/__init__.py +409 -0
  53. agent_os/_adversarial_impl.py +200 -0
  54. agent_os/_circuit_breaker_impl.py +232 -0
  55. agent_os/_mcp_metrics.py +193 -0
  56. agent_os/adversarial.py +20 -0
  57. agent_os/agents_compat.py +490 -0
  58. agent_os/audit_logger.py +135 -0
  59. agent_os/base_agent.py +651 -0
  60. agent_os/circuit_breaker.py +34 -0
  61. agent_os/cli/__init__.py +659 -0
  62. agent_os/cli/cmd_audit.py +128 -0
  63. agent_os/cli/cmd_init.py +152 -0
  64. agent_os/cli/cmd_policy.py +41 -0
  65. agent_os/cli/cmd_policy_gen.py +180 -0
  66. agent_os/cli/cmd_validate.py +258 -0
  67. agent_os/cli/mcp_scan.py +265 -0
  68. agent_os/cli/output.py +192 -0
  69. agent_os/cli/policy_checker.py +330 -0
  70. agent_os/compat.py +74 -0
  71. agent_os/constraint_graph.py +234 -0
  72. agent_os/content_governance.py +140 -0
  73. agent_os/context_budget.py +305 -0
  74. agent_os/credential_redactor.py +224 -0
  75. agent_os/diff_policy.py +89 -0
  76. agent_os/egress_policy.py +159 -0
  77. agent_os/escalation.py +276 -0
  78. agent_os/event_bus.py +124 -0
  79. agent_os/exceptions.py +180 -0
  80. agent_os/execution_context_policy.py +141 -0
  81. agent_os/github_enterprise.py +96 -0
  82. agent_os/health.py +20 -0
  83. agent_os/integrations/__init__.py +279 -0
  84. agent_os/integrations/a2a_adapter.py +279 -0
  85. agent_os/integrations/agent_lightning/__init__.py +30 -0
  86. agent_os/integrations/anthropic_adapter.py +420 -0
  87. agent_os/integrations/autogen_adapter.py +620 -0
  88. agent_os/integrations/base.py +1137 -0
  89. agent_os/integrations/compat.py +229 -0
  90. agent_os/integrations/config.py +98 -0
  91. agent_os/integrations/conversation_guardian.py +957 -0
  92. agent_os/integrations/crewai_adapter.py +467 -0
  93. agent_os/integrations/drift_detector.py +425 -0
  94. agent_os/integrations/dry_run.py +124 -0
  95. agent_os/integrations/escalation.py +582 -0
  96. agent_os/integrations/gemini_adapter.py +364 -0
  97. agent_os/integrations/google_adk_adapter.py +633 -0
  98. agent_os/integrations/guardrails_adapter.py +394 -0
  99. agent_os/integrations/health.py +197 -0
  100. agent_os/integrations/langchain_adapter.py +654 -0
  101. agent_os/integrations/llamafirewall.py +343 -0
  102. agent_os/integrations/llamaindex_adapter.py +188 -0
  103. agent_os/integrations/logging.py +191 -0
  104. agent_os/integrations/maf_adapter.py +631 -0
  105. agent_os/integrations/mistral_adapter.py +365 -0
  106. agent_os/integrations/openai_adapter.py +816 -0
  107. agent_os/integrations/openai_agents_sdk.py +406 -0
  108. agent_os/integrations/policy_compose.py +171 -0
  109. agent_os/integrations/profiling.py +144 -0
  110. agent_os/integrations/pydantic_ai_adapter.py +420 -0
  111. agent_os/integrations/rate_limiter.py +130 -0
  112. agent_os/integrations/rbac.py +143 -0
  113. agent_os/integrations/registry.py +113 -0
  114. agent_os/integrations/scope_guard.py +303 -0
  115. agent_os/integrations/semantic_kernel_adapter.py +769 -0
  116. agent_os/integrations/smolagents_adapter.py +629 -0
  117. agent_os/integrations/templates.py +178 -0
  118. agent_os/integrations/token_budget.py +134 -0
  119. agent_os/integrations/tool_aliases.py +190 -0
  120. agent_os/integrations/webhooks.py +177 -0
  121. agent_os/lite.py +208 -0
  122. agent_os/mcp_gateway.py +385 -0
  123. agent_os/mcp_message_signer.py +273 -0
  124. agent_os/mcp_protocols.py +161 -0
  125. agent_os/mcp_response_scanner.py +232 -0
  126. agent_os/mcp_security.py +924 -0
  127. agent_os/mcp_session_auth.py +231 -0
  128. agent_os/mcp_sliding_rate_limiter.py +184 -0
  129. agent_os/memory_guard.py +409 -0
  130. agent_os/metrics.py +134 -0
  131. agent_os/mute.py +428 -0
  132. agent_os/mute_agent.py +209 -0
  133. agent_os/policies/__init__.py +77 -0
  134. agent_os/policies/async_evaluator.py +275 -0
  135. agent_os/policies/backends.py +670 -0
  136. agent_os/policies/bridge.py +169 -0
  137. agent_os/policies/budget.py +85 -0
  138. agent_os/policies/cli.py +294 -0
  139. agent_os/policies/conflict_resolution.py +270 -0
  140. agent_os/policies/data_classification.py +252 -0
  141. agent_os/policies/evaluator.py +239 -0
  142. agent_os/policies/policy_schema.json +228 -0
  143. agent_os/policies/rate_limiting.py +145 -0
  144. agent_os/policies/schema.py +115 -0
  145. agent_os/policies/shared.py +331 -0
  146. agent_os/prompt_injection.py +694 -0
  147. agent_os/providers.py +182 -0
  148. agent_os/py.typed +0 -0
  149. agent_os/retry.py +81 -0
  150. agent_os/reversibility.py +251 -0
  151. agent_os/sandbox.py +432 -0
  152. agent_os/sandbox_provider.py +140 -0
  153. agent_os/secure_codegen.py +525 -0
  154. agent_os/security_skills.py +538 -0
  155. agent_os/semantic_policy.py +422 -0
  156. agent_os/server/__init__.py +15 -0
  157. agent_os/server/__main__.py +25 -0
  158. agent_os/server/app.py +277 -0
  159. agent_os/server/models.py +104 -0
  160. agent_os/shift_left_metrics.py +130 -0
  161. agent_os/stateless.py +742 -0
  162. agent_os/supervisor.py +148 -0
  163. agent_os/task_outcome.py +148 -0
  164. agent_os/transparency.py +181 -0
  165. agent_os/trust_root.py +128 -0
  166. agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
  167. agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
  168. agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
  169. agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
  170. agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
  171. agent_os_observability/__init__.py +27 -0
  172. agent_os_observability/dashboards.py +898 -0
  173. agent_os_observability/metrics.py +398 -0
  174. agent_os_observability/server.py +223 -0
  175. agent_os_observability/tracer.py +232 -0
  176. agent_primitives/__init__.py +24 -0
  177. agent_primitives/failures.py +84 -0
  178. agent_primitives/py.typed +0 -0
  179. amb_core/__init__.py +177 -0
  180. amb_core/adapters/__init__.py +57 -0
  181. amb_core/adapters/aws_sqs_broker.py +376 -0
  182. amb_core/adapters/azure_servicebus_broker.py +340 -0
  183. amb_core/adapters/kafka_broker.py +260 -0
  184. amb_core/adapters/nats_broker.py +285 -0
  185. amb_core/adapters/rabbitmq_broker.py +235 -0
  186. amb_core/adapters/redis_broker.py +262 -0
  187. amb_core/broker.py +145 -0
  188. amb_core/bus.py +481 -0
  189. amb_core/cloudevents.py +509 -0
  190. amb_core/dlq.py +345 -0
  191. amb_core/hf_utils.py +536 -0
  192. amb_core/memory_broker.py +410 -0
  193. amb_core/models.py +141 -0
  194. amb_core/persistence.py +529 -0
  195. amb_core/schema.py +294 -0
  196. amb_core/tracing.py +358 -0
  197. atr/__init__.py +640 -0
  198. atr/access.py +348 -0
  199. atr/composition.py +645 -0
  200. atr/decorator.py +357 -0
  201. atr/executor.py +384 -0
  202. atr/health.py +557 -0
  203. atr/hf_utils.py +449 -0
  204. atr/injection.py +422 -0
  205. atr/metrics.py +440 -0
  206. atr/policies.py +403 -0
  207. atr/py.typed +2 -0
  208. atr/registry.py +452 -0
  209. atr/schema.py +480 -0
  210. atr/tools/safe/__init__.py +75 -0
  211. atr/tools/safe/calculator.py +467 -0
  212. atr/tools/safe/datetime_tool.py +443 -0
  213. atr/tools/safe/file_reader.py +402 -0
  214. atr/tools/safe/http_client.py +316 -0
  215. atr/tools/safe/json_parser.py +374 -0
  216. atr/tools/safe/text_tool.py +537 -0
  217. atr/tools/safe/toolkit.py +175 -0
  218. caas/__init__.py +162 -0
  219. caas/api/__init__.py +7 -0
  220. caas/api/server.py +1328 -0
  221. caas/caching.py +834 -0
  222. caas/cli.py +210 -0
  223. caas/conversation.py +223 -0
  224. caas/decay.py +72 -0
  225. caas/detection/__init__.py +9 -0
  226. caas/detection/detector.py +238 -0
  227. caas/enrichment.py +130 -0
  228. caas/gateway/__init__.py +27 -0
  229. caas/gateway/trust_gateway.py +474 -0
  230. caas/hf_utils.py +479 -0
  231. caas/ingestion/__init__.py +23 -0
  232. caas/ingestion/processors.py +253 -0
  233. caas/ingestion/structure_parser.py +188 -0
  234. caas/models.py +356 -0
  235. caas/pragmatic_truth.py +444 -0
  236. caas/routing/__init__.py +10 -0
  237. caas/routing/heuristic_router.py +58 -0
  238. caas/storage/__init__.py +9 -0
  239. caas/storage/store.py +389 -0
  240. caas/triad.py +213 -0
  241. caas/tuning/__init__.py +9 -0
  242. caas/tuning/tuner.py +329 -0
  243. caas/vfs/__init__.py +14 -0
  244. caas/vfs/filesystem.py +452 -0
  245. cmvk/__init__.py +218 -0
  246. cmvk/audit.py +402 -0
  247. cmvk/benchmarks.py +478 -0
  248. cmvk/constitutional.py +904 -0
  249. cmvk/hf_utils.py +301 -0
  250. cmvk/metrics.py +473 -0
  251. cmvk/profiles.py +300 -0
  252. cmvk/py.typed +0 -0
  253. cmvk/types.py +12 -0
  254. cmvk/verification.py +956 -0
  255. emk/__init__.py +89 -0
  256. emk/causal.py +352 -0
  257. emk/hf_utils.py +421 -0
  258. emk/indexer.py +83 -0
  259. emk/py.typed +0 -0
  260. emk/schema.py +204 -0
  261. emk/sleep_cycle.py +347 -0
  262. emk/store.py +281 -0
  263. iatp/__init__.py +166 -0
  264. iatp/attestation.py +461 -0
  265. iatp/cli.py +317 -0
  266. iatp/hf_utils.py +472 -0
  267. iatp/ipc_pipes.py +580 -0
  268. iatp/main.py +412 -0
  269. iatp/models/__init__.py +447 -0
  270. iatp/policy_engine.py +337 -0
  271. iatp/py.typed +2 -0
  272. iatp/recovery.py +321 -0
  273. iatp/security/__init__.py +270 -0
  274. iatp/sidecar/__init__.py +519 -0
  275. iatp/telemetry/__init__.py +164 -0
  276. iatp/tests/__init__.py +1 -0
  277. iatp/tests/test_attestation.py +370 -0
  278. iatp/tests/test_cli.py +131 -0
  279. iatp/tests/test_ed25519_attestation.py +211 -0
  280. iatp/tests/test_models.py +130 -0
  281. iatp/tests/test_policy_engine.py +347 -0
  282. iatp/tests/test_recovery.py +281 -0
  283. iatp/tests/test_security.py +222 -0
  284. iatp/tests/test_sidecar.py +167 -0
  285. iatp/tests/test_telemetry.py +175 -0
  286. mcp_kernel_server/__init__.py +28 -0
  287. mcp_kernel_server/cli.py +274 -0
  288. mcp_kernel_server/resources.py +217 -0
  289. mcp_kernel_server/server.py +564 -0
  290. mcp_kernel_server/tools.py +1174 -0
  291. mute_agent/__init__.py +68 -0
  292. mute_agent/core/__init__.py +1 -0
  293. mute_agent/core/execution_agent.py +166 -0
  294. mute_agent/core/handshake_protocol.py +201 -0
  295. mute_agent/core/reasoning_agent.py +238 -0
  296. mute_agent/knowledge_graph/__init__.py +1 -0
  297. mute_agent/knowledge_graph/graph_elements.py +65 -0
  298. mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
  299. mute_agent/knowledge_graph/subgraph.py +224 -0
  300. mute_agent/listener/__init__.py +43 -0
  301. mute_agent/listener/adapters/__init__.py +31 -0
  302. mute_agent/listener/adapters/base_adapter.py +189 -0
  303. mute_agent/listener/adapters/caas_adapter.py +344 -0
  304. mute_agent/listener/adapters/control_plane_adapter.py +436 -0
  305. mute_agent/listener/adapters/iatp_adapter.py +332 -0
  306. mute_agent/listener/adapters/scak_adapter.py +251 -0
  307. mute_agent/listener/listener.py +610 -0
  308. mute_agent/listener/state_observer.py +436 -0
  309. mute_agent/listener/threshold_config.py +313 -0
  310. mute_agent/super_system/__init__.py +1 -0
  311. mute_agent/super_system/router.py +204 -0
  312. mute_agent/visualization/__init__.py +10 -0
  313. mute_agent/visualization/graph_debugger.py +502 -0
  314. nexus/README.md +60 -0
  315. nexus/__init__.py +51 -0
  316. nexus/arbiter.py +359 -0
  317. nexus/client.py +466 -0
  318. nexus/dmz.py +444 -0
  319. nexus/escrow.py +430 -0
  320. nexus/exceptions.py +286 -0
  321. nexus/pyproject.toml +36 -0
  322. nexus/registry.py +393 -0
  323. nexus/reputation.py +425 -0
  324. nexus/schemas/__init__.py +51 -0
  325. nexus/schemas/compliance.py +276 -0
  326. nexus/schemas/escrow.py +251 -0
  327. nexus/schemas/manifest.py +225 -0
  328. nexus/schemas/receipt.py +208 -0
  329. nexus/tests/__init__.py +0 -0
  330. nexus/tests/conftest.py +146 -0
  331. nexus/tests/test_arbiter.py +192 -0
  332. nexus/tests/test_dmz.py +194 -0
  333. nexus/tests/test_escrow.py +276 -0
  334. nexus/tests/test_exceptions.py +225 -0
  335. nexus/tests/test_registry.py +232 -0
  336. nexus/tests/test_reputation.py +328 -0
  337. nexus/tests/test_schemas.py +295 -0
@@ -0,0 +1,563 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """
4
+ Hugging Face Hub Utilities for Agent Control Plane
5
+
6
+ This module provides utilities for interacting with Hugging Face Hub, including:
7
+ - Uploading experiment logs and results
8
+ - Downloading/uploading datasets
9
+ - Model card generation
10
+ - Dataset versioning and management
11
+
12
+ Installation:
13
+ pip install huggingface_hub datasets
14
+
15
+ Usage:
16
+ from agent_control_plane.hf_utils import (
17
+ upload_experiment_logs,
18
+ download_red_team_dataset,
19
+ create_model_card,
20
+ )
21
+
22
+ # Upload experiment results
23
+ upload_experiment_logs(
24
+ results_path="experiments/results.json",
25
+ repo_id="microsoft/acp-experiment-logs",
26
+ )
27
+
28
+ Configuration:
29
+ Set HF_TOKEN environment variable or use `huggingface-cli login`
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ import json
35
+ import logging
36
+ import os
37
+ from dataclasses import dataclass, field
38
+ from datetime import datetime
39
+ from pathlib import Path
40
+ from typing import Any, Dict, List, Optional, Union
41
+
42
+ logger = logging.getLogger(__name__)
43
+
44
+
45
+ # =============================================================================
46
+ # Configuration
47
+ # =============================================================================
48
+
49
+
50
+ @dataclass
51
+ class HFConfig:
52
+ """Configuration for Hugging Face Hub operations.
53
+
54
+ Attributes:
55
+ default_org: Default organization/user for uploads.
56
+ red_team_dataset: Repository ID for the red team benchmark dataset.
57
+ experiment_logs_repo: Repository ID for experiment logs.
58
+ token: HF API token (if not set, uses HF_TOKEN env var).
59
+ """
60
+
61
+ default_org: str = "microsoft"
62
+ red_team_dataset: str = "microsoft/agent-control-redteam-60"
63
+ experiment_logs_repo: str = "microsoft/acp-experiment-logs"
64
+ token: Optional[str] = None
65
+
66
+ def get_token(self) -> Optional[str]:
67
+ """Get the HF token from config or environment."""
68
+ return self.token or os.environ.get("HF_TOKEN")
69
+
70
+
71
+ DEFAULT_CONFIG = HFConfig()
72
+
73
+
74
+ # =============================================================================
75
+ # Dataset Operations
76
+ # =============================================================================
77
+
78
+
79
+ def download_red_team_dataset(
80
+ config: Optional[HFConfig] = None,
81
+ split: str = "train",
82
+ streaming: bool = False,
83
+ ) -> Any:
84
+ """
85
+ Download the Agent Control Plane red team benchmark dataset.
86
+
87
+ This dataset contains 60 adversarial prompts across categories:
88
+ - Direct attacks
89
+ - Prompt injection
90
+ - Privilege escalation
91
+ - Data exfiltration
92
+
93
+ Args:
94
+ config: HF configuration (uses default if not provided).
95
+ split: Dataset split to load ("train").
96
+ streaming: If True, return an iterable dataset for memory efficiency.
97
+
98
+ Returns:
99
+ Hugging Face Dataset object.
100
+
101
+ Raises:
102
+ ImportError: If datasets library is not installed.
103
+
104
+ Example:
105
+ >>> from agent_control_plane.hf_utils import download_red_team_dataset
106
+ >>> dataset = download_red_team_dataset()
107
+ >>> print(f"Loaded {len(dataset)} prompts")
108
+ >>> for item in dataset:
109
+ ... print(f"Category: {item['category']}, Blocked: {item['expected_blocked']}")
110
+ """
111
+ try:
112
+ from datasets import load_dataset
113
+ except ImportError:
114
+ raise ImportError(
115
+ "datasets library required. Install with: pip install datasets"
116
+ )
117
+
118
+ config = config or DEFAULT_CONFIG
119
+
120
+ logger.info(f"Downloading red team dataset from: {config.red_team_dataset}")
121
+
122
+ dataset = load_dataset(
123
+ config.red_team_dataset,
124
+ split=split,
125
+ streaming=streaming,
126
+ token=config.get_token(),
127
+ )
128
+
129
+ logger.info(f"Successfully loaded dataset with {len(dataset)} entries")
130
+ return dataset
131
+
132
+
133
+ def upload_dataset(
134
+ data: Union[Dict[str, List[Any]], List[Dict[str, Any]], Any],
135
+ repo_id: str,
136
+ config: Optional[HFConfig] = None,
137
+ private: bool = False,
138
+ commit_message: Optional[str] = None,
139
+ ) -> str:
140
+ """
141
+ Upload a dataset to Hugging Face Hub.
142
+
143
+ Args:
144
+ data: Dataset to upload. Can be:
145
+ - Dict mapping column names to lists
146
+ - List of dicts (one per row)
147
+ - Existing HF Dataset object
148
+ repo_id: Target repository ID (e.g., "username/dataset-name").
149
+ config: HF configuration (uses default if not provided).
150
+ private: If True, create a private repository.
151
+ commit_message: Custom commit message.
152
+
153
+ Returns:
154
+ URL of the uploaded dataset.
155
+
156
+ Raises:
157
+ ImportError: If datasets/huggingface_hub libraries not installed.
158
+
159
+ Example:
160
+ >>> from agent_control_plane.hf_utils import upload_dataset
161
+ >>> data = {
162
+ ... "prompt": ["attack 1", "attack 2"],
163
+ ... "category": ["injection", "exfil"],
164
+ ... "blocked": [True, True],
165
+ ... }
166
+ >>> url = upload_dataset(data, "my-user/my-dataset")
167
+ >>> print(f"Uploaded to: {url}")
168
+ """
169
+ try:
170
+ from datasets import Dataset
171
+ from huggingface_hub import HfApi
172
+ except ImportError:
173
+ raise ImportError(
174
+ "Required libraries not installed. "
175
+ "Install with: pip install datasets huggingface_hub"
176
+ )
177
+
178
+ config = config or DEFAULT_CONFIG
179
+ token = config.get_token()
180
+
181
+ # Convert to Dataset if needed
182
+ if isinstance(data, dict):
183
+ dataset = Dataset.from_dict(data)
184
+ elif isinstance(data, list):
185
+ dataset = Dataset.from_list(data)
186
+ else:
187
+ dataset = data # Assume it's already a Dataset
188
+
189
+ # Generate commit message
190
+ if commit_message is None:
191
+ commit_message = f"Upload dataset - {datetime.now().isoformat()}"
192
+
193
+ logger.info(f"Uploading dataset to: {repo_id}")
194
+ logger.info(f"Dataset size: {len(dataset)} rows")
195
+
196
+ # Push to hub
197
+ dataset.push_to_hub(
198
+ repo_id,
199
+ token=token,
200
+ private=private,
201
+ commit_message=commit_message,
202
+ )
203
+
204
+ url = f"https://huggingface.co/datasets/{repo_id}"
205
+ logger.info(f"Successfully uploaded to: {url}")
206
+ return url
207
+
208
+
209
+ # =============================================================================
210
+ # Experiment Log Operations
211
+ # =============================================================================
212
+
213
+
214
+ def upload_experiment_logs(
215
+ results_path: Union[str, Path],
216
+ repo_id: Optional[str] = None,
217
+ config: Optional[HFConfig] = None,
218
+ experiment_name: Optional[str] = None,
219
+ metadata: Optional[Dict[str, Any]] = None,
220
+ ) -> str:
221
+ """
222
+ Upload experiment results/logs to Hugging Face Hub.
223
+
224
+ This function uploads experiment results for reproducibility tracking.
225
+ Results are stored in a structured format with metadata.
226
+
227
+ Args:
228
+ results_path: Path to results JSON file or directory.
229
+ repo_id: Target repository ID. Uses config default if not provided.
230
+ config: HF configuration (uses default if not provided).
231
+ experiment_name: Optional name for the experiment run.
232
+ metadata: Additional metadata to include.
233
+
234
+ Returns:
235
+ URL of the uploaded file.
236
+
237
+ Raises:
238
+ FileNotFoundError: If results_path doesn't exist.
239
+ ImportError: If huggingface_hub library not installed.
240
+
241
+ Example:
242
+ >>> from agent_control_plane.hf_utils import upload_experiment_logs
243
+ >>> url = upload_experiment_logs(
244
+ ... results_path="experiments/results.json",
245
+ ... experiment_name="ablation_study_v2",
246
+ ... metadata={"gpu": "A100", "seed": 42},
247
+ ... )
248
+ >>> print(f"Logs uploaded to: {url}")
249
+ """
250
+ try:
251
+ from huggingface_hub import HfApi, upload_file
252
+ except ImportError:
253
+ raise ImportError(
254
+ "huggingface_hub library required. Install with: pip install huggingface_hub"
255
+ )
256
+
257
+ config = config or DEFAULT_CONFIG
258
+ repo_id = repo_id or config.experiment_logs_repo
259
+ token = config.get_token()
260
+
261
+ results_path = Path(results_path)
262
+ if not results_path.exists():
263
+ raise FileNotFoundError(f"Results file not found: {results_path}")
264
+
265
+ # Load and enrich results
266
+ with open(results_path, "r") as f:
267
+ results = json.load(f)
268
+
269
+ # Add metadata
270
+ enriched_results = {
271
+ "upload_timestamp": datetime.now().isoformat(),
272
+ "experiment_name": experiment_name or results_path.stem,
273
+ "source_file": str(results_path),
274
+ "custom_metadata": metadata or {},
275
+ "results": results,
276
+ }
277
+
278
+ # Generate unique filename
279
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
280
+ exp_name = experiment_name or "experiment"
281
+ filename = f"logs/{exp_name}_{timestamp}.json"
282
+
283
+ # Create temp file with enriched data
284
+ temp_path = results_path.parent / f"_upload_{timestamp}.json"
285
+ try:
286
+ with open(temp_path, "w") as f:
287
+ json.dump(enriched_results, f, indent=2)
288
+
289
+ logger.info(f"Uploading experiment logs to: {repo_id}/{filename}")
290
+
291
+ # Upload to hub
292
+ api = HfApi(token=token)
293
+
294
+ # Ensure repo exists
295
+ try:
296
+ api.create_repo(repo_id, repo_type="dataset", exist_ok=True)
297
+ except Exception as e:
298
+ logger.warning(f"Could not create repo (may already exist): {e}")
299
+
300
+ url = api.upload_file(
301
+ path_or_fileobj=str(temp_path),
302
+ path_in_repo=filename,
303
+ repo_id=repo_id,
304
+ repo_type="dataset",
305
+ commit_message=f"Upload experiment: {exp_name}",
306
+ )
307
+
308
+ logger.info(f"Successfully uploaded to: {url}")
309
+ return url
310
+
311
+ finally:
312
+ # Cleanup temp file
313
+ if temp_path.exists():
314
+ temp_path.unlink()
315
+
316
+
317
+ def list_experiment_logs(
318
+ repo_id: Optional[str] = None,
319
+ config: Optional[HFConfig] = None,
320
+ limit: int = 50,
321
+ ) -> List[Dict[str, Any]]:
322
+ """
323
+ List available experiment logs in the repository.
324
+
325
+ Args:
326
+ repo_id: Repository ID to list from.
327
+ config: HF configuration (uses default if not provided).
328
+ limit: Maximum number of files to list.
329
+
330
+ Returns:
331
+ List of file metadata dicts with name, size, and last_modified.
332
+
333
+ Example:
334
+ >>> from agent_control_plane.hf_utils import list_experiment_logs
335
+ >>> logs = list_experiment_logs()
336
+ >>> for log in logs[:5]:
337
+ ... print(f"{log['name']} - {log['size']} bytes")
338
+ """
339
+ try:
340
+ from huggingface_hub import HfApi
341
+ except ImportError:
342
+ raise ImportError(
343
+ "huggingface_hub library required. Install with: pip install huggingface_hub"
344
+ )
345
+
346
+ config = config or DEFAULT_CONFIG
347
+ repo_id = repo_id or config.experiment_logs_repo
348
+ token = config.get_token()
349
+
350
+ api = HfApi(token=token)
351
+
352
+ try:
353
+ files = api.list_repo_files(repo_id, repo_type="dataset")
354
+
355
+ # Filter for log files
356
+ log_files = [f for f in files if f.startswith("logs/") and f.endswith(".json")]
357
+
358
+ return [{"name": f, "path": f} for f in log_files[:limit]]
359
+
360
+ except Exception as e:
361
+ logger.error(f"Failed to list experiment logs: {e}")
362
+ return []
363
+
364
+
365
+ # =============================================================================
366
+ # Model Card Generation
367
+ # =============================================================================
368
+
369
+
370
+ @dataclass
371
+ class ModelCardInfo:
372
+ """Information for generating a Hugging Face Model Card.
373
+
374
+ Attributes:
375
+ model_name: Name of the model/system.
376
+ description: Brief description.
377
+ intended_use: Primary intended use cases.
378
+ limitations: Known limitations and out-of-scope uses.
379
+ training_data: Description of training data (if applicable).
380
+ metrics: Evaluation metrics and results.
381
+ citation: BibTeX citation.
382
+ """
383
+
384
+ model_name: str = "Agent Control Plane"
385
+ description: str = ""
386
+ intended_use: List[str] = field(default_factory=list)
387
+ out_of_scope_use: List[str] = field(default_factory=list)
388
+ limitations: List[str] = field(default_factory=list)
389
+ training_data: str = ""
390
+ metrics: Dict[str, Any] = field(default_factory=dict)
391
+ citation: str = ""
392
+ license: str = "MIT"
393
+ authors: List[str] = field(default_factory=lambda: ["Microsoft Corporation"])
394
+
395
+
396
+ def create_model_card(info: Optional[ModelCardInfo] = None) -> str:
397
+ """
398
+ Generate a Hugging Face Model Card README.md content.
399
+
400
+ Args:
401
+ info: ModelCardInfo with details. Uses defaults if not provided.
402
+
403
+ Returns:
404
+ Markdown string for the model card.
405
+
406
+ Example:
407
+ >>> from agent_control_plane.hf_utils import create_model_card, ModelCardInfo
408
+ >>> info = ModelCardInfo(
409
+ ... model_name="My ACP Instance",
410
+ ... intended_use=["Enterprise AI governance"],
411
+ ... limitations=["Requires policy configuration"],
412
+ ... )
413
+ >>> card = create_model_card(info)
414
+ >>> print(card)
415
+ """
416
+ if info is None:
417
+ info = ModelCardInfo(
418
+ model_name="Agent Control Plane (ACP)",
419
+ description=(
420
+ "A deterministic kernel for zero-violation governance in agentic AI systems. "
421
+ "ACP interposes between LLM intent and action execution, providing "
422
+ "ABAC-based policy enforcement and constraint graphs."
423
+ ),
424
+ intended_use=[
425
+ "Enterprise AI agent governance and safety enforcement",
426
+ "Multi-agent orchestration with policy-based access control",
427
+ "Research into deterministic AI safety mechanisms",
428
+ "Integration with OpenAI, LangChain, and MCP-based agents",
429
+ ],
430
+ out_of_scope_use=[
431
+ "Direct use as an LLM or chat model",
432
+ "Content moderation (this is action-level, not content-level)",
433
+ "Replacing human oversight in critical systems",
434
+ ],
435
+ limitations=[
436
+ "Requires explicit policy configuration for each deployment",
437
+ "Does not prevent all possible adversarial attacks",
438
+ "Shadow mode simulation does not guarantee real-world behavior",
439
+ "Performance overhead scales with policy complexity",
440
+ ],
441
+ metrics={
442
+ "Safety Violation Rate": "0.00% (60-prompt red team benchmark)",
443
+ "False Positive Rate": "0.00%",
444
+ "Token Reduction": "98.1% (Scale by Subtraction)",
445
+ "Latency Overhead": "<5ms per policy check",
446
+ },
447
+ citation="""@article{siddique2026acp,
448
+ title={Agent Control Plane: A Deterministic Kernel for Zero-Violation Governance in Agentic AI},
449
+ author={Siddique, Imran},
450
+ journal={arXiv preprint},
451
+ year={2026}
452
+ }""",
453
+ )
454
+
455
+ # Generate markdown
456
+ card = f"""---
457
+ license: {info.license}
458
+ tags:
459
+ - ai-safety
460
+ - agents
461
+ - governance
462
+ - control-plane
463
+ - deterministic
464
+ language:
465
+ - en
466
+ library_name: agent-control-plane
467
+ ---
468
+
469
+ # {info.model_name}
470
+
471
+ {info.description}
472
+
473
+ ## Intended Use
474
+
475
+ **Primary Use Cases:**
476
+ """
477
+
478
+ for use in info.intended_use:
479
+ card += f"- {use}\n"
480
+
481
+ if info.out_of_scope_use:
482
+ card += "\n**Out-of-Scope Uses:**\n"
483
+ for use in info.out_of_scope_use:
484
+ card += f"- ⚠️ {use}\n"
485
+
486
+ card += "\n## Limitations\n\n"
487
+ for limitation in info.limitations:
488
+ card += f"- {limitation}\n"
489
+
490
+ if info.metrics:
491
+ card += "\n## Evaluation Results\n\n"
492
+ card += "| Metric | Value |\n|--------|-------|\n"
493
+ for metric, value in info.metrics.items():
494
+ card += f"| {metric} | {value} |\n"
495
+
496
+ card += f"""
497
+ ## Installation
498
+
499
+ ```bash
500
+ pip install agent-control-plane
501
+ ```
502
+
503
+ ## Quick Start
504
+
505
+ ```python
506
+ from agent_control_plane import AgentControlPlane, create_governed_client
507
+
508
+ # Create a governed OpenAI client
509
+ client = create_governed_client(
510
+ openai_client,
511
+ permission_level="read_only"
512
+ )
513
+
514
+ # All tool calls are now governed by the control plane
515
+ response = client.chat.completions.create(
516
+ model="gpt-4",
517
+ messages=[{{"role": "user", "content": "Read the sales report"}}],
518
+ tools=[...]
519
+ )
520
+ ```
521
+
522
+ ## Citation
523
+
524
+ If you use this work, please cite:
525
+
526
+ ```bibtex
527
+ {info.citation}
528
+ ```
529
+
530
+ ## Authors
531
+
532
+ """
533
+ for author in info.authors:
534
+ card += f"- {author}\n"
535
+
536
+ card += f"""
537
+ ## License
538
+
539
+ This project is licensed under the {info.license} License.
540
+ """
541
+
542
+ return card
543
+
544
+
545
+ # =============================================================================
546
+ # Convenience Exports
547
+ # =============================================================================
548
+
549
+
550
+ __all__ = [
551
+ # Configuration
552
+ "HFConfig",
553
+ "DEFAULT_CONFIG",
554
+ # Dataset operations
555
+ "download_red_team_dataset",
556
+ "upload_dataset",
557
+ # Experiment logs
558
+ "upload_experiment_logs",
559
+ "list_experiment_logs",
560
+ # Model card
561
+ "ModelCardInfo",
562
+ "create_model_card",
563
+ ]
@@ -0,0 +1,55 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """
4
+ Agent Control Plane - Interfaces Module
5
+
6
+ This module defines the abstract interfaces that allow for:
7
+ 1. Dependency injection of kernels (e.g., scak can implement KernelInterface)
8
+ 2. Plugin-based architecture for validators, executors, and context routers
9
+ 3. Runtime configuration without hard imports
10
+
11
+ Layer 3: The Framework
12
+ - Allowed dependencies: iatp, cmvk, caas
13
+ - Forbidden dependencies: scak, mute-agent (these should implement our interfaces)
14
+ """
15
+
16
+ from .kernel_interface import (
17
+ KernelInterface,
18
+ KernelCapability,
19
+ KernelMetadata,
20
+ )
21
+
22
+ from .plugin_interface import (
23
+ ValidatorInterface,
24
+ ExecutorInterface,
25
+ ContextRouterInterface,
26
+ PolicyProviderInterface,
27
+ PluginCapability,
28
+ PluginMetadata,
29
+ )
30
+
31
+ from .protocol_interfaces import (
32
+ MessageSecurityInterface,
33
+ VerificationInterface,
34
+ ContextRoutingInterface,
35
+ )
36
+
37
+ __all__ = [
38
+ # Kernel Interface (for scak and other kernel implementations)
39
+ "KernelInterface",
40
+ "KernelCapability",
41
+ "KernelMetadata",
42
+
43
+ # Plugin Interfaces (for extensibility)
44
+ "ValidatorInterface",
45
+ "ExecutorInterface",
46
+ "ContextRouterInterface",
47
+ "PolicyProviderInterface",
48
+ "PluginCapability",
49
+ "PluginMetadata",
50
+
51
+ # Protocol Interfaces (for iatp, cmvk, caas integration)
52
+ "MessageSecurityInterface",
53
+ "VerificationInterface",
54
+ "ContextRoutingInterface",
55
+ ]