chuk-tool-processor 0.22__tar.gz → 0.22.2__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.22/src/chuk_tool_processor.egg-info → chuk_tool_processor-0.22.2}/PKG-INFO +5 -6
  2. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/README.md +1 -1
  3. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/pyproject.toml +13 -6
  4. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/core/processor.py +11 -8
  5. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/strategies/inprocess_strategy.py +5 -5
  6. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/logging/context.py +1 -1
  7. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/mcp_tool.py +2 -4
  8. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/register_mcp_tools.py +1 -1
  9. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/metadata.py +9 -11
  10. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2/src/chuk_tool_processor.egg-info}/PKG-INFO +5 -6
  11. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor.egg-info/requires.txt +3 -4
  12. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/LICENSE +0 -0
  13. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/setup.cfg +0 -0
  14. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/__init__.py +0 -0
  15. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/config.py +0 -0
  16. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/core/__init__.py +0 -0
  17. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/core/context.py +0 -0
  18. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/core/exceptions.py +0 -0
  19. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/discovery/__init__.py +0 -0
  20. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/discovery/dynamic_provider.py +0 -0
  21. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/discovery/search.py +0 -0
  22. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/discovery/searchable.py +0 -0
  23. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/discovery/synonyms.py +0 -0
  24. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/__init__.py +0 -0
  25. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/bulkhead.py +0 -0
  26. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/code_sandbox.py +0 -0
  27. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/strategies/__init__.py +0 -0
  28. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/strategies/subprocess_strategy.py +0 -0
  29. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/tool_executor.py +0 -0
  30. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/__init__.py +0 -0
  31. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/caching.py +0 -0
  32. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/circuit_breaker.py +0 -0
  33. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/factory.py +0 -0
  34. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/observable.py +0 -0
  35. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/rate_limiting.py +0 -0
  36. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/redis_circuit_breaker.py +0 -0
  37. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/redis_rate_limiting.py +0 -0
  38. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/execution/wrappers/retry.py +0 -0
  39. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/__init__.py +0 -0
  40. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/assumption_trace.py +0 -0
  41. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/base.py +0 -0
  42. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/budget.py +0 -0
  43. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/chain.py +0 -0
  44. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/concurrency.py +0 -0
  45. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/contract_guard.py +0 -0
  46. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/models.py +0 -0
  47. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/network_policy.py +0 -0
  48. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/output_size.py +0 -0
  49. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/per_tool.py +0 -0
  50. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/plan_shape.py +0 -0
  51. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/precondition.py +0 -0
  52. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/provenance.py +0 -0
  53. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/retry_safety.py +0 -0
  54. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/runaway.py +0 -0
  55. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/saturation.py +0 -0
  56. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/schema_strictness.py +0 -0
  57. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/sensitive_data.py +0 -0
  58. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/side_effect.py +0 -0
  59. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/timeout_budget.py +0 -0
  60. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/guards/unresolved.py +0 -0
  61. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/logging/__init__.py +0 -0
  62. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/logging/formatter.py +0 -0
  63. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/logging/helpers.py +0 -0
  64. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/logging/metrics.py +0 -0
  65. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/__init__.py +0 -0
  66. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/middleware.py +0 -0
  67. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/models.py +0 -0
  68. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/setup_mcp_http_streamable.py +0 -0
  69. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/setup_mcp_sse.py +0 -0
  70. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/setup_mcp_stdio.py +0 -0
  71. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/stream_manager.py +0 -0
  72. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/transport/__init__.py +0 -0
  73. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/transport/base_transport.py +0 -0
  74. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/transport/http_streamable_transport.py +0 -0
  75. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/transport/models.py +0 -0
  76. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/transport/sse_transport.py +0 -0
  77. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/mcp/transport/stdio_transport.py +0 -0
  78. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/__init__.py +0 -0
  79. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/execution_span.py +0 -0
  80. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/execution_strategy.py +0 -0
  81. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/execution_trace.py +0 -0
  82. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/return_order.py +0 -0
  83. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/sandbox_policy.py +0 -0
  84. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/streaming_tool.py +0 -0
  85. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/tool_call.py +0 -0
  86. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/tool_contract.py +0 -0
  87. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/tool_export_mixin.py +0 -0
  88. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/tool_result.py +0 -0
  89. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/tool_spec.py +0 -0
  90. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/models/validated_tool.py +0 -0
  91. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/observability/__init__.py +0 -0
  92. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/observability/metrics.py +0 -0
  93. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/observability/setup.py +0 -0
  94. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/observability/trace_sink.py +0 -0
  95. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/observability/tracing.py +0 -0
  96. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/plugins/__init__.py +0 -0
  97. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/plugins/discovery.py +0 -0
  98. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/plugins/parsers/__init__.py +0 -0
  99. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/plugins/parsers/base.py +0 -0
  100. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/plugins/parsers/function_call_tool.py +0 -0
  101. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/plugins/parsers/json_tool.py +0 -0
  102. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/plugins/parsers/openai_tool.py +0 -0
  103. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/plugins/parsers/xml_tool.py +0 -0
  104. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/py.typed +0 -0
  105. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/__init__.py +0 -0
  106. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/auto_register.py +0 -0
  107. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/decorators.py +0 -0
  108. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/interface.py +0 -0
  109. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/provider.py +0 -0
  110. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/providers/__init__.py +0 -0
  111. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/providers/memory.py +0 -0
  112. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/providers/redis.py +0 -0
  113. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/registry/tool_export.py +0 -0
  114. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/scheduling/__init__.py +0 -0
  115. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/scheduling/greedy_dag.py +0 -0
  116. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/scheduling/policy.py +0 -0
  117. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/scheduling/types.py +0 -0
  118. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/utils/__init__.py +0 -0
  119. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/utils/fast_json.py +0 -0
  120. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor/utils/validation.py +0 -0
  121. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor.egg-info/SOURCES.txt +0 -0
  122. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor.egg-info/dependency_links.txt +0 -0
  123. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/src/chuk_tool_processor.egg-info/top_level.txt +0 -0
  124. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/tests/test_bulkhead.py +0 -0
  125. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/tests/test_config_coverage.py +0 -0
  126. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/tests/test_execution_context.py +0 -0
  127. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.2}/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.22
