digitalkin 0.3.2.dev25__tar.gz → 0.3.2.dev27__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 (149) hide show
  1. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/PKG-INFO +1 -1
  2. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/pyproject.toml +1 -1
  3. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/__version__.py +1 -1
  4. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/setup_types.py +9 -7
  5. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/tool_cache.py +6 -4
  6. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/tool_reference.py +34 -46
  7. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin.egg-info/PKG-INFO +1 -1
  8. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/LICENSE +0 -0
  9. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/README.md +0 -0
  10. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/base_server/__init__.py +0 -0
  11. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/base_server/mock/__init__.py +0 -0
  12. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/base_server/mock/mock_pb2.py +0 -0
  13. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  14. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/base_server/server_async_insecure.py +0 -0
  15. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/base_server/server_async_secure.py +0 -0
  16. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/base_server/server_sync_insecure.py +0 -0
  17. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/base_server/server_sync_secure.py +0 -0
  18. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/modules/__init__.py +0 -0
  19. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/modules/archetype_with_tools_module.py +0 -0
  20. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/modules/cpu_intensive_module.py +0 -0
  21. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/modules/dynamic_setup_module.py +0 -0
  22. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/modules/minimal_llm_module.py +0 -0
  23. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/modules/text_transform_module.py +0 -0
  24. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  25. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  26. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  27. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  28. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  29. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/monitoring/tests/test_metrics.py +0 -0
  30. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/services/filesystem_module.py +0 -0
  31. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/examples/services/storage_module.py +0 -0
  32. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/setup.cfg +0 -0
  33. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/__init__.py +0 -0
  34. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/__init__.py +0 -0
  35. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/common/__init__.py +0 -0
  36. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/common/factories.py +0 -0
  37. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/job_manager/__init__.py +0 -0
  38. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  39. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
  40. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/job_manager/taskiq_broker.py +0 -0
  41. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/job_manager/taskiq_job_manager.py +0 -0
  42. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/task_manager/__init__.py +0 -0
  43. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
  44. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  45. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  46. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/task_manager/surrealdb_repository.py +0 -0
  47. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/task_manager/task_executor.py +0 -0
  48. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/core/task_manager/task_session.py +0 -0
  49. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/__init__.py +0 -0
  50. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  51. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/module_server.py +0 -0
  52. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
  53. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  54. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
  55. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
  56. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  57. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  58. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/logger.py +0 -0
  59. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/__init__.py +0 -0
  60. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/base_mixin.py +0 -0
  61. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/callback_mixin.py +0 -0
  62. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/chat_history_mixin.py +0 -0
  63. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/cost_mixin.py +0 -0
  64. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  65. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  66. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/logger_mixin.py +0 -0
  67. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/mixins/storage_mixin.py +0 -0
  68. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/__init__.py +0 -0
  69. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/core/__init__.py +0 -0
  70. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/core/job_manager_models.py +0 -0
  71. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/core/task_monitor.py +0 -0
  72. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  73. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/grpc_servers/models.py +0 -0
  74. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/grpc_servers/types.py +0 -0
  75. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/__init__.py +0 -0
  76. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/base_types.py +0 -0
  77. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/module.py +0 -0
  78. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/module_context.py +0 -0
  79. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/module_types.py +0 -0
  80. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/module/utility.py +0 -0
  81. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/services/__init__.py +0 -0
  82. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/services/cost.py +0 -0
  83. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/services/registry.py +0 -0
  84. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/models/services/storage.py +0 -0
  85. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/__init__.py +0 -0
  86. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/_base_module.py +0 -0
  87. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/archetype_module.py +0 -0
  88. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/tool_module.py +0 -0
  89. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/trigger_handler.py +0 -0
  90. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/triggers/__init__.py +0 -0
  91. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  92. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  93. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  94. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/py.typed +0 -0
  95. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/__init__.py +0 -0
  96. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/agent/__init__.py +0 -0
  97. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/agent/agent_strategy.py +0 -0
  98. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/agent/default_agent.py +0 -0
  99. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/base_strategy.py +0 -0
  100. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/communication/__init__.py +0 -0
  101. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/communication/communication_strategy.py +0 -0
  102. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/communication/default_communication.py +0 -0
  103. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/communication/grpc_communication.py +0 -0
  104. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/cost/__init__.py +0 -0
  105. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  106. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/cost/default_cost.py +0 -0
  107. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  108. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/filesystem/__init__.py +0 -0
  109. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
  110. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  111. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
  112. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/identity/__init__.py +0 -0
  113. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/identity/default_identity.py +0 -0
  114. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  115. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/registry/__init__.py +0 -0
  116. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/registry/default_registry.py +0 -0
  117. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/registry/exceptions.py +0 -0
  118. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/registry/grpc_registry.py +0 -0
  119. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/registry/registry_models.py +0 -0
  120. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/registry/registry_strategy.py +0 -0
  121. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/services_config.py +0 -0
  122. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/services_models.py +0 -0
  123. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/setup/__init__.py +0 -0
  124. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/setup/default_setup.py +0 -0
  125. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/setup/grpc_setup.py +0 -0
  126. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  127. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/snapshot/__init__.py +0 -0
  128. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/snapshot/default_snapshot.py +0 -0
  129. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/snapshot/snapshot_strategy.py +0 -0
  130. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/storage/__init__.py +0 -0
  131. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/storage/default_storage.py +0 -0
  132. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/storage/grpc_storage.py +0 -0
  133. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  134. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/user_profile/__init__.py +0 -0
  135. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  136. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  137. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  138. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/utils/__init__.py +0 -0
  139. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/utils/arg_parser.py +0 -0
  140. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/utils/conditional_schema.py +0 -0
  141. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/utils/development_mode_action.py +0 -0
  142. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/utils/dynamic_schema.py +0 -0
  143. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  144. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/utils/package_discover.py +0 -0
  145. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin/utils/schema_splitter.py +0 -0
  146. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin.egg-info/SOURCES.txt +0 -0
  147. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  148. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/src/digitalkin.egg-info/requires.txt +0 -0
  149. {digitalkin-0.3.2.dev25 → digitalkin-0.3.2.dev27}/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.2.dev25
