digitalkin 0.3.1.dev1__tar.gz → 0.3.2a2__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 (161) hide show
  1. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/PKG-INFO +13 -13
  2. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/base_server/server_async_insecure.py +6 -5
  3. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/base_server/server_async_secure.py +6 -5
  4. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/base_server/server_sync_insecure.py +5 -4
  5. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/base_server/server_sync_secure.py +5 -4
  6. digitalkin-0.3.2a2/examples/modules/archetype_with_tools_module.py +232 -0
  7. digitalkin-0.3.2a2/examples/modules/dynamic_setup_module.py +338 -0
  8. digitalkin-0.3.2a2/examples/monitoring/digitalkin_observability/__init__.py +46 -0
  9. digitalkin-0.3.2a2/examples/monitoring/digitalkin_observability/http_server.py +150 -0
  10. digitalkin-0.3.2a2/examples/monitoring/digitalkin_observability/interceptors.py +176 -0
  11. digitalkin-0.3.2a2/examples/monitoring/digitalkin_observability/metrics.py +201 -0
  12. digitalkin-0.3.2a2/examples/monitoring/digitalkin_observability/prometheus.py +137 -0
  13. digitalkin-0.3.2a2/examples/monitoring/tests/test_metrics.py +172 -0
  14. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/services/filesystem_module.py +7 -5
  15. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/services/storage_module.py +4 -2
  16. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/pyproject.toml +116 -118
  17. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/__version__.py +1 -1
  18. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/base_job_manager.py +1 -1
  19. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/single_job_manager.py +78 -36
  20. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/taskiq_broker.py +8 -7
  21. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/taskiq_job_manager.py +9 -5
  22. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/base_task_manager.py +3 -1
  23. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/surrealdb_repository.py +13 -7
  24. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/task_executor.py +27 -10
  25. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/task_session.py +133 -101
  26. digitalkin-0.3.2a2/src/digitalkin/grpc_servers/module_server.py +191 -0
  27. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/module_servicer.py +133 -27
  28. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +36 -10
  29. digitalkin-0.3.2a2/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +106 -0
  30. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/__init__.py +1 -1
  31. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/core/job_manager_models.py +0 -8
  32. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/core/task_monitor.py +23 -1
  33. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/grpc_servers/models.py +95 -8
  34. digitalkin-0.3.2a2/src/digitalkin/models/module/__init__.py +41 -0
  35. digitalkin-0.3.2a2/src/digitalkin/models/module/base_types.py +61 -0
  36. digitalkin-0.3.2a2/src/digitalkin/models/module/module_context.py +406 -0
  37. digitalkin-0.3.2a2/src/digitalkin/models/module/module_types.py +29 -0
  38. digitalkin-0.3.2a2/src/digitalkin/models/module/setup_types.py +547 -0
  39. digitalkin-0.3.2a2/src/digitalkin/models/module/tool_cache.py +230 -0
  40. digitalkin-0.3.2a2/src/digitalkin/models/module/tool_reference.py +160 -0
  41. digitalkin-0.3.2a2/src/digitalkin/models/module/utility.py +167 -0
  42. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/services/cost.py +22 -1
  43. digitalkin-0.3.2a2/src/digitalkin/models/services/registry.py +77 -0
  44. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/modules/__init__.py +5 -1
  45. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/modules/_base_module.py +253 -90
  46. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/modules/archetype_module.py +6 -1
  47. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/modules/tool_module.py +6 -1
  48. digitalkin-0.3.2a2/src/digitalkin/modules/triggers/__init__.py +8 -0
  49. digitalkin-0.3.2a2/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +45 -0
  50. digitalkin-0.3.2a2/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +63 -0
  51. digitalkin-0.3.2a2/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +52 -0
  52. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/__init__.py +4 -0
  53. digitalkin-0.3.2a2/src/digitalkin/services/communication/__init__.py +7 -0
  54. digitalkin-0.3.2a2/src/digitalkin/services/communication/communication_strategy.py +87 -0
  55. digitalkin-0.3.2a2/src/digitalkin/services/communication/default_communication.py +104 -0
  56. digitalkin-0.3.2a2/src/digitalkin/services/communication/grpc_communication.py +264 -0
  57. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/cost/cost_strategy.py +36 -14
  58. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/cost/default_cost.py +61 -1
  59. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/cost/grpc_cost.py +98 -2
  60. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/filesystem/grpc_filesystem.py +9 -2
  61. digitalkin-0.3.2a2/src/digitalkin/services/registry/__init__.py +27 -0
  62. digitalkin-0.3.2a2/src/digitalkin/services/registry/default_registry.py +162 -0
  63. digitalkin-0.3.2a2/src/digitalkin/services/registry/exceptions.py +47 -0
  64. digitalkin-0.3.2a2/src/digitalkin/services/registry/grpc_registry.py +382 -0
  65. digitalkin-0.3.2a2/src/digitalkin/services/registry/registry_models.py +15 -0
  66. digitalkin-0.3.2a2/src/digitalkin/services/registry/registry_strategy.py +116 -0
  67. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/services_config.py +25 -3
  68. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/services_models.py +5 -1
  69. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/setup/default_setup.py +1 -1
  70. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/setup/grpc_setup.py +1 -1
  71. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/storage/grpc_storage.py +1 -1
  72. digitalkin-0.3.2a2/src/digitalkin/services/user_profile/__init__.py +12 -0
  73. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/user_profile/grpc_user_profile.py +2 -2
  74. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -15
  75. digitalkin-0.3.2a2/src/digitalkin/utils/__init__.py +41 -0
  76. digitalkin-0.3.2a2/src/digitalkin/utils/conditional_schema.py +260 -0
  77. digitalkin-0.3.2a2/src/digitalkin/utils/dynamic_schema.py +487 -0
  78. digitalkin-0.3.2a2/src/digitalkin/utils/schema_splitter.py +290 -0
  79. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin.egg-info/PKG-INFO +13 -13
  80. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin.egg-info/SOURCES.txt +30 -3
  81. digitalkin-0.3.2a2/src/digitalkin.egg-info/requires.txt +12 -0
  82. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin.egg-info/top_level.txt +1 -0
  83. digitalkin-0.3.1.dev1/src/digitalkin/grpc_servers/module_server.py +0 -267
  84. digitalkin-0.3.1.dev1/src/digitalkin/grpc_servers/registry_server.py +0 -65
  85. digitalkin-0.3.1.dev1/src/digitalkin/grpc_servers/registry_servicer.py +0 -456
  86. digitalkin-0.3.1.dev1/src/digitalkin/models/module/__init__.py +0 -28
  87. digitalkin-0.3.1.dev1/src/digitalkin/models/module/module_context.py +0 -140
  88. digitalkin-0.3.1.dev1/src/digitalkin/models/module/module_types.py +0 -109
  89. digitalkin-0.3.1.dev1/src/digitalkin/services/registry/__init__.py +0 -6
  90. digitalkin-0.3.1.dev1/src/digitalkin/services/registry/default_registry.py +0 -10
  91. digitalkin-0.3.1.dev1/src/digitalkin/services/registry/registry_strategy.py +0 -14
  92. digitalkin-0.3.1.dev1/src/digitalkin/services/user_profile/__init__.py +0 -1
  93. digitalkin-0.3.1.dev1/src/digitalkin/utils/__init__.py +0 -1
  94. digitalkin-0.3.1.dev1/src/digitalkin.egg-info/requires.txt +0 -12
  95. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/LICENSE +0 -0
  96. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/README.md +0 -0
  97. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/base_server/__init__.py +0 -0
  98. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/base_server/mock/__init__.py +0 -0
  99. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/base_server/mock/mock_pb2.py +0 -0
  100. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  101. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/modules/__init__.py +0 -0
  102. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/modules/cpu_intensive_module.py +1 -1
  103. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/modules/minimal_llm_module.py +1 -1
  104. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/examples/modules/text_transform_module.py +1 -1
  105. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/setup.cfg +0 -0
  106. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/__init__.py +0 -0
  107. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/__init__.py +0 -0
  108. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/common/__init__.py +0 -0
  109. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/common/factories.py +0 -0
  110. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/__init__.py +0 -0
  111. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/__init__.py +0 -0
  112. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  113. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  114. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/__init__.py +0 -0
  115. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  116. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  117. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
  118. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  119. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/logger.py +0 -0
  120. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/__init__.py +0 -0
  121. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/base_mixin.py +0 -0
  122. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/callback_mixin.py +0 -0
  123. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/chat_history_mixin.py +0 -0
  124. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/cost_mixin.py +0 -0
  125. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  126. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  127. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/logger_mixin.py +0 -0
  128. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/mixins/storage_mixin.py +0 -0
  129. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/core/__init__.py +0 -0
  130. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  131. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/grpc_servers/types.py +0 -0
  132. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/module/module.py +0 -0
  133. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/services/__init__.py +0 -0
  134. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/models/services/storage.py +0 -0
  135. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/modules/trigger_handler.py +0 -0
  136. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/py.typed +0 -0
  137. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/agent/__init__.py +0 -0
  138. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/agent/agent_strategy.py +0 -0
  139. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/agent/default_agent.py +0 -0
  140. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/base_strategy.py +0 -0
  141. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/cost/__init__.py +0 -0
  142. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/filesystem/__init__.py +0 -0
  143. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
  144. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  145. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/identity/__init__.py +0 -0
  146. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/identity/default_identity.py +0 -0
  147. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  148. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/setup/__init__.py +0 -0
  149. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  150. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/snapshot/__init__.py +0 -0
  151. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/snapshot/default_snapshot.py +0 -0
  152. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/snapshot/snapshot_strategy.py +0 -0
  153. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/storage/__init__.py +0 -0
  154. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/storage/default_storage.py +0 -0
  155. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  156. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  157. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/utils/arg_parser.py +0 -0
  158. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/utils/development_mode_action.py +0 -0
  159. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  160. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin/utils/package_discover.py +0 -0
  161. {digitalkin-0.3.1.dev1 → digitalkin-0.3.2a2}/src/digitalkin.egg-info/dependency_links.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 0.3.1.dev1
