digitalkin 1.0.0.dev25__tar.gz → 1.0.2.dev0__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 (247) hide show
  1. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/PKG-INFO +8 -6
  2. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/pyproject.toml +27 -26
  3. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/__version__.py +1 -1
  4. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/community/agno/__init__.py +16 -1
  5. digitalkin-1.0.2.dev0/src/digitalkin/community/agno/models.py +164 -0
  6. digitalkin-1.0.2.dev0/src/digitalkin/community/agno/module_toolkit.py +540 -0
  7. digitalkin-1.0.2.dev0/src/digitalkin/community/agno/toolkits/__init__.py +20 -0
  8. digitalkin-1.0.2.dev0/src/digitalkin/community/agno/toolkits/base.py +91 -0
  9. digitalkin-1.0.2.dev0/src/digitalkin/community/agno/toolkits/chat_history.py +298 -0
  10. digitalkin-1.0.2.dev0/src/digitalkin/community/agno/toolkits/defaults.py +57 -0
  11. digitalkin-1.0.2.dev0/src/digitalkin/community/agno/toolkits/registry.py +166 -0
  12. digitalkin-1.0.2.dev0/src/digitalkin/community/agno/toolkits/user_profile.py +59 -0
  13. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/module_runner.py +39 -16
  14. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/gateway_servicer.py +14 -8
  15. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/module_server.py +2 -0
  16. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/grpc_servers/stream_error_codes.py +1 -0
  17. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/module_context.py +9 -1
  18. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/tool_reference.py +9 -3
  19. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/services/registry.py +23 -1
  20. digitalkin-1.0.2.dev0/src/digitalkin/models/settings/registry.py +29 -0
  21. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/_base_module.py +26 -1
  22. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/archetype_module.py +2 -0
  23. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/tool_module.py +4 -0
  24. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/communication/exceptions.py +4 -0
  25. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/registry/default_registry.py +97 -12
  26. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/registry/grpc_registry.py +176 -17
  27. digitalkin-1.0.2.dev0/src/digitalkin/services/registry/registry_strategy.py +215 -0
  28. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/storage/grpc_storage.py +28 -1
  29. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin.egg-info/PKG-INFO +8 -6
  30. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin.egg-info/SOURCES.txt +8 -0
  31. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin.egg-info/requires.txt +8 -5
  32. digitalkin-1.0.0.dev25/src/digitalkin/community/agno/models.py +0 -28
  33. digitalkin-1.0.0.dev25/src/digitalkin/services/registry/registry_strategy.py +0 -128
  34. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/LICENSE +0 -0
  35. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/README.md +0 -0
  36. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/base_server/__init__.py +0 -0
  37. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/base_server/mock/__init__.py +0 -0
  38. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/base_server/mock/mock_pb2.py +0 -0
  39. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
  40. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/base_server/server_async_insecure.py +0 -0
  41. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/base_server/server_async_secure.py +0 -0
  42. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/base_server/server_sync_insecure.py +0 -0
  43. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/base_server/server_sync_secure.py +0 -0
  44. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/__init__.py +0 -0
  45. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/echo_module.py +0 -0
  46. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/models/__init__.py +0 -0
  47. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/models/input.py +0 -0
  48. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/models/output.py +0 -0
  49. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/models/secret.py +0 -0
  50. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/models/setup.py +0 -0
  51. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/server.py +0 -0
  52. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/triggers/__init__.py +0 -0
  53. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/bench_module/triggers/message_trigger.py +0 -0
  54. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/modules/__init__.py +0 -0
  55. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/modules/archetype_with_tools_module.py +0 -0
  56. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/modules/cpu_intensive_module.py +0 -0
  57. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/modules/dynamic_setup_module.py +0 -0
  58. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/modules/minimal_llm_module.py +0 -0
  59. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/modules/text_transform_module.py +0 -0
  60. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
  61. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
  62. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
  63. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
  64. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
  65. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/monitoring/tests/test_metrics.py +0 -0
  66. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/client.py +0 -0
  67. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/echo_module.py +0 -0
  68. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/models/__init__.py +0 -0
  69. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/models/input.py +0 -0
  70. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/models/output.py +0 -0
  71. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/models/secret.py +0 -0
  72. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/models/setup.py +0 -0
  73. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/server.py +0 -0
  74. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/triggers/__init__.py +0 -0
  75. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/redis_demo/triggers/message_trigger.py +0 -0
  76. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/services/filesystem_module.py +0 -0
  77. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/examples/services/storage_module.py +0 -0
  78. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/setup.cfg +0 -0
  79. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/__init__.py +0 -0
  80. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/community/__init__.py +0 -0
  81. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/community/agno/agno_adapter.py +0 -0
  82. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/community/agno/agui_tools.py +0 -0
  83. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/community/agno/hitl.py +0 -0
  84. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/__init__.py +0 -0
  85. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/common/__init__.py +0 -0
  86. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/common/factories.py +0 -0
  87. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/exceptions.py +0 -0
  88. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/job_manager/__init__.py +0 -0
  89. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
  90. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
  91. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/profiling/__init__.py +0 -0
  92. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/profiling/step_timer.py +0 -0
  93. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/profiling/task_profiler.py +0 -0
  94. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/resilience/__init__.py +0 -0
  95. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/resilience/bulkhead.py +0 -0
  96. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
  97. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/__init__.py +0 -0
  98. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
  99. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
  100. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
  101. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
  102. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
  103. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
  104. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
  105. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
  106. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
  107. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/task_executor.py +0 -0
  108. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/core/task_manager/task_session.py +0 -0
  109. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/exceptions.py +0 -0
  110. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/__init__.py +0 -0
  111. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/_base_server.py +0 -0
  112. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/exceptions.py +0 -0
  113. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
  114. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
  115. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
  116. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
  117. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
  118. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
  119. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/stream_session.py +0 -0
  120. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
  121. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
  122. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
  123. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
  124. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
  125. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
  126. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/logger.py +0 -0
  127. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/mixins/__init__.py +0 -0
  128. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/mixins/agui_mixin.py +0 -0
  129. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/mixins/base_mixin.py +0 -0
  130. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/mixins/cost_mixin.py +0 -0
  131. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/mixins/file_history_mixin.py +0 -0
  132. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
  133. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/mixins/logger_mixin.py +0 -0
  134. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/mixins/storage_mixin.py +0 -0
  135. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/__init__.py +0 -0
  136. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/core/__init__.py +0 -0
  137. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/core/job_manager_models.py +0 -0
  138. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/core/redis.py +0 -0
  139. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/core/task_monitor.py +0 -0
  140. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/events/__init__.py +0 -0
  141. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/events/agent_events.py +0 -0
  142. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
  143. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
  144. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
  145. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/grpc_servers/models.py +0 -0
  146. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/grpc_servers/types.py +0 -0
  147. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/__init__.py +0 -0
  148. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/ag_ui.py +0 -0
  149. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/base_types.py +0 -0
  150. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/module.py +0 -0
  151. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/module_types.py +0 -0
  152. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/request_metadata.py +0 -0
  153. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/select_schema.py +0 -0
  154. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/setup_types.py +0 -0
  155. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/tool_cache.py +0 -0
  156. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/module/utility.py +0 -0
  157. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/services/__init__.py +0 -0
  158. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/services/cost.py +0 -0
  159. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/services/services.py +0 -0
  160. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/services/storage.py +0 -0
  161. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/__init__.py +0 -0
  162. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/gateway.py +0 -0
  163. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/grpc_client.py +0 -0
  164. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/log.py +0 -0
  165. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/module.py +0 -0
  166. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/profiling.py +0 -0
  167. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/queue.py +0 -0
  168. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/redis.py +0 -0
  169. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/resilience.py +0 -0
  170. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/server/__init__.py +0 -0
  171. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/server/channel.py +0 -0
  172. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/server/grpc.py +0 -0
  173. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/server/server.py +0 -0
  174. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/server/servicer.py +0 -0
  175. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/task_manager.py +0 -0
  176. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/utils/__init__.py +0 -0
  177. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/settings/utils/channel.py +0 -0
  178. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/utils/__init__.py +0 -0
  179. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
  180. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/__init__.py +0 -0
  181. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/trigger_handler.py +0 -0
  182. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/triggers/__init__.py +0 -0
  183. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
  184. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
  185. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
  186. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/py.typed +0 -0
  187. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/__init__.py +0 -0
  188. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/base_strategy.py +0 -0
  189. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/communication/__init__.py +0 -0
  190. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/communication/communication_strategy.py +0 -0
  191. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/communication/default_communication.py +0 -0
  192. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/communication/grpc_communication.py +0 -0
  193. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/cost/__init__.py +0 -0
  194. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/cost/cost_strategy.py +0 -0
  195. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/cost/default_cost.py +0 -0
  196. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/cost/exceptions.py +0 -0
  197. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/cost/grpc_cost.py +0 -0
  198. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/filesystem/__init__.py +0 -0
  199. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
  200. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/filesystem/exceptions.py +0 -0
  201. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
  202. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
  203. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/identity/__init__.py +0 -0
  204. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/identity/default_identity.py +0 -0
  205. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/identity/identity_strategy.py +0 -0
  206. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/registry/__init__.py +0 -0
  207. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/registry/exceptions.py +0 -0
  208. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/registry/registry_models.py +0 -0
  209. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/secret/__init__.py +0 -0
  210. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/secret/default_secret.py +0 -0
  211. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/secret/exceptions.py +0 -0
  212. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/secret/grpc_secret.py +0 -0
  213. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/secret/secret_strategy.py +0 -0
  214. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/services_config.py +0 -0
  215. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/services_models.py +0 -0
  216. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/setup/__init__.py +0 -0
  217. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/setup/default_setup.py +0 -0
  218. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/setup/exceptions.py +0 -0
  219. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/setup/grpc_setup.py +0 -0
  220. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/setup/setup_strategy.py +0 -0
  221. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/storage/__init__.py +0 -0
  222. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/storage/default_storage.py +0 -0
  223. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/storage/exceptions.py +0 -0
  224. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/storage/storage_strategy.py +0 -0
  225. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/task_manager/__init__.py +0 -0
  226. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
  227. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/task_manager/exceptions.py +0 -0
  228. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
  229. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
  230. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/user_profile/__init__.py +0 -0
  231. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
  232. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/user_profile/exceptions.py +0 -0
  233. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
  234. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
  235. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/__init__.py +0 -0
  236. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/arg_parser.py +0 -0
  237. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/conditional_schema.py +0 -0
  238. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/development_mode_action.py +0 -0
  239. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/dynamic_schema.py +0 -0
  240. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/exceptions.py +0 -0
  241. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/llm_ready_schema.py +0 -0
  242. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/package_discover.py +0 -0
  243. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/proto_utils.py +0 -0
  244. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin/utils/schema_splitter.py +0 -0
  245. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin.egg-info/dependency_links.txt +0 -0
  246. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/src/digitalkin.egg-info/top_level.txt +0 -0
  247. {digitalkin-1.0.0.dev25 → digitalkin-1.0.2.dev0}/tests/test_exceptions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: digitalkin
