digitalkin 0.3.3.dev8__tar.gz → 0.3.4__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 (158) hide show
  1. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/PKG-INFO +2 -2
  2. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/pyproject.toml +3 -3
  3. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/__version__.py +1 -1
  4. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/__init__.py +0 -2
  5. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/module_context.py +2 -18
  6. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/setup_types.py +124 -13
  7. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/tool_cache.py +51 -45
  8. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/_base_module.py +16 -8
  9. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin.egg-info/PKG-INFO +2 -2
  10. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin.egg-info/requires.txt +1 -1
  11. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/LICENSE +0 -0
  12. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/README.md +0 -0
  13. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/base_server/__init__.py +0 -0
  14. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/base_server/mock/__init__.py +0 -0
  15. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/base_server/mock/mock_pb2.py +0 -0
  16. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  17. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/base_server/server_async_insecure.py +0 -0
  18. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/base_server/server_async_secure.py +0 -0
  19. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/base_server/server_sync_insecure.py +0 -0
  20. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/base_server/server_sync_secure.py +0 -0
  21. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/modules/__init__.py +0 -0
  22. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/modules/archetype_with_tools_module.py +0 -0
  23. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/modules/cpu_intensive_module.py +0 -0
  24. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/modules/dynamic_setup_module.py +0 -0
  25. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/modules/minimal_llm_module.py +0 -0
  26. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/modules/text_transform_module.py +0 -0
  27. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  28. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  29. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  30. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  31. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  32. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/monitoring/tests/test_metrics.py +0 -0
  33. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/services/filesystem_module.py +0 -0
  34. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/examples/services/storage_module.py +0 -0
  35. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/setup.cfg +0 -0
  36. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/__init__.py +0 -0
  37. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/__init__.py +0 -0
  38. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/common/__init__.py +0 -0
  39. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/common/factories.py +0 -0
  40. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/job_manager/__init__.py +0 -0
  41. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  42. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
  43. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/job_manager/taskiq_broker.py +0 -0
  44. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/job_manager/taskiq_job_manager.py +0 -0
  45. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/profiling/__init__.py +0 -0
  46. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/profiling/asyncio_monitor.py +0 -0
  47. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/profiling/task_profiler.py +0 -0
  48. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/task_manager/__init__.py +0 -0
  49. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
  50. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  51. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  52. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/task_manager/task_executor.py +0 -0
  53. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/core/task_manager/task_session.py +0 -0
  54. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/__init__.py +0 -0
  55. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  56. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/module_server.py +0 -0
  57. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
  58. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  59. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
  60. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
  61. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  62. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  63. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/logger.py +0 -0
  64. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/__init__.py +0 -0
  65. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/base_mixin.py +0 -0
  66. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/callback_mixin.py +0 -0
  67. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/chat_history_mixin.py +0 -0
  68. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/cost_mixin.py +0 -0
  69. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  70. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  71. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/logger_mixin.py +0 -0
  72. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/mixins/storage_mixin.py +0 -0
  73. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/__init__.py +0 -0
  74. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/core/__init__.py +0 -0
  75. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/core/job_manager_models.py +0 -0
  76. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/core/task_monitor.py +0 -0
  77. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  78. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/grpc_servers/models.py +0 -0
  79. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/grpc_servers/types.py +0 -0
  80. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/base_types.py +0 -0
  81. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/module.py +0 -0
  82. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/module_types.py +0 -0
  83. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/request_metadata.py +0 -0
  84. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/select_schema.py +0 -0
  85. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/tool_reference.py +0 -0
  86. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/module/utility.py +0 -0
  87. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/services/__init__.py +0 -0
  88. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/services/cost.py +0 -0
  89. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/services/registry.py +0 -0
  90. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/models/services/storage.py +0 -0
  91. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/__init__.py +0 -0
  92. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/archetype_module.py +0 -0
  93. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/tool_module.py +0 -0
  94. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/trigger_handler.py +0 -0
  95. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/triggers/__init__.py +0 -0
  96. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  97. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  98. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  99. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/py.typed +0 -0
  100. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/__init__.py +0 -0
  101. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/agent/__init__.py +0 -0
  102. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/agent/agent_strategy.py +0 -0
  103. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/agent/default_agent.py +0 -0
  104. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/base_strategy.py +0 -0
  105. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/communication/__init__.py +0 -0
  106. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/communication/communication_strategy.py +0 -0
  107. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/communication/default_communication.py +0 -0
  108. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/communication/grpc_communication.py +0 -0
  109. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/cost/__init__.py +0 -0
  110. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  111. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/cost/default_cost.py +0 -0
  112. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  113. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/filesystem/__init__.py +0 -0
  114. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
  115. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  116. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
  117. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/identity/__init__.py +0 -0
  118. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/identity/default_identity.py +0 -0
  119. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  120. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/registry/__init__.py +0 -0
  121. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/registry/default_registry.py +0 -0
  122. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/registry/exceptions.py +0 -0
  123. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/registry/grpc_registry.py +0 -0
  124. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/registry/registry_models.py +0 -0
  125. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/registry/registry_strategy.py +0 -0
  126. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/services_config.py +0 -0
  127. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/services_models.py +0 -0
  128. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/setup/__init__.py +0 -0
  129. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/setup/default_setup.py +0 -0
  130. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/setup/grpc_setup.py +0 -0
  131. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  132. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/snapshot/__init__.py +0 -0
  133. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/snapshot/default_snapshot.py +0 -0
  134. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/snapshot/snapshot_strategy.py +0 -0
  135. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/storage/__init__.py +0 -0
  136. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/storage/default_storage.py +0 -0
  137. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/storage/grpc_storage.py +0 -0
  138. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  139. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/task_manager/__init__.py +0 -0
  140. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
  141. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/task_manager/grpc_task_manager.py +0 -0
  142. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  143. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/user_profile/__init__.py +0 -0
  144. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  145. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  146. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  147. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/__init__.py +0 -0
  148. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/arg_parser.py +0 -0
  149. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/conditional_schema.py +0 -0
  150. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/development_mode_action.py +0 -0
  151. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/dynamic_schema.py +0 -0
  152. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  153. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/package_discover.py +0 -0
  154. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/proto_utils.py +0 -0
  155. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin/utils/schema_splitter.py +0 -0
  156. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin.egg-info/SOURCES.txt +0 -0
  157. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  158. {digitalkin-0.3.3.dev8 → digitalkin-0.3.4}/src/digitalkin.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 0.3.3.dev8
