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
amb_core/hf_utils.py ADDED
@@ -0,0 +1,536 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """
4
+ Hugging Face Hub Utilities for AMB
5
+ ==================================
6
+
7
+ This module provides utilities for uploading and downloading experiment results,
8
+ datasets, and logs to/from the Hugging Face Hub.
9
+
10
+ Features:
11
+ - Upload experiment results and benchmarks
12
+ - Push/pull message log datasets
13
+ - Version control for research artifacts
14
+
15
+ Requirements:
16
+ pip install huggingface_hub
17
+
18
+ Usage:
19
+ from amb_core.hf_utils import upload_experiment_logs, download_dataset
20
+
21
+ # Upload benchmark results
22
+ upload_experiment_logs(
23
+ file_path="experiments/results.json",
24
+ repo_id="microsoft/amb-benchmarks"
25
+ )
26
+
27
+ # Download existing dataset
28
+ df = download_dataset("microsoft/amb-message-logs")
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ import json
34
+ import os
35
+ from datetime import datetime, timezone
36
+ from pathlib import Path
37
+ from typing import Any, Dict, List, Optional, Union
38
+
39
+ try:
40
+ from huggingface_hub import (
41
+ DatasetCard,
42
+ DatasetCardData,
43
+ HfApi,
44
+ Repository,
45
+ create_repo,
46
+ hf_hub_download,
47
+ list_repo_files,
48
+ upload_file,
49
+ )
50
+ HF_AVAILABLE = True
51
+ except ImportError:
52
+ HF_AVAILABLE = False
53
+
54
+
55
+ __all__ = [
56
+ "upload_experiment_logs",
57
+ "download_dataset",
58
+ "push_message_logs",
59
+ "create_dataset_card",
60
+ "HFDatasetManager",
61
+ ]
62
+
63
+
64
+ def _check_hf_available() -> None:
65
+ """Check if huggingface_hub is installed."""
66
+ if not HF_AVAILABLE:
67
+ raise ImportError(
68
+ "huggingface_hub is required for HF utilities. "
69
+ "Install it with: pip install huggingface_hub"
70
+ )
71
+
72
+
73
+ def upload_experiment_logs(
74
+ file_path: Union[str, Path],
75
+ repo_id: str,
76
+ *,
77
+ path_in_repo: Optional[str] = None,
78
+ commit_message: Optional[str] = None,
79
+ token: Optional[str] = None,
80
+ private: bool = False,
81
+ ) -> str:
82
+ """
83
+ Upload experiment logs or benchmark results to Hugging Face Hub.
84
+
85
+ This function uploads a single file (typically JSON results from experiments)
86
+ to a dataset repository on the Hugging Face Hub.
87
+
88
+ Args:
89
+ file_path: Local path to the file to upload.
90
+ repo_id: Repository ID on HF Hub (e.g., "microsoft/amb-benchmarks").
91
+ path_in_repo: Destination path in the repository. Defaults to filename
92
+ with timestamp prefix.
93
+ commit_message: Git commit message. Auto-generated if not provided.
94
+ token: HF API token. Uses HF_TOKEN env var or cached token if not provided.
95
+ private: Whether to create a private repository if it doesn't exist.
96
+
97
+ Returns:
98
+ URL to the uploaded file on Hugging Face Hub.
99
+
100
+ Raises:
101
+ ImportError: If huggingface_hub is not installed.
102
+ FileNotFoundError: If the file_path doesn't exist.
103
+
104
+ Example:
105
+ >>> url = upload_experiment_logs(
106
+ ... "experiments/results.json",
107
+ ... "microsoft/amb-benchmarks"
108
+ ... )
109
+ >>> print(f"Uploaded to: {url}")
110
+ """
111
+ _check_hf_available()
112
+
113
+ file_path = Path(file_path)
114
+ if not file_path.exists():
115
+ raise FileNotFoundError(f"File not found: {file_path}")
116
+
117
+ api = HfApi(token=token)
118
+
119
+ # Create repo if it doesn't exist
120
+ try:
121
+ create_repo(
122
+ repo_id=repo_id,
123
+ repo_type="dataset",
124
+ private=private,
125
+ exist_ok=True,
126
+ token=token,
127
+ )
128
+ except Exception:
129
+ # Repo might already exist
130
+ pass
131
+
132
+ # Generate path in repo with timestamp
133
+ if path_in_repo is None:
134
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
135
+ path_in_repo = f"runs/{timestamp}_{file_path.name}"
136
+
137
+ # Generate commit message
138
+ if commit_message is None:
139
+ commit_message = f"Upload experiment results: {file_path.name}"
140
+
141
+ # Upload file
142
+ url = api.upload_file(
143
+ path_or_fileobj=str(file_path),
144
+ path_in_repo=path_in_repo,
145
+ repo_id=repo_id,
146
+ repo_type="dataset",
147
+ commit_message=commit_message,
148
+ )
149
+
150
+ return url
151
+
152
+
153
+ def download_dataset(
154
+ repo_id: str,
155
+ filename: str = "latest",
156
+ *,
157
+ local_dir: Optional[Union[str, Path]] = None,
158
+ token: Optional[str] = None,
159
+ ) -> Path:
160
+ """
161
+ Download a dataset file from Hugging Face Hub.
162
+
163
+ Args:
164
+ repo_id: Repository ID on HF Hub (e.g., "microsoft/amb-benchmarks").
165
+ filename: Specific file to download, or "latest" to get most recent.
166
+ local_dir: Local directory to save the file. Defaults to HF cache.
167
+ token: HF API token. Uses HF_TOKEN env var or cached token if not provided.
168
+
169
+ Returns:
170
+ Path to the downloaded file.
171
+
172
+ Raises:
173
+ ImportError: If huggingface_hub is not installed.
174
+
175
+ Example:
176
+ >>> path = download_dataset(
177
+ ... "microsoft/amb-benchmarks",
178
+ ... filename="latest"
179
+ ... )
180
+ >>> with open(path) as f:
181
+ ... data = json.load(f)
182
+ """
183
+ _check_hf_available()
184
+
185
+ api = HfApi(token=token)
186
+
187
+ # If "latest", find most recent file
188
+ if filename == "latest":
189
+ files = list_repo_files(repo_id, repo_type="dataset", token=token)
190
+ # Filter to JSON files in runs directory
191
+ run_files = [f for f in files if f.startswith("runs/") and f.endswith(".json")]
192
+ if not run_files:
193
+ raise FileNotFoundError(f"No run files found in {repo_id}")
194
+ filename = sorted(run_files)[-1] # Most recent by timestamp
195
+
196
+ # Download file
197
+ local_path = hf_hub_download(
198
+ repo_id=repo_id,
199
+ filename=filename,
200
+ repo_type="dataset",
201
+ local_dir=local_dir,
202
+ token=token,
203
+ )
204
+
205
+ return Path(local_path)
206
+
207
+
208
+ def push_message_logs(
209
+ messages: List[Dict[str, Any]],
210
+ repo_id: str,
211
+ *,
212
+ split: str = "train",
213
+ token: Optional[str] = None,
214
+ private: bool = False,
215
+ ) -> str:
216
+ """
217
+ Push a list of message logs as a dataset to Hugging Face Hub.
218
+
219
+ This is useful for collecting agent communication patterns for research.
220
+
221
+ Args:
222
+ messages: List of message dictionaries to push.
223
+ repo_id: Repository ID on HF Hub.
224
+ split: Dataset split name (train, test, validation).
225
+ token: HF API token.
226
+ private: Whether to create a private repository.
227
+
228
+ Returns:
229
+ URL to the dataset on Hugging Face Hub.
230
+
231
+ Example:
232
+ >>> messages = [
233
+ ... {"topic": "agent.thoughts", "payload": {"thought": "analyzing..."}, "timestamp": "2024-01-01T00:00:00Z"},
234
+ ... {"topic": "agent.actions", "payload": {"action": "search"}, "timestamp": "2024-01-01T00:00:01Z"},
235
+ ... ]
236
+ >>> url = push_message_logs(messages, "microsoft/amb-message-logs")
237
+ """
238
+ _check_hf_available()
239
+
240
+ api = HfApi(token=token)
241
+
242
+ # Create repo
243
+ create_repo(
244
+ repo_id=repo_id,
245
+ repo_type="dataset",
246
+ private=private,
247
+ exist_ok=True,
248
+ token=token,
249
+ )
250
+
251
+ # Convert to JSONL format
252
+ timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
253
+ filename = f"data/{split}_{timestamp}.jsonl"
254
+
255
+ # Create temporary file
256
+ import tempfile
257
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".jsonl", delete=False) as f:
258
+ for msg in messages:
259
+ f.write(json.dumps(msg, default=str) + "\n")
260
+ temp_path = f.name
261
+
262
+ try:
263
+ # Upload
264
+ url = api.upload_file(
265
+ path_or_fileobj=temp_path,
266
+ path_in_repo=filename,
267
+ repo_id=repo_id,
268
+ repo_type="dataset",
269
+ commit_message=f"Add {len(messages)} message logs",
270
+ )
271
+ finally:
272
+ os.unlink(temp_path)
273
+
274
+ return url
275
+
276
+
277
+ def create_dataset_card(
278
+ repo_id: str,
279
+ *,
280
+ description: str = "Agent Message Bus communication logs and experiment results.",
281
+ license: str = "mit",
282
+ language: str = "en",
283
+ tags: Optional[List[str]] = None,
284
+ token: Optional[str] = None,
285
+ ) -> None:
286
+ """
287
+ Create or update the dataset card (README.md) for a HF dataset.
288
+
289
+ Args:
290
+ repo_id: Repository ID on HF Hub.
291
+ description: Dataset description.
292
+ license: License identifier.
293
+ language: Language code.
294
+ tags: List of tags for the dataset.
295
+ token: HF API token.
296
+
297
+ Example:
298
+ >>> create_dataset_card(
299
+ ... "microsoft/amb-benchmarks",
300
+ ... description="AMB performance benchmarks across different configurations.",
301
+ ... tags=["message-bus", "agents", "benchmarks"]
302
+ ... )
303
+ """
304
+ _check_hf_available()
305
+
306
+ if tags is None:
307
+ tags = ["agent-communication", "message-bus", "benchmarks", "async"]
308
+
309
+ card_data = DatasetCardData(
310
+ license=license,
311
+ language=language,
312
+ tags=tags,
313
+ )
314
+
315
+ card_content = f"""---
316
+ {card_data.to_yaml()}
317
+ ---
318
+
319
+ # {repo_id.split('/')[-1]}
320
+
321
+ {description}
322
+
323
+ ## Dataset Description
324
+
325
+ This dataset contains experiment results and message logs from the
326
+ [AMB (Agent Message Bus)](https://github.com/microsoft/agent-governance-toolkit) project.
327
+
328
+ ### Supported Tasks
329
+
330
+ - Performance benchmarking analysis
331
+ - Agent communication pattern research
332
+ - Message latency studies
333
+
334
+ ### Data Format
335
+
336
+ Results are stored in JSON/JSONL format with the following schema:
337
+
338
+ ```json
339
+ {{
340
+ "metadata": {{
341
+ "experiment_name": "string",
342
+ "timestamp": "ISO8601",
343
+ "seed": "int"
344
+ }},
345
+ "results": [
346
+ {{
347
+ "name": "benchmark_name",
348
+ "mean_latency_ms": "float",
349
+ "throughput_msg_per_sec": "float"
350
+ }}
351
+ ]
352
+ }}
353
+ ```
354
+
355
+ ## Usage
356
+
357
+ ```python
358
+ from amb_core.hf_utils import download_dataset
359
+ import json
360
+
361
+ # Download latest results
362
+ path = download_dataset("{repo_id}", filename="latest")
363
+ with open(path) as f:
364
+ data = json.load(f)
365
+ ```
366
+
367
+ ## Citation
368
+
369
+ ```bibtex
370
+ @software{{amb2024,
371
+ author = {{Siddique, Imran}},
372
+ title = {{AMB: Agent Message Bus}},
373
+ year = {{2024}},
374
+ url = {{https://github.com/microsoft/agent-governance-toolkit}}
375
+ }}
376
+ ```
377
+
378
+ ## License
379
+
380
+ This dataset is released under the {license.upper()} License.
381
+ """
382
+
383
+ api = HfApi(token=token)
384
+
385
+ import tempfile
386
+ with tempfile.NamedTemporaryFile(mode="w", suffix=".md", delete=False) as f:
387
+ f.write(card_content)
388
+ temp_path = f.name
389
+
390
+ try:
391
+ api.upload_file(
392
+ path_or_fileobj=temp_path,
393
+ path_in_repo="README.md",
394
+ repo_id=repo_id,
395
+ repo_type="dataset",
396
+ commit_message="Update dataset card",
397
+ token=token,
398
+ )
399
+ finally:
400
+ os.unlink(temp_path)
401
+
402
+
403
+ class HFDatasetManager:
404
+ """
405
+ High-level manager for Hugging Face dataset operations.
406
+
407
+ This class provides a convenient interface for managing experiment
408
+ results and message logs on Hugging Face Hub.
409
+
410
+ Attributes:
411
+ repo_id: Repository ID on HF Hub.
412
+ token: HF API token.
413
+
414
+ Example:
415
+ >>> manager = HFDatasetManager("microsoft/amb-benchmarks")
416
+ >>> manager.upload_results("experiments/results.json")
417
+ >>> latest = manager.get_latest_results()
418
+ """
419
+
420
+ def __init__(
421
+ self,
422
+ repo_id: str,
423
+ *,
424
+ token: Optional[str] = None,
425
+ auto_create: bool = True,
426
+ private: bool = False,
427
+ ) -> None:
428
+ """
429
+ Initialize the dataset manager.
430
+
431
+ Args:
432
+ repo_id: Repository ID on HF Hub (e.g., "username/dataset-name").
433
+ token: HF API token. Uses HF_TOKEN env var if not provided.
434
+ auto_create: Whether to automatically create the repo if it doesn't exist.
435
+ private: Whether to create a private repository.
436
+ """
437
+ _check_hf_available()
438
+
439
+ self.repo_id = repo_id
440
+ self.token = token or os.environ.get("HF_TOKEN")
441
+ self._api = HfApi(token=self.token)
442
+
443
+ if auto_create:
444
+ try:
445
+ create_repo(
446
+ repo_id=repo_id,
447
+ repo_type="dataset",
448
+ private=private,
449
+ exist_ok=True,
450
+ token=self.token,
451
+ )
452
+ except Exception:
453
+ pass # Repo might already exist
454
+
455
+ def upload_results(
456
+ self,
457
+ file_path: Union[str, Path],
458
+ *,
459
+ commit_message: Optional[str] = None,
460
+ ) -> str:
461
+ """
462
+ Upload experiment results to the repository.
463
+
464
+ Args:
465
+ file_path: Path to the results file (JSON).
466
+ commit_message: Git commit message.
467
+
468
+ Returns:
469
+ URL to the uploaded file.
470
+ """
471
+ return upload_experiment_logs(
472
+ file_path=file_path,
473
+ repo_id=self.repo_id,
474
+ token=self.token,
475
+ commit_message=commit_message,
476
+ )
477
+
478
+ def get_latest_results(
479
+ self,
480
+ local_dir: Optional[Union[str, Path]] = None,
481
+ ) -> Dict[str, Any]:
482
+ """
483
+ Download and parse the latest results file.
484
+
485
+ Args:
486
+ local_dir: Local directory to save the file.
487
+
488
+ Returns:
489
+ Parsed JSON data from the latest results file.
490
+ """
491
+ path = download_dataset(
492
+ repo_id=self.repo_id,
493
+ filename="latest",
494
+ local_dir=local_dir,
495
+ token=self.token,
496
+ )
497
+
498
+ with open(path) as f:
499
+ return json.load(f)
500
+
501
+ def list_runs(self) -> List[str]:
502
+ """
503
+ List all experiment runs in the repository.
504
+
505
+ Returns:
506
+ List of run file paths.
507
+ """
508
+ files = list_repo_files(
509
+ self.repo_id,
510
+ repo_type="dataset",
511
+ token=self.token,
512
+ )
513
+ return [f for f in files if f.startswith("runs/") and f.endswith(".json")]
514
+
515
+ def push_logs(
516
+ self,
517
+ messages: List[Dict[str, Any]],
518
+ *,
519
+ split: str = "train",
520
+ ) -> str:
521
+ """
522
+ Push message logs to the repository.
523
+
524
+ Args:
525
+ messages: List of message dictionaries.
526
+ split: Dataset split name.
527
+
528
+ Returns:
529
+ URL to the uploaded data.
530
+ """
531
+ return push_message_logs(
532
+ messages=messages,
533
+ repo_id=self.repo_id,
534
+ split=split,
535
+ token=self.token,
536
+ )