3
- Version: 1.0.0.dev25
3
+ Version: 1.0.2.dev0
4
4
  Summary: SDK to build kin used in DigitalKin
5
5
  Author-email: "DigitalKin.ai" <contact@digitalkin.ai>
6
6
  License: Attribution-NonCommercial-ShareAlike 4.0 International
@@ -453,14 +453,16 @@ Requires-Python: >=3.10
453
453
  Description-Content-Type: text/markdown
454
454
  License-File: LICENSE
455
455
  Requires-Dist: ag-ui-protocol>=0.1.18
456
- Requires-Dist: agentic-mesh-protocol==1.0.0a2
456
+ Requires-Dist: agentic-mesh-protocol==1.0.1.dev2
457
457
  Requires-Dist: anyio>=4.13.0
458
- Requires-Dist: grpcio-health-checking==1.81.0
459
- Requires-Dist: grpcio-reflection==1.81.0
460
- Requires-Dist: grpcio-status==1.81.0
461
- Requires-Dist: pydantic>=2.12.4
458
+ Requires-Dist: grpcio-health-checking==1.82.1
459
+ Requires-Dist: grpcio-reflection==1.82.1
460
+ Requires-Dist: grpcio-status==1.82.1
462
461
  Requires-Dist: pydantic-settings>=2.14.1
