digitalkin 0.3.1.dev2__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 (159) hide show
  1. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/PKG-INFO +12 -12
  2. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/base_server/server_async_insecure.py +6 -5
  3. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/base_server/server_async_secure.py +6 -5
  4. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/base_server/server_sync_insecure.py +5 -4
  5. {digitalkin-0.3.1.dev2 → 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.1.dev2 → digitalkin-0.3.2a2}/examples/modules/dynamic_setup_module.py +5 -29
  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.dev2 → digitalkin-0.3.2a2}/examples/services/filesystem_module.py +7 -5
  15. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/services/storage_module.py +4 -2
  16. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/pyproject.toml +112 -113
  17. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/__version__.py +1 -1
  18. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/base_job_manager.py +1 -1
  19. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/single_job_manager.py +78 -36
  20. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/taskiq_broker.py +7 -6
  21. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/taskiq_job_manager.py +9 -5
  22. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/base_task_manager.py +3 -1
  23. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/surrealdb_repository.py +13 -7
  24. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/task_executor.py +27 -10
  25. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/task_session.py +121 -99
  26. digitalkin-0.3.2a2/src/digitalkin/grpc_servers/module_server.py +191 -0
  27. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/module_servicer.py +121 -19
  28. {digitalkin-0.3.1.dev2 → 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.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/__init__.py +1 -1
  31. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/core/job_manager_models.py +0 -8
  32. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/core/task_monitor.py +23 -1
  33. {digitalkin-0.3.1.dev2 → 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.dev2 → 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.dev2 → digitalkin-0.3.2a2}/src/digitalkin/modules/__init__.py +5 -1
  45. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/modules/_base_module.py +188 -63
  46. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/modules/archetype_module.py +6 -1
  47. {digitalkin-0.3.1.dev2 → 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.dev2 → 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.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/cost/cost_strategy.py +36 -14
  58. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/cost/default_cost.py +61 -1
  59. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/cost/grpc_cost.py +98 -2
  60. {digitalkin-0.3.1.dev2 → 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.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/services_config.py +25 -3
  68. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/services_models.py +5 -1
  69. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/setup/default_setup.py +1 -1
  70. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/setup/grpc_setup.py +1 -1
  71. {digitalkin-0.3.1.dev2 → 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.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/user_profile/grpc_user_profile.py +2 -2
  74. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -15
  75. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/utils/__init__.py +15 -3
  76. digitalkin-0.3.2a2/src/digitalkin/utils/conditional_schema.py +260 -0
  77. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/utils/dynamic_schema.py +4 -0
  78. digitalkin-0.3.2a2/src/digitalkin/utils/schema_splitter.py +290 -0
  79. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin.egg-info/PKG-INFO +12 -12
  80. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin.egg-info/SOURCES.txt +28 -3
  81. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin.egg-info/requires.txt +5 -5
  82. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin.egg-info/top_level.txt +1 -0
  83. digitalkin-0.3.1.dev2/src/digitalkin/grpc_servers/module_server.py +0 -267
  84. digitalkin-0.3.1.dev2/src/digitalkin/grpc_servers/registry_server.py +0 -65
  85. digitalkin-0.3.1.dev2/src/digitalkin/grpc_servers/registry_servicer.py +0 -456
  86. digitalkin-0.3.1.dev2/src/digitalkin/models/module/__init__.py +0 -28
  87. digitalkin-0.3.1.dev2/src/digitalkin/models/module/module_context.py +0 -140
  88. digitalkin-0.3.1.dev2/src/digitalkin/models/module/module_types.py +0 -393
  89. digitalkin-0.3.1.dev2/src/digitalkin/services/registry/__init__.py +0 -6
  90. digitalkin-0.3.1.dev2/src/digitalkin/services/registry/default_registry.py +0 -10
  91. digitalkin-0.3.1.dev2/src/digitalkin/services/registry/registry_strategy.py +0 -14
  92. digitalkin-0.3.1.dev2/src/digitalkin/services/user_profile/__init__.py +0 -1
  93. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/LICENSE +0 -0
  94. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/README.md +0 -0
  95. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/base_server/__init__.py +0 -0
  96. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/base_server/mock/__init__.py +0 -0
  97. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/base_server/mock/mock_pb2.py +0 -0
  98. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  99. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/modules/__init__.py +0 -0
  100. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/modules/cpu_intensive_module.py +1 -1
  101. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/modules/minimal_llm_module.py +1 -1
  102. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/examples/modules/text_transform_module.py +1 -1
  103. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/setup.cfg +0 -0
  104. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/__init__.py +0 -0
  105. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/__init__.py +0 -0
  106. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/common/__init__.py +0 -0
  107. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/common/factories.py +0 -0
  108. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/job_manager/__init__.py +0 -0
  109. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/__init__.py +0 -0
  110. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  111. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  112. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/__init__.py +0 -0
  113. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  114. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  115. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
  116. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  117. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/logger.py +0 -0
  118. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/__init__.py +0 -0
  119. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/base_mixin.py +0 -0
  120. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/callback_mixin.py +0 -0
  121. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/chat_history_mixin.py +0 -0
  122. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/cost_mixin.py +0 -0
  123. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  124. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  125. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/logger_mixin.py +0 -0
  126. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/mixins/storage_mixin.py +0 -0
  127. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/core/__init__.py +0 -0
  128. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  129. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/grpc_servers/types.py +0 -0
  130. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/module/module.py +0 -0
  131. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/services/__init__.py +0 -0
  132. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/models/services/storage.py +0 -0
  133. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/modules/trigger_handler.py +0 -0
  134. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/py.typed +0 -0
  135. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/agent/__init__.py +0 -0
  136. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/agent/agent_strategy.py +0 -0
  137. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/agent/default_agent.py +0 -0
  138. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/base_strategy.py +0 -0
  139. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/cost/__init__.py +0 -0
  140. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/filesystem/__init__.py +0 -0
  141. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
  142. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  143. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/identity/__init__.py +0 -0
  144. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/identity/default_identity.py +0 -0
  145. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  146. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/setup/__init__.py +0 -0
  147. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  148. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/snapshot/__init__.py +0 -0
  149. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/snapshot/default_snapshot.py +0 -0
  150. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/snapshot/snapshot_strategy.py +0 -0
  151. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/storage/__init__.py +0 -0
  152. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/storage/default_storage.py +0 -0
  153. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  154. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  155. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/utils/arg_parser.py +0 -0
  156. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/utils/development_mode_action.py +0 -0
  157. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  158. {digitalkin-0.3.1.dev2 → digitalkin-0.3.2a2}/src/digitalkin/utils/package_discover.py +0 -0
  159. {digitalkin-0.3.1.dev2 → 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.dev2
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.dev5
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
459
  Requires-Dist: pydantic>=2.12.5
460
- Requires-Dist: surrealdb>=1.0.6
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.12.0; 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)
@@ -209,8 +209,6 @@ class DynamicModuleOutput(DataModel[MessageOutputTrigger]):
209
209
  class DynamicModuleSecret(BaseModel):
210
210
  """Secret model (empty for this example)."""
211
211
 
212
- pass
213
-
214
212
 
215
213
  # =============================================================================
216
214
  # Module Implementation
@@ -285,13 +283,7 @@ class DynamicSetupModule(
285
283
 
286
284
  async def demonstrate_dynamic_schema() -> None:
287
285
  """Demonstrate the dynamic schema functionality."""
288
- print("=" * 60)
289
- print("Dynamic Schema Demonstration")
290
- print("=" * 60)
291
-
292
286
  # 1. Show schema WITHOUT force (dynamic fields not resolved)
293
- print("\n1. Schema without force=True (fetchers NOT called):")
294
- print("-" * 40)
295
287
 
296
288
  model_no_force = await DynamicAgentSetup.get_clean_model(
297
289
  config_fields=True,
@@ -302,13 +294,10 @@ async def demonstrate_dynamic_schema() -> None:
302
294
 
303
295
  # Check if enum is present
304
296
  model_name_schema = schema_no_force.get("properties", {}).get("model_name", {})
305
- print(f"model_name has enum: {'enum' in model_name_schema}")
306
297
  if "enum" in model_name_schema:
307
- print(f" enum values: {model_name_schema['enum']}")
298
+ pass
308
299
 
309
300
  # 2. Show schema WITH force (dynamic fields resolved)
310
- print("\n2. Schema with force=True (fetchers called):")
311
- print("-" * 40)
312
301
 
313
302
  model_with_force = await DynamicAgentSetup.get_clean_model(
314
303
  config_fields=True,
@@ -319,43 +308,30 @@ async def demonstrate_dynamic_schema() -> None:
319
308
 
320
309
  # Check enum values after force
321
310
  model_name_schema = schema_with_force.get("properties", {}).get("model_name", {})
322
- print(f"model_name has enum: {'enum' in model_name_schema}")
323
311
  if "enum" in model_name_schema:
324
- print(f" enum values: {model_name_schema['enum']}")
312
+ pass
325
313
 
326
314
  language_schema = schema_with_force.get("properties", {}).get("language", {})
327
- print(f"language has enum: {'enum' in language_schema}")
328
315
  if "enum" in language_schema:
329
- print(f" enum values: {language_schema['enum']}")
316
+ pass
330
317
 
331
318
  # 3. Show that static json_schema_extra is preserved
332
- print("\n3. Static json_schema_extra preserved:")
333
- print("-" * 40)
334
- print(f"model_name ui:widget: {model_name_schema.get('ui:widget', 'NOT FOUND')}")
335
319
 
336
320
  # 4. Show field filtering
337
- print("\n4. Field filtering demonstration:")
338
- print("-" * 40)
339
321
 
340
322
  # Config fields only (hidden excluded)
341
- config_model = await DynamicAgentSetup.get_clean_model(
323
+ await DynamicAgentSetup.get_clean_model(
342
324
  config_fields=True,
343
325
  hidden_fields=False,
344
326
  force=False,
345
327
  )
346
- print(f"Config fields (hidden=False): {list(config_model.model_fields.keys())}")
347
328
 
348
329
  # All fields including hidden
349
- all_model = await DynamicAgentSetup.get_clean_model(
330
+ await DynamicAgentSetup.get_clean_model(
350
331
  config_fields=True,
351
332
  hidden_fields=True,
352
333
  force=False,
353
334
  )
354
- print(f"All fields (hidden=True): {list(all_model.model_fields.keys())}")
355
-
356
- print("\n" + "=" * 60)
357
- print("Demonstration complete!")
358
- print("=" * 60)
359
335
 
360
336
 
361
337
  if __name__ == "__main__":
@@ -0,0 +1,46 @@
1
+ """Standalone observability module for DigitalKin.
2
+
3
+ This module can be copied into your project and used independently.
4
+ It has no dependencies on the digitalkin package.
5
+
6
+ Usage:
7
+ from digitalkin_observability import (
8
+ MetricsCollector,
9
+ MetricsServer,
10
+ MetricsServerInterceptor,
11
+ PrometheusExporter,
12
+ get_metrics,
13
+ start_metrics_server,
14
+ stop_metrics_server,
15
+ )
16
+
17
+ # Start metrics HTTP server
18
+ start_metrics_server(port=8081)
19
+
20
+ # Track metrics
21
+ metrics = get_metrics()
22
+ metrics.inc_jobs_started("my_module")
23
+ metrics.inc_jobs_completed("my_module", duration=1.5)
24
+
25
+ # Export to Prometheus format
26
+ print(PrometheusExporter.export())
27
+ """
28
+
29
+ from digitalkin_observability.http_server import (
30
+ MetricsServer,
31
+ start_metrics_server,
32
+ stop_metrics_server,
33
+ )
34
+ from digitalkin_observability.interceptors import MetricsServerInterceptor
35
+ from digitalkin_observability.metrics import MetricsCollector, get_metrics
36
+ from digitalkin_observability.prometheus import PrometheusExporter
37
+
38
+ __all__ = [
39
+ "MetricsCollector",
40
+ "MetricsServer",
41
+ "MetricsServerInterceptor",
42
+ "PrometheusExporter",
43
+ "get_metrics",
44
+ "start_metrics_server",
45
+ "stop_metrics_server",
46
+ ]