3
+ Version: 0.3.4
4
4
  Summary: SDK to build kin used in DigitalKin
5
5
  Author-email: "DigitalKin.ai" <contact@digitalkin.ai>
6
6
  License: Attribution-NonCommercial-ShareAlike 4.0 International
@@ -453,7 +453,7 @@ Requires-Python: >=3.10
453
453
  Description-Content-Type: text/markdown
454
454
  License-File: LICENSE
455
455
  Requires-Dist: agentic-mesh-protocol==0.2.3
456
- Requires-Dist: anyio==4.12.1
456
+ Requires-Dist: anyio==4.13.0
457
457
  Requires-Dist: grpcio-health-checking==1.78.0
458
458
  Requires-Dist: grpcio-reflection==1.78.0
459
459
  Requires-Dist: grpcio-status==1.78.0
@@ -28,13 +28,13 @@
28
28
 
29
29
  dependencies = [
30
30
  "agentic-mesh-protocol==0.2.3",
31
- "anyio==4.12.1",
31
+ "anyio==4.13.0",
32
32
  "grpcio-health-checking==1.78.0",
33
33
  "grpcio-reflection==1.78.0",
34
34
  "grpcio-status==1.78.0",
35
35
  "pydantic==2.12.5",
36
36
  ]
37
- version = "0.3.3.dev8"
37
+ version = "0.3.4"
38
38
 
39
39
  [project.optional-dependencies]