462
+ Requires-Dist: pydantic>=2.12.4
463
463
  Requires-Dist: redis[hiredis]<9,>=7.4.0
464
+ Provides-Extra: agno
465
+ Requires-Dist: agno>=2.6; extra == "agno"
464
466
  Provides-Extra: performance
465
467
  Requires-Dist: uvloop>=0.21; extra == "performance"
466
468
  Provides-Extra: profiling
@@ -28,18 +28,19 @@
28
28
 
29
29
  dependencies = [
30
30
  "ag-ui-protocol>=0.1.18",
31
- "agentic-mesh-protocol==1.0.0a2",
31
+ "agentic-mesh-protocol==1.0.1.dev2",
32
32
  "anyio>=4.13.0",
33
- "grpcio-health-checking==1.81.0",
34
- "grpcio-reflection==1.81.0",
35
- "grpcio-status==1.81.0",
36
- "pydantic>=2.12.4",
33
+ "grpcio-health-checking==1.82.1",
34
+ "grpcio-reflection==1.82.1",
35
+ "grpcio-status==1.82.1",
37
36
  "pydantic-settings>=2.14.1",
37
+ "pydantic>=2.12.4",
38
38
  "redis[hiredis]>=7.4.0,<9",
39
39
  ]
40
- version = "1.0.0.dev25"
40
+ version = "1.0.2.dev0"
41
41
 