3
+ Version: 0.3.2a2
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
@@ -434,35 +434,35 @@ License: Attribution-NonCommercial-ShareAlike 4.0 International
434
434
  Creative Commons may be contacted at creativecommons.org.
435
435
  https://creativecommons.org/licenses/by-nc-sa/4.0/
436
436
 
437
- Project-URL: Homepage, https://github.com/DigitalKin-ai/digitalkin
438
437
  Project-URL: Documentation, https://github.com/DigitalKin-ai/digitalkin
438
+ Project-URL: Homepage, https://github.com/DigitalKin-ai/digitalkin
439
439
  Project-URL: Issues, https://github.com/DigitalKin-ai/digitalkin/issues
440
- Keywords: digitalkin,kin,agent,gprc,sdk
440
+ Keywords: agent,digitalkin,gprc,kin,sdk
441
441
  Classifier: Development Status :: 3 - Alpha
442
442
  Classifier: Intended Audience :: Developers
443
+ Classifier: License :: Other/Proprietary License
443
444
  Classifier: Operating System :: OS Independent
444
- Classifier: Topic :: Software Development :: Libraries
445
- Classifier: Programming Language :: Python
445
+ Classifier: Programming Language :: Python :: 3 :: Only
446
446
  Classifier: Programming Language :: Python :: 3.10
