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
atr/hf_utils.py ADDED
@@ -0,0 +1,449 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """Hugging Face Hub utilities for ATR.
4
+
5
+ This module provides utilities for integrating ATR with the Hugging Face ecosystem,
6
+ including uploading/downloading datasets, experiment logs, and tool specifications.
7
+
8
+ Example:
9
+ Upload experiment results to Hugging Face Hub::
10
+
11
+ from atr.hf_utils import upload_experiment_logs
12
+
13
+ upload_experiment_logs(
14
+ repo_id="microsoft/atr-experiments",
15
+ results_path="experiments/results/results.json"
16
+ )
17
+
18
+ Note:
19
+ Requires the `huggingface-hub` package. Install with::
20
+
21
+ pip install agent-tool-registry[hf]
22
+
23
+ You must be authenticated with Hugging Face. Run::
24
+
25
+ huggingface-cli login
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ import json
31
+ import logging
32
+ from datetime import datetime, timezone
33
+ from pathlib import Path
34
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
35
+
36
+ if TYPE_CHECKING:
37
+ from atr import Registry, ToolSpec
38
+
39
+ logger = logging.getLogger(__name__)
40
+
41
+ # Default repository namespace
42
+ DEFAULT_NAMESPACE = "microsoft"
43
+
44
+
45
+ def _check_hf_hub_installed() -> None:
46
+ """Check if huggingface_hub is installed.
47
+
48
+ Raises:
49
+ ImportError: If huggingface_hub is not installed.
50
+ """
51
+ try:
52
+ import huggingface_hub # noqa: F401
53
+ except ImportError as e:
54
+ raise ImportError(
55
+ "huggingface_hub is required for HF integration. "
56
+ "Install it with: pip install agent-tool-registry[hf]"
57
+ ) from e
58
+
59
+
60
+ def upload_experiment_logs(
61
+ repo_id: str,
62
+ results_path: Union[str, Path],
63
+ *,
64
+ commit_message: Optional[str] = None,
65
+ private: bool = False,
66
+ token: Optional[str] = None,
67
+ ) -> str:
68
+ """Upload experiment results to Hugging Face Hub.
69
+
70
+ Creates or updates a dataset repository with experiment logs.
71
+
72
+ Args:
73
+ repo_id: The Hugging Face repo ID (e.g., "microsoft/atr-experiments").
74
+ results_path: Path to the results JSON file.
75
+ commit_message: Custom commit message. Auto-generated if None.
76
+ private: Whether the repository should be private.
77
+ token: Hugging Face API token. Uses cached token if None.
78
+
79
+ Returns:
80
+ URL of the uploaded file on Hugging Face Hub.
81
+
82
+ Raises:
83
+ ImportError: If huggingface_hub is not installed.
84
+ FileNotFoundError: If results file doesn't exist.
85
+ ValueError: If results file is not valid JSON.
86
+
87
+ Example:
88
+ >>> url = upload_experiment_logs(
89
+ ... repo_id="microsoft/atr-experiments",
90
+ ... results_path="experiments/results/results.json"
91
+ ... )
92
+ >>> print(f"Uploaded to: {url}")
93
+ """
94
+ _check_hf_hub_installed()
95
+
96
+ from huggingface_hub import HfApi, create_repo
97
+
98
+ results_path = Path(results_path)
99
+ if not results_path.exists():
100
+ raise FileNotFoundError(f"Results file not found: {results_path}")
101
+
102
+ # Validate JSON
103
+ try:
104
+ with open(results_path, encoding="utf-8") as f:
105
+ data = json.load(f)
106
+ except json.JSONDecodeError as e:
107
+ raise ValueError(f"Invalid JSON in results file: {e}") from e
108
+
109
+ api = HfApi(token=token)
110
+
111
+ # Create repo if it doesn't exist
112
+ try:
113
+ create_repo(
114
+ repo_id=repo_id,
115
+ repo_type="dataset",
116
+ private=private,
117
+ token=token,
118
+ exist_ok=True,
119
+ )
120
+ except Exception as e:
121
+ logger.warning(f"Could not create/verify repo: {e}")
122
+
123
+ # Generate filename with timestamp
124
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
125
+ remote_path = f"experiments/results_{timestamp}.json"
126
+
127
+ # Generate commit message
128
+ if commit_message is None:
129
+ atr_version = data.get("metadata", {}).get("atr_version", "unknown")
130
+ commit_message = f"Add experiment results (ATR v{atr_version})"
131
+
132
+ # Upload file
133
+ url = api.upload_file(
134
+ path_or_fileobj=str(results_path),
135
+ path_in_repo=remote_path,
136
+ repo_id=repo_id,
137
+ repo_type="dataset",
138
+ commit_message=commit_message,
139
+ token=token,
140
+ )
141
+
142
+ logger.info(f"Uploaded experiment logs to: {url}")
143
+ return url
144
+
145
+
146
+ def download_experiment_logs(
147
+ repo_id: str,
148
+ output_dir: Union[str, Path] = ".",
149
+ *,
150
+ filename: Optional[str] = None,
151
+ token: Optional[str] = None,
152
+ ) -> Path:
153
+ """Download experiment results from Hugging Face Hub.
154
+
155
+ Args:
156
+ repo_id: The Hugging Face repo ID.
157
+ output_dir: Directory to save downloaded files.
158
+ filename: Specific file to download. Downloads latest if None.
159
+ token: Hugging Face API token.
160
+
161
+ Returns:
162
+ Path to the downloaded file.
163
+
164
+ Raises:
165
+ ImportError: If huggingface_hub is not installed.
166
+
167
+ Example:
168
+ >>> path = download_experiment_logs(
169
+ ... repo_id="microsoft/atr-experiments",
170
+ ... output_dir="./downloaded"
171
+ ... )
172
+ """
173
+ _check_hf_hub_installed()
174
+
175
+ from huggingface_hub import hf_hub_download, list_repo_files
176
+
177
+ output_dir = Path(output_dir)
178
+ output_dir.mkdir(parents=True, exist_ok=True)
179
+
180
+ # If no specific file, find the latest
181
+ if filename is None:
182
+ files = list_repo_files(repo_id=repo_id, repo_type="dataset", token=token)
183
+ experiment_files = sorted(
184
+ [f for f in files if f.startswith("experiments/") and f.endswith(".json")],
185
+ reverse=True,
186
+ )
187
+ if not experiment_files:
188
+ raise FileNotFoundError(f"No experiment files found in {repo_id}")
189
+ filename = experiment_files[0]
190
+
191
+ downloaded_path = hf_hub_download(
192
+ repo_id=repo_id,
193
+ filename=filename,
194
+ repo_type="dataset",
195
+ local_dir=str(output_dir),
196
+ token=token,
197
+ )
198
+
199
+ return Path(downloaded_path)
200
+
201
+
202
+ def upload_tool_registry(
203
+ repo_id: str,
204
+ registry: Registry,
205
+ *,
206
+ commit_message: Optional[str] = None,
207
+ private: bool = False,
208
+ token: Optional[str] = None,
209
+ ) -> str:
210
+ """Upload a tool registry snapshot to Hugging Face Hub.
211
+
212
+ Serializes all tool specifications and uploads as a dataset.
213
+
214
+ Args:
215
+ repo_id: The Hugging Face repo ID.
216
+ registry: The ATR Registry instance to upload.
217
+ commit_message: Custom commit message.
218
+ private: Whether the repository should be private.
219
+ token: Hugging Face API token.
220
+
221
+ Returns:
222
+ URL of the uploaded file.
223
+
224
+ Example:
225
+ >>> import atr
226
+ >>> url = upload_tool_registry(
227
+ ... repo_id="microsoft/atr-tools",
228
+ ... registry=atr._global_registry
229
+ ... )
230
+ """
231
+ _check_hf_hub_installed()
232
+
233
+ from huggingface_hub import HfApi, create_repo
234
+
235
+ api = HfApi(token=token)
236
+
237
+ # Create repo
238
+ create_repo(
239
+ repo_id=repo_id,
240
+ repo_type="dataset",
241
+ private=private,
242
+ token=token,
243
+ exist_ok=True,
244
+ )
245
+
246
+ # Serialize registry
247
+ tools = registry.list_tools()
248
+ registry_data = {
249
+ "metadata": {
250
+ "timestamp": datetime.now(timezone.utc).isoformat(),
251
+ "tool_count": len(tools),
252
+ },
253
+ "tools": [
254
+ {
255
+ "name": tool.metadata.name,
256
+ "description": tool.metadata.description,
257
+ "version": tool.metadata.version,
258
+ "author": tool.metadata.author,
259
+ "cost": tool.metadata.cost.value,
260
+ "tags": tool.metadata.tags,
261
+ "parameters": [p.model_dump() for p in tool.parameters],
262
+ "openai_schema": tool.to_openai_function_schema(),
263
+ }
264
+ for tool in tools
265
+ ],
266
+ }
267
+
268
+ # Write to temp file and upload
269
+ import tempfile
270
+
271
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False, encoding="utf-8") as f:
272
+ json.dump(registry_data, f, indent=2, default=str)
273
+ temp_path = f.name
274
+
275
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
276
+ remote_path = f"registry/tools_{timestamp}.json"
277
+
278
+ if commit_message is None:
279
+ commit_message = f"Upload tool registry ({len(tools)} tools)"
280
+
281
+ url = api.upload_file(
282
+ path_or_fileobj=temp_path,
283
+ path_in_repo=remote_path,
284
+ repo_id=repo_id,
285
+ repo_type="dataset",
286
+ commit_message=commit_message,
287
+ token=token,
288
+ )
289
+
290
+ # Cleanup
291
+ Path(temp_path).unlink()
292
+
293
+ logger.info(f"Uploaded tool registry to: {url}")
294
+ return url
295
+
296
+
297
+ def create_model_card_snippet(
298
+ tools: List[ToolSpec],
299
+ model_name: str = "ATR Tool Registry",
300
+ ) -> str:
301
+ """Generate a Hugging Face Model Card snippet for ATR tools.
302
+
303
+ Creates a markdown snippet suitable for a Model Card README.
304
+
305
+ Args:
306
+ tools: List of tool specifications to document.
307
+ model_name: Name to use in the model card header.
308
+
309
+ Returns:
310
+ Markdown string for the model card.
311
+
312
+ Example:
313
+ >>> import atr
314
+ >>> tools = atr.list_tools()
315
+ >>> snippet = create_model_card_snippet(tools)
316
+ >>> print(snippet)
317
+ """
318
+ tool_list = "\n".join(f"- **{t.metadata.name}**: {t.metadata.description}" for t in tools[:10])
319
+
320
+ if len(tools) > 10:
321
+ tool_list += f"\n- ... and {len(tools) - 10} more tools"
322
+
323
+ return f"""---
324
+ license: mit
325
+ language:
326
+ - en
327
+ library_name: atr
328
+ tags:
329
+ - agent-tools
330
+ - function-calling
331
+ - llm
332
+ ---
333
+
334
+ # {model_name}
335
+
336
+ ## Model Description
337
+
338
+ This repository contains tool specifications for the Agent Tool Registry (ATR),
339
+ a decentralized marketplace for agent capabilities.
340
+
341
+ ## Intended Use
342
+
343
+ These tool specifications are intended for:
344
+ - **LLM Function Calling**: Convert to OpenAI/Anthropic function schemas
345
+ - **Agent Development**: Discover and integrate tools into AI agents
346
+ - **Research**: Benchmark and evaluate agent tool usage
347
+
348
+ ### Primary Use Cases
349
+
350
+ 1. Tool discovery for autonomous agents
351
+ 2. Schema generation for LLM function calling
352
+ 3. Standardized tool interfaces across different agent frameworks
353
+
354
+ ## Tools Included
355
+
356
+ {tool_list}
357
+
358
+ ## Limitations
359
+
360
+ - **No Execution**: ATR stores specifications only; execution is handled by the agent runtime
361
+ - **Schema Only**: The callable functions are not included in this dataset
362
+ - **Version Dependent**: Tool specifications may change between versions
363
+
364
+ ## How to Use
365
+
366
+ ```python
367
+ import atr
368
+ from atr.hf_utils import download_experiment_logs
369
+
370
+ # Download tool specifications
371
+ # (implementation depends on your use case)
372
+ ```
373
+
374
+ ## Citation
375
+
376
+ ```bibtex
377
+ @software{{atr2026,
378
+ author = {{Siddique, Imran}},
379
+ title = {{ATR: Agent Tool Registry}},
380
+ year = {{2026}},
381
+ url = {{https://github.com/microsoft/agent-governance-toolkit}}
382
+ }}
383
+ ```
384
+
385
+ ## Contact
386
+
387
+ For questions or issues, please open an issue on the
388
+ [GitHub repository](https://github.com/microsoft/agent-governance-toolkit).
389
+ """
390
+
391
+
392
+ def push_to_hub(
393
+ repo_id: str,
394
+ data: Dict[str, Any],
395
+ filename: str,
396
+ *,
397
+ repo_type: str = "dataset",
398
+ commit_message: Optional[str] = None,
399
+ private: bool = False,
400
+ token: Optional[str] = None,
401
+ ) -> str:
402
+ """Generic utility to push JSON data to Hugging Face Hub.
403
+
404
+ Args:
405
+ repo_id: The Hugging Face repo ID.
406
+ data: Dictionary to serialize as JSON.
407
+ filename: Remote filename (e.g., "data/results.json").
408
+ repo_type: Type of repository ("dataset", "model", "space").
409
+ commit_message: Commit message.
410
+ private: Whether repository should be private.
411
+ token: Hugging Face API token.
412
+
413
+ Returns:
414
+ URL of the uploaded file.
415
+ """
416
+ _check_hf_hub_installed()
417
+
418
+ from huggingface_hub import HfApi, create_repo
419
+
420
+ api = HfApi(token=token)
421
+
422
+ create_repo(
423
+ repo_id=repo_id,
424
+ repo_type=repo_type,
425
+ private=private,
426
+ token=token,
427
+ exist_ok=True,
428
+ )
429
+
430
+ import tempfile
431
+
432
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False, encoding="utf-8") as f:
433
+ json.dump(data, f, indent=2, default=str)
434
+ temp_path = f.name
435
+
436
+ if commit_message is None:
437
+ commit_message = f"Upload {filename}"
438
+
439
+ url = api.upload_file(
440
+ path_or_fileobj=temp_path,
441
+ path_in_repo=filename,
442
+ repo_id=repo_id,
443
+ repo_type=repo_type,
444
+ commit_message=commit_message,
445
+ token=token,
446
+ )
447
+
448
+ Path(temp_path).unlink()
449
+ return url