42
42
  [project.optional-dependencies]
43
+ agno = [ "agno>=2.6" ]
43
44
  performance = [ "uvloop>=0.21" ]
44
45
  profiling = [
45
46
  "pyinstrument>=5.1.2",
@@ -56,6 +57,22 @@
56
57
  name = "DigitalKin.ai"
57
58
 
58
59
  [dependency-groups]
60
+ tests = [
61
+ "fakeredis[lua]>=2.35.1",
62
+ "freezegun>=1.5.5",
63
+ "grpcio-testing>=1.81.0",
64
+ "hdrhistogram>=0.10.3",
65
+ "hypothesis>=6.152.8",
66
+ "objgraph>=3.6",
67
+ "psutil>=7.2.2",
68
+ "pytest-asyncio>=1.3.0",
69
+ "pytest-benchmark>=5.2.3",
70
+ "pytest-cov>=7.1.0",
71
+ "pytest-html>=4.2.0",
72
+ "pytest-json-report>=1.5.0",
73
+ "pytest-timeout>=2.4.0",
74
+ "pytest>=9.0.3",
75
+ ]
59
76
  dev = [
60
77
  "build>=1.5.0",
61
78
  "bump-my-version>=1.3.0",
@@ -67,7 +84,7 @@
67
84
  "twine>=6.2.0",
68
85
  "types-grpcio-health-checking>=1.0.0.20260518",
69
86
  "types-grpcio-reflection>=1.0.0.20260508",
70
- "types-grpcio>=1.0.0.20260518",
87
+ "types-grpcio>=1.82.1.20260711",
71
88
  "types-protobuf>=7.34.1.20260518",
72
89
  "typos>=1.48.0",
73
90
  ]
@@ -95,22 +112,6 @@
95
112
  "mkdocstrings>=1.0.4",
96
113
  "tomli>=2.4.1",
97
114
  ]
