chuk-tool-processor 0.22__tar.gz → 0.22.1__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.1}/PKG-INFO +2 -2
  2. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/README.md +1 -1
  3. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/pyproject.toml +9 -1
  4. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/core/processor.py +4 -3
  5. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/logging/context.py +1 -1
  6. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/metadata.py +8 -4
  7. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1/src/chuk_tool_processor.egg-info}/PKG-INFO +2 -2
  8. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/LICENSE +0 -0
  9. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/setup.cfg +0 -0
  10. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/__init__.py +0 -0
  11. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/config.py +0 -0
  12. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/core/__init__.py +0 -0
  13. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/core/context.py +0 -0
  14. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/core/exceptions.py +0 -0
  15. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/discovery/__init__.py +0 -0
  16. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/discovery/dynamic_provider.py +0 -0
  17. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/discovery/search.py +0 -0
  18. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/discovery/searchable.py +0 -0
  19. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/discovery/synonyms.py +0 -0
  20. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/__init__.py +0 -0
  21. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/bulkhead.py +0 -0
  22. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/code_sandbox.py +0 -0
  23. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/strategies/__init__.py +0 -0
  24. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/strategies/inprocess_strategy.py +0 -0
  25. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/strategies/subprocess_strategy.py +0 -0
  26. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/tool_executor.py +0 -0
  27. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/__init__.py +0 -0
  28. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/caching.py +0 -0
  29. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/circuit_breaker.py +0 -0
  30. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/factory.py +0 -0
  31. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/observable.py +0 -0
  32. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/rate_limiting.py +0 -0
  33. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/redis_circuit_breaker.py +0 -0
  34. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/redis_rate_limiting.py +0 -0
  35. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/execution/wrappers/retry.py +0 -0
  36. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/__init__.py +0 -0
  37. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/assumption_trace.py +0 -0
  38. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/base.py +0 -0
  39. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/budget.py +0 -0
  40. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/chain.py +0 -0
  41. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/concurrency.py +0 -0
  42. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/contract_guard.py +0 -0
  43. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/models.py +0 -0
  44. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/network_policy.py +0 -0
  45. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/output_size.py +0 -0
  46. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/per_tool.py +0 -0
  47. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/plan_shape.py +0 -0
  48. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/precondition.py +0 -0
  49. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/provenance.py +0 -0
  50. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/retry_safety.py +0 -0
  51. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/runaway.py +0 -0
  52. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/saturation.py +0 -0
  53. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/schema_strictness.py +0 -0
  54. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/sensitive_data.py +0 -0
  55. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/side_effect.py +0 -0
  56. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/timeout_budget.py +0 -0
  57. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/guards/unresolved.py +0 -0
  58. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/logging/__init__.py +0 -0
  59. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/logging/formatter.py +0 -0
  60. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/logging/helpers.py +0 -0
  61. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/logging/metrics.py +0 -0
  62. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/__init__.py +0 -0
  63. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/mcp_tool.py +0 -0
  64. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/middleware.py +0 -0
  65. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/models.py +0 -0
  66. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/register_mcp_tools.py +0 -0
  67. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/setup_mcp_http_streamable.py +0 -0
  68. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/setup_mcp_sse.py +0 -0
  69. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/setup_mcp_stdio.py +0 -0
  70. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/stream_manager.py +0 -0
  71. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/transport/__init__.py +0 -0
  72. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/transport/base_transport.py +0 -0
  73. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/transport/http_streamable_transport.py +0 -0
  74. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/transport/models.py +0 -0
  75. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/transport/sse_transport.py +0 -0
  76. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/mcp/transport/stdio_transport.py +0 -0
  77. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/__init__.py +0 -0
  78. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/execution_span.py +0 -0
  79. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/execution_strategy.py +0 -0
  80. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/execution_trace.py +0 -0
  81. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/return_order.py +0 -0
  82. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/sandbox_policy.py +0 -0
  83. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/streaming_tool.py +0 -0
  84. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/tool_call.py +0 -0
  85. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/tool_contract.py +0 -0
  86. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/tool_export_mixin.py +0 -0
  87. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/tool_result.py +0 -0
  88. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/tool_spec.py +0 -0
  89. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/models/validated_tool.py +0 -0
  90. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/observability/__init__.py +0 -0
  91. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/observability/metrics.py +0 -0
  92. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/observability/setup.py +0 -0
  93. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/observability/trace_sink.py +0 -0
  94. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/observability/tracing.py +0 -0
  95. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/plugins/__init__.py +0 -0
  96. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/plugins/discovery.py +0 -0
  97. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/plugins/parsers/__init__.py +0 -0
  98. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/plugins/parsers/base.py +0 -0
  99. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/plugins/parsers/function_call_tool.py +0 -0
  100. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/plugins/parsers/json_tool.py +0 -0
  101. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/plugins/parsers/openai_tool.py +0 -0
  102. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/plugins/parsers/xml_tool.py +0 -0
  103. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/py.typed +0 -0
  104. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/__init__.py +0 -0
  105. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/auto_register.py +0 -0
  106. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/decorators.py +0 -0
  107. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/interface.py +0 -0
  108. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/provider.py +0 -0
  109. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/providers/__init__.py +0 -0
  110. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/providers/memory.py +0 -0
  111. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/providers/redis.py +0 -0
  112. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/registry/tool_export.py +0 -0
  113. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/scheduling/__init__.py +0 -0
  114. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/scheduling/greedy_dag.py +0 -0
  115. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/scheduling/policy.py +0 -0
  116. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/scheduling/types.py +0 -0
  117. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/utils/__init__.py +0 -0
  118. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/utils/fast_json.py +0 -0
  119. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor/utils/validation.py +0 -0
  120. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor.egg-info/SOURCES.txt +0 -0
  121. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor.egg-info/dependency_links.txt +0 -0
  122. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor.egg-info/requires.txt +0 -0
  123. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/src/chuk_tool_processor.egg-info/top_level.txt +0 -0
  124. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/tests/test_bulkhead.py +0 -0
  125. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/tests/test_config_coverage.py +0 -0
  126. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/tests/test_execution_context.py +0 -0
  127. {chuk_tool_processor-0.22 → chuk_tool_processor-0.22.1}/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.1
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
@@ -655,7 +655,7 @@ python examples/04_mcp_integration/notion_oauth.py
655
655
  python examples/04_mcp_integration/middleware_demo.py
