digitalkin 1.0.3.dev0__tar.gz → 1.0.3.dev2__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.3.dev0 → digitalkin-1.0.3.dev2}/PKG-INFO +2 -2
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/pyproject.toml +19 -19
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/hitl.py +122 -54
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/base.py +27 -0
- digitalkin-1.0.3.dev2/src/digitalkin/community/agno/toolkits/registry/action.py +339 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/base.py +31 -8
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +9 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +10 -7
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +65 -32
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +4 -2
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/services/action.py +8 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +10 -6
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +9 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +8 -5
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/user_profile.py +4 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/redis_client.py +12 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/gateway_servicer.py +21 -4
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/__init__.py +8 -0
- digitalkin-1.0.3.dev2/src/digitalkin/models/module/loaded_tools.py +140 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/module_context.py +89 -5
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/tool_cache.py +70 -10
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/registry.py +17 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/redis.py +13 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/_base_module.py +22 -3
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/default_filesystem.py +9 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/filesystem_strategy.py +10 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/grpc_filesystem.py +28 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/default_registry.py +33 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/grpc_registry.py +28 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/registry_strategy.py +46 -1
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/default_setup.py +70 -4
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/grpc_setup.py +71 -2
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/setup_strategy.py +33 -3
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/default_storage.py +28 -8
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/grpc_storage.py +15 -3
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/storage_strategy.py +46 -11
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/grpc_user_profile.py +3 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/user_profile_strategy.py +3 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/PKG-INFO +2 -2
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/SOURCES.txt +1 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/requires.txt +1 -1
- digitalkin-1.0.3.dev0/src/digitalkin/community/agno/toolkits/registry/action.py +0 -177
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/LICENSE +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/README.md +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/services/filesystem_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/setup.cfg +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/agno_adapter.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/models.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/module_toolkit.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/module_runner.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/module_server.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/logger.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/agui_mixin.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/core/redis.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/services.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/grpc_client.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/log.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/queue.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/registry.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/resilience.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/server/servicer.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/task_manager.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/utils/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/filesystem/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/default_secret.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/grpc_secret.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/secret/secret_strategy.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/setup/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/storage/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/services/user_profile/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/exceptions.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/utils/setup_content_validator.py +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin.egg-info/top_level.txt +0 -0
- {digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/tests/test_exceptions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 1.0.3.
|
|
3
|
+
Version: 1.0.3.dev2
|
|
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,7 +453,7 @@ 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.21.dev1787220377
|
|
456
|
-
Requires-Dist: agentic-mesh-protocol==1.0.1
|
|
456
|
+
Requires-Dist: agentic-mesh-protocol==1.0.1
|
|
457
457
|
Requires-Dist: agno<3,>=2.8.0
|
|
458
458
|
Requires-Dist: anyio>=4.13.0
|
|
459
459
|
Requires-Dist: grpcio-health-checking==1.82.1
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
# which is how a nested run's output is attributed to its author. Pinned exactly
|
|
32
32
|
# because it is a dated prerelease; move to >=0.1.21 once that ships stable.
|
|
33
33
|
"ag-ui-protocol==0.1.21.dev1787220377",
|
|
34
|
-
"agentic-mesh-protocol==1.0.1
|
|
34
|
+
"agentic-mesh-protocol==1.0.1",
|
|
35
35
|
"agno>=2.8.0,<3",
|
|
36
36
|
"anyio>=4.13.0",
|
|
37
37
|
"grpcio-health-checking==1.82.1",
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
"pydantic-settings>=2.14.1",
|
|
41
41
|
"pydantic>=2.12.4",
|
|
42
42
|
"redis[hiredis]>=7.4.0,<9",
|
|
43
|
-
]
|
|
44
|
-
version = "1.0.3.
|
|
43
|
+
]
|
|
44
|
+
version = "1.0.3.dev2"
|
|
45
45
|
|
|
46
46
|
[project.optional-dependencies]
|
|
47
47
|
agno = [ "agno>=2.6" ]
|
|
@@ -61,22 +61,6 @@ version = "1.0.3.dev0"
|
|
|
61
61
|
name = "DigitalKin.ai"
|
|
62
62
|
|
|
63
63
|
[dependency-groups]
|
|
64
|
-
tests = [
|
|
65
|
-
"fakeredis[lua]>=2.35.1",
|
|
66
|
-
"freezegun>=1.5.5",
|
|
67
|
-
"grpcio-testing>=1.81.0",
|
|
68
|
-
"hdrhistogram>=0.10.3",
|
|
69
|
-
"hypothesis>=6.152.8",
|
|
70
|
-
"objgraph>=3.6",
|
|
71
|
-
"psutil>=7.2.2",
|
|
72
|
-
"pytest-asyncio>=1.3.0",
|
|
73
|
-
"pytest-benchmark>=5.2.3",
|
|
74
|
-
"pytest-cov>=7.1.0",
|
|
75
|
-
"pytest-html>=4.2.0",
|
|
76
|
-
"pytest-json-report>=1.5.0",
|
|
77
|
-
"pytest-timeout>=2.4.0",
|
|
78
|
-
"pytest>=9.0.3",
|
|
79
|
-
]
|
|
80
64
|
dev = [
|
|
81
65
|
"build>=1.5.0",
|
|
82
66
|
"bump-my-version>=1.3.0",
|
|
@@ -116,6 +100,22 @@ version = "1.0.3.dev0"
|
|
|
116
100
|
"mkdocstrings>=1.0.4",
|
|
117
101
|
"tomli>=2.4.1",
|
|
118
102
|
]
|
|
103
|
+
tests = [
|
|
104
|
+
"fakeredis[lua]>=2.35.1",
|
|
105
|
+
"freezegun>=1.5.5",
|
|
106
|
+
"grpcio-testing>=1.81.0",
|
|
107
|
+
"hdrhistogram>=0.10.3",
|
|
108
|
+
"hypothesis>=6.152.8",
|
|
109
|
+
"objgraph>=3.6",
|
|
110
|
+
"psutil>=7.2.2",
|
|
111
|
+
"pytest-asyncio>=1.3.0",
|
|
112
|
+
"pytest-benchmark>=5.2.3",
|
|
113
|
+
"pytest-cov>=7.1.0",
|
|
114
|
+
"pytest-html>=4.2.0",
|
|
115
|
+
"pytest-json-report>=1.5.0",
|
|
116
|
+
"pytest-timeout>=2.4.0",
|
|
117
|
+
"pytest>=9.0.3",
|
|
118
|
+
]
|
|
119
119
|
[tool.setuptools]
|
|
120
120
|
package-dir = { "" = "src" }
|
|
121
121
|
|
|
@@ -340,6 +340,40 @@ class AgnoHitlRunner:
|
|
|
340
340
|
self._store = store
|
|
341
341
|
self._dependency_key = dependency_key
|
|
342
342
|
self._tool_loader = tool_loader
|
|
343
|
+
# Set while a continue is in flight, so _restore_tools can put the factory back.
|
|
344
|
+
self._tools_factory: Any = None
|
|
345
|
+
|
|
346
|
+
def _resolve_tools_for_continue(self, agui_tools: list[AgUiTool] | None) -> None:
|
|
347
|
+
"""Hand Agno a concrete tool list for the ``acontinue_run`` about to be issued.
|
|
348
|
+
|
|
349
|
+
A Team's async ``acontinue_run`` never resolves a callable ``tools`` factory, so the
|
|
350
|
+
continued leader would run with an empty function map and every call — not just the
|
|
351
|
+
freshly loaded one — would come back as "the requested tool does not exist".
|
|
352
|
+
|
|
353
|
+
Args:
|
|
354
|
+
agui_tools: Frontend tools to merge in, exactly as the factory would.
|
|
355
|
+
"""
|
|
356
|
+
from digitalkin.community.agno.agui_tools import AguiTools
|
|
357
|
+
|
|
358
|
+
factory = vars(self._agent).get("tools")
|
|
359
|
+
if not callable(factory) or isinstance(factory, list):
|
|
360
|
+
return
|
|
361
|
+
if self._tools_factory is None:
|
|
362
|
+
self._tools_factory = factory
|
|
363
|
+
self._agent.tools = [
|
|
364
|
+
*factory(None),
|
|
365
|
+
*[AguiTools.agui_tool_to_external_function(tool) for tool in agui_tools or []],
|
|
366
|
+
]
|
|
367
|
+
|
|
368
|
+
def _restore_tools(self) -> None:
|
|
369
|
+
"""Put the tools factory back after a continue, if one was swapped out.
|
|
370
|
+
|
|
371
|
+
The factory is the steady state: it merges each turn's AG-UI frontend tools on the
|
|
372
|
+
next run, so leaving the resolved list in place would freeze this turn's set.
|
|
373
|
+
"""
|
|
374
|
+
if self._tools_factory is not None:
|
|
375
|
+
self._agent.tools = self._tools_factory
|
|
376
|
+
self._tools_factory = None
|
|
343
377
|
|
|
344
378
|
@staticmethod
|
|
345
379
|
def _find_loader(tools: Any) -> LoadManager | None:
|
|
@@ -675,66 +709,70 @@ class AgnoHitlRunner:
|
|
|
675
709
|
"""
|
|
676
710
|
from digitalkin.community.agno.agno_adapter import AgnoStreamAdapter
|
|
677
711
|
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
async for raw_event in stream:
|
|
683
|
-
if isinstance(raw_event, run_output_cls):
|
|
684
|
-
final_run_output = raw_event
|
|
685
|
-
continue
|
|
686
|
-
for event in adapter.to_digitalkin_events(raw_event):
|
|
687
|
-
await send(event)
|
|
712
|
+
try:
|
|
713
|
+
for _ in range(20):
|
|
714
|
+
adapter = AgnoStreamAdapter()
|
|
715
|
+
final_run_output: RunOutput | None = None
|
|
688
716
|
|
|
689
|
-
|
|
690
|
-
|
|
717
|
+
async for raw_event in stream:
|
|
718
|
+
if isinstance(raw_event, run_output_cls):
|
|
719
|
+
final_run_output = raw_event
|
|
720
|
+
continue
|
|
721
|
+
for event in adapter.to_digitalkin_events(raw_event):
|
|
722
|
+
await send(event)
|
|
691
723
|
|
|
692
|
-
|
|
693
|
-
|
|
724
|
+
for event in adapter.flush():
|
|
725
|
+
await send(event)
|
|
694
726
|
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
#
|
|
699
|
-
#
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
stream=
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
727
|
+
if not (adapter.is_paused and final_run_output is not None and final_run_output.is_paused):
|
|
728
|
+
return None
|
|
729
|
+
|
|
730
|
+
# Resolve any load_manager calls in-process; if the pause has nothing left for the
|
|
731
|
+
# front, auto-continue so discover -> load -> use reads as a single turn.
|
|
732
|
+
if await self._load_paused_tools(final_run_output) and not self._pending_external(final_run_output):
|
|
733
|
+
# Agno caches the tools-factory output per run, so a continue would re-resolve
|
|
734
|
+
# from the stale pre-load cache and miss the just-loaded tool. Invalidate it.
|
|
735
|
+
from agno.utils.callables import aclear_callable_cache # pyright: ignore[reportMissingImports]
|
|
736
|
+
|
|
737
|
+
await aclear_callable_cache(self._agent, kind="tools")
|
|
738
|
+
# ...and hand the continue a resolved list, because a Team never re-invokes the
|
|
739
|
+
# factory on acontinue_run at all. See _resolve_tools_for_continue.
|
|
740
|
+
self._resolve_tools_for_continue(agui_tools)
|
|
741
|
+
stream = self._agent.acontinue_run(
|
|
742
|
+
run_response=final_run_output,
|
|
743
|
+
stream=True,
|
|
744
|
+
stream_events=True,
|
|
745
|
+
yield_run_output=True,
|
|
746
|
+
dependencies={self._dependency_key: agui_tools or []},
|
|
747
|
+
)
|
|
748
|
+
continue
|
|
715
749
|
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
750
|
+
pause_info = await self._store.save(run_output=final_run_output, thread_id=thread_id)
|
|
751
|
+
# Attach AG-UI-shaped messages so the front can materialise the tool_call.
|
|
752
|
+
pause_info.new_messages = HitlEvents.agno_messages_to_agui(final_run_output.messages or [])
|
|
753
|
+
return pause_info
|
|
720
754
|
|
|
721
|
-
|
|
722
|
-
|
|
755
|
+
logger.warning("AgnoHitlRunner: auto-continue limit reached for thread_id=%s", thread_id)
|
|
756
|
+
from digitalkin.models.events import AgentRunEvent, RunErrorEvent
|
|
723
757
|
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
758
|
+
await send(
|
|
759
|
+
RunErrorEvent(
|
|
760
|
+
event=AgentRunEvent.RUN_ERROR,
|
|
761
|
+
error_type="auto_continue_limit",
|
|
762
|
+
content=(
|
|
763
|
+
"The run was stopped after too many consecutive in-process tool "
|
|
764
|
+
"loads (load_manager). Send a new message to continue."
|
|
765
|
+
),
|
|
766
|
+
error_details=None,
|
|
767
|
+
timestamp=None,
|
|
768
|
+
metadata=None,
|
|
769
|
+
)
|
|
735
770
|
)
|
|
736
|
-
|
|
737
|
-
|
|
771
|
+
return None
|
|
772
|
+
finally:
|
|
773
|
+
# The swapped-in list is only valid for the continues issued above; the factory is
|
|
774
|
+
# the steady state every later run resolves from.
|
|
775
|
+
self._restore_tools()
|
|
738
776
|
|
|
739
777
|
async def _load_paused_tools(self, run_output: RunOutput) -> bool:
|
|
740
778
|
"""Resolve ``load_manager`` calls in a paused run, writing each tool result in place.
|
|
@@ -752,10 +790,40 @@ class AgnoHitlRunner:
|
|
|
752
790
|
loader_tool = self._tool_loader.tool_name
|
|
753
791
|
for tool in run_output.tools or []:
|
|
754
792
|
if tool.external_execution_required and tool.result is None and tool.tool_name == loader_tool:
|
|
755
|
-
|
|
793
|
+
result = await self._tool_loader.run_paused(tool.tool_args or {})
|
|
794
|
+
tool.result = result
|
|
795
|
+
self._resolve_requirement(run_output, tool.tool_call_id, result)
|
|
756
796
|
handled = True
|
|
757
797
|
return handled
|
|
758
798
|
|
|
799
|
+
@staticmethod
|
|
800
|
+
def _resolve_requirement(run_output: RunOutput, tool_call_id: str | None, result: str) -> None:
|
|
801
|
+
"""Mark the paused run's requirement for ``tool_call_id`` as externally executed.
|
|
802
|
+
|
|
803
|
+
Agno gates ``acontinue_run`` on ``RunRequirement.is_resolved()``, never on
|
|
804
|
+
``tools[].result``: ``needs_external_execution`` stays True until the requirement's own
|
|
805
|
+
``external_execution_result`` is set. Writing only the tool result therefore leaves the
|
|
806
|
+
run "still paused" — the continue re-pauses immediately without a model call, the loaded
|
|
807
|
+
tool is never used, and the turn dead-ends on a pause with nothing left for the front to
|
|
808
|
+
resolve. The frontend resume path (:meth:`continue_paused_run`) already syncs
|
|
809
|
+
requirements; the in-process load path must do the same.
|
|
810
|
+
|
|
811
|
+
Args:
|
|
812
|
+
run_output: The paused Agno run whose requirements mirror ``run_output.tools``.
|
|
813
|
+
tool_call_id: The resolved tool call's id; ``None``/empty matches nothing.
|
|
814
|
+
result: The tool result to record on the requirement.
|
|
815
|
+
"""
|
|
816
|
+
if not tool_call_id:
|
|
817
|
+
return
|
|
818
|
+
for requirement in run_output.requirements or []:
|
|
819
|
+
tool_execution = requirement.tool_execution
|
|
820
|
+
if (
|
|
821
|
+
tool_execution is not None
|
|
822
|
+
and tool_execution.tool_call_id == tool_call_id
|
|
823
|
+
and requirement.needs_external_execution
|
|
824
|
+
):
|
|
825
|
+
requirement.set_external_execution_result(result)
|
|
826
|
+
|
|
759
827
|
@staticmethod
|
|
760
828
|
def _pending_external(run_output: RunOutput) -> bool:
|
|
761
829
|
"""Report whether any external tool in the paused run still needs a result.
|
{digitalkin-1.0.3.dev0 → digitalkin-1.0.3.dev2}/src/digitalkin/community/agno/toolkits/base.py
RENAMED
|
@@ -81,6 +81,33 @@ class DkToolkit(Toolkit):
|
|
|
81
81
|
"""
|
|
82
82
|
return json.dumps({"error": error, "metadata": {"success": False, **metadata}}, ensure_ascii=False)
|
|
83
83
|
|
|
84
|
+
@staticmethod
|
|
85
|
+
def _nest_action(action: Any, fields: dict[str, Any]) -> Any:
|
|
86
|
+
"""Normalise the three shapes a model sends a nested ``action`` object in.
|
|
87
|
+
|
|
88
|
+
The tool schema declares a single ``action`` property holding a discriminated union, but
|
|
89
|
+
models routinely flatten it — sending ``{"action": "search", "query": ""}`` instead of
|
|
90
|
+
``{"action": {"action": "search", "query": ""}}`` — or serialise the inner object as a
|
|
91
|
+
JSON string. Both are the model reading a nested union schema the obvious way, not a
|
|
92
|
+
malformed call, so they are accepted rather than refused.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
action: The ``action`` argument as received: the object, a JSON string of it, or the
|
|
96
|
+
bare discriminator when the model flattened the call.
|
|
97
|
+
fields: Any sibling keyword arguments, i.e. the flattened action's own fields.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
The payload to validate: a JSON string is passed through for ``validate_json``,
|
|
101
|
+
anything else comes back as a dict.
|
|
102
|
+
"""
|
|
103
|
+
if isinstance(action, str):
|
|
104
|
+
# A JSON string is the inner object already; anything else is the bare discriminator,
|
|
105
|
+
# whose fields were flattened alongside it (empty when the action takes none).
|
|
106
|
+
return action if action.lstrip().startswith("{") else {"action": action, **fields}
|
|
107
|
+
if fields and isinstance(action, dict):
|
|
108
|
+
return {**action, **fields}
|
|
109
|
+
return fields if action is None and fields else action
|
|
110
|
+
|
|
84
111
|
async def _notify(self, name: str, value: Any) -> None:
|
|
85
112
|
"""Emit an AG-UI custom event on the agent's output stream (best-effort).
|
|
86
113
|
|