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
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
|