3
+ Version: 0.3.2.dev27
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
@@ -25,7 +25,7 @@
25
25
  "Programming Language :: Python",
26
26
  "Topic :: Software Development :: Libraries",
27
27
  ]
28
- version = "0.3.2.dev25"
28
+ version = "0.3.2.dev27"
29
29
 
30
30
  dependencies = [
31
31
  "agentic-mesh-protocol==0.2.1.dev0",
@@ -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.2.dev25"
8
+ __version__ = "0.3.2.dev27"
@@ -399,7 +399,9 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
399
399
  logger.info("ToolReference '%s' has no selected tools, skipping", field_name)
400
400
  return
401
401
 
402
- tools_to_resolve = [tool for tool in tool_ref.selected_tools if tool.slug and tool.slug not in resolved_tools]
402
+ tools_to_resolve = [
403
+ setup_id for setup_id in tool_ref.selected_tools if setup_id and setup_id not in resolved_tools
404
+ ]
403
405
 
404
406
  if not tools_to_resolve:
405
407
  logger.info("All tools for '%s' already cached", field_name)
@@ -501,8 +503,8 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
501
503
  if field_value is None:
502
504
  continue
503
505
  if isinstance(field_value, ToolReference):
504
- for tool in field_value.selected_tools:
505
- tool_module_info = self.resolved_tools.get(tool.slug or "")
506
+ for setup_id in field_value.selected_tools:
507
+ tool_module_info = self.resolved_tools.get(setup_id)
506
508
  if tool_module_info:
507
509
  cache.add(tool_module_info)
508
510
  elif isinstance(field_value, BaseModel):
@@ -521,8 +523,8 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
521
523
  """
522
524
  for item in items:
523
525
  if isinstance(item, ToolReference):
524
- for tool in item.selected_tools:
525
- tool_module_info = self.resolved_tools.get(tool.slug or "")
526
+ for setup_id in item.selected_tools:
527
+ tool_module_info = self.resolved_tools.get(setup_id)
526
528
  if tool_module_info:
527
529
  cache.add(tool_module_info)
528
530
  elif isinstance(item, BaseModel):
@@ -537,8 +539,8 @@ class SetupModel(BaseModel, Generic[SetupModelT]):
537
539
  """
538
540
  for item in mapping.values():
539
541
  if isinstance(item, ToolReference):
540
- for tool in item.selected_tools:
541
- tool_module_info = self.resolved_tools.get(tool.slug or "")
542
+ for setup_id in item.selected_tools:
543
+ tool_module_info = self.resolved_tools.get(setup_id)
542
544
  if tool_module_info:
543
545
  cache.add(tool_module_info)
544
546
  elif isinstance(item, BaseModel):
@@ -120,7 +120,8 @@ class ToolCache(BaseModel):
120
120
 
121
121
  async def module_info_to_tool_module_info(
122
122
  module_info: ModuleInfo,
123
- tool: SelectedTool,
123
+ setup_id: str,
124
+ tool_name: str,
124
125
  communication: "CommunicationStrategy",
125
126
  *,
126
127
  llm_format: bool = True,
@@ -132,7 +133,8 @@ async def module_info_to_tool_module_info(
132
133
 
133
134
  Args:
134
135
  module_info: Module info from registry.
135
- tool: Selected tool information.
136
+ setup_id: Setup ID of the selected tool.
137
+ tool_name: Name of the tool.
136
138
  communication: Communication strategy for gRPC calls.
137
139
  llm_format: Use LLM-friendly schema format.
138
140
 
@@ -161,8 +163,8 @@ async def module_info_to_tool_module_info(
161
163
  documentation=module_info.documentation,
162
164
  status=module_info.status,
163
165
  tools=tools,
164
- setup_id=tool.setup_id,
165
- tool_name=tool.name,
166
+ setup_id=setup_id,
167
+ tool_name=tool_name,
166
168
  )
167
169
 
168
170
 
@@ -2,52 +2,38 @@
2
2
 
3
3
  from typing import Annotated
4
4
 
5
- from pydantic import AfterValidator, BaseModel, Field
5
+ from pydantic import AfterValidator, BaseModel, BeforeValidator, Field
6
6
  from pydantic.annotated_handlers import GetJsonSchemaHandler
7
7
  from pydantic.json_schema import JsonSchemaValue
8
8
  from pydantic_core import CoreSchema
9
9
 
10
- from digitalkin.models.module.tool_cache import (
11
- SelectedTool,
12
- ToolModuleInfo,
13
- module_info_to_tool_module_info,
14
- )
10
+ from digitalkin.models.module.tool_cache import ToolModuleInfo, module_info_to_tool_module_info
15
11
  from digitalkin.services.communication.communication_strategy import CommunicationStrategy
16
12
  from digitalkin.services.registry import RegistryStrategy
17
13
 
18
14
 
19
15
  class ToolReference(BaseModel):
20
- """Tool selection configuration and reference."""
16
+ """Tool selection containing setup IDs."""
21
17
 
22
- selected_tools: list[SelectedTool] = Field(default=[], description="Tools selected by the user.")
23
- setup_ids: list[str] = Field(default=[], description="Setup IDs for the user to choose from.")
24
- module_ids: list[str] = Field(default=[], description="Module IDs for the user to choose from.")
25
- tag_ids: list[str] = Field(default=[], description="Tag IDs for the user to choose from.")
26
- categories: list[str] = Field(default=[], description="Categories for the user to choose from.")
27
- max_tools: int = Field(default=0, description="Maximum tools to select. 0 for unlimited.")
28
- min_tools: int = Field(default=0, description="Minimum tools to select. 0 for no minimum.")
18
+ selected_tools: list[str] = Field(default=[], description="Setup IDs of selected tools.")
29
19
 
30
20
  async def resolve(self, registry: RegistryStrategy, communication: CommunicationStrategy) -> list[ToolModuleInfo]:
31
- """Resolve this reference using the registry.
21
+ """Resolve selected tools using the registry.
32
22
 
33
23
  Args:
34
24
  registry: Registry service for module discovery.
35
25
  communication: Communication service for module schemas.
36
26
 
37
27
  Returns:
38
- List of ToolModuleInfo if resolved.
28
+ List of ToolModuleInfo for resolved tools.
39
29
  """
40
30
  resolved: list[ToolModuleInfo] = []
41
- for tool in self.selected_tools:
42
- setup = registry.get_setup(tool.setup_id)
31
+ for setup_id in self.selected_tools:
32
+ setup = registry.get_setup(setup_id)
43
33
  if setup and setup.module_id:
44
34
  info = registry.discover_by_id(setup.module_id)
45
- tool.slug = tool.setup_id
46
- tool.module_id = setup.module_id
47
- tool.name = setup.name
48
35
  if info:
49
- resolved.append(await module_info_to_tool_module_info(info, tool, communication))
50
-
36
+ resolved.append(await module_info_to_tool_module_info(info, setup_id, setup.name, communication))
51
37
  return resolved
52
38
 
53
39
 
@@ -72,38 +58,29 @@ class _ToolReferenceInputSchema:
72
58
 
73
59
  def __get_pydantic_json_schema__( # noqa: PLW3201
74
60
  self,
75
- schema: CoreSchema,
76
- handler: GetJsonSchemaHandler,
61
+ _schema: CoreSchema,
62
+ _handler: GetJsonSchemaHandler,
77
63
  ) -> JsonSchemaValue:
78
- """Generate JSON schema for ToolReference with ui:options.
79
-
80
- Args:
81
- schema: The core schema from Pydantic.
82
- handler: Handler to generate JSON schema from core schema.
64
+ """Generate JSON schema as array for UI, hiding ToolReference complexity.
83
65
 
84
66
  Returns:
85
- JSON schema for ToolReference with ui:options.
67
+ JSON schema as array with ui:widget toolSelect.
86
68
  """
87
- json_schema = handler(schema)
88
- ui_options: dict[str, object] = {
69
+ json_schema: dict[str, object] = {
70
+ "type": "array",
71
+ "items": {"type": "string"},
72
+ }
73
+ if self.max_tools > 0:
74
+ json_schema["maxItems"] = self.max_tools
75
+ if self.min_tools > 0:
76
+ json_schema["minItems"] = self.min_tools
77
+ json_schema["ui:widget"] = "toolSelect"
78
+ json_schema["ui:options"] = {
89
79
  "setupIds": self.setup_ids,
90
80
  "moduleIds": self.module_ids,
91
81
  "tagIds": self.tag_ids,
92
82
  "categories": self.categories,
93
83
  }
94
- if self.max_tools > 0:
95
- ui_options["maxTools"] = self.max_tools
96
- if self.min_tools > 0:
97
- ui_options["minTools"] = self.min_tools
98
- json_schema["ui:options"] = ui_options
99
- json_schema["ui:widget"] = "toolSelect"
100
- if self.max_tools > 0 or self.min_tools > 0:
101
- resolved = handler.resolve_ref_schema(json_schema)
102
- selected_tools_schema = resolved["properties"]["selected_tools"]
103
- if self.max_tools > 0:
104
- selected_tools_schema["maxItems"] = self.max_tools
105
- if self.min_tools > 0:
106
- selected_tools_schema["minItems"] = self.min_tools
107
84
  return json_schema
108
85
 
109
86
 
@@ -129,6 +106,16 @@ def tool_reference_input(
129
106
  Annotated type for use in Pydantic models.
130
107
  """
131
108
 
109
+ def convert_to_tool_reference(v: object) -> ToolReference | object:
110
+ """Convert list of setup IDs to ToolReference.
111
+
112
+ Returns:
113
+ ToolReference if input is list, otherwise original value.
114
+ """
115
+ if isinstance(v, list):
116
+ return ToolReference(selected_tools=v)
117
+ return v
118
+
132
119
  def validate_tools_count(v: ToolReference) -> ToolReference:
133
120
  """Validate selected_tools count against min/max constraints.
134
121
 
@@ -149,6 +136,7 @@ def tool_reference_input(
149
136
 
150
137
  return Annotated[ # type: ignore[return-value]
151
138
  ToolReference,
139
+ BeforeValidator(convert_to_tool_reference),
152
140
  AfterValidator(validate_tools_count),
153
141
  _ToolReferenceInputSchema(
154
142
  setup_ids=setup_ids,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 0.3.2.dev25
3
+ Version: 0.3.2.dev27
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