447
447
  Classifier: Programming Language :: Python :: 3.11
448
448
  Classifier: Programming Language :: Python :: 3.12
449
449
  Classifier: Programming Language :: Python :: 3.13
450
- Classifier: Programming Language :: Python :: 3 :: Only
451
- Classifier: License :: Other/Proprietary License
450
+ Classifier: Programming Language :: Python
451
+ Classifier: Topic :: Software Development :: Libraries
452
452
  Requires-Python: >=3.10
453
453
  Description-Content-Type: text/markdown
454
454
  License-File: LICENSE
455
- Requires-Dist: digitalkin-proto==0.2.0.dev4
455
+ Requires-Dist: agentic-mesh-protocol==0.2.1.dev1
456
456
  Requires-Dist: grpcio-health-checking>=1.76.0
457
457
  Requires-Dist: grpcio-reflection>=1.76.0
458
458
  Requires-Dist: grpcio-status>=1.76.0
459
- Requires-Dist: pydantic>=2.12.4
460
- Requires-Dist: surrealdb>=1.0.6
459
+ Requires-Dist: pydantic>=2.12.5
460
+ Requires-Dist: surrealdb>=1.0.7
461
461
  Provides-Extra: taskiq
462
- Requires-Dist: rstream>=0.40.0; extra == "taskiq"
462
+ Requires-Dist: rstream>=0.40.1; extra == "taskiq"
463
463
  Requires-Dist: taskiq-aio-pika>=0.5.0; extra == "taskiq"