98
- tests = [
99
- "fakeredis[lua]>=2.35.1",
100
- "freezegun>=1.5.5",
101
- "grpcio-testing>=1.81.0",
102
- "hdrhistogram>=0.10.3",
103
- "hypothesis>=6.152.8",
104
- "objgraph>=3.6",
105
- "psutil>=7.2.2",
106
- "pytest-asyncio>=1.3.0",
107
- "pytest-benchmark>=4.0",
108
- "pytest-cov>=7.1.0",
109
- "pytest-html>=4.2.0",
110
- "pytest-json-report>=1.5.0",
111
- "pytest-timeout>=2.4.0",
112
- "pytest>=9.0.3",
113
- ]
114
115
  [tool.setuptools]
115
116
  package-dir = { "" = "src" }
116
117
 
@@ -146,12 +147,12 @@
146
147
  "buck-out",
147
148
  "build",
148
149
  "dist",
149
- "scripts",
150
150
  "docs/*",
151
151
  "examples/*",
152
152
  "factory.py",
153
153
  "generate_certificates.py",
154
154
  "node_modules",
155
+ "scripts",
155
156
  "tests/*",
156
157
  "venv",
157
158
  ]
@@ -268,10 +269,10 @@
268
269
  skip-magic-trailing-comma = false
269
270
 
270
271
  [tool.mypy]
271
- exclude = [ "examples", "tests", "scripts" ]
272
+ exclude = [ "examples", "scripts", "tests" ]
272
273
  ignore_missing_imports = true
273
- warn_unused_ignores = true
274
274
  warn_redundant_casts = true
275
+ warn_unused_ignores = true
275
276
 
276
277
  [tool.pytest.ini_options]
277
278
 
@@ -5,4 +5,4 @@ from importlib.metadata import PackageNotFoundError, version
5
5
  try:
6
6
  __version__ = version("digitalkin")
7
7
  except PackageNotFoundError:
8
- __version__ = "1.0.0.dev25"
8
+ __version__ = "1.0.2.dev0"
@@ -12,6 +12,19 @@ on top of the Agno agent framework. Exports:
12
12
  paused Agno run via the module's
13
13
  :class:`~digitalkin.services.storage.StorageStrategy` and resumes it
14
14
  when the front replies with a ``ToolMessage``.
