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
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Hugging Face Hub Utilities for Agent Control Plane
|
|
5
|
+
|
|
6
|
+
This module provides utilities for interacting with Hugging Face Hub, including:
|
|
7
|
+
- Uploading experiment logs and results
|
|
8
|
+
- Downloading/uploading datasets
|
|
9
|
+
- Model card generation
|
|
10
|
+
- Dataset versioning and management
|
|
11
|
+
|
|
12
|
+
Installation:
|
|
13
|
+
pip install huggingface_hub datasets
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
from agent_control_plane.hf_utils import (
|
|
17
|
+
upload_experiment_logs,
|
|
18
|
+
download_red_team_dataset,
|
|
19
|
+
create_model_card,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
# Upload experiment results
|
|
23
|
+
upload_experiment_logs(
|
|
24
|
+
results_path="experiments/results.json",
|
|
25
|
+
repo_id="microsoft/acp-experiment-logs",
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
Configuration:
|
|
29
|
+
Set HF_TOKEN environment variable or use `huggingface-cli login`
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
import json
|
|
35
|
+
import logging
|
|
36
|
+
import os
|
|
37
|
+
from dataclasses import dataclass, field
|
|
38
|
+
from datetime import datetime
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
from typing import Any, Dict, List, Optional, Union
|
|
41
|
+
|
|
42
|
+
logger = logging.getLogger(__name__)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# =============================================================================
|
|
46
|
+
# Configuration
|
|
47
|
+
# =============================================================================
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass
|
|
51
|
+
class HFConfig:
|
|
52
|
+
"""Configuration for Hugging Face Hub operations.
|
|
53
|
+
|
|
54
|
+
Attributes:
|
|
55
|
+
default_org: Default organization/user for uploads.
|
|
56
|
+
red_team_dataset: Repository ID for the red team benchmark dataset.
|
|
57
|
+
experiment_logs_repo: Repository ID for experiment logs.
|
|
58
|
+
token: HF API token (if not set, uses HF_TOKEN env var).
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
default_org: str = "microsoft"
|
|
62
|
+
red_team_dataset: str = "microsoft/agent-control-redteam-60"
|
|
63
|
+
experiment_logs_repo: str = "microsoft/acp-experiment-logs"
|
|
64
|
+
token: Optional[str] = None
|
|
65
|
+
|
|
66
|
+
def get_token(self) -> Optional[str]:
|
|
67
|
+
"""Get the HF token from config or environment."""
|
|
68
|
+
return self.token or os.environ.get("HF_TOKEN")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
DEFAULT_CONFIG = HFConfig()
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# =============================================================================
|
|
75
|
+
# Dataset Operations
|
|
76
|
+
# =============================================================================
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def download_red_team_dataset(
|
|
80
|
+
config: Optional[HFConfig] = None,
|
|
81
|
+
split: str = "train",
|
|
82
|
+
streaming: bool = False,
|
|
83
|
+
) -> Any:
|
|
84
|
+
"""
|
|
85
|
+
Download the Agent Control Plane red team benchmark dataset.
|
|
86
|
+
|
|
87
|
+
This dataset contains 60 adversarial prompts across categories:
|
|
88
|
+
- Direct attacks
|
|
89
|
+
- Prompt injection
|
|
90
|
+
- Privilege escalation
|
|
91
|
+
- Data exfiltration
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
config: HF configuration (uses default if not provided).
|
|
95
|
+
split: Dataset split to load ("train").
|
|
96
|
+
streaming: If True, return an iterable dataset for memory efficiency.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Hugging Face Dataset object.
|
|
100
|
+
|
|
101
|
+
Raises:
|
|
102
|
+
ImportError: If datasets library is not installed.
|
|
103
|
+
|
|
104
|
+
Example:
|
|
105
|
+
>>> from agent_control_plane.hf_utils import download_red_team_dataset
|
|
106
|
+
>>> dataset = download_red_team_dataset()
|
|
107
|
+
>>> print(f"Loaded {len(dataset)} prompts")
|
|
108
|
+
>>> for item in dataset:
|
|
109
|
+
... print(f"Category: {item['category']}, Blocked: {item['expected_blocked']}")
|
|
110
|
+
"""
|
|
111
|
+
try:
|
|
112
|
+
from datasets import load_dataset
|
|
113
|
+
except ImportError:
|
|
114
|
+
raise ImportError(
|
|
115
|
+
"datasets library required. Install with: pip install datasets"
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
config = config or DEFAULT_CONFIG
|
|
119
|
+
|
|
120
|
+
logger.info(f"Downloading red team dataset from: {config.red_team_dataset}")
|
|
121
|
+
|
|
122
|
+
dataset = load_dataset(
|
|
123
|
+
config.red_team_dataset,
|
|
124
|
+
split=split,
|
|
125
|
+
streaming=streaming,
|
|
126
|
+
token=config.get_token(),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
logger.info(f"Successfully loaded dataset with {len(dataset)} entries")
|
|
130
|
+
return dataset
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def upload_dataset(
|
|
134
|
+
data: Union[Dict[str, List[Any]], List[Dict[str, Any]], Any],
|
|
135
|
+
repo_id: str,
|
|
136
|
+
config: Optional[HFConfig] = None,
|
|
137
|
+
private: bool = False,
|
|
138
|
+
commit_message: Optional[str] = None,
|
|
139
|
+
) -> str:
|
|
140
|
+
"""
|
|
141
|
+
Upload a dataset to Hugging Face Hub.
|
|
142
|
+
|
|
143
|
+
Args:
|
|
144
|
+
data: Dataset to upload. Can be:
|
|
145
|
+
- Dict mapping column names to lists
|
|
146
|
+
- List of dicts (one per row)
|
|
147
|
+
- Existing HF Dataset object
|
|
148
|
+
repo_id: Target repository ID (e.g., "username/dataset-name").
|
|
149
|
+
config: HF configuration (uses default if not provided).
|
|
150
|
+
private: If True, create a private repository.
|
|
151
|
+
commit_message: Custom commit message.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
URL of the uploaded dataset.
|
|
155
|
+
|
|
156
|
+
Raises:
|
|
157
|
+
ImportError: If datasets/huggingface_hub libraries not installed.
|
|
158
|
+
|
|
159
|
+
Example:
|
|
160
|
+
>>> from agent_control_plane.hf_utils import upload_dataset
|
|
161
|
+
>>> data = {
|
|
162
|
+
... "prompt": ["attack 1", "attack 2"],
|
|
163
|
+
... "category": ["injection", "exfil"],
|
|
164
|
+
... "blocked": [True, True],
|
|
165
|
+
... }
|
|
166
|
+
>>> url = upload_dataset(data, "my-user/my-dataset")
|
|
167
|
+
>>> print(f"Uploaded to: {url}")
|
|
168
|
+
"""
|
|
169
|
+
try:
|
|
170
|
+
from datasets import Dataset
|
|
171
|
+
from huggingface_hub import HfApi
|
|
172
|
+
except ImportError:
|
|
173
|
+
raise ImportError(
|
|
174
|
+
"Required libraries not installed. "
|
|
175
|
+
"Install with: pip install datasets huggingface_hub"
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
config = config or DEFAULT_CONFIG
|
|
179
|
+
token = config.get_token()
|
|
180
|
+
|
|
181
|
+
# Convert to Dataset if needed
|
|
182
|
+
if isinstance(data, dict):
|
|
183
|
+
dataset = Dataset.from_dict(data)
|
|
184
|
+
elif isinstance(data, list):
|
|
185
|
+
dataset = Dataset.from_list(data)
|
|
186
|
+
else:
|
|
187
|
+
dataset = data # Assume it's already a Dataset
|
|
188
|
+
|
|
189
|
+
# Generate commit message
|
|
190
|
+
if commit_message is None:
|
|
191
|
+
commit_message = f"Upload dataset - {datetime.now().isoformat()}"
|
|
192
|
+
|
|
193
|
+
logger.info(f"Uploading dataset to: {repo_id}")
|
|
194
|
+
logger.info(f"Dataset size: {len(dataset)} rows")
|
|
195
|
+
|
|
196
|
+
# Push to hub
|
|
197
|
+
dataset.push_to_hub(
|
|
198
|
+
repo_id,
|
|
199
|
+
token=token,
|
|
200
|
+
private=private,
|
|
201
|
+
commit_message=commit_message,
|
|
202
|
+
)
|
|
203
|
+
|
|
204
|
+
url = f"https://huggingface.co/datasets/{repo_id}"
|
|
205
|
+
logger.info(f"Successfully uploaded to: {url}")
|
|
206
|
+
return url
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
# =============================================================================
|
|
210
|
+
# Experiment Log Operations
|
|
211
|
+
# =============================================================================
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def upload_experiment_logs(
|
|
215
|
+
results_path: Union[str, Path],
|
|
216
|
+
repo_id: Optional[str] = None,
|
|
217
|
+
config: Optional[HFConfig] = None,
|
|
218
|
+
experiment_name: Optional[str] = None,
|
|
219
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
220
|
+
) -> str:
|
|
221
|
+
"""
|
|
222
|
+
Upload experiment results/logs to Hugging Face Hub.
|
|
223
|
+
|
|
224
|
+
This function uploads experiment results for reproducibility tracking.
|
|
225
|
+
Results are stored in a structured format with metadata.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
results_path: Path to results JSON file or directory.
|
|
229
|
+
repo_id: Target repository ID. Uses config default if not provided.
|
|
230
|
+
config: HF configuration (uses default if not provided).
|
|
231
|
+
experiment_name: Optional name for the experiment run.
|
|
232
|
+
metadata: Additional metadata to include.
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
URL of the uploaded file.
|
|
236
|
+
|
|
237
|
+
Raises:
|
|
238
|
+
FileNotFoundError: If results_path doesn't exist.
|
|
239
|
+
ImportError: If huggingface_hub library not installed.
|
|
240
|
+
|
|
241
|
+
Example:
|
|
242
|
+
>>> from agent_control_plane.hf_utils import upload_experiment_logs
|
|
243
|
+
>>> url = upload_experiment_logs(
|
|
244
|
+
... results_path="experiments/results.json",
|
|
245
|
+
... experiment_name="ablation_study_v2",
|
|
246
|
+
... metadata={"gpu": "A100", "seed": 42},
|
|
247
|
+
... )
|
|
248
|
+
>>> print(f"Logs uploaded to: {url}")
|
|
249
|
+
"""
|
|
250
|
+
try:
|
|
251
|
+
from huggingface_hub import HfApi, upload_file
|
|
252
|
+
except ImportError:
|
|
253
|
+
raise ImportError(
|
|
254
|
+
"huggingface_hub library required. Install with: pip install huggingface_hub"
|
|
255
|
+
)
|
|
256
|
+
|
|
257
|
+
config = config or DEFAULT_CONFIG
|
|
258
|
+
repo_id = repo_id or config.experiment_logs_repo
|
|
259
|
+
token = config.get_token()
|
|
260
|
+
|
|
261
|
+
results_path = Path(results_path)
|
|
262
|
+
if not results_path.exists():
|
|
263
|
+
raise FileNotFoundError(f"Results file not found: {results_path}")
|
|
264
|
+
|
|
265
|
+
# Load and enrich results
|
|
266
|
+
with open(results_path, "r") as f:
|
|
267
|
+
results = json.load(f)
|
|
268
|
+
|
|
269
|
+
# Add metadata
|
|
270
|
+
enriched_results = {
|
|
271
|
+
"upload_timestamp": datetime.now().isoformat(),
|
|
272
|
+
"experiment_name": experiment_name or results_path.stem,
|
|
273
|
+
"source_file": str(results_path),
|
|
274
|
+
"custom_metadata": metadata or {},
|
|
275
|
+
"results": results,
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
# Generate unique filename
|
|
279
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
280
|
+
exp_name = experiment_name or "experiment"
|
|
281
|
+
filename = f"logs/{exp_name}_{timestamp}.json"
|
|
282
|
+
|
|
283
|
+
# Create temp file with enriched data
|
|
284
|
+
temp_path = results_path.parent / f"_upload_{timestamp}.json"
|
|
285
|
+
try:
|
|
286
|
+
with open(temp_path, "w") as f:
|
|
287
|
+
json.dump(enriched_results, f, indent=2)
|
|
288
|
+
|
|
289
|
+
logger.info(f"Uploading experiment logs to: {repo_id}/{filename}")
|
|
290
|
+
|
|
291
|
+
# Upload to hub
|
|
292
|
+
api = HfApi(token=token)
|
|
293
|
+
|
|
294
|
+
# Ensure repo exists
|
|
295
|
+
try:
|
|
296
|
+
api.create_repo(repo_id, repo_type="dataset", exist_ok=True)
|
|
297
|
+
except Exception as e:
|
|
298
|
+
logger.warning(f"Could not create repo (may already exist): {e}")
|
|
299
|
+
|
|
300
|
+
url = api.upload_file(
|
|
301
|
+
path_or_fileobj=str(temp_path),
|
|
302
|
+
path_in_repo=filename,
|
|
303
|
+
repo_id=repo_id,
|
|
304
|
+
repo_type="dataset",
|
|
305
|
+
commit_message=f"Upload experiment: {exp_name}",
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
logger.info(f"Successfully uploaded to: {url}")
|
|
309
|
+
return url
|
|
310
|
+
|
|
311
|
+
finally:
|
|
312
|
+
# Cleanup temp file
|
|
313
|
+
if temp_path.exists():
|
|
314
|
+
temp_path.unlink()
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def list_experiment_logs(
|
|
318
|
+
repo_id: Optional[str] = None,
|
|
319
|
+
config: Optional[HFConfig] = None,
|
|
320
|
+
limit: int = 50,
|
|
321
|
+
) -> List[Dict[str, Any]]:
|
|
322
|
+
"""
|
|
323
|
+
List available experiment logs in the repository.
|
|
324
|
+
|
|
325
|
+
Args:
|
|
326
|
+
repo_id: Repository ID to list from.
|
|
327
|
+
config: HF configuration (uses default if not provided).
|
|
328
|
+
limit: Maximum number of files to list.
|
|
329
|
+
|
|
330
|
+
Returns:
|
|
331
|
+
List of file metadata dicts with name, size, and last_modified.
|
|
332
|
+
|
|
333
|
+
Example:
|
|
334
|
+
>>> from agent_control_plane.hf_utils import list_experiment_logs
|
|
335
|
+
>>> logs = list_experiment_logs()
|
|
336
|
+
>>> for log in logs[:5]:
|
|
337
|
+
... print(f"{log['name']} - {log['size']} bytes")
|
|
338
|
+
"""
|
|
339
|
+
try:
|
|
340
|
+
from huggingface_hub import HfApi
|
|
341
|
+
except ImportError:
|
|
342
|
+
raise ImportError(
|
|
343
|
+
"huggingface_hub library required. Install with: pip install huggingface_hub"
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
config = config or DEFAULT_CONFIG
|
|
347
|
+
repo_id = repo_id or config.experiment_logs_repo
|
|
348
|
+
token = config.get_token()
|
|
349
|
+
|
|
350
|
+
api = HfApi(token=token)
|
|
351
|
+
|
|
352
|
+
try:
|
|
353
|
+
files = api.list_repo_files(repo_id, repo_type="dataset")
|
|
354
|
+
|
|
355
|
+
# Filter for log files
|
|
356
|
+
log_files = [f for f in files if f.startswith("logs/") and f.endswith(".json")]
|
|
357
|
+
|
|
358
|
+
return [{"name": f, "path": f} for f in log_files[:limit]]
|
|
359
|
+
|
|
360
|
+
except Exception as e:
|
|
361
|
+
logger.error(f"Failed to list experiment logs: {e}")
|
|
362
|
+
return []
|
|
363
|
+
|
|
364
|
+
|
|
365
|
+
# =============================================================================
|
|
366
|
+
# Model Card Generation
|
|
367
|
+
# =============================================================================
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
@dataclass
|
|
371
|
+
class ModelCardInfo:
|
|
372
|
+
"""Information for generating a Hugging Face Model Card.
|
|
373
|
+
|
|
374
|
+
Attributes:
|
|
375
|
+
model_name: Name of the model/system.
|
|
376
|
+
description: Brief description.
|
|
377
|
+
intended_use: Primary intended use cases.
|
|
378
|
+
limitations: Known limitations and out-of-scope uses.
|
|
379
|
+
training_data: Description of training data (if applicable).
|
|
380
|
+
metrics: Evaluation metrics and results.
|
|
381
|
+
citation: BibTeX citation.
|
|
382
|
+
"""
|
|
383
|
+
|
|
384
|
+
model_name: str = "Agent Control Plane"
|
|
385
|
+
description: str = ""
|
|
386
|
+
intended_use: List[str] = field(default_factory=list)
|
|
387
|
+
out_of_scope_use: List[str] = field(default_factory=list)
|
|
388
|
+
limitations: List[str] = field(default_factory=list)
|
|
389
|
+
training_data: str = ""
|
|
390
|
+
metrics: Dict[str, Any] = field(default_factory=dict)
|
|
391
|
+
citation: str = ""
|
|
392
|
+
license: str = "MIT"
|
|
393
|
+
authors: List[str] = field(default_factory=lambda: ["Microsoft Corporation"])
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
def create_model_card(info: Optional[ModelCardInfo] = None) -> str:
|
|
397
|
+
"""
|
|
398
|
+
Generate a Hugging Face Model Card README.md content.
|
|
399
|
+
|
|
400
|
+
Args:
|
|
401
|
+
info: ModelCardInfo with details. Uses defaults if not provided.
|
|
402
|
+
|
|
403
|
+
Returns:
|
|
404
|
+
Markdown string for the model card.
|
|
405
|
+
|
|
406
|
+
Example:
|
|
407
|
+
>>> from agent_control_plane.hf_utils import create_model_card, ModelCardInfo
|
|
408
|
+
>>> info = ModelCardInfo(
|
|
409
|
+
... model_name="My ACP Instance",
|
|
410
|
+
... intended_use=["Enterprise AI governance"],
|
|
411
|
+
... limitations=["Requires policy configuration"],
|
|
412
|
+
... )
|
|
413
|
+
>>> card = create_model_card(info)
|
|
414
|
+
>>> print(card)
|
|
415
|
+
"""
|
|
416
|
+
if info is None:
|
|
417
|
+
info = ModelCardInfo(
|
|
418
|
+
model_name="Agent Control Plane (ACP)",
|
|
419
|
+
description=(
|
|
420
|
+
"A deterministic kernel for zero-violation governance in agentic AI systems. "
|
|
421
|
+
"ACP interposes between LLM intent and action execution, providing "
|
|
422
|
+
"ABAC-based policy enforcement and constraint graphs."
|
|
423
|
+
),
|
|
424
|
+
intended_use=[
|
|
425
|
+
"Enterprise AI agent governance and safety enforcement",
|
|
426
|
+
"Multi-agent orchestration with policy-based access control",
|
|
427
|
+
"Research into deterministic AI safety mechanisms",
|
|
428
|
+
"Integration with OpenAI, LangChain, and MCP-based agents",
|
|
429
|
+
],
|
|
430
|
+
out_of_scope_use=[
|
|
431
|
+
"Direct use as an LLM or chat model",
|
|
432
|
+
"Content moderation (this is action-level, not content-level)",
|
|
433
|
+
"Replacing human oversight in critical systems",
|
|
434
|
+
],
|
|
435
|
+
limitations=[
|
|
436
|
+
"Requires explicit policy configuration for each deployment",
|
|
437
|
+
"Does not prevent all possible adversarial attacks",
|
|
438
|
+
"Shadow mode simulation does not guarantee real-world behavior",
|
|
439
|
+
"Performance overhead scales with policy complexity",
|
|
440
|
+
],
|
|
441
|
+
metrics={
|
|
442
|
+
"Safety Violation Rate": "0.00% (60-prompt red team benchmark)",
|
|
443
|
+
"False Positive Rate": "0.00%",
|
|
444
|
+
"Token Reduction": "98.1% (Scale by Subtraction)",
|
|
445
|
+
"Latency Overhead": "<5ms per policy check",
|
|
446
|
+
},
|
|
447
|
+
citation="""@article{siddique2026acp,
|
|
448
|
+
title={Agent Control Plane: A Deterministic Kernel for Zero-Violation Governance in Agentic AI},
|
|
449
|
+
author={Siddique, Imran},
|
|
450
|
+
journal={arXiv preprint},
|
|
451
|
+
year={2026}
|
|
452
|
+
}""",
|
|
453
|
+
)
|
|
454
|
+
|
|
455
|
+
# Generate markdown
|
|
456
|
+
card = f"""---
|
|
457
|
+
license: {info.license}
|
|
458
|
+
tags:
|
|
459
|
+
- ai-safety
|
|
460
|
+
- agents
|
|
461
|
+
- governance
|
|
462
|
+
- control-plane
|
|
463
|
+
- deterministic
|
|
464
|
+
language:
|
|
465
|
+
- en
|
|
466
|
+
library_name: agent-control-plane
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
# {info.model_name}
|
|
470
|
+
|
|
471
|
+
{info.description}
|
|
472
|
+
|
|
473
|
+
## Intended Use
|
|
474
|
+
|
|
475
|
+
**Primary Use Cases:**
|
|
476
|
+
"""
|
|
477
|
+
|
|
478
|
+
for use in info.intended_use:
|
|
479
|
+
card += f"- {use}\n"
|
|
480
|
+
|
|
481
|
+
if info.out_of_scope_use:
|
|
482
|
+
card += "\n**Out-of-Scope Uses:**\n"
|
|
483
|
+
for use in info.out_of_scope_use:
|
|
484
|
+
card += f"- ⚠️ {use}\n"
|
|
485
|
+
|
|
486
|
+
card += "\n## Limitations\n\n"
|
|
487
|
+
for limitation in info.limitations:
|
|
488
|
+
card += f"- {limitation}\n"
|
|
489
|
+
|
|
490
|
+
if info.metrics:
|
|
491
|
+
card += "\n## Evaluation Results\n\n"
|
|
492
|
+
card += "| Metric | Value |\n|--------|-------|\n"
|
|
493
|
+
for metric, value in info.metrics.items():
|
|
494
|
+
card += f"| {metric} | {value} |\n"
|
|
495
|
+
|
|
496
|
+
card += f"""
|
|
497
|
+
## Installation
|
|
498
|
+
|
|
499
|
+
```bash
|
|
500
|
+
pip install agent-control-plane
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
## Quick Start
|
|
504
|
+
|
|
505
|
+
```python
|
|
506
|
+
from agent_control_plane import AgentControlPlane, create_governed_client
|
|
507
|
+
|
|
508
|
+
# Create a governed OpenAI client
|
|
509
|
+
client = create_governed_client(
|
|
510
|
+
openai_client,
|
|
511
|
+
permission_level="read_only"
|
|
512
|
+
)
|
|
513
|
+
|
|
514
|
+
# All tool calls are now governed by the control plane
|
|
515
|
+
response = client.chat.completions.create(
|
|
516
|
+
model="gpt-4",
|
|
517
|
+
messages=[{{"role": "user", "content": "Read the sales report"}}],
|
|
518
|
+
tools=[...]
|
|
519
|
+
)
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
## Citation
|
|
523
|
+
|
|
524
|
+
If you use this work, please cite:
|
|
525
|
+
|
|
526
|
+
```bibtex
|
|
527
|
+
{info.citation}
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
## Authors
|
|
531
|
+
|
|
532
|
+
"""
|
|
533
|
+
for author in info.authors:
|
|
534
|
+
card += f"- {author}\n"
|
|
535
|
+
|
|
536
|
+
card += f"""
|
|
537
|
+
## License
|
|
538
|
+
|
|
539
|
+
This project is licensed under the {info.license} License.
|
|
540
|
+
"""
|
|
541
|
+
|
|
542
|
+
return card
|
|
543
|
+
|
|
544
|
+
|
|
545
|
+
# =============================================================================
|
|
546
|
+
# Convenience Exports
|
|
547
|
+
# =============================================================================
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
__all__ = [
|
|
551
|
+
# Configuration
|
|
552
|
+
"HFConfig",
|
|
553
|
+
"DEFAULT_CONFIG",
|
|
554
|
+
# Dataset operations
|
|
555
|
+
"download_red_team_dataset",
|
|
556
|
+
"upload_dataset",
|
|
557
|
+
# Experiment logs
|
|
558
|
+
"upload_experiment_logs",
|
|
559
|
+
"list_experiment_logs",
|
|
560
|
+
# Model card
|
|
561
|
+
"ModelCardInfo",
|
|
562
|
+
"create_model_card",
|
|
563
|
+
]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Agent Control Plane - Interfaces Module
|
|
5
|
+
|
|
6
|
+
This module defines the abstract interfaces that allow for:
|
|
7
|
+
1. Dependency injection of kernels (e.g., scak can implement KernelInterface)
|
|
8
|
+
2. Plugin-based architecture for validators, executors, and context routers
|
|
9
|
+
3. Runtime configuration without hard imports
|
|
10
|
+
|
|
11
|
+
Layer 3: The Framework
|
|
12
|
+
- Allowed dependencies: iatp, cmvk, caas
|
|
13
|
+
- Forbidden dependencies: scak, mute-agent (these should implement our interfaces)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from .kernel_interface import (
|
|
17
|
+
KernelInterface,
|
|
18
|
+
KernelCapability,
|
|
19
|
+
KernelMetadata,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
from .plugin_interface import (
|
|
23
|
+
ValidatorInterface,
|
|
24
|
+
ExecutorInterface,
|
|
25
|
+
ContextRouterInterface,
|
|
26
|
+
PolicyProviderInterface,
|
|
27
|
+
PluginCapability,
|
|
28
|
+
PluginMetadata,
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
from .protocol_interfaces import (
|
|
32
|
+
MessageSecurityInterface,
|
|
33
|
+
VerificationInterface,
|
|
34
|
+
ContextRoutingInterface,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
__all__ = [
|
|
38
|
+
# Kernel Interface (for scak and other kernel implementations)
|
|
39
|
+
"KernelInterface",
|
|
40
|
+
"KernelCapability",
|
|
41
|
+
"KernelMetadata",
|
|
42
|
+
|
|
43
|
+
# Plugin Interfaces (for extensibility)
|
|
44
|
+
"ValidatorInterface",
|
|
45
|
+
"ExecutorInterface",
|
|
46
|
+
"ContextRouterInterface",
|
|
47
|
+
"PolicyProviderInterface",
|
|
48
|
+
"PluginCapability",
|
|
49
|
+
"PluginMetadata",
|
|
50
|
+
|
|
51
|
+
# Protocol Interfaces (for iatp, cmvk, caas integration)
|
|
52
|
+
"MessageSecurityInterface",
|
|
53
|
+
"VerificationInterface",
|
|
54
|
+
"ContextRoutingInterface",
|
|
55
|
+
]
|