3
+ Version: 0.22.2
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
@@ -20,19 +20,18 @@ Requires-Python: >=3.11
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
22
  Requires-Dist: chuk-mcp>=0.9
23
- Requires-Dist: dotenv>=0.9.9
23
+ Requires-Dist: python-dotenv>=1.0.0
24
24
  Requires-Dist: psutil>=7.0.0
25
25
  Requires-Dist: pydantic>=2.11.3
26
- Requires-Dist: uuid>=1.30
27
26
  Provides-Extra: fast-json
28
27
  Requires-Dist: orjson<4,>=3.10.0; extra == "fast-json"
29
28
  Provides-Extra: redis
30
- Requires-Dist: redis[hiredis]<6,>=5.0.0; extra == "redis"
29
+ Requires-Dist: redis[hiredis]<8,>=7.2; extra == "redis"
31
30
  Provides-Extra: full
32
31
  Requires-Dist: orjson<4,>=3.10.0; extra == "full"
33
32
  Provides-Extra: all
34
33
  Requires-Dist: orjson<4,>=3.10.0; extra == "all"
35
- Requires-Dist: redis[hiredis]<6,>=5.0.0; extra == "all"
34
+ Requires-Dist: redis[hiredis]<8,>=7.2; extra == "all"
36
35
  Dynamic: license-file
37
36
 
38
37
  # CHUK Tool Processor — A Tool Execution Runtime for AI Systems
@@ -655,7 +654,7 @@ python examples/04_mcp_integration/notion_oauth.py
655
654
  python examples/04_mcp_integration/middleware_demo.py
656
655
  ```
657
656
 
658
- See [examples/](examples/) for 20+ working examples.
657
+ See [examples/](examples/) for 45+ working examples.
659
658
 
660
659
  ---
661
660
 
@@ -618,7 +618,7 @@ python examples/04_mcp_integration/notion_oauth.py
618
618
  python examples/04_mcp_integration/middleware_demo.py
619
619
  ```
620
620
 
621
- See [examples/](examples/) for 20+ working examples.
621
+ See [examples/](examples/) for 45+ working examples.
622
622
 
623
623
  ---
624
624
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "chuk-tool-processor"
7
- version = "0.22"
7
+ version = "0.22.2"
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"
@@ -36,10 +36,9 @@ classifiers = [
36
36
  ]
