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/decorator.py
ADDED
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Decorator for registering tools in the Agent Tool Registry.
|
|
5
|
+
|
|
6
|
+
Provides @atr.register() decorator to turn Python functions into discoverable tools.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import asyncio
|
|
12
|
+
import inspect
|
|
13
|
+
from typing import (
|
|
14
|
+
TYPE_CHECKING,
|
|
15
|
+
Any,
|
|
16
|
+
Callable,
|
|
17
|
+
List,
|
|
18
|
+
Optional,
|
|
19
|
+
Union,
|
|
20
|
+
get_args,
|
|
21
|
+
get_origin,
|
|
22
|
+
get_type_hints,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
from .registry import Registry
|
|
26
|
+
from .schema import (
|
|
27
|
+
CostLevel,
|
|
28
|
+
ParameterSpec,
|
|
29
|
+
ParameterType,
|
|
30
|
+
SideEffect,
|
|
31
|
+
ToolMetadata,
|
|
32
|
+
ToolSpec,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
if TYPE_CHECKING:
|
|
36
|
+
pass
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _python_type_to_parameter_type(python_type: Any) -> ParameterType:
|
|
40
|
+
"""Convert Python type annotation to ParameterType.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
python_type: Python type annotation
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
Corresponding ParameterType
|
|
47
|
+
"""
|
|
48
|
+
# Handle None type
|
|
49
|
+
if python_type is type(None):
|
|
50
|
+
return ParameterType.STRING
|
|
51
|
+
|
|
52
|
+
# Get the origin to check for generic types
|
|
53
|
+
origin = get_origin(python_type)
|
|
54
|
+
|
|
55
|
+
# Only unwrap Optional/Union types - don't unwrap List, Dict, etc.
|
|
56
|
+
# Check if it's a Union (which includes Optional)
|
|
57
|
+
if origin is Union:
|
|
58
|
+
args = get_args(python_type)
|
|
59
|
+
if args:
|
|
60
|
+
# For Optional[X] or Union[X, None], get X
|
|
61
|
+
non_none_types = [arg for arg in args if arg is not type(None)]
|
|
62
|
+
if non_none_types:
|
|
63
|
+
# Use the first non-None type and recurse
|
|
64
|
+
return _python_type_to_parameter_type(non_none_types[0])
|
|
65
|
+
|
|
66
|
+
# Now check the origin for generic types like List[str], Dict[str, int]
|
|
67
|
+
if origin is list:
|
|
68
|
+
return ParameterType.ARRAY
|
|
69
|
+
elif origin is dict:
|
|
70
|
+
return ParameterType.OBJECT
|
|
71
|
+
|
|
72
|
+
# Map basic Python types to ParameterType
|
|
73
|
+
if python_type == str:
|
|
74
|
+
return ParameterType.STRING
|
|
75
|
+
elif python_type == int:
|
|
76
|
+
return ParameterType.INTEGER
|
|
77
|
+
elif python_type == float:
|
|
78
|
+
return ParameterType.NUMBER
|
|
79
|
+
elif python_type == bool:
|
|
80
|
+
return ParameterType.BOOLEAN
|
|
81
|
+
elif python_type == list:
|
|
82
|
+
return ParameterType.ARRAY
|
|
83
|
+
elif python_type == dict:
|
|
84
|
+
return ParameterType.OBJECT
|
|
85
|
+
else:
|
|
86
|
+
# Default to string for unknown types
|
|
87
|
+
return ParameterType.STRING
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def _extract_parameters_from_function(func: Callable) -> List[ParameterSpec]:
|
|
91
|
+
"""Extract parameter specifications from function signature.
|
|
92
|
+
|
|
93
|
+
Args:
|
|
94
|
+
func: The function to analyze
|
|
95
|
+
|
|
96
|
+
Returns:
|
|
97
|
+
List of ParameterSpec objects
|
|
98
|
+
|
|
99
|
+
Raises:
|
|
100
|
+
ValueError: If function has parameters without type hints
|
|
101
|
+
"""
|
|
102
|
+
sig = inspect.signature(func)
|
|
103
|
+
type_hints = get_type_hints(func)
|
|
104
|
+
parameters = []
|
|
105
|
+
|
|
106
|
+
for param_name, param in sig.parameters.items():
|
|
107
|
+
# Skip self/cls parameters
|
|
108
|
+
if param_name in ("self", "cls"):
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
# Require type hints - no magic arguments!
|
|
112
|
+
if param_name not in type_hints:
|
|
113
|
+
raise ValueError(
|
|
114
|
+
f"Parameter '{param_name}' in function '{func.__name__}' must have a type hint. "
|
|
115
|
+
"No magic arguments allowed!"
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
python_type = type_hints[param_name]
|
|
119
|
+
param_type = _python_type_to_parameter_type(python_type)
|
|
120
|
+
|
|
121
|
+
# Determine if required (has no default value)
|
|
122
|
+
required = param.default == inspect.Parameter.empty
|
|
123
|
+
default = None if required else param.default
|
|
124
|
+
|
|
125
|
+
# Extract description from docstring if available
|
|
126
|
+
description = f"Parameter {param_name}"
|
|
127
|
+
docstring = inspect.getdoc(func)
|
|
128
|
+
if docstring:
|
|
129
|
+
# Simple extraction - look for "param_name: description" pattern
|
|
130
|
+
for line in docstring.split("\n"):
|
|
131
|
+
if param_name in line and ":" in line:
|
|
132
|
+
parts = line.split(":", 1)
|
|
133
|
+
if len(parts) == 2:
|
|
134
|
+
description = parts[1].strip()
|
|
135
|
+
break
|
|
136
|
+
|
|
137
|
+
param_spec = ParameterSpec(
|
|
138
|
+
name=param_name,
|
|
139
|
+
type=param_type,
|
|
140
|
+
description=description,
|
|
141
|
+
required=required,
|
|
142
|
+
default=default,
|
|
143
|
+
)
|
|
144
|
+
parameters.append(param_spec)
|
|
145
|
+
|
|
146
|
+
return parameters
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _extract_return_spec_from_function(func: Callable) -> Optional[ParameterSpec]:
|
|
150
|
+
"""Extract return value specification from function.
|
|
151
|
+
|
|
152
|
+
Args:
|
|
153
|
+
func: The function to analyze
|
|
154
|
+
|
|
155
|
+
Returns:
|
|
156
|
+
ParameterSpec for return value, or None if no return type
|
|
157
|
+
"""
|
|
158
|
+
type_hints = get_type_hints(func)
|
|
159
|
+
|
|
160
|
+
if "return" not in type_hints or type_hints["return"] == type(None):
|
|
161
|
+
return None
|
|
162
|
+
|
|
163
|
+
return_type = type_hints["return"]
|
|
164
|
+
param_type = _python_type_to_parameter_type(return_type)
|
|
165
|
+
|
|
166
|
+
return ParameterSpec(
|
|
167
|
+
name="return_value",
|
|
168
|
+
type=param_type,
|
|
169
|
+
description="Function return value",
|
|
170
|
+
required=True,
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class register:
|
|
175
|
+
"""Decorator to register a function as a tool in the ATR.
|
|
176
|
+
|
|
177
|
+
Usage:
|
|
178
|
+
@atr.register(name="scraper", cost="low", tags=["web", "scraping"])
|
|
179
|
+
def scrape_website(url: str, timeout: int = 30) -> str:
|
|
180
|
+
'''Scrape content from a website.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
url: The URL to scrape
|
|
184
|
+
timeout: Timeout in seconds
|
|
185
|
+
'''
|
|
186
|
+
# Implementation here
|
|
187
|
+
pass
|
|
188
|
+
|
|
189
|
+
Advanced usage with all features:
|
|
190
|
+
@atr.register(
|
|
191
|
+
name="pdf_parser",
|
|
192
|
+
version="1.0.0",
|
|
193
|
+
async_=True,
|
|
194
|
+
rate_limit="10/minute",
|
|
195
|
+
permissions=["claims-agent"],
|
|
196
|
+
retry_policy=RetryPolicy(max_attempts=3, backoff="exponential"),
|
|
197
|
+
tags=["document", "parsing"]
|
|
198
|
+
)
|
|
199
|
+
async def pdf_parser(file_path: str, config: Config = inject()) -> dict:
|
|
200
|
+
'''Parse a PDF document.'''
|
|
201
|
+
...
|
|
202
|
+
|
|
203
|
+
This decorator:
|
|
204
|
+
1. Extracts function signature and converts to ToolSpec
|
|
205
|
+
2. Validates all parameters have type hints (no magic arguments!)
|
|
206
|
+
3. Registers the tool in the global registry
|
|
207
|
+
4. Returns the original function unchanged (doesn't wrap it)
|
|
208
|
+
"""
|
|
209
|
+
|
|
210
|
+
def __init__(
|
|
211
|
+
self,
|
|
212
|
+
name: Optional[str] = None,
|
|
213
|
+
description: Optional[str] = None,
|
|
214
|
+
version: str = "1.0.0",
|
|
215
|
+
author: Optional[str] = None,
|
|
216
|
+
cost: str = "free",
|
|
217
|
+
side_effects: Optional[List[str]] = None,
|
|
218
|
+
tags: Optional[List[str]] = None,
|
|
219
|
+
registry: Optional[Registry] = None,
|
|
220
|
+
# New parameters for enhanced features
|
|
221
|
+
async_: Optional[bool] = None, # Auto-detected if None
|
|
222
|
+
permissions: Optional[List[str]] = None,
|
|
223
|
+
rate_limit: Optional[str] = None,
|
|
224
|
+
retry_policy: Optional[Any] = None, # RetryPolicy
|
|
225
|
+
health_check: Optional[Any] = None, # HealthCheck
|
|
226
|
+
access_policy: Optional[Any] = None, # AccessPolicy
|
|
227
|
+
deprecated: bool = False,
|
|
228
|
+
deprecated_message: Optional[str] = None,
|
|
229
|
+
):
|
|
230
|
+
"""Initialize the register decorator.
|
|
231
|
+
|
|
232
|
+
Args:
|
|
233
|
+
name: Tool name (defaults to function name)
|
|
234
|
+
description: Tool description (defaults to function docstring)
|
|
235
|
+
version: Semantic version string (e.g., "1.0.0")
|
|
236
|
+
author: Tool author
|
|
237
|
+
cost: Cost level (free, low, medium, high)
|
|
238
|
+
side_effects: List of side effects
|
|
239
|
+
tags: Searchable tags
|
|
240
|
+
registry: Registry instance (uses global if not provided)
|
|
241
|
+
async_: Whether tool is async (auto-detected if None)
|
|
242
|
+
permissions: List of roles/agents allowed to access this tool
|
|
243
|
+
rate_limit: Rate limit string (e.g., "10/minute", "100/hour")
|
|
244
|
+
retry_policy: RetryPolicy instance for automatic retries
|
|
245
|
+
health_check: HealthCheck instance for verifying tool availability
|
|
246
|
+
access_policy: AccessPolicy instance for fine-grained access control
|
|
247
|
+
deprecated: Whether this version is deprecated
|
|
248
|
+
deprecated_message: Migration guide for deprecated tools
|
|
249
|
+
"""
|
|
250
|
+
self.name = name
|
|
251
|
+
self.description = description
|
|
252
|
+
self.version = version
|
|
253
|
+
self.author = author
|
|
254
|
+
self.cost = cost
|
|
255
|
+
self.side_effects = side_effects or ["none"]
|
|
256
|
+
self.tags = tags or []
|
|
257
|
+
self.registry = registry
|
|
258
|
+
self.async_ = async_
|
|
259
|
+
self.permissions = permissions or []
|
|
260
|
+
self.rate_limit = rate_limit
|
|
261
|
+
self.retry_policy = retry_policy
|
|
262
|
+
self.health_check = health_check
|
|
263
|
+
self.access_policy = access_policy
|
|
264
|
+
self.deprecated = deprecated
|
|
265
|
+
self.deprecated_message = deprecated_message
|
|
266
|
+
|
|
267
|
+
def __call__(self, func: Callable) -> Callable:
|
|
268
|
+
"""Register the function and return it unchanged.
|
|
269
|
+
|
|
270
|
+
Args:
|
|
271
|
+
func: The function to register
|
|
272
|
+
|
|
273
|
+
Returns:
|
|
274
|
+
The original function (not wrapped)
|
|
275
|
+
"""
|
|
276
|
+
# Get or import global registry
|
|
277
|
+
if self.registry is None:
|
|
278
|
+
from . import _global_registry
|
|
279
|
+
|
|
280
|
+
self.registry = _global_registry
|
|
281
|
+
|
|
282
|
+
# Extract metadata
|
|
283
|
+
tool_name = self.name or func.__name__
|
|
284
|
+
tool_description = self.description or inspect.getdoc(func) or f"Tool: {tool_name}"
|
|
285
|
+
|
|
286
|
+
# Auto-detect async
|
|
287
|
+
is_async = self.async_ if self.async_ is not None else asyncio.iscoroutinefunction(func)
|
|
288
|
+
|
|
289
|
+
# Parse cost level
|
|
290
|
+
try:
|
|
291
|
+
cost_level = CostLevel(self.cost.lower())
|
|
292
|
+
except ValueError:
|
|
293
|
+
cost_level = CostLevel.FREE
|
|
294
|
+
|
|
295
|
+
# Parse side effects
|
|
296
|
+
parsed_side_effects = []
|
|
297
|
+
for se in self.side_effects:
|
|
298
|
+
try:
|
|
299
|
+
parsed_side_effects.append(SideEffect(se.lower()))
|
|
300
|
+
except ValueError:
|
|
301
|
+
parsed_side_effects.append(SideEffect.NONE)
|
|
302
|
+
|
|
303
|
+
# Create metadata
|
|
304
|
+
metadata = ToolMetadata(
|
|
305
|
+
name=tool_name,
|
|
306
|
+
description=tool_description,
|
|
307
|
+
version=self.version,
|
|
308
|
+
author=self.author,
|
|
309
|
+
cost=cost_level,
|
|
310
|
+
side_effects=parsed_side_effects,
|
|
311
|
+
tags=self.tags,
|
|
312
|
+
is_async=is_async,
|
|
313
|
+
permissions=self.permissions,
|
|
314
|
+
rate_limit=self.rate_limit,
|
|
315
|
+
deprecated=self.deprecated,
|
|
316
|
+
deprecated_message=self.deprecated_message,
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
# Extract parameters from function signature
|
|
320
|
+
parameters = _extract_parameters_from_function(func)
|
|
321
|
+
|
|
322
|
+
# Extract return specification
|
|
323
|
+
returns = _extract_return_spec_from_function(func)
|
|
324
|
+
|
|
325
|
+
# Create tool spec
|
|
326
|
+
tool_spec = ToolSpec(
|
|
327
|
+
metadata=metadata,
|
|
328
|
+
parameters=parameters,
|
|
329
|
+
returns=returns,
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
# Apply policies
|
|
333
|
+
if self.retry_policy is not None:
|
|
334
|
+
tool_spec._retry_policy = self.retry_policy
|
|
335
|
+
|
|
336
|
+
if self.rate_limit is not None:
|
|
337
|
+
from .policies import RateLimitPolicy
|
|
338
|
+
|
|
339
|
+
tool_spec._rate_limit_policy = RateLimitPolicy.from_string(self.rate_limit)
|
|
340
|
+
|
|
341
|
+
if self.health_check is not None:
|
|
342
|
+
tool_spec._health_check = self.health_check
|
|
343
|
+
|
|
344
|
+
if self.access_policy is not None:
|
|
345
|
+
tool_spec._access_policy = self.access_policy
|
|
346
|
+
elif self.permissions:
|
|
347
|
+
# Create access policy from permissions list
|
|
348
|
+
from .access import AccessPolicy
|
|
349
|
+
|
|
350
|
+
tool_spec._access_policy = AccessPolicy.roles_only(*self.permissions)
|
|
351
|
+
|
|
352
|
+
# Register the tool (store the callable but don't execute it)
|
|
353
|
+
self.registry.register_tool(tool_spec, callable_func=func)
|
|
354
|
+
|
|
355
|
+
# Return the original function unchanged - we don't wrap it
|
|
356
|
+
# The registry stores it, but execution happens elsewhere
|
|
357
|
+
return func
|