15
+ - :class:`ToolCallMetadata`, :class:`ToolOutputMetadata` — metadata models
16
+ for module tool calls made through the toolkit.
17
+
18
+ ``ModuleToolkit`` (Agno Toolkit wrapping a module's remote tools) requires the
19
+ optional ``agno`` dependency at import time and is therefore NOT exported here;
20
+ import it directly::
21
+
22
+ from digitalkin.community.agno.module_toolkit import ModuleToolkit
23
+
24
+ Default agent toolkits (``ChatHistoryTools``, ``UserProfileTools``,
25
+ ``RegistryTools``, ``DefaultToolkits``) live in
26
+ :mod:`digitalkin.community.agno.toolkits` — imported separately because they
27
+ require the optional ``agno`` dependency at import time.
15
28
  """
16
29
 
17
30
  from digitalkin.community.agno.agno_adapter import AgnoStreamAdapter
@@ -23,7 +36,7 @@ from digitalkin.community.agno.hitl import (
23
36
  PausedRunRecord,
24
37
  PausedRunStore,
25
38
  )
26
- from digitalkin.community.agno.models import PauseInfo
39
+ from digitalkin.community.agno.models import PauseInfo, ToolCallMetadata, ToolOutputMetadata
27
40
 
28
41
  __all__ = [
29
42
  "HITL_STORAGE_CONFIG",
@@ -34,4 +47,6 @@ __all__ = [
34
47
  "PauseInfo",
35
48
  "PausedRunRecord",
36
49
  "PausedRunStore",
50
+ "ToolCallMetadata",
51
+ "ToolOutputMetadata",
37
52
  ]
@@ -0,0 +1,164 @@
1
+ """Models for the Agno community integration."""
2
+
3
+ from typing import Any
4
+
5
+ from ag_ui.core.types import Message as AgUiMessage
6
+ from pydantic import BaseModel, Field
7
+
8
+
9
+ class PauseInfo(BaseModel):
10
+ """Summary of a paused Agno run.
11
+
12
+ Returned by :meth:`AgnoHitlRunner.run` and related methods whenever
13
+ the run paused on one or more external tool calls. Callers typically
14
+ use it to emit the AG-UI awaiting-tool-result event to the front.
15
+
16
+ ``new_messages`` carries the AG-UI messages generated by Agno during
17
+ the paused run (user echoes, the assistant message with ``tool_calls``,
18
+ and any tool results emitted before the pause). It's provided because
19
+ Agno does not emit stream events from which the front can reconstruct
20
+ the assistant-with-tool-calls message — in particular, when the LLM
21
+ goes straight from reasoning to a frontend tool call without emitting
22
+ any text. Consumers typically push these messages to the front via a
23
+ :class:`~ag_ui.core.events.MessagesSnapshotEvent` so the client has an
24
+ authoritative view of the conversation.
25
+ """
26
+
27
+ thread_id: str
28
+ run_id: str
29
+ pending_tool_call_ids: list[str]
30
+ new_messages: list[AgUiMessage] = Field(default_factory=list)
31
+
32
+
33
+ class ToolOutputMetadata(BaseModel):
34
+ """Cost and execution metadata reported by a tool module itself.
35
+
36
+ Enables accurate cost aggregation across modules.
37
+
38
+ Attributes:
39
+ response_time_ms: Time taken for the API call(s) in milliseconds.
40
+ api_calls_made: Number of API calls made by the tool.
41
+ cost_estimate_usd: Estimated cost in USD.
42
+ tavily_credits_used: Tavily API credits consumed (if applicable).
43
+ search_depth: Search depth used (basic, advanced, etc.).
44
+ include_raw_content: Whether raw content was requested.
45
+ queries_count: Number of queries executed.
46
+ results_returned: Number of results returned.
47
+ urls_processed: Number of URLs processed (for extract operations).
48
+ """
49
+
50
+ response_time_ms: float | None = Field(default=None, description="API response time in ms")
51
+ api_calls_made: int = Field(default=1, description="Number of API calls made")
52
+ cost_estimate_usd: float | None = Field(default=None, description="Estimated cost in USD")
53
+ tavily_credits_used: int | None = Field(default=None, description="Tavily credits consumed")
54
+ search_depth: str | None = Field(default=None, description="Search depth used")
55
+ include_raw_content: bool = Field(default=False, description="Whether raw content was requested")
56
+ queries_count: int = Field(default=1, description="Number of queries executed")
57
+ results_returned: int = Field(default=0, description="Number of results returned")
58
+ urls_processed: int = Field(default=0, description="Number of URLs processed")
59
+
60
+
61
+ class ToolCallMetadata(BaseModel):
62
+ """Metadata from a module tool call including cost and timing information.
63
+
64
+ Attributes:
65
+ module_id: The SDK module ID that was called (e.g., "modules:tool_websearch").
66
+ success: Whether the tool call completed successfully.
67
+ duration_ms: Execution time in milliseconds.
68
+ cost_tracked: Whether cost metadata is available from the tool.
69
+ error: Error message if the call failed, None otherwise.
70
+ input_kwargs: The kwargs passed to the tool (for debugging).
71
+ output_summary: Brief summary of the output (truncated for logs).
72
+ tool_metadata: Metadata returned by the tool itself (cost, API calls, etc.).
73
+ """
74
+
75
+ module_id: str = Field(..., description="The SDK module ID that was called")
76
+ success: bool = Field(..., description="Whether the tool call succeeded")
77
+ duration_ms: float = Field(..., description="Execution time in milliseconds")
78
+ cost_tracked: bool = Field(default=False, description="Whether cost metadata is available from tool")
79
+ error: str | None = Field(default=None, description="Error message if failed")
80
+ input_kwargs: dict[str, Any] | None = Field(
81
+ default=None,
82
+ description="Input kwargs passed to the tool for debugging",
83
+ )
84
+ output_summary: str | None = Field(
85
+ default=None,
86
+ description="Brief summary of the output (truncated)",
87
+ )
88
+ tool_metadata: ToolOutputMetadata | None = Field(
89
+ default=None,
90
+ description="Metadata returned by the tool module (cost, API calls, etc.)",
91
+ )
92
+
93
+ def to_success_dict(self) -> dict[str, Any]:
94
+ """Convert metadata to dict for successful responses.
95
+
96
+ Returns:
97
+ Dictionary with success-relevant fields (error excluded).
98
+ """
99
+ return self.model_dump(exclude={"error"})
100
+
101
+ def to_error_dict(self) -> dict[str, Any]:
102
+ """Convert metadata to dict for error responses.
103
+
104
+ Returns:
105
+ Dictionary with error-relevant fields.
106
+ """
107
+ return self.model_dump(include={"module_id", "success", "duration_ms", "error"})
108
+
109
+ def to_log_dict(self) -> dict[str, Any]:
110
+ """Convert metadata to dict for logging.
111
+
112
+ Returns:
113
+ Dictionary suitable for log extra data, large kwargs truncated.
114
+ """
115
+ data: dict[str, Any] = {
116
+ "module_id": self.module_id,
117
+ "success": self.success,
118
+ "duration_ms": self.duration_ms,
119
+ "cost_tracked": self.cost_tracked,
120
+ }
121
+ if self.error:
122
+ data["error"] = self.error
123
+ if self.input_kwargs:
124
+ max_len = 100
125
+ data["input_kwargs"] = {
126
+ k: (str(v)[:max_len] + "..." if len(str(v)) > max_len else v) for k, v in self.input_kwargs.items()
127
+ }
128
+ if self.output_summary:
129
+ data["output_summary"] = self.output_summary
130
+ if self.tool_metadata:
131
+ data["tool_metadata"] = self.tool_metadata.model_dump(exclude_none=True)
132
+ return data
133
+
134
+ @staticmethod
135
+ def extract_tool_metadata(output: dict[str, Any]) -> "ToolOutputMetadata | None":
136
+ """Extract tool metadata from a tool's output if present.
137
+
138
+ Args:
139
+ output: The tool output dictionary.
140
+
141
+ Returns:
142
+ ToolOutputMetadata if metadata is present, None otherwise.
143
+ """
144
+ if not isinstance(output, dict):
145
+ return None
146
+
147
+ metadata = output.get("metadata")
148
+ if not metadata or not isinstance(metadata, dict):
149
+ return None
150
+
151
+ try:
152
+ return ToolOutputMetadata(
153
+ response_time_ms=metadata.get("response_time_ms"),
154
+ api_calls_made=metadata.get("api_calls_made", 1),
155
+ cost_estimate_usd=metadata.get("cost_estimate_usd"),
156
+ tavily_credits_used=metadata.get("tavily_credits_used"),
157
+ search_depth=metadata.get("search_depth"),
158
+ include_raw_content=metadata.get("include_raw_content", False),
159
+ queries_count=metadata.get("queries_count", 1),
160
+ results_returned=metadata.get("results_returned", 0),
161
+ urls_processed=metadata.get("urls_processed", 0),
162
+ )
163
+ except Exception:
164
+ return None