656
656
  ```
657
657
 
658
- See [examples/](examples/) for 20+ working examples.
658
+ See [examples/](examples/) for 45+ working examples.
659
659
 
660
660
  ---
661
661
 
@@ -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.1"
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"
@@ -82,6 +82,14 @@ addopts = "-v --cov=src --cov-report=term --cov-report=xml --cov-report=html"
82
82
  asyncio_default_fixture_loop_scope = "function"
83
83
  asyncio_mode = "strict"
84
84
  minversion = "8.0"
85
+ filterwarnings = [
86
+ # Pydantic V1 compat warning from LangChain (third-party, can't fix)
87
+ "ignore::pydantic.warnings.PydanticDeprecatedSince20",
88
+ # RuntimeWarning from mock coroutines never awaited in tests
89
+ "ignore:coroutine .* was never awaited:RuntimeWarning",
90
+ # PytestCollectionWarning for test helper classes with __init__
91
+ "ignore::pytest.PytestCollectionWarning",
92
+ ]
85
93
 
86
94
  [dependency-groups]
87
95
  dev = [
@@ -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
@@ -863,7 +864,7 @@ class ToolProcessor:
863
864
  # Close the executor if it has a close method
864
865
  if self.executor and hasattr(self.executor, "close"):
865
866
  close_method = self.executor.close
866
- if asyncio.iscoroutinefunction(close_method):
867
+ if inspect.iscoroutinefunction(close_method):
867
868
  await close_method()
868
869
  elif callable(close_method):
869
870
  close_method()
@@ -871,7 +872,7 @@ class ToolProcessor:
871
872
  # Close the strategy if it has a close method
872
873
  if self.strategy and hasattr(self.strategy, "close"):
873
874
  close_method = self.strategy.close
874
- if asyncio.iscoroutinefunction(close_method):
875
+ if inspect.iscoroutinefunction(close_method):
875
876
  await close_method()
876
877
  elif callable(close_method):
877
878
  result = close_method()
@@ -887,7 +888,7 @@ class ToolProcessor:
887
888
  if isinstance(current, CachingToolExecutor):
888
889
  if hasattr(current.cache, "clear"):
889
890
  clear_method = current.cache.clear
890
- if asyncio.iscoroutinefunction(clear_method):
891
+ if inspect.iscoroutinefunction(clear_method):
891
892
  await clear_method()
892
893
  else:
893
894
  clear_result = clear_method()
@@ -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;
@@ -5,7 +5,7 @@ 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
11
  from pydantic import BaseModel, Field, model_validator
@@ -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)")
@@ -113,7 +117,7 @@ class ToolMetadata(BaseModel):
113
117
 
114
118
  def with_updated_timestamp(self) -> ToolMetadata:
115
119
  """Create a copy with updated timestamp."""
116
- return self.model_copy(update={"updated_at": datetime.utcnow()})
120
+ return self.model_copy(update={"updated_at": datetime.now(UTC)})
117
121
 
118
122
  def __str__(self) -> str:
119
123
  """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.1
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
@@ -655,7 +655,7 @@ python examples/04_mcp_integration/notion_oauth.py
655
655
  python examples/04_mcp_integration/middleware_demo.py
656
656
  ```
657
657
 
658
- See [examples/](examples/) for 20+ working examples.
658
+ See [examples/](examples/) for 45+ working examples.
659
659
 
660
660
  ---
661
661