chuk-tool-processor 0.20__tar.gz → 0.22__tar.gz
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.
- {chuk_tool_processor-0.20/src/chuk_tool_processor.egg-info → chuk_tool_processor-0.22}/PKG-INFO +1 -1
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/pyproject.toml +1 -1
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/__init__.py +5 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/config.py +16 -21
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/context.py +3 -3
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/exceptions.py +3 -3
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/dynamic_provider.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/bulkhead.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/circuit_breaker.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/factory.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/observable.py +1 -1
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/redis_circuit_breaker.py +0 -9
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/base.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/models.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/network_policy.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/output_size.py +3 -3
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/plan_shape.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/retry_safety.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/schema_strictness.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/sensitive_data.py +3 -3
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/side_effect.py +4 -4
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/timeout_budget.py +3 -3
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/mcp_tool.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/middleware.py +4 -4
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/models.py +4 -3
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/stream_manager.py +63 -34
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/base_transport.py +57 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/http_streamable_transport.py +10 -42
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/models.py +11 -1
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/sse_transport.py +33 -46
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/stdio_transport.py +24 -19
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/execution_span.py +20 -18
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/execution_trace.py +17 -10
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/return_order.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/sandbox_policy.py +5 -5
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_contract.py +5 -5
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_spec.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/trace_sink.py +89 -60
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/providers/__init__.py +21 -5
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/providers/redis.py +2 -2
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22/src/chuk_tool_processor.egg-info}/PKG-INFO +1 -1
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor.egg-info/SOURCES.txt +1 -0
- chuk_tool_processor-0.22/tests/test_config_coverage.py +702 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/LICENSE +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/README.md +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/setup.cfg +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/processor.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/search.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/searchable.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/synonyms.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/code_sandbox.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/strategies/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/strategies/inprocess_strategy.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/strategies/subprocess_strategy.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/tool_executor.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/caching.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/rate_limiting.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/redis_rate_limiting.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/retry.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/assumption_trace.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/budget.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/chain.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/concurrency.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/contract_guard.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/per_tool.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/precondition.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/provenance.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/runaway.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/saturation.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/unresolved.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/context.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/formatter.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/helpers.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/metrics.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/register_mcp_tools.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/setup_mcp_http_streamable.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/setup_mcp_sse.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/setup_mcp_stdio.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/execution_strategy.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/streaming_tool.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_call.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_export_mixin.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_result.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/validated_tool.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/metrics.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/setup.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/tracing.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/discovery.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/base.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/function_call_tool.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/json_tool.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/openai_tool.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/xml_tool.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/py.typed +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/auto_register.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/decorators.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/interface.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/metadata.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/provider.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/providers/memory.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/tool_export.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/scheduling/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/scheduling/greedy_dag.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/scheduling/policy.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/scheduling/types.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/utils/__init__.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/utils/fast_json.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/utils/validation.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor.egg-info/dependency_links.txt +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor.egg-info/requires.txt +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor.egg-info/top_level.txt +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/tests/test_bulkhead.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/tests/test_execution_context.py +0 -0
- {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/tests/test_scoped_registry.py +0 -0
{chuk_tool_processor-0.20/src/chuk_tool_processor.egg-info → chuk_tool_processor-0.22}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: chuk-tool-processor
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.22
|
|
4
4
|
Summary: Async-native framework for registering, discovering, and executing tools referenced in LLM responses
|
|
5
5
|
License: Apache-2.0
|
|
6
6
|
Keywords: llm,tools,async,ai,openai,mcp,model-context-protocol,tool-calling,function-calling
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "chuk-tool-processor"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.22"
|
|
8
8
|
description = "Async-native framework for registering, discovering, and executing tools referenced in LLM responses"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -20,10 +20,11 @@ Quick Start:
|
|
|
20
20
|
>>> asyncio.run(main())
|
|
21
21
|
"""
|
|
22
22
|
|
|
23
|
+
from importlib.metadata import version as _pkg_version
|
|
23
24
|
from typing import TYPE_CHECKING
|
|
24
25
|
|
|
25
|
-
# Version
|
|
26
|
-
__version__ = "
|
|
26
|
+
# Version — single source of truth is pyproject.toml
|
|
27
|
+
__version__ = _pkg_version("chuk-tool-processor")
|
|
27
28
|
|
|
28
29
|
# Core processor and context
|
|
29
30
|
# Configuration
|
|
@@ -159,6 +160,7 @@ from chuk_tool_processor.registry import (
|
|
|
159
160
|
ToolInfo,
|
|
160
161
|
ToolRegistryProvider,
|
|
161
162
|
create_registry,
|
|
163
|
+
ensure_registrations,
|
|
162
164
|
get_default_registry,
|
|
163
165
|
initialize,
|
|
164
166
|
)
|
|
@@ -227,6 +229,7 @@ __all__ = [
|
|
|
227
229
|
# Registry
|
|
228
230
|
"ToolInfo",
|
|
229
231
|
"initialize",
|
|
232
|
+
"ensure_registrations",
|
|
230
233
|
"get_default_registry",
|
|
231
234
|
"create_registry",
|
|
232
235
|
"ToolRegistryProvider",
|
|
@@ -66,12 +66,13 @@ Example:
|
|
|
66
66
|
from __future__ import annotations
|
|
67
67
|
|
|
68
68
|
import os
|
|
69
|
-
from
|
|
70
|
-
from enum import Enum
|
|
69
|
+
from enum import StrEnum
|
|
71
70
|
from typing import Any
|
|
72
71
|
|
|
72
|
+
from pydantic import BaseModel, Field
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
|
|
75
|
+
class BackendType(StrEnum):
|
|
75
76
|
"""Backend type for registry and resilience features."""
|
|
76
77
|
|
|
77
78
|
MEMORY = "memory"
|
|
@@ -115,8 +116,7 @@ def _get_float(key: str, default: float | None = None) -> float | None:
|
|
|
115
116
|
return default
|
|
116
117
|
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
class CircuitBreakerConfig:
|
|
119
|
+
class CircuitBreakerConfig(BaseModel):
|
|
120
120
|
"""Circuit breaker configuration."""
|
|
121
121
|
|
|
122
122
|
enabled: bool = False
|
|
@@ -139,14 +139,13 @@ class CircuitBreakerConfig:
|
|
|
139
139
|
)
|
|
140
140
|
|
|
141
141
|
|
|
142
|
-
|
|
143
|
-
class RateLimitConfig:
|
|
142
|
+
class RateLimitConfig(BaseModel):
|
|
144
143
|
"""Rate limiting configuration."""
|
|
145
144
|
|
|
146
145
|
enabled: bool = False
|
|
147
146
|
global_limit: int | None = None
|
|
148
147
|
global_period: float = 60.0
|
|
149
|
-
tool_limits: dict[str, tuple[int, float]] =
|
|
148
|
+
tool_limits: dict[str, tuple[int, float]] = Field(default_factory=dict)
|
|
150
149
|
|
|
151
150
|
@classmethod
|
|
152
151
|
def from_env(cls) -> RateLimitConfig:
|
|
@@ -172,8 +171,7 @@ class RateLimitConfig:
|
|
|
172
171
|
)
|
|
173
172
|
|
|
174
173
|
|
|
175
|
-
|
|
176
|
-
class CacheConfig:
|
|
174
|
+
class CacheConfig(BaseModel):
|
|
177
175
|
"""Caching configuration."""
|
|
178
176
|
|
|
179
177
|
enabled: bool = True
|
|
@@ -188,8 +186,7 @@ class CacheConfig:
|
|
|
188
186
|
)
|
|
189
187
|
|
|
190
188
|
|
|
191
|
-
|
|
192
|
-
class RetryConfig:
|
|
189
|
+
class RetryConfig(BaseModel):
|
|
193
190
|
"""Retry configuration."""
|
|
194
191
|
|
|
195
192
|
enabled: bool = True
|
|
@@ -210,8 +207,7 @@ class RetryConfig:
|
|
|
210
207
|
)
|
|
211
208
|
|
|
212
209
|
|
|
213
|
-
|
|
214
|
-
class RegistryConfig:
|
|
210
|
+
class RegistryConfig(BaseModel):
|
|
215
211
|
"""Registry configuration."""
|
|
216
212
|
|
|
217
213
|
backend: BackendType = BackendType.MEMORY
|
|
@@ -236,8 +232,7 @@ class RegistryConfig:
|
|
|
236
232
|
)
|
|
237
233
|
|
|
238
234
|
|
|
239
|
-
|
|
240
|
-
class ProcessorConfig:
|
|
235
|
+
class ProcessorConfig(BaseModel):
|
|
241
236
|
"""
|
|
242
237
|
Complete configuration for ToolProcessor with environment variable support.
|
|
243
238
|
|
|
@@ -266,7 +261,7 @@ class ProcessorConfig:
|
|
|
266
261
|
"""
|
|
267
262
|
|
|
268
263
|
# Registry configuration
|
|
269
|
-
registry: RegistryConfig =
|
|
264
|
+
registry: RegistryConfig = Field(default_factory=RegistryConfig)
|
|
270
265
|
|
|
271
266
|
# Resilience backend selection (rate limiting, circuit breaker)
|
|
272
267
|
resilience_backend: BackendType = BackendType.MEMORY
|
|
@@ -280,10 +275,10 @@ class ProcessorConfig:
|
|
|
280
275
|
max_concurrency: int | None = None
|
|
281
276
|
|
|
282
277
|
# Feature configs
|
|
283
|
-
circuit_breaker: CircuitBreakerConfig =
|
|
284
|
-
rate_limit: RateLimitConfig =
|
|
285
|
-
cache: CacheConfig =
|
|
286
|
-
retry: RetryConfig =
|
|
278
|
+
circuit_breaker: CircuitBreakerConfig = Field(default_factory=CircuitBreakerConfig)
|
|
279
|
+
rate_limit: RateLimitConfig = Field(default_factory=RateLimitConfig)
|
|
280
|
+
cache: CacheConfig = Field(default_factory=CacheConfig)
|
|
281
|
+
retry: RetryConfig = Field(default_factory=RetryConfig)
|
|
287
282
|
|
|
288
283
|
# Backwards compatibility alias
|
|
289
284
|
@property
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/context.py
RENAMED
|
@@ -23,13 +23,13 @@ import contextlib
|
|
|
23
23
|
import contextvars
|
|
24
24
|
import uuid
|
|
25
25
|
from datetime import UTC, datetime, timedelta
|
|
26
|
-
from enum import
|
|
26
|
+
from enum import StrEnum
|
|
27
27
|
from typing import Any, Self
|
|
28
28
|
|
|
29
29
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
class ContextHeader(
|
|
32
|
+
class ContextHeader(StrEnum):
|
|
33
33
|
"""Standard HTTP headers for context propagation."""
|
|
34
34
|
|
|
35
35
|
REQUEST_ID = "X-Request-ID"
|
|
@@ -42,7 +42,7 @@ class ContextHeader(str, Enum):
|
|
|
42
42
|
BUDGET = "X-Budget"
|
|
43
43
|
|
|
44
44
|
|
|
45
|
-
class ContextKey(
|
|
45
|
+
class ContextKey(StrEnum):
|
|
46
46
|
"""Standard keys for context dictionary representation."""
|
|
47
47
|
|
|
48
48
|
REQUEST_ID = "request_id"
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/exceptions.py
RENAMED
|
@@ -9,7 +9,7 @@ that enable planners to make intelligent retry and fallback decisions.
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
11
|
from difflib import get_close_matches
|
|
12
|
-
from enum import
|
|
12
|
+
from enum import StrEnum
|
|
13
13
|
from typing import TYPE_CHECKING, Any, cast
|
|
14
14
|
|
|
15
15
|
from pydantic import BaseModel, ConfigDict, Field
|
|
@@ -18,7 +18,7 @@ if TYPE_CHECKING:
|
|
|
18
18
|
pass # For future type hints if needed
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
class ErrorCode(
|
|
21
|
+
class ErrorCode(StrEnum):
|
|
22
22
|
"""Machine-readable error codes for tool processor errors."""
|
|
23
23
|
|
|
24
24
|
# Tool registry errors
|
|
@@ -57,7 +57,7 @@ class ErrorCode(str, Enum):
|
|
|
57
57
|
CONFIGURATION_ERROR = "CONFIGURATION_ERROR"
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
class ErrorCategory(
|
|
60
|
+
class ErrorCategory(StrEnum):
|
|
61
61
|
"""
|
|
62
62
|
High-level error categories for planner decision-making.
|
|
63
63
|
|
|
@@ -20,7 +20,7 @@ from __future__ import annotations
|
|
|
20
20
|
import json
|
|
21
21
|
import logging
|
|
22
22
|
from abc import ABC, abstractmethod
|
|
23
|
-
from enum import
|
|
23
|
+
from enum import StrEnum
|
|
24
24
|
from typing import Any, Generic, TypeVar
|
|
25
25
|
|
|
26
26
|
from chuk_tool_processor.discovery.search import (
|
|
@@ -77,7 +77,7 @@ def _error_response(
|
|
|
77
77
|
return response
|
|
78
78
|
|
|
79
79
|
|
|
80
|
-
class DynamicToolName(
|
|
80
|
+
class DynamicToolName(StrEnum):
|
|
81
81
|
"""Names of available dynamic tools - no magic strings!"""
|
|
82
82
|
|
|
83
83
|
LIST_TOOLS = "list_tools"
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/bulkhead.py
RENAMED
|
@@ -33,7 +33,7 @@ import asyncio
|
|
|
33
33
|
import fnmatch
|
|
34
34
|
from collections import defaultdict
|
|
35
35
|
from contextlib import asynccontextmanager
|
|
36
|
-
from enum import
|
|
36
|
+
from enum import StrEnum
|
|
37
37
|
from functools import lru_cache
|
|
38
38
|
from typing import Any
|
|
39
39
|
|
|
@@ -44,7 +44,7 @@ from chuk_tool_processor.logging import get_logger
|
|
|
44
44
|
logger = get_logger("chuk_tool_processor.execution.bulkhead")
|
|
45
45
|
|
|
46
46
|
|
|
47
|
-
class BulkheadLimitType(
|
|
47
|
+
class BulkheadLimitType(StrEnum):
|
|
48
48
|
"""Types of bulkhead limits that can be exceeded."""
|
|
49
49
|
|
|
50
50
|
TOOL = "tool"
|
|
@@ -18,7 +18,7 @@ from __future__ import annotations
|
|
|
18
18
|
import asyncio
|
|
19
19
|
import time
|
|
20
20
|
from datetime import UTC, datetime
|
|
21
|
-
from enum import
|
|
21
|
+
from enum import StrEnum
|
|
22
22
|
from typing import Any
|
|
23
23
|
|
|
24
24
|
from chuk_tool_processor.core.exceptions import ToolCircuitOpenError
|
|
@@ -50,7 +50,7 @@ except ImportError:
|
|
|
50
50
|
# --------------------------------------------------------------------------- #
|
|
51
51
|
# Circuit breaker state
|
|
52
52
|
# --------------------------------------------------------------------------- #
|
|
53
|
-
class CircuitState(
|
|
53
|
+
class CircuitState(StrEnum):
|
|
54
54
|
"""Circuit breaker states."""
|
|
55
55
|
|
|
56
56
|
CLOSED = "closed" # Normal operation
|
|
@@ -38,7 +38,7 @@ Example:
|
|
|
38
38
|
from __future__ import annotations
|
|
39
39
|
|
|
40
40
|
from dataclasses import dataclass
|
|
41
|
-
from enum import
|
|
41
|
+
from enum import StrEnum
|
|
42
42
|
from typing import TYPE_CHECKING, Any, Protocol, runtime_checkable
|
|
43
43
|
|
|
44
44
|
from chuk_tool_processor.execution.wrappers.circuit_breaker import (
|
|
@@ -62,7 +62,7 @@ if TYPE_CHECKING:
|
|
|
62
62
|
logger = get_logger("chuk_tool_processor.execution.wrappers.factory")
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
class WrapperBackend(
|
|
65
|
+
class WrapperBackend(StrEnum):
|
|
66
66
|
"""Backend type for production wrappers."""
|
|
67
67
|
|
|
68
68
|
MEMORY = "memory" # In-memory, single-instance
|
|
@@ -162,7 +162,7 @@ class ObservableExecutor:
|
|
|
162
162
|
decision = GuardDecision(
|
|
163
163
|
guard_name=guard_name,
|
|
164
164
|
guard_class=type(guard_result).__module__,
|
|
165
|
-
verdict=guard_result.verdict
|
|
165
|
+
verdict=guard_result.verdict,
|
|
166
166
|
reason=guard_result.reason,
|
|
167
167
|
details=guard_result.details,
|
|
168
168
|
duration_ms=duration_ms,
|
|
@@ -37,7 +37,6 @@ from __future__ import annotations
|
|
|
37
37
|
|
|
38
38
|
import time
|
|
39
39
|
from dataclasses import dataclass
|
|
40
|
-
from enum import Enum
|
|
41
40
|
from typing import TYPE_CHECKING, Any
|
|
42
41
|
|
|
43
42
|
from chuk_tool_processor.logging import get_logger
|
|
@@ -48,14 +47,6 @@ if TYPE_CHECKING:
|
|
|
48
47
|
logger = get_logger("chuk_tool_processor.execution.wrappers.redis_circuit_breaker")
|
|
49
48
|
|
|
50
49
|
|
|
51
|
-
class CircuitState(str, Enum):
|
|
52
|
-
"""Circuit breaker states."""
|
|
53
|
-
|
|
54
|
-
CLOSED = "closed" # Normal operation
|
|
55
|
-
OPEN = "open" # Blocking requests due to failures
|
|
56
|
-
HALF_OPEN = "half_open" # Testing recovery with limited requests
|
|
57
|
-
|
|
58
|
-
|
|
59
50
|
@dataclass
|
|
60
51
|
class RedisCircuitBreakerConfig:
|
|
61
52
|
"""Configuration for Redis circuit breaker behavior."""
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/base.py
RENAMED
|
@@ -8,13 +8,13 @@ Each guard focuses on one concern and returns a typed result.
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
10
|
from abc import ABC, abstractmethod
|
|
11
|
-
from enum import
|
|
11
|
+
from enum import StrEnum
|
|
12
12
|
from typing import Any, Protocol, runtime_checkable
|
|
13
13
|
|
|
14
14
|
from pydantic import BaseModel, Field
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class GuardVerdict(
|
|
17
|
+
class GuardVerdict(StrEnum):
|
|
18
18
|
"""Verdict from a guard check."""
|
|
19
19
|
|
|
20
20
|
ALLOW = "allow" # Proceed with execution
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/models.py
RENAMED
|
@@ -6,10 +6,10 @@ Defines tool classifications and enforcement levels used by guards.
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
from enum import
|
|
9
|
+
from enum import StrEnum
|
|
10
10
|
|
|
11
11
|
|
|
12
|
-
class EnforcementLevel(
|
|
12
|
+
class EnforcementLevel(StrEnum):
|
|
13
13
|
"""Enforcement level for guards and constraints."""
|
|
14
14
|
|
|
15
15
|
OFF = "off" # No enforcement
|
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import ipaddress
|
|
10
10
|
import re
|
|
11
|
-
from enum import
|
|
11
|
+
from enum import StrEnum
|
|
12
12
|
from typing import Any
|
|
13
13
|
from urllib.parse import urlparse
|
|
14
14
|
|
|
@@ -18,7 +18,7 @@ from chuk_tool_processor.guards.base import BaseGuard, GuardResult
|
|
|
18
18
|
from chuk_tool_processor.guards.models import EnforcementLevel
|
|
19
19
|
|
|
20
20
|
|
|
21
|
-
class NetworkViolationType(
|
|
21
|
+
class NetworkViolationType(StrEnum):
|
|
22
22
|
"""Types of network policy violations."""
|
|
23
23
|
|
|
24
24
|
DOMAIN_NOT_ALLOWED = "domain_not_allowed"
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/output_size.py
RENAMED
|
@@ -7,7 +7,7 @@ Caps bytes, tokens, array lengths, and nesting depth.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
import json
|
|
10
|
-
from enum import
|
|
10
|
+
from enum import StrEnum
|
|
11
11
|
from typing import Any
|
|
12
12
|
|
|
13
13
|
from pydantic import BaseModel, Field
|
|
@@ -15,7 +15,7 @@ from pydantic import BaseModel, Field
|
|
|
15
15
|
from chuk_tool_processor.guards.base import BaseGuard, GuardResult
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class TruncationMode(
|
|
18
|
+
class TruncationMode(StrEnum):
|
|
19
19
|
"""How to handle oversized outputs."""
|
|
20
20
|
|
|
21
21
|
ERROR = "error" # Block with error
|
|
@@ -23,7 +23,7 @@ class TruncationMode(str, Enum):
|
|
|
23
23
|
PAGINATE = "paginate" # Return with pagination info
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
class SizeViolationType(
|
|
26
|
+
class SizeViolationType(StrEnum):
|
|
27
27
|
"""Types of size violations."""
|
|
28
28
|
|
|
29
29
|
BYTES_EXCEEDED = "bytes_exceeded"
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/plan_shape.py
RENAMED
|
@@ -6,7 +6,7 @@ Guards against overly long chains, excessive unique tools, and fan-out explosion
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
from enum import
|
|
9
|
+
from enum import StrEnum
|
|
10
10
|
from typing import Any
|
|
11
11
|
|
|
12
12
|
from pydantic import BaseModel, Field
|
|
@@ -15,7 +15,7 @@ from chuk_tool_processor.guards.base import BaseGuard, GuardResult
|
|
|
15
15
|
from chuk_tool_processor.guards.models import EnforcementLevel
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
class PlanShapeViolationType(
|
|
18
|
+
class PlanShapeViolationType(StrEnum):
|
|
19
19
|
"""Types of plan shape violations."""
|
|
20
20
|
|
|
21
21
|
CHAIN_TOO_LONG = "chain_too_long"
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/retry_safety.py
RENAMED
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import hashlib
|
|
10
10
|
import time
|
|
11
|
-
from enum import
|
|
11
|
+
from enum import StrEnum
|
|
12
12
|
from typing import Any
|
|
13
13
|
|
|
14
14
|
from pydantic import BaseModel, Field
|
|
@@ -17,7 +17,7 @@ from chuk_tool_processor.guards.base import BaseGuard, GuardResult
|
|
|
17
17
|
from chuk_tool_processor.guards.models import EnforcementLevel
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
class ErrorClass(
|
|
20
|
+
class ErrorClass(StrEnum):
|
|
21
21
|
"""Classification of errors for retry decisions."""
|
|
22
22
|
|
|
23
23
|
VALIDATION = "validation"
|
|
@@ -7,7 +7,7 @@ Blocks or auto-fixes calls that don't conform to tool JSON schemas.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
from collections.abc import Awaitable, Callable
|
|
10
|
-
from enum import
|
|
10
|
+
from enum import StrEnum
|
|
11
11
|
from typing import Any
|
|
12
12
|
|
|
13
13
|
from pydantic import BaseModel, Field
|
|
@@ -16,7 +16,7 @@ from chuk_tool_processor.guards.base import BaseGuard, GuardResult
|
|
|
16
16
|
from chuk_tool_processor.guards.models import EnforcementLevel
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
class SchemaViolationType(
|
|
19
|
+
class SchemaViolationType(StrEnum):
|
|
20
20
|
"""Types of schema violations."""
|
|
21
21
|
|
|
22
22
|
MISSING_REQUIRED = "missing_required"
|
|
@@ -8,7 +8,7 @@ from __future__ import annotations
|
|
|
8
8
|
|
|
9
9
|
import hashlib
|
|
10
10
|
import re
|
|
11
|
-
from enum import
|
|
11
|
+
from enum import StrEnum
|
|
12
12
|
from typing import Any
|
|
13
13
|
|
|
14
14
|
from pydantic import BaseModel, Field
|
|
@@ -17,7 +17,7 @@ from chuk_tool_processor.guards.base import BaseGuard, GuardResult
|
|
|
17
17
|
from chuk_tool_processor.guards.models import EnforcementLevel
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
class SensitiveDataType(
|
|
20
|
+
class SensitiveDataType(StrEnum):
|
|
21
21
|
"""Types of sensitive data patterns."""
|
|
22
22
|
|
|
23
23
|
API_KEY = "api_key"
|
|
@@ -30,7 +30,7 @@ class SensitiveDataType(str, Enum):
|
|
|
30
30
|
BASIC_AUTH = "basic_auth"
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
class RedactMode(
|
|
33
|
+
class RedactMode(StrEnum):
|
|
34
34
|
"""How to handle detected secrets."""
|
|
35
35
|
|
|
36
36
|
BLOCK = "block" # Block execution entirely
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/side_effect.py
RENAMED
|
@@ -7,7 +7,7 @@ Labels tools as read_only/write/destructive and enforces policies.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
from collections.abc import Awaitable, Callable
|
|
10
|
-
from enum import
|
|
10
|
+
from enum import StrEnum
|
|
11
11
|
from typing import Any
|
|
12
12
|
|
|
13
13
|
from pydantic import BaseModel, Field
|
|
@@ -16,7 +16,7 @@ from chuk_tool_processor.guards.base import BaseGuard, GuardResult
|
|
|
16
16
|
from chuk_tool_processor.guards.models import EnforcementLevel, ToolClassification
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
class SideEffectClass(
|
|
19
|
+
class SideEffectClass(StrEnum):
|
|
20
20
|
"""Classification of tool side effects."""
|
|
21
21
|
|
|
22
22
|
READ_ONLY = "read_only"
|
|
@@ -24,7 +24,7 @@ class SideEffectClass(str, Enum):
|
|
|
24
24
|
DESTRUCTIVE = "destructive"
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
class ExecutionMode(
|
|
27
|
+
class ExecutionMode(StrEnum):
|
|
28
28
|
"""Allowed execution modes."""
|
|
29
29
|
|
|
30
30
|
READ_ONLY = "read_only" # Only read operations allowed
|
|
@@ -32,7 +32,7 @@ class ExecutionMode(str, Enum):
|
|
|
32
32
|
DESTRUCTIVE_ALLOWED = "destructive_allowed" # All operations allowed
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
class Environment(
|
|
35
|
+
class Environment(StrEnum):
|
|
36
36
|
"""Deployment environment."""
|
|
37
37
|
|
|
38
38
|
DEV = "dev"
|
|
@@ -7,7 +7,7 @@ Enforces per-turn and per-plan time budgets with soft/hard limits.
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
9
|
import time
|
|
10
|
-
from enum import
|
|
10
|
+
from enum import StrEnum
|
|
11
11
|
from typing import Any
|
|
12
12
|
|
|
13
13
|
from pydantic import BaseModel, Field
|
|
@@ -16,7 +16,7 @@ from chuk_tool_processor.guards.base import BaseGuard, GuardResult
|
|
|
16
16
|
from chuk_tool_processor.guards.models import EnforcementLevel
|
|
17
17
|
|
|
18
18
|
|
|
19
|
-
class DegradeAction(
|
|
19
|
+
class DegradeAction(StrEnum):
|
|
20
20
|
"""Actions to take when soft budget is exceeded."""
|
|
21
21
|
|
|
22
22
|
DISABLE_RETRIES = "disable_retries"
|
|
@@ -25,7 +25,7 @@ class DegradeAction(str, Enum):
|
|
|
25
25
|
REDUCE_TIMEOUT = "reduce_timeout"
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
class BudgetStatus(
|
|
28
|
+
class BudgetStatus(StrEnum):
|
|
29
29
|
"""Current budget status."""
|
|
30
30
|
|
|
31
31
|
OK = "ok"
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/mcp_tool.py
RENAMED
|
@@ -393,7 +393,7 @@ class MCPTool:
|
|
|
393
393
|
# Check if we should open the circuit breaker
|
|
394
394
|
if self._consecutive_failures >= self.recovery_config.circuit_breaker_threshold and not self._circuit_open:
|
|
395
395
|
self._circuit_open = True
|
|
396
|
-
self._circuit_open_time = time.
|
|
396
|
+
self._circuit_open_time = time.monotonic()
|
|
397
397
|
self.connection_state = ConnectionState.FAILED
|
|
398
398
|
logger.error(
|
|
399
399
|
f"Circuit breaker opened for tool '{self.tool_name}' after {self._consecutive_failures} consecutive failures"
|
|
@@ -407,7 +407,7 @@ class MCPTool:
|
|
|
407
407
|
# Check if enough time has passed to close the circuit
|
|
408
408
|
if (
|
|
409
409
|
self._circuit_open_time
|
|
410
|
-
and time.
|
|
410
|
+
and time.monotonic() - self._circuit_open_time >= self.recovery_config.circuit_breaker_timeout
|
|
411
411
|
):
|
|
412
412
|
self._circuit_open = False
|
|
413
413
|
self._circuit_open_time = None
|
{chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/middleware.py
RENAMED
|
@@ -11,7 +11,7 @@ Async-native, Pydantic-based middleware configuration for:
|
|
|
11
11
|
from __future__ import annotations
|
|
12
12
|
|
|
13
13
|
from datetime import UTC, datetime
|
|
14
|
-
from enum import
|
|
14
|
+
from enum import StrEnum
|
|
15
15
|
from typing import TYPE_CHECKING, Any
|
|
16
16
|
|
|
17
17
|
from pydantic import BaseModel, Field
|
|
@@ -43,7 +43,7 @@ logger = get_logger("chuk_tool_processor.mcp.middleware")
|
|
|
43
43
|
# ============================================================================
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
class MiddlewareLayer(
|
|
46
|
+
class MiddlewareLayer(StrEnum):
|
|
47
47
|
"""Middleware layer identifiers."""
|
|
48
48
|
|
|
49
49
|
RETRY = "retry"
|
|
@@ -51,7 +51,7 @@ class MiddlewareLayer(str, Enum):
|
|
|
51
51
|
RATE_LIMITING = "rate_limiting"
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
class RetryableError(
|
|
54
|
+
class RetryableError(StrEnum):
|
|
55
55
|
"""Error patterns that should trigger retry."""
|
|
56
56
|
|
|
57
57
|
TRANSPORT_NOT_INITIALIZED = "Transport not initialized"
|
|
@@ -62,7 +62,7 @@ class RetryableError(str, Enum):
|
|
|
62
62
|
CLOSED = "closed"
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
class NonRetryableError(
|
|
65
|
+
class NonRetryableError(StrEnum):
|
|
66
66
|
"""Error patterns that should NOT be retried."""
|
|
67
67
|
|
|
68
68
|
OAUTH = "oauth"
|
|
@@ -6,18 +6,19 @@ Pydantic models for MCP server configurations.
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
-
from enum import
|
|
9
|
+
from enum import StrEnum
|
|
10
10
|
from typing import Any
|
|
11
11
|
|
|
12
12
|
from pydantic import BaseModel, Field, model_validator
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
class MCPTransport(
|
|
15
|
+
class MCPTransport(StrEnum):
|
|
16
16
|
"""Supported MCP transport types."""
|
|
17
17
|
|
|
18
18
|
STDIO = "stdio"
|
|
19
19
|
SSE = "sse"
|
|
20
20
|
HTTP = "http"
|
|
21
|
+
HTTP_STREAMABLE = "http_streamable"
|
|
21
22
|
|
|
22
23
|
|
|
23
24
|
class MCPServerConfig(BaseModel):
|
|
@@ -46,7 +47,7 @@ class MCPServerConfig(BaseModel):
|
|
|
46
47
|
if not self.command:
|
|
47
48
|
raise ValueError("command is required for stdio transport")
|
|
48
49
|
else:
|
|
49
|
-
# SSE/HTTP
|
|
50
|
+
# SSE/HTTP/HTTP_STREAMABLE
|
|
50
51
|
if not self.url:
|
|
51
52
|
raise ValueError(f"url is required for {self.transport} transport")
|
|
52
53
|
# Extract API key from Authorization header if present
|