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.
Files changed (127) hide show
  1. {chuk_tool_processor-0.20/src/chuk_tool_processor.egg-info → chuk_tool_processor-0.22}/PKG-INFO +1 -1
  2. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/pyproject.toml +1 -1
  3. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/__init__.py +5 -2
  4. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/config.py +16 -21
  5. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/context.py +3 -3
  6. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/exceptions.py +3 -3
  7. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/dynamic_provider.py +2 -2
  8. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/bulkhead.py +2 -2
  9. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/circuit_breaker.py +2 -2
  10. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/factory.py +2 -2
  11. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/observable.py +1 -1
  12. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/redis_circuit_breaker.py +0 -9
  13. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/base.py +2 -2
  14. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/models.py +2 -2
  15. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/network_policy.py +2 -2
  16. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/output_size.py +3 -3
  17. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/plan_shape.py +2 -2
  18. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/retry_safety.py +2 -2
  19. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/schema_strictness.py +2 -2
  20. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/sensitive_data.py +3 -3
  21. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/side_effect.py +4 -4
  22. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/timeout_budget.py +3 -3
  23. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/mcp_tool.py +2 -2
  24. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/middleware.py +4 -4
  25. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/models.py +4 -3
  26. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/stream_manager.py +63 -34
  27. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/base_transport.py +57 -0
  28. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/http_streamable_transport.py +10 -42
  29. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/models.py +11 -1
  30. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/sse_transport.py +33 -46
  31. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/stdio_transport.py +24 -19
  32. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/execution_span.py +20 -18
  33. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/execution_trace.py +17 -10
  34. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/return_order.py +2 -2
  35. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/sandbox_policy.py +5 -5
  36. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_contract.py +5 -5
  37. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_spec.py +2 -2
  38. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/trace_sink.py +89 -60
  39. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/providers/__init__.py +21 -5
  40. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/providers/redis.py +2 -2
  41. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22/src/chuk_tool_processor.egg-info}/PKG-INFO +1 -1
  42. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor.egg-info/SOURCES.txt +1 -0
  43. chuk_tool_processor-0.22/tests/test_config_coverage.py +702 -0
  44. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/LICENSE +0 -0
  45. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/README.md +0 -0
  46. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/setup.cfg +0 -0
  47. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/__init__.py +0 -0
  48. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/core/processor.py +0 -0
  49. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/__init__.py +0 -0
  50. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/search.py +0 -0
  51. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/searchable.py +0 -0
  52. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/discovery/synonyms.py +0 -0
  53. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/__init__.py +0 -0
  54. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/code_sandbox.py +0 -0
  55. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/strategies/__init__.py +0 -0
  56. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/strategies/inprocess_strategy.py +0 -0
  57. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/strategies/subprocess_strategy.py +0 -0
  58. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/tool_executor.py +0 -0
  59. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/__init__.py +0 -0
  60. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/caching.py +0 -0
  61. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/rate_limiting.py +0 -0
  62. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/redis_rate_limiting.py +0 -0
  63. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/execution/wrappers/retry.py +0 -0
  64. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/__init__.py +0 -0
  65. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/assumption_trace.py +0 -0
  66. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/budget.py +0 -0
  67. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/chain.py +0 -0
  68. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/concurrency.py +0 -0
  69. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/contract_guard.py +0 -0
  70. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/per_tool.py +0 -0
  71. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/precondition.py +0 -0
  72. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/provenance.py +0 -0
  73. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/runaway.py +0 -0
  74. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/saturation.py +0 -0
  75. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/guards/unresolved.py +0 -0
  76. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/__init__.py +0 -0
  77. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/context.py +0 -0
  78. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/formatter.py +0 -0
  79. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/helpers.py +0 -0
  80. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/logging/metrics.py +0 -0
  81. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/__init__.py +0 -0
  82. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/register_mcp_tools.py +0 -0
  83. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/setup_mcp_http_streamable.py +0 -0
  84. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/setup_mcp_sse.py +0 -0
  85. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/setup_mcp_stdio.py +0 -0
  86. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/mcp/transport/__init__.py +0 -0
  87. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/__init__.py +0 -0
  88. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/execution_strategy.py +0 -0
  89. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/streaming_tool.py +0 -0
  90. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_call.py +0 -0
  91. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_export_mixin.py +0 -0
  92. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/tool_result.py +0 -0
  93. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/models/validated_tool.py +0 -0
  94. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/__init__.py +0 -0
  95. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/metrics.py +0 -0
  96. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/setup.py +0 -0
  97. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/observability/tracing.py +0 -0
  98. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/__init__.py +0 -0
  99. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/discovery.py +0 -0
  100. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/__init__.py +0 -0
  101. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/base.py +0 -0
  102. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/function_call_tool.py +0 -0
  103. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/json_tool.py +0 -0
  104. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/openai_tool.py +0 -0
  105. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/plugins/parsers/xml_tool.py +0 -0
  106. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/py.typed +0 -0
  107. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/__init__.py +0 -0
  108. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/auto_register.py +0 -0
  109. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/decorators.py +0 -0
  110. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/interface.py +0 -0
  111. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/metadata.py +0 -0
  112. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/provider.py +0 -0
  113. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/providers/memory.py +0 -0
  114. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/registry/tool_export.py +0 -0
  115. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/scheduling/__init__.py +0 -0
  116. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/scheduling/greedy_dag.py +0 -0
  117. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/scheduling/policy.py +0 -0
  118. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/scheduling/types.py +0 -0
  119. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/utils/__init__.py +0 -0
  120. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/utils/fast_json.py +0 -0
  121. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor/utils/validation.py +0 -0
  122. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor.egg-info/dependency_links.txt +0 -0
  123. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor.egg-info/requires.txt +0 -0
  124. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/src/chuk_tool_processor.egg-info/top_level.txt +0 -0
  125. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/tests/test_bulkhead.py +0 -0
  126. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/tests/test_execution_context.py +0 -0
  127. {chuk_tool_processor-0.20 → chuk_tool_processor-0.22}/tests/test_scoped_registry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chuk-tool-processor