40
40
  profiling = [
@@ -60,7 +60,7 @@
60
60
 
61
61
  [dependency-groups]
62
62
  dev = [
63
- "build==1.4.0",
63
+ "build==1.4.1",
64
64
  "bump-my-version==1.2.7",
65
65
  "cryptography==46.0.5",
66
66
  "mypy==1.19.1",
@@ -5,4 +5,4 @@ from importlib.metadata import PackageNotFoundError, version
5
5
  try:
6
6
  __version__ = version("digitalkin")
7
7
  except PackageNotFoundError:
8
- __version__ = "0.3.3.dev8"
8
+ __version__ = "0.3.4"
@@ -12,7 +12,6 @@ from digitalkin.models.module.tool_cache import (
12
12
  ToolCache,
13
13
  ToolDefinition,
14
14
  ToolModuleInfo,
15
- ToolParameter,
16
15
  )
17
16
  from digitalkin.models.module.tool_reference import (
18
17
  ToolReference,
@@ -38,7 +37,6 @@ __all__ = [
38
37
  "ToolCache",
39
38
  "ToolDefinition",
40
39
  "ToolModuleInfo",
41
- "ToolParameter",
42
40
  "ToolReference",
43
41
  "ToolSelection",
44
42
  "UtilityProtocol",
@@ -9,7 +9,7 @@ from zoneinfo import ZoneInfo
9
9
 
10
10
  from digitalkin.logger import logger
11
11
  from digitalkin.models.module.request_metadata import RequestMetadata
12
- from digitalkin.models.module.tool_cache import ToolCache, ToolDefinition, ToolModuleInfo, ToolParameter
12
+ from digitalkin.models.module.tool_cache import ToolCache, ToolDefinition, ToolModuleInfo
13
13
  from digitalkin.services.agent.agent_strategy import AgentStrategy
14
14
  from digitalkin.services.communication.communication_strategy import CommunicationStrategy
15
15
  from digitalkin.services.cost.cost_strategy import CostStrategy
@@ -225,29 +225,13 @@ class ModuleContext:
225
225
  "toolkit_name": tool_module_info.tool_name or "undefined",
226
226
  "name": tool_module_info.slug + "__" + tool_def.name,
227
227
  "description": tool_def.description + cost_description,
228
- "parameters": ModuleContext._build_parameters_schema(tool_def.parameters),
228
+ "parameters": tool_def.parameters_schema,
229
229
  },
230
230
  "cost_info": cost_info,
231
231
  }
232
232
  for tool_def in tool_module_info.tools
233
233
  ]
234
234
 
235
- @staticmethod
236
- def _build_parameters_schema(params: list[ToolParameter]) -> dict[str, Any]:
237
- """Convert ToolParameter list to JSON Schema.
238
-
239
- Args:
240
- params: List of tool parameters.
241
-
242
- Returns:
243
- JSON Schema object with properties and required fields.
244
- """
245
- return {
246
- "type": "object",
247
- "properties": {p.name: {"type": p.type, "description": p.description or ""} for p in params},
248
- "required": [p.name for p in params if p.required],
249
- }
250
-
251
235
  @staticmethod
252
236
  def _build_cost_info(cost_config: dict[str, Any]) -> dict[str, Any]:
253
237
  """Build cost information structure for tool metadata.
@@ -79,12 +79,11 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
79
79
  if has_dynamic(field_info):
80
80
  current_field_info = await cls._refresh_field_schema(name, field_info)
81
81
 
82
- if (nested_model := cls._get_base_model_type(current_annotation)) is not None:
83
- refreshed_nested = await cls._refresh_nested_model(nested_model)
84
- if refreshed_nested is not nested_model:
85
- current_annotation = refreshed_nested
86
- current_field_info = copy.deepcopy(current_field_info)
87
- current_field_info.annotation = current_annotation
82
+ refreshed_annotation = await cls._refresh_annotation(current_annotation)
83
+ if refreshed_annotation is not None:
84
+ current_annotation = refreshed_annotation
85
+ current_field_info = copy.deepcopy(current_field_info)
86
+ current_field_info.annotation = current_annotation
88
87
 
89
88
  clean_fields[name] = (current_annotation, current_field_info)
90
89
 
@@ -223,6 +222,119 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
223
222
  return result
224
223
  return None
225
224
 
225
+ @classmethod
226
+ def _find_all_base_models_in_args(
227
+ cls,
228
+ args: "tuple[type, ...]",
229
+ ) -> "list[type[BaseModel]]":
230
+ """Find all BaseModel subclasses in type args.
231
+
232
+ Args:
233
+ args: Type arguments to search.
234
+
235
+ Returns:
236
+ List of BaseModel subclasses found.
237
+ """
238
+ results: list[type[BaseModel]] = []
239
+ for arg in args:
240
+ if arg is type(None):
241
+ continue
242
+ if (result := cls._check_base_model(arg)) is not None:
243
+ results.append(result)
244
+ return results
245
+
246
+ @classmethod
247
+ async def _refresh_annotation(cls, annotation: "type | None") -> "type | None":
248
+ """Refresh dynamic fields in an annotation, handling Unions and single models.
249
+
250
+ Args:
251
+ annotation: Type annotation to refresh.
252
+
253
+ Returns:
254
+ Refreshed annotation, or None if no changes were made.
255
+ """
256
+ if annotation is None:
257
+ return None
258
+
259
+ refreshed_union = await cls._refresh_union_variants(annotation)
260
+ if refreshed_union is not None:
261
+ return refreshed_union
262
+
263
+ nested_model = cls._get_base_model_type(annotation)
264
+ if nested_model is None:
265
+ return None
266
+
267
+ refreshed = await cls._refresh_nested_model(nested_model)
268
+ if refreshed is nested_model:
269
+ return None
270
+
271
+ return cls._rebuild_generic_annotation(annotation, nested_model, refreshed)
272
+
273
+ @classmethod
274
+ def _rebuild_generic_annotation(
275
+ cls, annotation: type, original: "type[BaseModel]", refreshed: "type[BaseModel]"
276
+ ) -> type:
277
+ """Rebuild a generic annotation replacing the original BaseModel with the refreshed one.
278
+
279
+ Args:
280
+ annotation: Original generic annotation (e.g. list[MyModel]).
281
+ original: The original BaseModel subclass found in the annotation.
282
+ refreshed: The refreshed replacement model.
283
+
284
+ Returns:
285
+ Rebuilt annotation, or the refreshed model if annotation is not generic.
286
+ """
287
+ origin = get_origin(annotation)
288
+ if origin is None:
289
+ return refreshed
290
+
291
+ args = get_args(annotation)
292
+ new_args = tuple(refreshed if a is original else a for a in args)
293
+ if origin in {list, set, frozenset}:
294
+ return origin[new_args[0]] # type: ignore[index]
295
+ if origin is dict:
296
+ return dict[new_args[0], new_args[1]] # type: ignore[misc,index,valid-type]
297
+ if origin is tuple:
298
+ return tuple[new_args] # type: ignore[misc,index,valid-type]
299
+ return refreshed
300
+
301
+ @classmethod
302
+ async def _refresh_union_variants(
303
+ cls,
304
+ annotation: "type",
305
+ ) -> "type | None":
306
+ """Refresh dynamic fields in all BaseModel variants of a Union annotation.
307
+
308
+ Args:
309
+ annotation: A Union type annotation potentially containing multiple BaseModel subclasses.
310
+
311
+ Returns:
312
+ Rebuilt annotation with refreshed variants, or None if no changes were made.
313
+ """
314
+ origin = get_origin(annotation)
315
+ if origin is not typing.Union and origin is not types.UnionType:
316
+ return None
317
+
318
+ args = get_args(annotation)
319
+ models = cls._find_all_base_models_in_args(args)
320
+ if len(models) <= 1:
321
+ return None
322
+
323
+ replacements: dict[type, type] = {}
324
+ for model in models:
325
+ refreshed = await cls._refresh_nested_model(model)
326
+ if refreshed is not model:
327
+ replacements[model] = refreshed
328
+
329
+ if not replacements:
330
+ return None
331
+
332
+ new_args = [replacements.get(a, a) for a in args] # type: ignore[arg-type]
333
+ rebuilt = new_args[0]
334
+ for arg in new_args[1:]:
335
+ rebuilt |= arg # type: ignore[operator]
336
+ return rebuilt # type: ignore[return-value]
337
+
226
338
  @classmethod
227
339
  async def _refresh_nested_model(cls, model_cls: "type[BaseModel]") -> "type[BaseModel]":
228
340
  """Refresh dynamic fields in a nested BaseModel.
@@ -244,13 +356,12 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
244
356
  current_field_info = await cls._refresh_field_schema(name, field_info)
245
357
  has_changes = True
246
358
 
247
- if (nested_model := cls._get_base_model_type(current_annotation)) is not None:
248
- refreshed_nested = await cls._refresh_nested_model(nested_model)
249
- if refreshed_nested is not nested_model:
250
- current_annotation = refreshed_nested
251
- current_field_info = copy.deepcopy(current_field_info)
252
- current_field_info.annotation = current_annotation
253
- has_changes = True
359
+ refreshed_annotation = await cls._refresh_annotation(current_annotation)
360
+ if refreshed_annotation is not None:
361
+ current_annotation = refreshed_annotation
362
+ current_field_info = copy.deepcopy(current_field_info)
363
+ current_field_info.annotation = current_annotation
364
+ has_changes = True
254
365
 
255
366
  clean_fields[name] = (current_annotation, current_field_info)
256
367
 
@@ -7,6 +7,7 @@ from pydantic import BaseModel, Field
7
7
 
8
8
  from digitalkin.logger import logger
9
9
  from digitalkin.models.services.registry import ModuleInfo
10
+ from digitalkin.utils.llm_ready_schema import inline_refs
10
11
 
11
12
 
12
13
  class SelectedTool(BaseModel):
@@ -22,40 +23,30 @@ if TYPE_CHECKING:
22
23
  from digitalkin.services.communication import CommunicationStrategy
23
24
 
24
25
 
25
- class ToolParameter(BaseModel):
26
- """Definition of a single tool parameter.
27
-
28
- Attributes:
29
- name: Parameter name.
30
- type: JSON Schema type (string, integer, number, boolean, array, object).
31
- description: Parameter description for the LLM.
32
- required: Whether this parameter is required.
33
- enum: Optional list of allowed values.
34
- items: Optional schema for array item types.
35
- properties: Optional schema for object properties.
36
- """
37
-
38
- name: str
39
- type: str
40
- description: str
41
- required: bool = True
42
- enum: list[str] | None = None
43
- items: dict[str, Any] | None = None
44
- properties: dict[str, Any] | None = None
45
-
46
-
47
26
  class ToolDefinition(BaseModel):
48
- """Complete definition of an LLM tool with grouped parameters.
27
+ """Complete definition of an LLM tool with resolved JSON Schema parameters.
49
28
 
50
29
  Attributes:
51
30
  name: Tool name (from protocol const or trigger class name).
52
31
  description: Tool description (from trigger docstring).
53
- parameters: List of parameter definitions.
32
+ parameters_schema: JSON Schema object describing the tool's parameters.
54
33
  """
55
34
 
56
35
  name: str
57
36
  description: str
58
- parameters: list[ToolParameter] = Field(default_factory=list)
37
+ parameters_schema: dict[str, Any] = Field(
38
+ default_factory=lambda: {"type": "object", "properties": {}, "required": []}
39
+ )
40
+
41
+ @property
42
+ def parameter_names(self) -> set[str]:
43
+ """Return the set of parameter names from the schema."""
44
+ return set[str](self.parameters_schema.get("properties", {}).keys())
45
+
46
+ @property
47
+ def parameter_count(self) -> int:
48
+ """Return the number of parameters in the schema."""
49
+ return len(self.parameters_schema.get("properties", {}))
59
50
 
60
51
 
61
52
  class ToolModuleInfo(ModuleInfo):
@@ -192,14 +183,44 @@ async def module_info_to_tool_module_info(
192
183
  )
193
184
 
194
185
 
186
+ def _build_parameters_from_schema(def_schema: dict[str, Any]) -> dict[str, Any]:
187
+ """Build parameters_schema directly from an inlined JSON Schema.
188
+
189
+ Extracts tool parameters from the trigger's JSON Schema, skipping
190
+ internal fields (``protocol``, ``created_at``).
191
+
192
+ Args:
193
+ def_schema: JSON Schema for the trigger with all ``$ref`` already inlined.
194
+
195
+ Returns:
196
+ JSON Schema dict with properties and required fields.
197
+ """
198
+ properties = def_schema.get("properties", {})
199
+ required_fields = set[Any](def_schema.get("required", []))
200
+ param_properties: dict[str, Any] = {}
201
+ required_list: list[str] = []
202
+
203
+ for prop_name, prop_info in properties.items():
204
+ if prop_name in {"protocol", "created_at"}:
205
+ continue
206
+ param_properties[prop_name] = dict[Any, Any](prop_info.items())
207
+ if prop_name in required_fields:
208
+ required_list.append(prop_name)
209
+
210
+ return {"type": "object", "properties": param_properties, "required": required_list}
211
+
212
+
195
213
  def _extract_tools_from_schema(schema: dict[str, Any]) -> list[ToolDefinition]:
196
214
  """Extract tool definitions from a discriminated union input schema.
197
215
 
216
+ Inlines ``$ref`` references and extracts parameters directly from the
217
+ JSON Schema — no intermediate Python model reconstruction needed.
218
+
198
219
  Args:
199
220
  schema: JSON schema with $defs containing protocol-based types.
200
221
 
201
222
  Returns:
202
- List of ToolDefinition with parameters grouped by trigger.
223
+ List of ToolDefinition with parameters_schema per trigger.
203
224
  """
204
225
  tools: list[ToolDefinition] = []
205
226
  defs = schema.get("$defs", {})
@@ -220,33 +241,18 @@ def _extract_tools_from_schema(schema: dict[str, Any]) -> list[ToolDefinition]:
220
241
  if "const" not in protocol_prop:
221
242
  continue
222
243
 
223
- # Extract tool-level info from trigger
224
244
  tool_name = protocol_prop.get("const", def_name)
225
245
  tool_description = def_schema.get("description", "")
226
246
 
227
- required_fields = set[Any](def_schema.get("required", []))
228
- parameters: list[ToolParameter] = []
229
-
230
- for prop_name, prop_info in properties.items():
231
- if prop_name in {"protocol", "created_at"}:
232
- continue
233
-
234
- param = ToolParameter(
235
- name=prop_name,
236
- type=prop_info.get("type", "string"),
237
- description=prop_info.get("description", ""),
238
- required=prop_name in required_fields,
239
- enum=prop_info.get("enum"),
240
- items=prop_info.get("items"),
241
- properties=prop_info.get("properties"),
242
- )
243
- parameters.append(param)
247
+ # Inline $ref references so properties are self-contained
248
+ inlined = inline_refs({**def_schema, "$defs": defs})
249
+ parameters_schema = _build_parameters_from_schema(inlined)
244
250
 
245
251
  tools.append(
246
252
  ToolDefinition(
247
253
  name=tool_name,
248
254
  description=tool_description,
249
- parameters=parameters,
255
+ parameters_schema=parameters_schema,
250
256
  )
251
257
  )
252
258
 
@@ -466,7 +466,8 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
466
466
  Raises:
467
467
  ValueError: If no handler for the protocol is found.
468
468
  """
469
- input_instance = self.input_format.model_validate(input_data)
469
+ model_cls = self._extended_input_format or self.input_format
470
+ input_instance = model_cls.model_validate(input_data)
470
471
 
471
472
  # Apply cost limits if present in input (field added dynamically by UtilitySchemaExtender)
472
473
  if (
@@ -585,12 +586,13 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
585
586
  except Exception as e:
586
587
  self._status = ModuleStatus.FAILED
587
588
  short_description = "Error initializing module"
588
- logger.exception("%s: %s", short_description, e)
589
+ error_detail = f"{type(e).__name__}: {e}" if str(e) else type(e).__name__
590
+ logger.exception("%s: %s", short_description, error_detail)
589
591
  await callback(
590
592
  ModuleCodeModel(
591
593
  code="Error",
592
594
  short_description=short_description,
593
- message=str(e),
595
+ message=error_detail,
594
596
  )
595
597
  )
596
598
  if done_callback is not None:
@@ -624,12 +626,18 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
624
626
  await handler.flush_file_history(self.context)
625
627
  except Exception:
626
628
  logger.warning("Failed to flush handler history during stop", exc_info=True)
627
- await self.context.callbacks.send_message(
628
- DataModel(
629
- root=EndOfStreamOutput(),
630
- annotations={"role": BaseRole.SYSTEM},
629
+ try:
630
+ await self.context.callbacks.send_message(
631
+ DataModel[EndOfStreamOutput](
632
+ root=EndOfStreamOutput(),
633
+ annotations={"role": BaseRole.SYSTEM},
634
+ )
635
+ )
636
+ except AttributeError:
637
+ logger.warning(
638
+ "send_message callback not set, skipping end-of-stream"
639
+ " (expected for start_config_setup which does not register send_message)"
631
640
  )
632
- )
633
641
  self._status = ModuleStatus.STOPPED
634
642
  logger.debug("Module %s cleaned", self.name)
635
643
  except Exception:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 0.3.3.dev8
3
+ Version: 0.3.4
4
4
  Summary: SDK to build kin used in DigitalKin
5
5
  Author-email: "DigitalKin.ai" <contact@digitalkin.ai>
6
6
  License: Attribution-NonCommercial-ShareAlike 4.0 International
@@ -453,7 +453,7 @@ Requires-Python: >=3.10
453
453
  Description-Content-Type: text/markdown
454
454
  License-File: LICENSE
455
455
  Requires-Dist: agentic-mesh-protocol==0.2.3
456
- Requires-Dist: anyio==4.12.1
456
+ Requires-Dist: anyio==4.13.0
457
457
  Requires-Dist: grpcio-health-checking==1.78.0
458
458
  Requires-Dist: grpcio-reflection==1.78.0
459
459
  Requires-Dist: grpcio-status==1.78.0
@@ -1,5 +1,5 @@
1
1
  agentic-mesh-protocol==0.2.3
2
- anyio==4.12.1
2
+ anyio==4.13.0
3
3
  grpcio-health-checking==1.78.0
4
4
  grpcio-reflection==1.78.0
5
5
  grpcio-status==1.78.0
File without changes
File without changes
File without changes