464
- Requires-Dist: taskiq-redis>=1.1.2; extra == "taskiq"
465
- Requires-Dist: taskiq[reload]>=0.11.20; extra == "taskiq"
464
+ Requires-Dist: taskiq-redis>=1.2.0; extra == "taskiq"
465
+ Requires-Dist: taskiq[reload]>=0.12.1; extra == "taskiq"
466
466
  Dynamic: license-file
467
467
 
468
468
  # DigitalKin Python SDK
@@ -9,8 +9,9 @@ from pathlib import Path
9
9
  # Add parent directory to path to enable imports
10
10
  sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
11
11
 
12
- from digitalkin.grpc_servers._base_server import BaseServer
13
12
  from digitalkin.grpc_servers.utils.models import SecurityMode, ServerConfig, ServerMode
13
+
14
+ from digitalkin.grpc_servers._base_server import BaseServer
14
15
  from examples.base_server.mock.mock_pb2 import DESCRIPTOR, HelloReply # type: ignore
15
16
  from examples.base_server.mock.mock_pb2_grpc import (
16
17
  Greeter,
@@ -30,7 +31,7 @@ class AsyncGreeterImpl(Greeter):
30
31
 
31
32
  async def SayHello(self, request, context): # noqa: N802
32
33
  """Asynchronous implementation of SayHello method."""
33
- logger.info(f"Received request object: {request}")
34
+ logger.info("Received request object: %s", request)
34
35
  logger.info(f"Request attributes: {vars(request)}")
35
36
  logger.info(f"Received request with name: {request.name}")
36
37
 
@@ -40,7 +41,7 @@ class AsyncGreeterImpl(Greeter):
40
41
  name = "unknown"
41
42
  # Check context metadata
42
43
  for key, value in context.invocation_metadata():
43
- logger.info(f"Metadata: {key}={value}")
44
+ logger.info("Metadata: %s=%s", key, value)
44
45
  if key.lower() == "name":
45
46
  name = value
46
47
 
@@ -97,7 +98,7 @@ async def main_async() -> int:
97
98
  # as the KeyboardInterrupt usually breaks out of asyncio.run()
98
99
  logger.info("Server stopping due to keyboard interrupt...")
99
100
  except Exception as e:
100
- logger.exception(f"Error running server: {e}")
101
+ logger.exception("Error running server: %s", e)
101
102
  return 1
102
103
  finally:
103
104
  # Clean up resources if server was started
@@ -116,7 +117,7 @@ def main():
116
117
  logger.info("Server stopped by keyboard interrupt")
117
118
  return 0 # Clean exit
118
119
  except Exception as e:
119
- logger.exception(f"Fatal error: {e}")
120
+ logger.exception("Fatal error: %s", e)
120
121
  return 1
121
122
 
122
123
 
@@ -9,13 +9,14 @@ from pathlib import Path
9
9
  # Add parent directory to path to enable imports
10
10
  sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
11
11
 
12
- from digitalkin.grpc_servers._base_server import BaseServer
13
12
  from digitalkin.grpc_servers.utils.models import (
14
13
  SecurityMode,
15
14
  ServerConfig,
16
15
  ServerCredentials,
17
16
  ServerMode,
18
17
  )
18
+
19
+ from digitalkin.grpc_servers._base_server import BaseServer
19
20
  from examples.base_server.mock.mock_pb2 import DESCRIPTOR, HelloReply # type: ignore
20
21
  from examples.base_server.mock.mock_pb2_grpc import (
21
22
  Greeter,
@@ -35,7 +36,7 @@ class AsyncGreeterImpl(Greeter):
35
36
 
36
37
  async def SayHello(self, request, context): # noqa: N802
37
38
  """Asynchronous implementation of SayHello method."""
38
- logger.info(f"Received request object: {request}")
39
+ logger.info("Received request object: %s", request)
39
40
  logger.info(f"Request attributes: {vars(request)}")
40
41
  logger.info(f"Received request with name: {request.name}")
41
42
 
@@ -45,7 +46,7 @@ class AsyncGreeterImpl(Greeter):
45
46
  name = "unknown"
46
47
  # Check context metadata
47
48
  for key, value in context.invocation_metadata():
48
- logger.info(f"Metadata: {key}={value}")
49
+ logger.info("Metadata: %s=%s", key, value)
49
50
  if key.lower() == "name":
50
51
  name = value
51
52
 
@@ -115,7 +116,7 @@ async def main_async() -> int:
115
116
  # as the KeyboardInterrupt usually breaks out of asyncio.run()
116
117
  logger.info("Server stopping due to keyboard interrupt...")
117
118
  except Exception as e:
118
- logger.exception(f"Error running server: {e}")
119
+ logger.exception("Error running server: %s", e)
119
120
  return 1
120
121
  finally:
121
122
  # Clean up resources if server was started
@@ -134,7 +135,7 @@ def main():
134
135
  logger.info("Server stopped by keyboard interrupt")
135
136
  return 0 # Clean exit
136
137
  except Exception as e:
137
- logger.exception(f"Fatal error: {e}")
138
+ logger.exception("Fatal error: %s", e)
138
139
  return 1
139
140
 
140
141
 
@@ -8,8 +8,9 @@ from pathlib import Path
8
8
  # Add parent directory to path to enable imports
9
9
  sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
10
10
 
11
- from digitalkin.grpc_servers._base_server import BaseServer
12
11
  from digitalkin.grpc_servers.utils.models import SecurityMode, ServerConfig, ServerMode
12
+
13
+ from digitalkin.grpc_servers._base_server import BaseServer
13
14
  from examples.base_server.mock.mock_pb2 import DESCRIPTOR, HelloReply # type: ignore
14
15
  from examples.base_server.mock.mock_pb2_grpc import (
15
16
  Greeter,
@@ -29,7 +30,7 @@ class SyncGreeterServicer(Greeter):
29
30
 
30
31
  def SayHello(self, request, context): # noqa: N802
31
32
  """Implementation of SayHello method."""
32
- logger.info(f"Received request object: {request}")
33
+ logger.info("Received request object: %s", request)
33
34
  logger.info(f"Request attributes: {vars(request)}")
34
35
  logger.info(f"Received request with name: {request.name}")
35
36
 
@@ -39,7 +40,7 @@ class SyncGreeterServicer(Greeter):
39
40
  name = "unknown"
40
41
  # Check context metadata
41
42
  for key, value in context.invocation_metadata():
42
- logger.info(f"Metadata: {key}={value}")
43
+ logger.info("Metadata: %s=%s", key, value)
43
44
  if key.lower() == "name":
44
45
  name = value
45
46
 
@@ -92,7 +93,7 @@ def main() -> int:
92
93
  server.stop()
93
94
 
94
95
  except Exception as e:
95
- logger.exception(f"Error running server: {e}")
96
+ logger.exception("Error running server: %s", e)
96
97
  return 1
97
98
 
98
99
  return 0
@@ -8,13 +8,14 @@ from pathlib import Path
8
8
  # Add parent directory to path to enable imports
9
9
  sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
10
10
 
11
- from digitalkin.grpc_servers._base_server import BaseServer
12
11
  from digitalkin.grpc_servers.utils.models import (
13
12
  SecurityMode,
14
13
  ServerConfig,
15
14
  ServerCredentials,
16
15
  ServerMode,
17
16
  )
17
+
18
+ from digitalkin.grpc_servers._base_server import BaseServer
18
19
  from examples.base_server.mock.mock_pb2 import DESCRIPTOR, HelloReply # type: ignore
19
20
  from examples.base_server.mock.mock_pb2_grpc import (
20
21
  Greeter,
@@ -34,7 +35,7 @@ class SyncGreeterServicer(Greeter):
34
35
 
35
36
  def SayHello(self, request, context): # noqa: N802
36
37
  """Implementation of SayHello method."""
37
- logger.info(f"Received request object: {request}")
38
+ logger.info("Received request object: %s", request)
38
39
  logger.info(f"Request attributes: {vars(request)}")
39
40
  logger.info(f"Received request with name: {request.name}")
40
41
 
@@ -44,7 +45,7 @@ class SyncGreeterServicer(Greeter):
44
45
  name = "unknown"
45
46
  # Check context metadata
46
47
  for key, value in context.invocation_metadata():
47
- logger.info(f"Metadata: {key}={value}")
48
+ logger.info("Metadata: %s=%s", key, value)
48
49
  if key.lower() == "name":
49
50
  name = value
50
51
 
@@ -111,7 +112,7 @@ def main() -> int:
111
112
  server.stop()
112
113
 
113
114
  except Exception as e:
114
- logger.exception(f"Error running server: {e}")
115
+ logger.exception("Error running server: %s", e)
115
116
  return 1
116
117
 
117
118
  return 0
@@ -0,0 +1,232 @@
1
+ """Example archetype module with tool cache integration."""
2
+
3
+ import logging
4
+ from typing import Any, ClassVar, Literal
5
+
6
+ from pydantic import BaseModel, Field
7
+
8
+ from digitalkin.models.grpc_servers.models import ClientConfig, SecurityMode, ServerMode
9
+ from digitalkin.models.module.module_context import ModuleContext
10
+ from digitalkin.models.module.setup_types import SetupModel
11
+ from digitalkin.models.module.tool_reference import ToolReference
12
+ from digitalkin.modules._base_module import BaseModule # noqa: PLC2701
13
+ from digitalkin.services.services_models import ServicesStrategy
14
+
15
+ logging.basicConfig(
16
+ level=logging.DEBUG,
17
+ format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
18
+ )
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class MessageInputPayload(BaseModel):
23
+ """Message input payload."""
24
+
25
+ payload_type: Literal["message"] = "message"
26
+ user_prompt: str
27
+
28
+
29
+ class ArchetypeInput(BaseModel):
30
+ """Archetype input."""
31
+
32
+ payload: MessageInputPayload = Field(discriminator="payload_type")
33
+
34
+
35
+ class MessageOutputPayload(BaseModel):
36
+ """Message output payload."""
37
+
38
+ payload_type: Literal["message"] = "message"
39
+ response: str
40
+ tools_used: list[str] = Field(default_factory=list)
41
+
42
+
43
+ class ArchetypeOutput(BaseModel):
44
+ """Archetype output."""
45
+
46
+ payload: MessageOutputPayload = Field(discriminator="payload_type")
47
+
48
+
49
+ class ArchetypeSetup(SetupModel):
50
+ """Setup with tool references resolved during config setup."""
51
+
52
+ model_name: str = Field(
53
+ default="gpt-4",
54
+ json_schema_extra={"config": True},
55
+ )
56
+ temperature: float = Field(
57
+ default=0.7,
58
+ json_schema_extra={"config": True},
59
+ )
60
+
61
+ search_tool: ToolReference = Field(
62
+ default_factory=lambda: ToolReference(
63
+ module_ids=["search-tool-v1"],
64
+ ),
65
+ json_schema_extra={"config": True},
66
+ )
67
+
68
+ calculator_tool: ToolReference = Field(
69
+ default_factory=lambda: ToolReference(
70
+ tags=["math-calculator"],
71
+ ),
72
+ json_schema_extra={"config": True},
73
+ )
74
+
75
+ dynamic_tool: ToolReference = Field(
76
+ default_factory=lambda: ToolReference(
77
+ tags=["discoverable"],
78
+ ),
79
+ json_schema_extra={"config": True},
80
+ )
81
+
82
+ system_prompt: str = Field(
83
+ default="You are a helpful assistant with access to tools.",
84
+ json_schema_extra={"hidden": True},
85
+ )
86
+
87
+
88
+ class ArchetypeConfigSetup(BaseModel):
89
+ """Config setup model."""
90
+
91
+ additional_instructions: str | None = None
92
+
93
+
94
+ class ArchetypeSecret(BaseModel):
95
+ """Secrets model."""
96
+
97
+
98
+ client_config = ClientConfig(
99
+ host="[::]",
100
+ port=50152,
101
+ mode=ServerMode.ASYNC,
102
+ security=SecurityMode.INSECURE,
103
+ credentials=None,
104
+ )
105
+
106
+
107
+ class ArchetypeWithToolsModule(
108
+ BaseModule[
109
+ ArchetypeInput,
110
+ ArchetypeOutput,
111
+ ArchetypeSetup,
112
+ ArchetypeSecret,
113
+ ]
114
+ ):
115
+ """Archetype module demonstrating tool cache usage."""
116
+
117
+ name = "ArchetypeWithToolsModule"
118
+ description = "Archetype with tool cache integration"
119
+
120
+ config_setup_format = ArchetypeConfigSetup
121
+ input_format = ArchetypeInput
122
+ output_format = ArchetypeOutput
123
+ setup_format = ArchetypeSetup
124
+ secret_format = ArchetypeSecret
125
+
126
+ metadata: ClassVar[dict[str, Any]] = {
127
+ "name": "ArchetypeWithToolsModule",
128
+ "version": "1.0.0",
129
+ "tags": ["archetype", "tools"],
130
+ }
131
+
132
+ services_config_strategies: ClassVar[dict[str, ServicesStrategy | None]] = {}
133
+ services_config_params: ClassVar[dict[str, dict[str, Any | None] | None]] = {
134
+ "registry": {
135
+ "config": {},
136
+ "client_config": client_config,
137
+ },
138
+ }
139
+
140
+ async def run_config_setup(
141
+ self,
142
+ context: ModuleContext, # noqa: ARG002
143
+ config_setup_data: ArchetypeSetup,
144
+ ) -> ArchetypeSetup:
145
+ """Custom config setup logic, runs in parallel with tool resolution.
146
+
147
+ Args:
148
+ context: Module context with services.
149
+ config_setup_data: Setup data being configured.
150
+
151
+ Returns:
152
+ Configured setup data.
153
+ """
154
+ logger.info("Running config setup for %s", self.name)
155
+ return config_setup_data
156
+
157
+ async def initialize(self, context: ModuleContext, setup_data: ArchetypeSetup) -> None: # noqa: ARG002
158
+ """Initialize module.
159
+
160
+ Args:
161
+ context: Module context with services and tool cache.
162
+ setup_data: Setup data for the module.
163
+ """
164
+ logger.info("Initializing %s", self.name)
165
+ if context.tool_cache:
166
+ logger.info("Available tools: %s", context.tool_cache.list_tools())
167
+
168
+ async def run(
169
+ self,
170
+ input_data: ArchetypeInput,
171
+ setup_data: ArchetypeSetup, # noqa: ARG002
172
+ ) -> None:
173
+ """Run module with tool cache lookups and call_module_by_id.
174
+
175
+ Args:
176
+ input_data: Input data to process.
177
+ setup_data: Setup configuration.
178
+ """
179
+ logger.info("Running %s", self.name)
180
+
181
+ tools_used: list[str] = []
182
+ tool_results: list[str] = []
183
+
184
+ # Get search tool from cache and call via call_module_by_id
185
+ search_info = self.context.tool_cache.get("search_tool")
186
+ if search_info:
187
+ tools_used.append(f"search:{search_info.module_id}")
188
+ async for response in self.context.call_module_by_id(
189
+ module_id=search_info.module_id,
190
+ input_data={"query": input_data.payload.user_prompt},
191
+ setup_id=self.context.session.setup_id,
192
+ mission_id=self.context.session.mission_id,
193
+ ):
194
+ tool_results.append(f"search_result: {response}")
195
+
196
+ # Get calculator tool from cache
197
+ calc_info = self.context.tool_cache.get("calculator_tool")
198
+ if calc_info:
199
+ tools_used.append(f"calculator:{calc_info.module_id}")
200
+ async for response in self.context.call_module_by_id(
201
+ module_id=calc_info.module_id,
202
+ input_data={"expression": "2 + 2"},
203
+ setup_id=self.context.session.setup_id,
204
+ mission_id=self.context.session.mission_id,
205
+ ):
206
+ tool_results.append(f"calc_result: {response}")
207
+
208
+ # Dynamic discovery via registry fallback for tools not in cache
209
+ dynamic_info = self.context.tool_cache.get(
210
+ "some_dynamic_tool",
211
+ registry=self.context.registry,
212
+ )
213
+ if dynamic_info:
214
+ tools_used.append(f"dynamic:{dynamic_info.module_id}")
215
+ async for response in self.context.call_module_by_id(
216
+ module_id=dynamic_info.module_id,
217
+ input_data={"prompt": input_data.payload.user_prompt},
218
+ setup_id=self.context.session.setup_id,
219
+ mission_id=self.context.session.mission_id,
220
+ ):
221
+ tool_results.append(f"dynamic_result: {response}")
222
+
223
+ response = MessageOutputPayload(
224
+ response=f"Processed: {input_data.payload.user_prompt} | Results: {len(tool_results)}",
225
+ tools_used=tools_used,
226
+ )
227
+
228
+ await self.context.callbacks.send_message(ArchetypeOutput(payload=response))
229
+
230
+ async def cleanup(self) -> None:
231
+ """Clean up resources."""
232
+ logger.info("Cleaning up %s", self.name)