3
- Version: 0.20
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.20"
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__ = "0.9.7"
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 dataclasses import dataclass, field
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
- class BackendType(str, Enum):
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
- @dataclass
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
- @dataclass
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]] = field(default_factory=dict)
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
- @dataclass
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
- @dataclass
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
- @dataclass
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
- @dataclass
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 = field(default_factory=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 = field(default_factory=CircuitBreakerConfig)
284
- rate_limit: RateLimitConfig = field(default_factory=RateLimitConfig)
285
- cache: CacheConfig = field(default_factory=CacheConfig)
286
- retry: RetryConfig = field(default_factory=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
@@ -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 Enum
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(str, Enum):
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(str, Enum):
45
+ class ContextKey(StrEnum):
46
46
  """Standard keys for context dictionary representation."""
47
47
 
48
48
  REQUEST_ID = "request_id"
@@ -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 Enum
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(str, Enum):
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(str, Enum):
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 Enum
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(str, Enum):
80
+ class DynamicToolName(StrEnum):
81
81
  """Names of available dynamic tools - no magic strings!"""
82
82
 
83
83
  LIST_TOOLS = "list_tools"
@@ -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 Enum
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(str, Enum):
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 Enum
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(str, Enum):
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 Enum
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(str, Enum):
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.value.upper(),
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."""
@@ -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 Enum
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(str, Enum):
17
+ class GuardVerdict(StrEnum):
18
18
  """Verdict from a guard check."""
19
19
 
20
20
  ALLOW = "allow" # Proceed with execution
@@ -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 Enum
9
+ from enum import StrEnum
10
10
 
11
11
 
12
- class EnforcementLevel(str, Enum):
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 Enum
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(str, Enum):
21
+ class NetworkViolationType(StrEnum):
22
22
  """Types of network policy violations."""
23
23
 
24
24
  DOMAIN_NOT_ALLOWED = "domain_not_allowed"
@@ -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 Enum
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(str, Enum):
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(str, Enum):
26
+ class SizeViolationType(StrEnum):
27
27
  """Types of size violations."""
28
28
 
29
29
  BYTES_EXCEEDED = "bytes_exceeded"
@@ -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 Enum
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(str, Enum):
18
+ class PlanShapeViolationType(StrEnum):
19
19
  """Types of plan shape violations."""
20
20
 
21
21
  CHAIN_TOO_LONG = "chain_too_long"
@@ -8,7 +8,7 @@ from __future__ import annotations
8
8
 
9
9
  import hashlib
10
10
  import time
11
- from enum import Enum
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(str, Enum):
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 Enum
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(str, Enum):
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 Enum
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(str, Enum):
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(str, Enum):
33
+ class RedactMode(StrEnum):
34
34
  """How to handle detected secrets."""
35
35
 
36
36
  BLOCK = "block" # Block execution entirely
@@ -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 Enum
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(str, Enum):
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(str, Enum):
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(str, Enum):
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 Enum
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(str, Enum):
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(str, Enum):
28
+ class BudgetStatus(StrEnum):
29
29
  """Current budget status."""
30
30
 
31
31
  OK = "ok"
@@ -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.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.time() - self._circuit_open_time >= self.recovery_config.circuit_breaker_timeout
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
@@ -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 Enum
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(str, Enum):
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(str, Enum):
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(str, Enum):
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 Enum
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(str, Enum):
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