37
37
  dependencies = [
38
38
  "chuk-mcp>=0.9",
39
- "dotenv>=0.9.9",
39
+ "python-dotenv>=1.0.0",
40
40
  "psutil>=7.0.0",
41
41
  "pydantic>=2.11.3",
42
- "uuid>=1.30",
43
42
  ]
44
43
 
45
44
  # Optional dependency groups
@@ -51,7 +50,7 @@ fast-json = [
51
50
 
52
51
  # Redis registry for distributed deployments
53
52
  redis = [
54
- "redis[hiredis]>=5.0.0,<6",
53
+ "redis[hiredis]>=7.2,<8",
55
54
  ]
56
55
 
57
56
  # Full feature set with performance optimizations
@@ -62,7 +61,7 @@ full = [
62
61
  # All extras combined
63
62
  all = [
64
63
  "orjson>=3.10.0,<4",
65
- "redis[hiredis]>=5.0.0,<6",
64
+ "redis[hiredis]>=7.2,<8",
66
65
  ]
67
66
 
68
67
  # Tell setuptools to look in src/ for your a2a package
@@ -82,6 +81,14 @@ addopts = "-v --cov=src --cov-report=term --cov-report=xml --cov-report=html"
82
81
  asyncio_default_fixture_loop_scope = "function"
83
82
  asyncio_mode = "strict"
84
83
  minversion = "8.0"
84
+ filterwarnings = [
85
+ # Pydantic V1 compat warning from LangChain (third-party, can't fix)
86
+ "ignore::pydantic.warnings.PydanticDeprecatedSince20",
87
+ # RuntimeWarning from mock coroutines never awaited in tests
88
+ "ignore:coroutine .* was never awaited:RuntimeWarning",
89
+ # PytestCollectionWarning for test helper classes with __init__
90
+ "ignore::pytest.PytestCollectionWarning",
91
+ ]
85
92
 
86
93
  [dependency-groups]
87
94
  dev = [
@@ -98,7 +105,7 @@ dev = [
98
105
  "pre-commit>=3.8.0",
99
106
  "coverage[toml]>=7.6.0",
100
107
  "orjson>=3.10.0",
101
- "redis[hiredis]>=5.0.0,<6",
108
+ "redis[hiredis]>=7.2,<8",
102
109
  "fakeredis[lua]>=2.32.1",
103
110
  ]
104
111
 
@@ -12,6 +12,7 @@ from __future__ import annotations
12
12
 
13
13
  import asyncio
14
14
  import hashlib
15
+ import inspect
15
16
  import json as stdlib_json # Use stdlib json for consistent hashing
16
17
  import time
17
18
  from typing import Any
@@ -499,9 +500,10 @@ class ToolProcessor:
499
500
 
500
501
  # Execute tool calls
501
502
  async with log_context_span("tool_execution", {"num_calls": len(calls)}):
502
- # Assert that initialization completed successfully
503
- assert self.registry is not None, "Registry must be initialized"
504
- assert self.executor is not None, "Executor must be initialized"
503
+ if self.registry is None:
504
+ raise RuntimeError("Registry not initialized. Call initialize() first.")
505
+ if self.executor is None:
506
+ raise RuntimeError("Executor not initialized. Call initialize() first.")
505
507
 
506
508
  # Check if any tools are unknown - search across all namespaces
507
509
  unknown_tools = []
@@ -517,7 +519,8 @@ class ToolProcessor:
517
519
 
518
520
  # Execute tools (with context scope if provided)
519
521
  async def _execute_with_context() -> list[ToolResult]:
520
- assert self.executor is not None
522
+ if self.executor is None:
523
+ raise RuntimeError("Executor not initialized. Call initialize() first.")
521
524
  # If return_order is specified and strategy supports it, call run() directly
522
525
  # This bypasses the wrapper chain but preserves return_order semantics
523
526
  if return_order is not None and self.strategy is not None and hasattr(self.strategy, "run"):
@@ -644,7 +647,7 @@ class ToolProcessor:
644
647
  results = await self.executor.execute(
645
648
  calls=calls,
646
649
  timeout=timeout,
647
- use_cache=use_cache if hasattr(self.executor, "use_cache") else True,
650
+ use_cache=use_cache,
648
651
  )
649
652
 
650
653
  # Ensure we always return a list (never None)
@@ -863,7 +866,7 @@ class ToolProcessor:
863
866
  # Close the executor if it has a close method
864
867
  if self.executor and hasattr(self.executor, "close"):
865
868
  close_method = self.executor.close
866
- if asyncio.iscoroutinefunction(close_method):
869
+ if inspect.iscoroutinefunction(close_method):
867
870
  await close_method()
868
871
  elif callable(close_method):
869
872
  close_method()
@@ -871,7 +874,7 @@ class ToolProcessor:
871
874
  # Close the strategy if it has a close method
872
875
  if self.strategy and hasattr(self.strategy, "close"):
873
876
  close_method = self.strategy.close
874
- if asyncio.iscoroutinefunction(close_method):
877
+ if inspect.iscoroutinefunction(close_method):
875
878
  await close_method()
876
879
  elif callable(close_method):
877
880
  result = close_method()
@@ -887,7 +890,7 @@ class ToolProcessor:
887
890
  if isinstance(current, CachingToolExecutor):
888
891
  if hasattr(current.cache, "clear"):
889
892
  clear_method = current.cache.clear
890
- if asyncio.iscoroutinefunction(clear_method):
893
+ if inspect.iscoroutinefunction(clear_method):
891
894
  await clear_method()
892
895
  else:
893
896
  clear_result = clear_method()
@@ -749,12 +749,12 @@ class InProcessStrategy(ExecutionStrategy):
749
749
  all_tools = await self.registry.list_tools()
750
750
 
751
751
  # Look for exact matches in tool name (ignoring namespace)
752
- for namespace, registered_name in all_tools:
753
- if registered_name == tool_name:
754
- logger.debug(f"Fuzzy match: found '{registered_name}' in namespace '{namespace}'")
755
- tool = await self.registry.get_tool(registered_name, namespace)
752
+ for tool_info in all_tools:
753
+ if tool_info.name == tool_name:
754
+ logger.debug(f"Fuzzy match: found '{tool_info.name}' in namespace '{tool_info.namespace}'")
755
+ tool = await self.registry.get_tool(tool_info.name, tool_info.namespace)
756
756
  if tool is not None:
757
- return tool, namespace
757
+ return tool, tool_info.namespace
758
758
 
759
759
  # Log all available tools for debugging
760
760
  logger.debug(f"Available tools: {all_tools}")
@@ -149,7 +149,7 @@ class AsyncContextManagerWrapper(contextlib.AbstractAsyncContextManager):
149
149
  else:
150
150
  # Propagate the exception into the generator
151
151
  try:
152
- await self._gen.athrow(exc_type, exc_val, exc_tb)
152
+ await self._gen.athrow(exc_val)
153
153
  except StopAsyncIteration:
154
154
  return False
155
155
  # If the generator swallowed the exception, suppress it;
@@ -327,10 +327,8 @@ class MCPTool:
327
327
  )
328
328
  return True
329
329
 
330
- # Fallback - try very quick operation with short timeout
331
- server_info: list[dict[str, Any]] = await asyncio.wait_for( # type: ignore[arg-type]
332
- self._sm.get_server_info(), timeout=1.0
333
- )
330
+ # Fallback - check server_info synchronously (get_server_info is not a coroutine)
331
+ server_info: list[dict[str, Any]] = self._sm.get_server_info()
334
332
  healthy = len(server_info) > 0
335
333
  logger.debug(f"StreamManager health for '{self.tool_name}': {healthy} (via server_info)")
336
334
  return healthy
@@ -187,7 +187,7 @@ async def update_mcp_tools_stream_manager(
187
187
  try:
188
188
  # List all tools in the namespace
189
189
  all_tools = await registry.list_tools()
190
- namespace_tools = [name for ns, name in all_tools if ns == namespace]
190
+ namespace_tools = [tool_info.name for tool_info in all_tools if tool_info.namespace == namespace]
191
191
 
192
192
  for tool_name in namespace_tools:
193
193
  try:
@@ -5,10 +5,10 @@ Tool metadata models for the registry with async-native support.
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
- from datetime import datetime
8
+ from datetime import UTC, datetime
9
9
  from typing import Any
10
10
 
11
- from pydantic import BaseModel, Field, model_validator
11
+ from pydantic import BaseModel, Field
12
12
 
13
13
 
14
14
  class MCPToolFactoryParams(BaseModel):
@@ -83,8 +83,12 @@ class ToolMetadata(BaseModel):
83
83
  result_schema: dict[str, Any] | None = Field(None, description="Schema for the tool's result")
84
84
  requires_auth: bool = Field(False, description="Whether the tool requires authentication")
85
85
  tags: set[str] = Field(default_factory=set, description="Tags associated with the tool")
86
- created_at: datetime = Field(default_factory=datetime.utcnow, description="When the tool was first registered")
87
- updated_at: datetime = Field(default_factory=datetime.utcnow, description="When the tool was last updated")
86
+ created_at: datetime = Field(
87
+ default_factory=lambda: datetime.now(UTC), description="When the tool was first registered"
88
+ )
89
+ updated_at: datetime = Field(
90
+ default_factory=lambda: datetime.now(UTC), description="When the tool was last updated"
91
+ )
88
92
  source: str | None = Field(None, description="Source of the tool (e.g., 'function', 'class', 'langchain')")
89
93
  source_name: str | None = Field(None, description="Source identifier (e.g., function name, class name)")
90
94
  concurrency_limit: int | None = Field(None, description="Maximum concurrent executions (None = unlimited)")
@@ -105,15 +109,9 @@ class ToolMetadata(BaseModel):
105
109
  None, description="Factory parameters for creating deferred MCP tools"
106
110
  )
107
111
 
108
- @model_validator(mode="after")
109
- def ensure_async(self) -> ToolMetadata:
110
- """Ensure all tools are marked as async in the async-native architecture."""
111
- self.is_async = True
112
- return self
113
-
114
112
  def with_updated_timestamp(self) -> ToolMetadata:
115
113
  """Create a copy with updated timestamp."""
116
- return self.model_copy(update={"updated_at": datetime.utcnow()})
114
+ return self.model_copy(update={"updated_at": datetime.now(UTC)})
117
115
 
118
116
  def __str__(self) -> str:
119
117
  """String representation of the tool metadata."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: chuk-tool-processor
3
- Version: 0.22
3
+ Version: 0.22.2
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
@@ -20,19 +20,18 @@ Requires-Python: >=3.11
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
22
  Requires-Dist: chuk-mcp>=0.9
23
- Requires-Dist: dotenv>=0.9.9
23
+ Requires-Dist: python-dotenv>=1.0.0
24
24
  Requires-Dist: psutil>=7.0.0
25
25
  Requires-Dist: pydantic>=2.11.3
26
- Requires-Dist: uuid>=1.30
27
26
  Provides-Extra: fast-json
28
27
  Requires-Dist: orjson<4,>=3.10.0; extra == "fast-json"
29
28
  Provides-Extra: redis
30
- Requires-Dist: redis[hiredis]<6,>=5.0.0; extra == "redis"
29
+ Requires-Dist: redis[hiredis]<8,>=7.2; extra == "redis"
31
30
  Provides-Extra: full
32
31
  Requires-Dist: orjson<4,>=3.10.0; extra == "full"
33
32
  Provides-Extra: all
34
33
  Requires-Dist: orjson<4,>=3.10.0; extra == "all"
35
- Requires-Dist: redis[hiredis]<6,>=5.0.0; extra == "all"
34
+ Requires-Dist: redis[hiredis]<8,>=7.2; extra == "all"
36
35
  Dynamic: license-file
37
36
 
38
37
  # CHUK Tool Processor — A Tool Execution Runtime for AI Systems
@@ -655,7 +654,7 @@ python examples/04_mcp_integration/notion_oauth.py
655
654
  python examples/04_mcp_integration/middleware_demo.py
656
655
  ```
657
656
 
658
- See [examples/](examples/) for 20+ working examples.
657
+ See [examples/](examples/) for 45+ working examples.
659
658
 
660
659
  ---
661
660
 
@@ -1,12 +1,11 @@
1
1
  chuk-mcp>=0.9
2
- dotenv>=0.9.9
2
+ python-dotenv>=1.0.0
3
3
  psutil>=7.0.0
4
4
  pydantic>=2.11.3
5
- uuid>=1.30
6
5
 
7
6
  [all]
8
7
  orjson<4,>=3.10.0
9
- redis[hiredis]<6,>=5.0.0
8
+ redis[hiredis]<8,>=7.2
10
9
 
11
10
  [fast-json]
12
11
  orjson<4,>=3.10.0
@@ -15,4 +14,4 @@ orjson<4,>=3.10.0
15
14
  orjson<4,>=3.10.0
16
15
 
17
16
  [redis]
18
- redis[hiredis]<6,>=5.0.0
17
+ redis[hiredis]<8,>=7.2