digitalkin 1.0.1.dev0__tar.gz → 1.0.2.dev1__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.
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/PKG-INFO +6 -6
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/pyproject.toml +27 -28
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/community/agno/__init__.py +5 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/community/agno/hitl.py +116 -16
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/community/agno/module_toolkit.py +3 -3
- digitalkin-1.0.2.dev1/src/digitalkin/community/agno/toolkits/__init__.py +24 -0
- digitalkin-1.0.2.dev1/src/digitalkin/community/agno/toolkits/base.py +103 -0
- digitalkin-1.0.2.dev1/src/digitalkin/community/agno/toolkits/chat_history.py +298 -0
- digitalkin-1.0.2.dev1/src/digitalkin/community/agno/toolkits/defaults.py +69 -0
- digitalkin-1.0.2.dev1/src/digitalkin/community/agno/toolkits/registry.py +179 -0
- digitalkin-1.0.2.dev1/src/digitalkin/community/agno/toolkits/setup.py +204 -0
- digitalkin-1.0.2.dev1/src/digitalkin/community/agno/toolkits/tool_loader.py +139 -0
- digitalkin-1.0.2.dev1/src/digitalkin/community/agno/toolkits/user_profile.py +59 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/job_manager/base_job_manager.py +2 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/job_manager/single_job_manager.py +12 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/module_runner.py +5 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/gateway_servicer.py +14 -8
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/module_server.py +2 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/module_context.py +51 -2
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/services/registry.py +23 -1
- digitalkin-1.0.2.dev1/src/digitalkin/models/settings/registry.py +29 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/_base_module.py +26 -1
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/archetype_module.py +2 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/tool_module.py +4 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/communication/exceptions.py +4 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/registry/default_registry.py +97 -12
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/registry/grpc_registry.py +205 -21
- digitalkin-1.0.2.dev1/src/digitalkin/services/registry/registry_strategy.py +215 -0
- digitalkin-1.0.2.dev1/src/digitalkin/services/setup/default_setup.py +168 -0
- digitalkin-1.0.2.dev1/src/digitalkin/services/setup/grpc_setup.py +284 -0
- digitalkin-1.0.2.dev1/src/digitalkin/services/setup/setup_strategy.py +105 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/storage/grpc_storage.py +28 -1
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin.egg-info/PKG-INFO +6 -6
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin.egg-info/SOURCES.txt +9 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin.egg-info/requires.txt +5 -5
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/tests/test_exceptions.py +2 -2
- digitalkin-1.0.1.dev0/src/digitalkin/services/registry/registry_strategy.py +0 -128
- digitalkin-1.0.1.dev0/src/digitalkin/services/setup/default_setup.py +0 -235
- digitalkin-1.0.1.dev0/src/digitalkin/services/setup/grpc_setup.py +0 -381
- digitalkin-1.0.1.dev0/src/digitalkin/services/setup/setup_strategy.py +0 -156
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/LICENSE +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/README.md +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/services/filesystem_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/setup.cfg +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/community/agno/agno_adapter.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/community/agno/models.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/logger.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/mixins/agui_mixin.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/core/redis.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/services/services.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/grpc_client.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/log.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/module.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/queue.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/redis.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/resilience.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/server/servicer.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/task_manager.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/utils/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/cost/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/filesystem/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/secret/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/secret/default_secret.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/secret/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/secret/grpc_secret.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/secret/secret_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/setup/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/storage/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/task_manager/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/user_profile/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/exceptions.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2.dev1
|
|
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,13 +453,13 @@ 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.
|
|
456
|
+
Requires-Dist: agentic-mesh-protocol==1.0.1.dev3
|
|
457
457
|
Requires-Dist: anyio>=4.13.0
|
|
458
|
-
Requires-Dist: grpcio-health-checking==1.
|
|
459
|
-
Requires-Dist: grpcio-reflection==1.
|
|
460
|
-
Requires-Dist: grpcio-status==1.
|
|
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
464
|
Provides-Extra: agno
|
|
465
465
|
Requires-Dist: agno>=2.6; extra == "agno"
|
|
@@ -28,19 +28,19 @@
|
|
|
28
28
|
|
|
29
29
|
dependencies = [
|
|
30
30
|
"ag-ui-protocol>=0.1.18",
|
|
31
|
-
"agentic-mesh-protocol==1.0.
|
|
31
|
+
"agentic-mesh-protocol==1.0.1.dev3",
|
|
32
32
|
"anyio>=4.13.0",
|
|
33
|
-
"grpcio-health-checking==1.
|
|
34
|
-
"grpcio-reflection==1.
|
|
35
|
-
"grpcio-status==1.
|
|
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.
|
|
40
|
+
version = "1.0.2.dev1"
|
|
41
41
|
|
|
42
42
|
[project.optional-dependencies]
|
|
43
|
-
agno
|
|
43
|
+
agno = [ "agno>=2.6" ]
|
|
44
44
|
performance = [ "uvloop>=0.21" ]
|
|
45
45
|
profiling = [
|
|
46
46
|
"pyinstrument>=5.1.2",
|
|
@@ -57,6 +57,22 @@
|
|
|
57
57
|
name = "DigitalKin.ai"
|
|
58
58
|
|
|
59
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
|
+
]
|
|
60
76
|
dev = [
|
|
61
77
|
"build>=1.5.0",
|
|
62
78
|
"bump-my-version>=1.3.0",
|
|
@@ -68,7 +84,7 @@
|
|
|
68
84
|
"twine>=6.2.0",
|
|
69
85
|
"types-grpcio-health-checking>=1.0.0.20260518",
|
|
70
86
|
"types-grpcio-reflection>=1.0.0.20260508",
|
|
71
|
-
"types-grpcio>=1.
|
|
87
|
+
"types-grpcio>=1.82.1.20260711",
|
|
72
88
|
"types-protobuf>=7.34.1.20260518",
|
|
73
89
|
"typos>=1.48.0",
|
|
74
90
|
]
|
|
@@ -96,23 +112,6 @@
|
|
|
96
112
|
"mkdocstrings>=1.0.4",
|
|
97
113
|
"tomli>=2.4.1",
|
|
98
114
|
]
|
|
99
|
-
tests = [
|
|
100
|
-
"agno>=2.6",
|
|
101
|
-
"fakeredis[lua]>=2.35.1",
|
|
102
|
-
"freezegun>=1.5.5",
|
|
103
|
-
"grpcio-testing>=1.81.0",
|
|
104
|
-
"hdrhistogram>=0.10.3",
|
|
105
|
-
"hypothesis>=6.152.8",
|
|
106
|
-
"objgraph>=3.6",
|
|
107
|
-
"psutil>=7.2.2",
|
|
108
|
-
"pytest-asyncio>=1.3.0",
|
|
109
|
-
"pytest-benchmark>=4.0",
|
|
110
|
-
"pytest-cov>=7.1.0",
|
|
111
|
-
"pytest-html>=4.2.0",
|
|
112
|
-
"pytest-json-report>=1.5.0",
|
|
113
|
-
"pytest-timeout>=2.4.0",
|
|
114
|
-
"pytest>=9.0.3",
|
|
115
|
-
]
|
|
116
115
|
[tool.setuptools]
|
|
117
116
|
package-dir = { "" = "src" }
|
|
118
117
|
|
|
@@ -148,12 +147,12 @@
|
|
|
148
147
|
"buck-out",
|
|
149
148
|
"build",
|
|
150
149
|
"dist",
|
|
151
|
-
"scripts",
|
|
152
150
|
"docs/*",
|
|
153
151
|
"examples/*",
|
|
154
152
|
"factory.py",
|
|
155
153
|
"generate_certificates.py",
|
|
156
154
|
"node_modules",
|
|
155
|
+
"scripts",
|
|
157
156
|
"tests/*",
|
|
158
157
|
"venv",
|
|
159
158
|
]
|
|
@@ -270,10 +269,10 @@
|
|
|
270
269
|
skip-magic-trailing-comma = false
|
|
271
270
|
|
|
272
271
|
[tool.mypy]
|
|
273
|
-
exclude = [ "examples", "
|
|
272
|
+
exclude = [ "examples", "scripts", "tests" ]
|
|
274
273
|
ignore_missing_imports = true
|
|
275
|
-
warn_unused_ignores = true
|
|
276
274
|
warn_redundant_casts = true
|
|
275
|
+
warn_unused_ignores = true
|
|
277
276
|
|
|
278
277
|
[tool.pytest.ini_options]
|
|
279
278
|
|
|
@@ -20,6 +20,11 @@ optional ``agno`` dependency at import time and is therefore NOT exported here;
|
|
|
20
20
|
import it directly::
|
|
21
21
|
|
|
22
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.
|
|
23
28
|
"""
|
|
24
29
|
|
|
25
30
|
from digitalkin.community.agno.agno_adapter import AgnoStreamAdapter
|
|
@@ -23,6 +23,7 @@ if TYPE_CHECKING:
|
|
|
23
23
|
from agno.agent import Agent
|
|
24
24
|
from agno.run.agent import RunOutput
|
|
25
25
|
|
|
26
|
+
from digitalkin.community.agno.toolkits.tool_loader import ToolLoaderTools
|
|
26
27
|
from digitalkin.models.events import BaseAgentRunEvent
|
|
27
28
|
from digitalkin.models.module import ModuleContext
|
|
28
29
|
from digitalkin.services.storage import StorageStrategy
|
|
@@ -78,8 +79,10 @@ class PausedRunStore:
|
|
|
78
79
|
seen: set[str] = set()
|
|
79
80
|
pending: list[str] = []
|
|
80
81
|
for tool in run_output.tools or []:
|
|
81
|
-
tid =
|
|
82
|
-
|
|
82
|
+
tid = tool.tool_call_id
|
|
83
|
+
# Skip tools already resolved in-process (e.g. a use_setup call handled by the
|
|
84
|
+
# runner): only genuinely unresolved external tools go to the front.
|
|
85
|
+
if tid and tid not in seen and tool.external_execution_required and tool.result is None:
|
|
83
86
|
seen.add(tid)
|
|
84
87
|
pending.append(tid)
|
|
85
88
|
record = PausedRunRecord(
|
|
@@ -303,6 +306,7 @@ class AgnoHitlRunner:
|
|
|
303
306
|
storage: StorageStrategy | None = None,
|
|
304
307
|
store: PausedRunStore | None = None,
|
|
305
308
|
dependency_key: str = "agui_tools",
|
|
309
|
+
tool_loader: ToolLoaderTools | None = None,
|
|
306
310
|
) -> None:
|
|
307
311
|
"""Initialize the runner.
|
|
308
312
|
|
|
@@ -314,6 +318,12 @@ class AgnoHitlRunner:
|
|
|
314
318
|
store: Pre-built paused-run store; wins over ``storage``.
|
|
315
319
|
dependency_key: Agno dependencies key carrying the AG-UI tool
|
|
316
320
|
list (must match :func:`make_tools_factory`).
|
|
321
|
+
tool_loader: The :class:`ToolLoaderTools` bound to the agent's tool list
|
|
322
|
+
(``ToolLoaderTools.find(tools)``). When present, a ``use_setup`` pause is
|
|
323
|
+
resolved and the run auto-continues instead of surfacing to the front.
|
|
324
|
+
When omitted, the runner locates it in ``agent.tools`` itself — otherwise
|
|
325
|
+
a ``use_setup`` pause would surface to the front as a frontend tool no
|
|
326
|
+
client implements, wedging the thread.
|
|
317
327
|
|
|
318
328
|
Raises:
|
|
319
329
|
ValueError: If neither ``storage`` nor ``store`` is provided.
|
|
@@ -323,9 +333,18 @@ class AgnoHitlRunner:
|
|
|
323
333
|
msg = "AgnoHitlRunner requires either `storage` or `store`."
|
|
324
334
|
raise ValueError(msg)
|
|
325
335
|
store = PausedRunStore(storage)
|
|
336
|
+
if tool_loader is None:
|
|
337
|
+
# Lazy import: ToolLoaderTools requires the optional agno dependency at
|
|
338
|
+
# import time, while this module must stay importable without it (same
|
|
339
|
+
# convention as the rest of community.agno). vars(): test fakes may not
|
|
340
|
+
# carry a tools attribute at all.
|
|
341
|
+
from digitalkin.community.agno.toolkits.tool_loader import ToolLoaderTools
|
|
342
|
+
|
|
343
|
+
tool_loader = ToolLoaderTools.find(vars(agent).get("tools"))
|
|
326
344
|
self._agent = agent
|
|
327
345
|
self._store = store
|
|
328
346
|
self._dependency_key = dependency_key
|
|
347
|
+
self._tool_loader = tool_loader
|
|
329
348
|
|
|
330
349
|
async def run(
|
|
331
350
|
self,
|
|
@@ -360,7 +379,9 @@ class AgnoHitlRunner:
|
|
|
360
379
|
yield_run_output=True,
|
|
361
380
|
dependencies={self._dependency_key: agui_tools or []},
|
|
362
381
|
)
|
|
363
|
-
return await self._drive(
|
|
382
|
+
return await self._drive(
|
|
383
|
+
stream=stream, send=send, thread_id=thread_id, run_output_cls=RunOutput, agui_tools=agui_tools
|
|
384
|
+
)
|
|
364
385
|
|
|
365
386
|
async def continue_paused_run(
|
|
366
387
|
self,
|
|
@@ -437,7 +458,9 @@ class AgnoHitlRunner:
|
|
|
437
458
|
yield_run_output=True,
|
|
438
459
|
dependencies={self._dependency_key: agui_tools or []},
|
|
439
460
|
)
|
|
440
|
-
pause_info = await self._drive(
|
|
461
|
+
pause_info = await self._drive(
|
|
462
|
+
stream=stream, send=send, thread_id=thread_id, run_output_cls=RunOutput, agui_tools=agui_tools
|
|
463
|
+
)
|
|
441
464
|
|
|
442
465
|
if pause_info is None:
|
|
443
466
|
await self._store.delete(thread_id)
|
|
@@ -612,31 +635,108 @@ class AgnoHitlRunner:
|
|
|
612
635
|
send: Callable[[BaseAgentRunEvent], Coroutine[Any, Any, None]],
|
|
613
636
|
thread_id: str,
|
|
614
637
|
run_output_cls: type[RunOutput],
|
|
638
|
+
agui_tools: list[AgUiTool] | None = None,
|
|
615
639
|
) -> PauseInfo | None:
|
|
616
|
-
"""Drain an Agno stream, forward events, persist on pause.
|
|
640
|
+
"""Drain an Agno stream, forward events, and persist or auto-continue on pause.
|
|
641
|
+
|
|
642
|
+
A ``use_setup`` pause (dynamic tool load) is resolved in-process and the run
|
|
643
|
+
auto-continues with the enlarged tool list; a frontend-tool pause is persisted and
|
|
644
|
+
surfaced. The loop is bounded so a model that keeps calling ``use_setup`` cannot spin
|
|
645
|
+
forever.
|
|
646
|
+
|
|
647
|
+
Args:
|
|
648
|
+
stream: The Agno event stream to drain.
|
|
649
|
+
send: Digitalkin-event callback for each forwarded event.
|
|
650
|
+
thread_id: AG-UI thread identifier (storage key on a frontend pause).
|
|
651
|
+
run_output_cls: The ``RunOutput`` class used to spot the terminal run object.
|
|
652
|
+
agui_tools: Frontend tools to re-pass to Agno on an auto-continue.
|
|
617
653
|
|
|
618
654
|
Returns:
|
|
619
|
-
:class:`PauseInfo` on pause, ``None``
|
|
655
|
+
:class:`PauseInfo` on a frontend pause, ``None`` on completion.
|
|
620
656
|
"""
|
|
621
657
|
from digitalkin.community.agno.agno_adapter import AgnoStreamAdapter
|
|
622
658
|
|
|
623
|
-
|
|
624
|
-
|
|
659
|
+
for _ in range(20):
|
|
660
|
+
adapter = AgnoStreamAdapter()
|
|
661
|
+
final_run_output: RunOutput | None = None
|
|
625
662
|
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
663
|
+
async for raw_event in stream:
|
|
664
|
+
if isinstance(raw_event, run_output_cls):
|
|
665
|
+
final_run_output = raw_event
|
|
666
|
+
continue
|
|
667
|
+
for event in adapter.to_digitalkin_events(raw_event):
|
|
668
|
+
await send(event)
|
|
669
|
+
|
|
670
|
+
for event in adapter.flush():
|
|
631
671
|
await send(event)
|
|
632
672
|
|
|
633
|
-
|
|
634
|
-
|
|
673
|
+
if not (adapter.is_paused and final_run_output is not None and final_run_output.is_paused):
|
|
674
|
+
return None
|
|
675
|
+
|
|
676
|
+
# Resolve any use_setup calls in-process; if the pause has nothing left for the
|
|
677
|
+
# front, auto-continue so discover -> load -> use reads as a single turn.
|
|
678
|
+
if await self._load_paused_tools(final_run_output) and not self._pending_external(final_run_output):
|
|
679
|
+
stream = self._agent.acontinue_run(
|
|
680
|
+
run_response=final_run_output,
|
|
681
|
+
stream=True,
|
|
682
|
+
stream_events=True,
|
|
683
|
+
yield_run_output=True,
|
|
684
|
+
dependencies={self._dependency_key: agui_tools or []},
|
|
685
|
+
)
|
|
686
|
+
continue
|
|
635
687
|
|
|
636
|
-
if adapter.is_paused and final_run_output is not None and getattr(final_run_output, "is_paused", False):
|
|
637
688
|
pause_info = await self._store.save(run_output=final_run_output, thread_id=thread_id)
|
|
638
689
|
# Attach AG-UI-shaped messages so the front can materialise the tool_call.
|
|
639
690
|
pause_info.new_messages = HitlEvents.agno_messages_to_agui(final_run_output.messages or [])
|
|
640
691
|
return pause_info
|
|
641
692
|
|
|
693
|
+
logger.warning("AgnoHitlRunner: auto-continue limit reached for thread_id=%s", thread_id)
|
|
694
|
+
from digitalkin.models.events import AgentRunEvent, RunErrorEvent
|
|
695
|
+
|
|
696
|
+
await send(
|
|
697
|
+
RunErrorEvent(
|
|
698
|
+
event=AgentRunEvent.RUN_ERROR,
|
|
699
|
+
error_type="auto_continue_limit",
|
|
700
|
+
content=(
|
|
701
|
+
"The run was stopped after too many consecutive in-process tool "
|
|
702
|
+
"loads (use_setup). Send a new message to continue."
|
|
703
|
+
),
|
|
704
|
+
error_details=None,
|
|
705
|
+
timestamp=None,
|
|
706
|
+
metadata=None,
|
|
707
|
+
)
|
|
708
|
+
)
|
|
642
709
|
return None
|
|
710
|
+
|
|
711
|
+
async def _load_paused_tools(self, run_output: RunOutput) -> bool:
|
|
712
|
+
"""Resolve ``use_setup`` calls in a paused run, writing each tool result in place.
|
|
713
|
+
|
|
714
|
+
Args:
|
|
715
|
+
run_output: The paused Agno run.
|
|
716
|
+
|
|
717
|
+
Returns:
|
|
718
|
+
``True`` if at least one ``use_setup`` call was handled, else ``False`` (no
|
|
719
|
+
loader wired, or the pause carries only frontend tools).
|
|
720
|
+
"""
|
|
721
|
+
if self._tool_loader is None:
|
|
722
|
+
return False
|
|
723
|
+
handled = False
|
|
724
|
+
loader_tool = self._tool_loader.tool_name
|
|
725
|
+
for tool in run_output.tools or []:
|
|
726
|
+
if tool.external_execution_required and tool.result is None and tool.tool_name == loader_tool:
|
|
727
|
+
setup_id = (tool.tool_args or {}).get("setup_id", "")
|
|
728
|
+
tool.result = await self._tool_loader.load(setup_id)
|
|
729
|
+
handled = True
|
|
730
|
+
return handled
|
|
731
|
+
|
|
732
|
+
@staticmethod
|
|
733
|
+
def _pending_external(run_output: RunOutput) -> bool:
|
|
734
|
+
"""Report whether any external tool in the paused run still needs a result.
|
|
735
|
+
|
|
736
|
+
Args:
|
|
737
|
+
run_output: The paused Agno run (after :meth:`_load_paused_tools`).
|
|
738
|
+
|
|
739
|
+
Returns:
|
|
740
|
+
``True`` if a frontend tool call remains unresolved (must go to the front).
|
|
741
|
+
"""
|
|
742
|
+
return any(tool.external_execution_required and tool.result is None for tool in run_output.tools or [])
|
{digitalkin-1.0.1.dev0 → digitalkin-1.0.2.dev1}/src/digitalkin/community/agno/module_toolkit.py
RENAMED
|
@@ -16,10 +16,10 @@ from typing import Any
|
|
|
16
16
|
|
|
17
17
|
from ag_ui.core.events import CustomEvent as AgUiCustomEvent
|
|
18
18
|
from agno.media import Image
|
|
19
|
-
from agno.tools import Toolkit
|
|
20
19
|
from agno.tools.function import Function, ToolResult
|
|
21
20
|
|
|
22
21
|
from digitalkin.community.agno.models import ToolCallMetadata, ToolOutputMetadata
|
|
22
|
+
from digitalkin.community.agno.toolkits.base import DkToolkit
|
|
23
23
|
from digitalkin.core.profiling.step_timer import StepTimer
|
|
24
24
|
from digitalkin.logger import logger
|
|
25
25
|
from digitalkin.models.module import ModuleContext
|
|
@@ -38,7 +38,7 @@ TOOL_CONTENT_PROTOCOL = "tool_content"
|
|
|
38
38
|
AGUI_CUSTOM_PROTOCOL = "agui_custom"
|
|
39
39
|
|
|
40
40
|
|
|
41
|
-
class ModuleToolkit(
|
|
41
|
+
class ModuleToolkit(DkToolkit):
|
|
42
42
|
"""Agno Toolkit wrapper for SDK module tools.
|
|
43
43
|
|
|
44
44
|
Wraps a ToolModuleInfo containing multiple ToolDefinitions into
|
|
@@ -170,7 +170,7 @@ class ModuleToolkit(Toolkit):
|
|
|
170
170
|
or tool_module_info.module_name
|
|
171
171
|
or tool_module_info.slug.replace(":", "_").replace(".", "_")
|
|
172
172
|
)
|
|
173
|
-
super().__init__(name=f"{toolkit_name}_toolkit", tools=agno_functions)
|
|
173
|
+
super().__init__(name=f"{toolkit_name}_toolkit", tools=agno_functions, context=self._context)
|
|
174
174
|
|
|
175
175
|
@property
|
|
176
176
|
def module_id(self) -> str:
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Default Agno toolkits for DigitalKin modules.
|
|
2
|
+
|
|
3
|
+
Requires the optional ``agno`` dependency — importing this subpackage without
|
|
4
|
+
``agno`` installed raises ModuleNotFoundError. The parent
|
|
5
|
+
``digitalkin.community.agno`` package stays importable without agno.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from digitalkin.community.agno.toolkits.base import DkToolkit
|
|
9
|
+
from digitalkin.community.agno.toolkits.chat_history import ChatHistoryTools
|
|
10
|
+
from digitalkin.community.agno.toolkits.defaults import DefaultToolkits
|
|
11
|
+
from digitalkin.community.agno.toolkits.registry import RegistryTools
|
|
12
|
+
from digitalkin.community.agno.toolkits.setup import SetupTools
|
|
13
|
+
from digitalkin.community.agno.toolkits.tool_loader import ToolLoaderTools
|
|
14
|
+
from digitalkin.community.agno.toolkits.user_profile import UserProfileTools
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"ChatHistoryTools",
|
|
18
|
+
"DefaultToolkits",
|
|
19
|
+
"DkToolkit",
|
|
20
|
+
"RegistryTools",
|
|
21
|
+
"SetupTools",
|
|
22
|
+
"ToolLoaderTools",
|
|
23
|
+
"UserProfileTools",
|
|
24
|
+
]
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"""Shared base for DigitalKin agno toolkits.
|
|
2
|
+
|
|
3
|
+
Codifies the format/return conventions established by
|
|
4
|
+
:class:`~digitalkin.community.agno.module_toolkit.ModuleToolkit`: a canonical
|
|
5
|
+
``{"output"|"error", "metadata"}`` JSON envelope (:meth:`_ok`/:meth:`_fail`) and
|
|
6
|
+
best-effort AG-UI custom-event notifications on the agent's own stream
|
|
7
|
+
(:meth:`_notify`). Every toolkit returns consistently and never raises into the
|
|
8
|
+
agent loop.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
from typing import TYPE_CHECKING, Any
|
|
15
|
+
|
|
16
|
+
from ag_ui.core.events import CustomEvent as AgUiCustomEvent
|
|
17
|
+
from agno.tools import Toolkit
|
|
18
|
+
|
|
19
|
+
from digitalkin.logger import logger
|
|
20
|
+
from digitalkin.models.module.ag_ui import AgUiCustomEventOutput, AgUiOutput
|
|
21
|
+
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from digitalkin.models.module import ModuleContext
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class DkToolkit(Toolkit):
|
|
27
|
+
"""Base class for DigitalKin agno toolkits.
|
|
28
|
+
|
|
29
|
+
Subclasses register bound async tool methods and return via :meth:`_ok`/
|
|
30
|
+
:meth:`_fail` so the agent always receives the same envelope and the tool
|
|
31
|
+
never raises. Passing a :class:`ModuleContext` enables :meth:`_notify`,
|
|
32
|
+
which pushes AG-UI custom events onto the caller's gRPC stream.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
name: str,
|
|
38
|
+
tools: list[Any],
|
|
39
|
+
context: ModuleContext | None = None,
|
|
40
|
+
external_execution_required_tools: list[str] | None = None,
|
|
41
|
+
) -> None:
|
|
42
|
+
"""Initialize the toolkit.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
name: Toolkit name registered with Agno.
|
|
46
|
+
tools: Bound tool callables to expose to the agent.
|
|
47
|
+
context: Module context; when present, :meth:`_notify` can emit AG-UI events.
|
|
48
|
+
external_execution_required_tools: Tool names Agno must pause on (executed
|
|
49
|
+
outside the agent loop) instead of running their entrypoint.
|
|
50
|
+
"""
|
|
51
|
+
self._ctx = context
|
|
52
|
+
super().__init__(
|
|
53
|
+
name=name,
|
|
54
|
+
tools=tools,
|
|
55
|
+
external_execution_required_tools=external_execution_required_tools or [],
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
@staticmethod
|
|
59
|
+
def _ok(output: Any, **metadata: Any) -> str:
|
|
60
|
+
"""Build the canonical success envelope.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
output: The tool result payload (JSON-serializable).
|
|
64
|
+
metadata: Extra metadata fields (e.g. ``tool``).
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
JSON string ``{"output": ..., "metadata": {"success": true, ...}}``.
|
|
68
|
+
"""
|
|
69
|
+
return json.dumps({"output": output, "metadata": {"success": True, **metadata}}, ensure_ascii=False)
|
|
70
|
+
|
|
71
|
+
@staticmethod
|
|
72
|
+
def _fail(error: str, **metadata: Any) -> str:
|
|
73
|
+
"""Build the canonical error envelope.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
error: Human/LLM-readable error message.
|
|
77
|
+
metadata: Extra metadata fields (e.g. ``tool``).
|
|
78
|
+
|
|
79
|
+
Returns:
|
|
80
|
+
JSON string ``{"error": ..., "metadata": {"success": false, ...}}``.
|
|
81
|
+
"""
|
|
82
|
+
return json.dumps({"error": error, "metadata": {"success": False, **metadata}}, ensure_ascii=False)
|
|
83
|
+
|
|
84
|
+
async def _notify(self, name: str, value: Any) -> None:
|
|
85
|
+
"""Emit an AG-UI custom event on the agent's output stream (best-effort).
|
|
86
|
+
|
|
87
|
+
No-op when there is no context or ``send_message`` is not installed (e.g. outside a
|
|
88
|
+
running job). Never raises — a notification failure must not fail the tool call.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
name: Custom event name.
|
|
92
|
+
value: Custom event payload (JSON-serializable).
|
|
93
|
+
"""
|
|
94
|
+
if self._ctx is None:
|
|
95
|
+
return
|
|
96
|
+
# callbacks is a dict-driven SimpleNamespace; send_message is attached during prepare().
|
|
97
|
+
send_message = vars(self._ctx.callbacks).get("send_message")
|
|
98
|
+
if send_message is None:
|
|
99
|
+
return
|
|
100
|
+
try:
|
|
101
|
+
await send_message(AgUiOutput(root=AgUiCustomEventOutput(event=AgUiCustomEvent(name=name, value=value))))
|
|
102
|
+
except Exception:
|
|
103
|
+
logger.exception("Failed to emit custom event '%s' to the agent stream", name)
|