agent_os_kernel 3.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agent_control_plane/__init__.py +662 -0
- agent_control_plane/a2a_adapter.py +543 -0
- agent_control_plane/adapter.py +417 -0
- agent_control_plane/agent_hibernation.py +394 -0
- agent_control_plane/agent_kernel.py +470 -0
- agent_control_plane/compliance.py +720 -0
- agent_control_plane/constraint_graphs.py +478 -0
- agent_control_plane/control_plane.py +854 -0
- agent_control_plane/example_executors.py +195 -0
- agent_control_plane/execution_engine.py +231 -0
- agent_control_plane/flight_recorder.py +846 -0
- agent_control_plane/governance_layer.py +435 -0
- agent_control_plane/hf_utils.py +563 -0
- agent_control_plane/interfaces/__init__.py +55 -0
- agent_control_plane/interfaces/kernel_interface.py +361 -0
- agent_control_plane/interfaces/plugin_interface.py +497 -0
- agent_control_plane/interfaces/protocol_interfaces.py +387 -0
- agent_control_plane/kernel_space.py +1009 -0
- agent_control_plane/langchain_adapter.py +424 -0
- agent_control_plane/lifecycle.py +3113 -0
- agent_control_plane/mcp_adapter.py +653 -0
- agent_control_plane/ml_safety.py +563 -0
- agent_control_plane/multimodal.py +727 -0
- agent_control_plane/mute_agent.py +422 -0
- agent_control_plane/observability.py +787 -0
- agent_control_plane/orchestrator.py +482 -0
- agent_control_plane/plugin_registry.py +750 -0
- agent_control_plane/policy_engine.py +954 -0
- agent_control_plane/process_isolation.py +777 -0
- agent_control_plane/shadow_mode.py +310 -0
- agent_control_plane/signals.py +493 -0
- agent_control_plane/supervisor_agents.py +430 -0
- agent_control_plane/time_travel_debugger.py +557 -0
- agent_control_plane/tool_registry.py +452 -0
- agent_control_plane/vfs.py +697 -0
- agent_kernel/__init__.py +69 -0
- agent_kernel/analyzer.py +435 -0
- agent_kernel/auditor.py +36 -0
- agent_kernel/completeness_auditor.py +237 -0
- agent_kernel/detector.py +203 -0
- agent_kernel/kernel.py +744 -0
- agent_kernel/memory_manager.py +85 -0
- agent_kernel/models.py +374 -0
- agent_kernel/nudge_mechanism.py +263 -0
- agent_kernel/outcome_analyzer.py +338 -0
- agent_kernel/patcher.py +582 -0
- agent_kernel/semantic_analyzer.py +316 -0
- agent_kernel/semantic_purge.py +349 -0
- agent_kernel/simulator.py +449 -0
- agent_kernel/teacher.py +85 -0
- agent_kernel/triage.py +152 -0
- agent_os/__init__.py +409 -0
- agent_os/_adversarial_impl.py +200 -0
- agent_os/_circuit_breaker_impl.py +232 -0
- agent_os/_mcp_metrics.py +193 -0
- agent_os/adversarial.py +20 -0
- agent_os/agents_compat.py +490 -0
- agent_os/audit_logger.py +135 -0
- agent_os/base_agent.py +651 -0
- agent_os/circuit_breaker.py +34 -0
- agent_os/cli/__init__.py +659 -0
- agent_os/cli/cmd_audit.py +128 -0
- agent_os/cli/cmd_init.py +152 -0
- agent_os/cli/cmd_policy.py +41 -0
- agent_os/cli/cmd_policy_gen.py +180 -0
- agent_os/cli/cmd_validate.py +258 -0
- agent_os/cli/mcp_scan.py +265 -0
- agent_os/cli/output.py +192 -0
- agent_os/cli/policy_checker.py +330 -0
- agent_os/compat.py +74 -0
- agent_os/constraint_graph.py +234 -0
- agent_os/content_governance.py +140 -0
- agent_os/context_budget.py +305 -0
- agent_os/credential_redactor.py +224 -0
- agent_os/diff_policy.py +89 -0
- agent_os/egress_policy.py +159 -0
- agent_os/escalation.py +276 -0
- agent_os/event_bus.py +124 -0
- agent_os/exceptions.py +180 -0
- agent_os/execution_context_policy.py +141 -0
- agent_os/github_enterprise.py +96 -0
- agent_os/health.py +20 -0
- agent_os/integrations/__init__.py +279 -0
- agent_os/integrations/a2a_adapter.py +279 -0
- agent_os/integrations/agent_lightning/__init__.py +30 -0
- agent_os/integrations/anthropic_adapter.py +420 -0
- agent_os/integrations/autogen_adapter.py +620 -0
- agent_os/integrations/base.py +1137 -0
- agent_os/integrations/compat.py +229 -0
- agent_os/integrations/config.py +98 -0
- agent_os/integrations/conversation_guardian.py +957 -0
- agent_os/integrations/crewai_adapter.py +467 -0
- agent_os/integrations/drift_detector.py +425 -0
- agent_os/integrations/dry_run.py +124 -0
- agent_os/integrations/escalation.py +582 -0
- agent_os/integrations/gemini_adapter.py +364 -0
- agent_os/integrations/google_adk_adapter.py +633 -0
- agent_os/integrations/guardrails_adapter.py +394 -0
- agent_os/integrations/health.py +197 -0
- agent_os/integrations/langchain_adapter.py +654 -0
- agent_os/integrations/llamafirewall.py +343 -0
- agent_os/integrations/llamaindex_adapter.py +188 -0
- agent_os/integrations/logging.py +191 -0
- agent_os/integrations/maf_adapter.py +631 -0
- agent_os/integrations/mistral_adapter.py +365 -0
- agent_os/integrations/openai_adapter.py +816 -0
- agent_os/integrations/openai_agents_sdk.py +406 -0
- agent_os/integrations/policy_compose.py +171 -0
- agent_os/integrations/profiling.py +144 -0
- agent_os/integrations/pydantic_ai_adapter.py +420 -0
- agent_os/integrations/rate_limiter.py +130 -0
- agent_os/integrations/rbac.py +143 -0
- agent_os/integrations/registry.py +113 -0
- agent_os/integrations/scope_guard.py +303 -0
- agent_os/integrations/semantic_kernel_adapter.py +769 -0
- agent_os/integrations/smolagents_adapter.py +629 -0
- agent_os/integrations/templates.py +178 -0
- agent_os/integrations/token_budget.py +134 -0
- agent_os/integrations/tool_aliases.py +190 -0
- agent_os/integrations/webhooks.py +177 -0
- agent_os/lite.py +208 -0
- agent_os/mcp_gateway.py +385 -0
- agent_os/mcp_message_signer.py +273 -0
- agent_os/mcp_protocols.py +161 -0
- agent_os/mcp_response_scanner.py +232 -0
- agent_os/mcp_security.py +924 -0
- agent_os/mcp_session_auth.py +231 -0
- agent_os/mcp_sliding_rate_limiter.py +184 -0
- agent_os/memory_guard.py +409 -0
- agent_os/metrics.py +134 -0
- agent_os/mute.py +428 -0
- agent_os/mute_agent.py +209 -0
- agent_os/policies/__init__.py +77 -0
- agent_os/policies/async_evaluator.py +275 -0
- agent_os/policies/backends.py +670 -0
- agent_os/policies/bridge.py +169 -0
- agent_os/policies/budget.py +85 -0
- agent_os/policies/cli.py +294 -0
- agent_os/policies/conflict_resolution.py +270 -0
- agent_os/policies/data_classification.py +252 -0
- agent_os/policies/evaluator.py +239 -0
- agent_os/policies/policy_schema.json +228 -0
- agent_os/policies/rate_limiting.py +145 -0
- agent_os/policies/schema.py +115 -0
- agent_os/policies/shared.py +331 -0
- agent_os/prompt_injection.py +694 -0
- agent_os/providers.py +182 -0
- agent_os/py.typed +0 -0
- agent_os/retry.py +81 -0
- agent_os/reversibility.py +251 -0
- agent_os/sandbox.py +432 -0
- agent_os/sandbox_provider.py +140 -0
- agent_os/secure_codegen.py +525 -0
- agent_os/security_skills.py +538 -0
- agent_os/semantic_policy.py +422 -0
- agent_os/server/__init__.py +15 -0
- agent_os/server/__main__.py +25 -0
- agent_os/server/app.py +277 -0
- agent_os/server/models.py +104 -0
- agent_os/shift_left_metrics.py +130 -0
- agent_os/stateless.py +742 -0
- agent_os/supervisor.py +148 -0
- agent_os/task_outcome.py +148 -0
- agent_os/transparency.py +181 -0
- agent_os/trust_root.py +128 -0
- agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
- agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
- agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
- agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
- agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
- agent_os_observability/__init__.py +27 -0
- agent_os_observability/dashboards.py +898 -0
- agent_os_observability/metrics.py +398 -0
- agent_os_observability/server.py +223 -0
- agent_os_observability/tracer.py +232 -0
- agent_primitives/__init__.py +24 -0
- agent_primitives/failures.py +84 -0
- agent_primitives/py.typed +0 -0
- amb_core/__init__.py +177 -0
- amb_core/adapters/__init__.py +57 -0
- amb_core/adapters/aws_sqs_broker.py +376 -0
- amb_core/adapters/azure_servicebus_broker.py +340 -0
- amb_core/adapters/kafka_broker.py +260 -0
- amb_core/adapters/nats_broker.py +285 -0
- amb_core/adapters/rabbitmq_broker.py +235 -0
- amb_core/adapters/redis_broker.py +262 -0
- amb_core/broker.py +145 -0
- amb_core/bus.py +481 -0
- amb_core/cloudevents.py +509 -0
- amb_core/dlq.py +345 -0
- amb_core/hf_utils.py +536 -0
- amb_core/memory_broker.py +410 -0
- amb_core/models.py +141 -0
- amb_core/persistence.py +529 -0
- amb_core/schema.py +294 -0
- amb_core/tracing.py +358 -0
- atr/__init__.py +640 -0
- atr/access.py +348 -0
- atr/composition.py +645 -0
- atr/decorator.py +357 -0
- atr/executor.py +384 -0
- atr/health.py +557 -0
- atr/hf_utils.py +449 -0
- atr/injection.py +422 -0
- atr/metrics.py +440 -0
- atr/policies.py +403 -0
- atr/py.typed +2 -0
- atr/registry.py +452 -0
- atr/schema.py +480 -0
- atr/tools/safe/__init__.py +75 -0
- atr/tools/safe/calculator.py +467 -0
- atr/tools/safe/datetime_tool.py +443 -0
- atr/tools/safe/file_reader.py +402 -0
- atr/tools/safe/http_client.py +316 -0
- atr/tools/safe/json_parser.py +374 -0
- atr/tools/safe/text_tool.py +537 -0
- atr/tools/safe/toolkit.py +175 -0
- caas/__init__.py +162 -0
- caas/api/__init__.py +7 -0
- caas/api/server.py +1328 -0
- caas/caching.py +834 -0
- caas/cli.py +210 -0
- caas/conversation.py +223 -0
- caas/decay.py +72 -0
- caas/detection/__init__.py +9 -0
- caas/detection/detector.py +238 -0
- caas/enrichment.py +130 -0
- caas/gateway/__init__.py +27 -0
- caas/gateway/trust_gateway.py +474 -0
- caas/hf_utils.py +479 -0
- caas/ingestion/__init__.py +23 -0
- caas/ingestion/processors.py +253 -0
- caas/ingestion/structure_parser.py +188 -0
- caas/models.py +356 -0
- caas/pragmatic_truth.py +444 -0
- caas/routing/__init__.py +10 -0
- caas/routing/heuristic_router.py +58 -0
- caas/storage/__init__.py +9 -0
- caas/storage/store.py +389 -0
- caas/triad.py +213 -0
- caas/tuning/__init__.py +9 -0
- caas/tuning/tuner.py +329 -0
- caas/vfs/__init__.py +14 -0
- caas/vfs/filesystem.py +452 -0
- cmvk/__init__.py +218 -0
- cmvk/audit.py +402 -0
- cmvk/benchmarks.py +478 -0
- cmvk/constitutional.py +904 -0
- cmvk/hf_utils.py +301 -0
- cmvk/metrics.py +473 -0
- cmvk/profiles.py +300 -0
- cmvk/py.typed +0 -0
- cmvk/types.py +12 -0
- cmvk/verification.py +956 -0
- emk/__init__.py +89 -0
- emk/causal.py +352 -0
- emk/hf_utils.py +421 -0
- emk/indexer.py +83 -0
- emk/py.typed +0 -0
- emk/schema.py +204 -0
- emk/sleep_cycle.py +347 -0
- emk/store.py +281 -0
- iatp/__init__.py +166 -0
- iatp/attestation.py +461 -0
- iatp/cli.py +317 -0
- iatp/hf_utils.py +472 -0
- iatp/ipc_pipes.py +580 -0
- iatp/main.py +412 -0
- iatp/models/__init__.py +447 -0
- iatp/policy_engine.py +337 -0
- iatp/py.typed +2 -0
- iatp/recovery.py +321 -0
- iatp/security/__init__.py +270 -0
- iatp/sidecar/__init__.py +519 -0
- iatp/telemetry/__init__.py +164 -0
- iatp/tests/__init__.py +1 -0
- iatp/tests/test_attestation.py +370 -0
- iatp/tests/test_cli.py +131 -0
- iatp/tests/test_ed25519_attestation.py +211 -0
- iatp/tests/test_models.py +130 -0
- iatp/tests/test_policy_engine.py +347 -0
- iatp/tests/test_recovery.py +281 -0
- iatp/tests/test_security.py +222 -0
- iatp/tests/test_sidecar.py +167 -0
- iatp/tests/test_telemetry.py +175 -0
- mcp_kernel_server/__init__.py +28 -0
- mcp_kernel_server/cli.py +274 -0
- mcp_kernel_server/resources.py +217 -0
- mcp_kernel_server/server.py +564 -0
- mcp_kernel_server/tools.py +1174 -0
- mute_agent/__init__.py +68 -0
- mute_agent/core/__init__.py +1 -0
- mute_agent/core/execution_agent.py +166 -0
- mute_agent/core/handshake_protocol.py +201 -0
- mute_agent/core/reasoning_agent.py +238 -0
- mute_agent/knowledge_graph/__init__.py +1 -0
- mute_agent/knowledge_graph/graph_elements.py +65 -0
- mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
- mute_agent/knowledge_graph/subgraph.py +224 -0
- mute_agent/listener/__init__.py +43 -0
- mute_agent/listener/adapters/__init__.py +31 -0
- mute_agent/listener/adapters/base_adapter.py +189 -0
- mute_agent/listener/adapters/caas_adapter.py +344 -0
- mute_agent/listener/adapters/control_plane_adapter.py +436 -0
- mute_agent/listener/adapters/iatp_adapter.py +332 -0
- mute_agent/listener/adapters/scak_adapter.py +251 -0
- mute_agent/listener/listener.py +610 -0
- mute_agent/listener/state_observer.py +436 -0
- mute_agent/listener/threshold_config.py +313 -0
- mute_agent/super_system/__init__.py +1 -0
- mute_agent/super_system/router.py +204 -0
- mute_agent/visualization/__init__.py +10 -0
- mute_agent/visualization/graph_debugger.py +502 -0
- nexus/README.md +60 -0
- nexus/__init__.py +51 -0
- nexus/arbiter.py +359 -0
- nexus/client.py +466 -0
- nexus/dmz.py +444 -0
- nexus/escrow.py +430 -0
- nexus/exceptions.py +286 -0
- nexus/pyproject.toml +36 -0
- nexus/registry.py +393 -0
- nexus/reputation.py +425 -0
- nexus/schemas/__init__.py +51 -0
- nexus/schemas/compliance.py +276 -0
- nexus/schemas/escrow.py +251 -0
- nexus/schemas/manifest.py +225 -0
- nexus/schemas/receipt.py +208 -0
- nexus/tests/__init__.py +0 -0
- nexus/tests/conftest.py +146 -0
- nexus/tests/test_arbiter.py +192 -0
- nexus/tests/test_dmz.py +194 -0
- nexus/tests/test_escrow.py +276 -0
- nexus/tests/test_exceptions.py +225 -0
- nexus/tests/test_registry.py +232 -0
- nexus/tests/test_reputation.py +328 -0
- nexus/tests/test_schemas.py +295 -0
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
|
+
)
|