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
cmvk/hf_utils.py ADDED
@@ -0,0 +1,301 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """
4
+ Hugging Face Hub Utilities for CMVK
5
+
6
+ Lightweight utilities for pushing/pulling datasets and experiment results
7
+ to the Hugging Face Hub. Designed for research reproducibility.
8
+
9
+ Usage:
10
+ from cmvk.hf_utils import upload_experiment_logs, download_dataset
11
+
12
+ # Upload experiment results
13
+ upload_experiment_logs(
14
+ results_path="experiments/results.json",
15
+ repo_id="microsoft/cmvk-benchmark-data"
16
+ )
17
+
18
+ # Download shared datasets
19
+ download_dataset(
20
+ repo_id="microsoft/cmvk-benchmark-data",
21
+ filename="datasets/humaneval_50.json",
22
+ local_path="experiments/datasets/"
23
+ )
24
+
25
+ Requirements:
26
+ pip install huggingface_hub
27
+ """
28
+
29
+ from __future__ import annotations
30
+
31
+ import json
32
+ import logging
33
+ from pathlib import Path
34
+ from typing import TYPE_CHECKING, Any
35
+
36
+ if TYPE_CHECKING:
37
+ from huggingface_hub import HfApi
38
+
39
+ logger = logging.getLogger(__name__)
40
+
41
+ # Default repository configuration
42
+ DEFAULT_REPO_ID = "microsoft/cmvk-benchmark-data"
43
+ DEFAULT_REPO_TYPE = "dataset"
44
+
45
+
46
+ class HuggingFaceHubError(Exception):
47
+ """Raised when Hugging Face Hub operations fail."""
48
+
49
+ pass
50
+
51
+
52
+ def _get_api() -> HfApi:
53
+ """Get HfApi instance, raising helpful error if not installed."""
54
+ try:
55
+ from huggingface_hub import HfApi
56
+
57
+ return HfApi()
58
+ except ImportError as e:
59
+ raise HuggingFaceHubError(
60
+ "huggingface_hub is required for HF integration. "
61
+ "Install with: pip install huggingface_hub"
62
+ ) from e
63
+
64
+
65
+ def check_auth() -> bool:
66
+ """
67
+ Check if Hugging Face authentication is configured.
68
+
69
+ Returns:
70
+ True if authenticated, False otherwise.
71
+
72
+ Example:
73
+ >>> if check_auth():
74
+ ... upload_experiment_logs("results.json")
75
+ """
76
+ try:
77
+ api = _get_api()
78
+ api.whoami()
79
+ return True
80
+ except Exception:
81
+ return False
82
+
83
+
84
+ def upload_experiment_logs(
85
+ results_path: str | Path,
86
+ repo_id: str = DEFAULT_REPO_ID,
87
+ path_in_repo: str | None = None,
88
+ commit_message: str | None = None,
89
+ private: bool = False,
90
+ ) -> str:
91
+ """
92
+ Upload experiment results/logs to Hugging Face Hub.
93
+
94
+ Args:
95
+ results_path: Path to local results file (JSON, CSV, etc.)
96
+ repo_id: Hugging Face repository ID (e.g., "username/repo-name")
97
+ path_in_repo: Path within the repository. If None, uses filename.
98
+ commit_message: Custom commit message. Auto-generated if None.
99
+ private: Whether to make the repository private.
100
+
101
+ Returns:
102
+ URL of the uploaded file.
103
+
104
+ Raises:
105
+ HuggingFaceHubError: If upload fails or file not found.
106
+ FileNotFoundError: If results_path doesn't exist.
107
+
108
+ Example:
109
+ >>> url = upload_experiment_logs(
110
+ ... "experiments/results.json",
111
+ ... repo_id="microsoft/cmvk-benchmark-data"
112
+ ... )
113
+ >>> print(f"Uploaded to: {url}")
114
+ """
115
+ from huggingface_hub import create_repo
116
+
117
+ results_path = Path(results_path)
118
+ if not results_path.exists():
119
+ raise FileNotFoundError(f"Results file not found: {results_path}")
120
+
121
+ api = _get_api()
122
+
123
+ # Create repo if needed
124
+ try:
125
+ create_repo(
126
+ repo_id,
127
+ repo_type=DEFAULT_REPO_TYPE,
128
+ private=private,
129
+ exist_ok=True,
130
+ )
131
+ except Exception as e:
132
+ logger.debug(f"Repository creation skipped: {e}")
133
+
134
+ # Determine path in repo
135
+ if path_in_repo is None:
136
+ path_in_repo = f"results/{results_path.name}"
137
+
138
+ # Auto-generate commit message
139
+ if commit_message is None:
140
+ commit_message = f"Upload experiment results: {results_path.name}"
141
+
142
+ try:
143
+ url: str = api.upload_file(
144
+ path_or_fileobj=str(results_path),
145
+ path_in_repo=path_in_repo,
146
+ repo_id=repo_id,
147
+ repo_type=DEFAULT_REPO_TYPE,
148
+ commit_message=commit_message,
149
+ )
150
+ logger.info(f"Uploaded {results_path.name} to {url}")
151
+ return url
152
+ except Exception as e:
153
+ raise HuggingFaceHubError(f"Failed to upload {results_path}: {e}") from e
154
+
155
+
156
+ def upload_traces(
157
+ trace_dir: str | Path,
158
+ repo_id: str = DEFAULT_REPO_ID,
159
+ max_files: int = 100,
160
+ ) -> list[str]:
161
+ """
162
+ Upload execution traces directory to Hugging Face Hub.
163
+
164
+ Args:
165
+ trace_dir: Directory containing trace JSON files.
166
+ repo_id: Hugging Face repository ID.
167
+ max_files: Maximum number of files to upload.
168
+
169
+ Returns:
170
+ List of uploaded file URLs.
171
+
172
+ Example:
173
+ >>> urls = upload_traces("logs/traces/")
174
+ >>> print(f"Uploaded {len(urls)} trace files")
175
+ """
176
+ trace_path = Path(trace_dir)
177
+ if not trace_path.exists():
178
+ raise FileNotFoundError(f"Trace directory not found: {trace_path}")
179
+
180
+ api = _get_api()
181
+ trace_files = sorted(trace_path.glob("*.json"))[:max_files]
182
+
183
+ urls = []
184
+ for trace_file in trace_files:
185
+ try:
186
+ url = api.upload_file(
187
+ path_or_fileobj=str(trace_file),
188
+ path_in_repo=f"traces/{trace_file.name}",
189
+ repo_id=repo_id,
190
+ repo_type=DEFAULT_REPO_TYPE,
191
+ commit_message=f"Upload trace: {trace_file.name}",
192
+ )
193
+ urls.append(url)
194
+ except Exception as e:
195
+ logger.warning(f"Failed to upload {trace_file.name}: {e}")
196
+
197
+ logger.info(f"Uploaded {len(urls)}/{len(trace_files)} trace files")
198
+ return urls
199
+
200
+
201
+ def download_dataset(
202
+ repo_id: str = DEFAULT_REPO_ID,
203
+ filename: str = "datasets/humaneval_50.json",
204
+ local_path: str | Path = "experiments/datasets/",
205
+ revision: str = "main",
206
+ ) -> Path:
207
+ """
208
+ Download a dataset file from Hugging Face Hub.
209
+
210
+ Args:
211
+ repo_id: Hugging Face repository ID.
212
+ filename: Path to file within the repository.
213
+ local_path: Local directory to save the file.
214
+ revision: Git revision (branch, tag, or commit).
215
+
216
+ Returns:
217
+ Path to the downloaded file.
218
+
219
+ Example:
220
+ >>> path = download_dataset(
221
+ ... filename="datasets/humaneval_50.json",
222
+ ... local_path="experiments/datasets/"
223
+ ... )
224
+ >>> with open(path) as f:
225
+ ... data = json.load(f)
226
+ """
227
+ from huggingface_hub import hf_hub_download
228
+
229
+ local_path = Path(local_path)
230
+ local_path.mkdir(parents=True, exist_ok=True)
231
+
232
+ try:
233
+ downloaded = hf_hub_download(
234
+ repo_id=repo_id,
235
+ filename=filename,
236
+ repo_type=DEFAULT_REPO_TYPE,
237
+ revision=revision,
238
+ local_dir=str(local_path),
239
+ )
240
+ result_path = Path(downloaded)
241
+ logger.info(f"Downloaded {filename} to {result_path}")
242
+ return result_path
243
+ except Exception as e:
244
+ raise HuggingFaceHubError(f"Failed to download {filename}: {e}") from e
245
+
246
+
247
+ def upload_verification_dataset(
248
+ data: list[dict[str, Any]],
249
+ dataset_name: str,
250
+ repo_id: str = DEFAULT_REPO_ID,
251
+ description: str | None = None,
252
+ ) -> str:
253
+ """
254
+ Upload a verification dataset (list of problems/results) to HF Hub.
255
+
256
+ Args:
257
+ data: List of problem dictionaries with verification results.
258
+ dataset_name: Name for the dataset file.
259
+ repo_id: Hugging Face repository ID.
260
+ description: Optional description to include in metadata.
261
+
262
+ Returns:
263
+ URL of the uploaded dataset.
264
+
265
+ Example:
266
+ >>> results = [
267
+ ... {"task_id": "HE/1", "success": True, "drift_score": 0.15},
268
+ ... {"task_id": "HE/2", "success": False, "drift_score": 0.89},
269
+ ... ]
270
+ >>> upload_verification_dataset(results, "humaneval_run_001")
271
+ """
272
+ import tempfile
273
+ from datetime import datetime
274
+
275
+ # Create metadata wrapper
276
+ dataset = {
277
+ "name": dataset_name,
278
+ "created_at": datetime.now().isoformat(),
279
+ "description": description or f"CMVK verification dataset: {dataset_name}",
280
+ "count": len(data),
281
+ "data": data,
282
+ }
283
+
284
+ # Write to temp file and upload
285
+ with tempfile.NamedTemporaryFile(
286
+ mode="w",
287
+ suffix=".json",
288
+ delete=False,
289
+ ) as f:
290
+ json.dump(dataset, f, indent=2)
291
+ temp_path = Path(f.name)
292
+
293
+ try:
294
+ return upload_experiment_logs(
295
+ temp_path,
296
+ repo_id=repo_id,
297
+ path_in_repo=f"datasets/{dataset_name}.json",
298
+ commit_message=f"Upload verification dataset: {dataset_name}",
299
+ )
300
+ finally:
301
+ temp_path.unlink(missing_ok=True)