digitalkin 1.0.5.dev2__tar.gz → 1.0.5.dev4__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.5.dev2 → digitalkin-1.0.5.dev4}/PKG-INFO +2 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/services/filesystem_module.py +7 -6
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/pyproject.toml +45 -45
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/agno_adapter.py +20 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/hitl.py +27 -5
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/module_toolkit.py +21 -4
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/action.py +47 -15
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/base.py +15 -10
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +1 -1
- digitalkin-1.0.5.dev4/src/digitalkin/community/agno/toolkits/registry/services/action.py +175 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +11 -5
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/job_manager/single_job_manager.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/profiling/task_profiler.py +3 -3
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/resilience/bulkhead.py +5 -6
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/base_task_manager.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/local_task_manager.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/module_runner.py +46 -8
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/proto_streams.py +2 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/redis_client.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/redis_signal.py +7 -7
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/remote_task_manager.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/task_executor.py +3 -3
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/_base_server.py +15 -15
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/gateway_servicer.py +21 -21
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/interceptors/permission.py +9 -9
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/interceptors/request_ids.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/m2m_call_registry.py +2 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/module_server.py +19 -10
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/module_servicer.py +30 -15
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +3 -3
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +7 -7
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +2 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/validators.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/logger.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/agui_mixin.py +176 -10
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/file_history_mixin.py +4 -3
- digitalkin-1.0.5.dev4/src/digitalkin/mixins/filesystem_mixin.py +220 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/models.py +30 -39
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/__init__.py +6 -0
- digitalkin-1.0.5.dev4/src/digitalkin/models/module/knowledge_files.py +87 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/module_context.py +7 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/setup_types.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/utility.py +6 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/__init__.py +4 -0
- digitalkin-1.0.5.dev4/src/digitalkin/models/services/filesystem.py +127 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/registry.py +3 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/storage.py +3 -9
- digitalkin-1.0.5.dev4/src/digitalkin/models/settings/certificate.py +90 -0
- digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/__init__.py +1 -0
- digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/channel.py +68 -0
- digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/circuit_breaker.py +19 -0
- digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/client.py +55 -0
- digitalkin-1.0.5.dev4/src/digitalkin/models/settings/client/grpc.py +148 -0
- digitalkin-1.0.5.dev4/src/digitalkin/models/settings/module.py +54 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/profiling.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/redis.py +5 -1
- digitalkin-1.0.5.dev4/src/digitalkin/models/settings/resilience.py +61 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/channel.py +23 -3
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/grpc.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/server.py +4 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/utils/channel.py +46 -8
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/_base_module.py +27 -11
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/trigger_handler.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +2 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +3 -3
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +2 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/communication/communication_strategy.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/communication/default_communication.py +5 -5
- digitalkin-1.0.5.dev4/src/digitalkin/services/communication/exceptions.py +20 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/communication/grpc_communication.py +17 -14
- digitalkin-1.0.5.dev4/src/digitalkin/services/filesystem/__init__.py +19 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/filesystem/default_filesystem.py +42 -35
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/filesystem/filesystem_strategy.py +49 -49
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/filesystem/grpc_filesystem.py +18 -40
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/identity/default_identity.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/default_registry.py +5 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/grpc_registry.py +3 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/registry_strategy.py +2 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/services_config.py +16 -4
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/default_setup.py +66 -6
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/grpc_setup.py +65 -17
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/setup_strategy.py +43 -6
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/default_storage.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/default_task_manager.py +4 -4
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/default_user_profile.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/arg_parser.py +6 -6
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/development_mode_action.py +12 -20
- digitalkin-1.0.5.dev4/src/digitalkin/utils/env_manager.py +139 -0
- digitalkin-1.0.5.dev4/src/digitalkin/utils/env_template.py +233 -0
- digitalkin-1.0.5.dev4/src/digitalkin/utils/json_structure.py +169 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/llm_ready_schema.py +1 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/package_discover.py +3 -3
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/schema_splitter.py +4 -4
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/PKG-INFO +2 -2
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/SOURCES.txt +11 -1
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/requires.txt +1 -1
- digitalkin-1.0.5.dev2/src/digitalkin/community/agno/toolkits/registry/services/action.py +0 -92
- digitalkin-1.0.5.dev2/src/digitalkin/mixins/filesystem_mixin.py +0 -46
- digitalkin-1.0.5.dev2/src/digitalkin/models/settings/grpc_client.py +0 -127
- digitalkin-1.0.5.dev2/src/digitalkin/models/settings/module.py +0 -31
- digitalkin-1.0.5.dev2/src/digitalkin/models/settings/resilience.py +0 -31
- digitalkin-1.0.5.dev2/src/digitalkin/services/communication/exceptions.py +0 -17
- digitalkin-1.0.5.dev2/src/digitalkin/services/filesystem/__init__.py +0 -7
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/LICENSE +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/README.md +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/setup.cfg +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/models.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/base.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/core/redis.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/loaded_tools.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/services/services.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/log.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/queue.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/registry.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/server/servicer.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/task_manager.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/utils/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/filesystem/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/default_secret.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/grpc_secret.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/secret/secret_strategy.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/setup/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/grpc_storage.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/exceptions.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/utils/setup_content_validator.py +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin.egg-info/top_level.txt +0 -0
- {digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/tests/test_exceptions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 1.0.5.
|
|
3
|
+
Version: 1.0.5.dev4
|
|
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.
|
|
456
|
+
Requires-Dist: agentic-mesh-protocol==1.0.2
|
|
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
|
|
@@ -10,7 +10,8 @@ from pydantic import BaseModel, Field
|
|
|
10
10
|
from digitalkin.logger import logger
|
|
11
11
|
from digitalkin.models.module import ModuleStatus
|
|
12
12
|
from digitalkin.modules.archetype_module import ArchetypeModule
|
|
13
|
-
from digitalkin.services.filesystem
|
|
13
|
+
from digitalkin.models.services.filesystem import FileType
|
|
14
|
+
from digitalkin.services.filesystem import FileFilter, UploadFileData
|
|
14
15
|
from digitalkin.services.services_config import ServicesConfig
|
|
15
16
|
from digitalkin.services.services_models import ServicesMode
|
|
16
17
|
|
|
@@ -118,9 +119,9 @@ class ExampleModule(ArchetypeModule[ExampleInput, ExampleOutput, ExampleSetup, E
|
|
|
118
119
|
file = UploadFileData(
|
|
119
120
|
content=b"%s\n%s" % (processed_message.encode(), str(processed_number).encode()),
|
|
120
121
|
name="example_output.txt",
|
|
121
|
-
|
|
122
|
+
type=FileType.DOCUMENT,
|
|
122
123
|
content_type="text/plain",
|
|
123
|
-
metadata={"
|
|
124
|
+
metadata={"sdk_created": True},
|
|
124
125
|
replace_if_exists=True,
|
|
125
126
|
)
|
|
126
127
|
|
|
@@ -176,10 +177,10 @@ async def test_module() -> None:
|
|
|
176
177
|
# Check the storage
|
|
177
178
|
if module.status == ModuleStatus.STOPPED:
|
|
178
179
|
files, _nb_results = await module.filesystem.get_files(
|
|
179
|
-
filters=FileFilter(
|
|
180
|
+
filters=FileFilter(names=["example_output.txt"]),
|
|
180
181
|
)
|
|
181
182
|
for file in files:
|
|
182
|
-
await module.filesystem.update_file(file.id,
|
|
183
|
+
await module.filesystem.update_file(file.id, type=FileType.OTHER)
|
|
183
184
|
# module.filesystem.delete_files(filters=FileFilter(name="example_output.txt", context="test-mission-123"), permanent=True)
|
|
184
185
|
|
|
185
186
|
logger.info("Retrieved file: %s with ID: %s", file.name, file.id)
|
|
@@ -188,7 +189,7 @@ async def test_module() -> None:
|
|
|
188
189
|
if file_record:
|
|
189
190
|
logger.info("File ID: %s", file_record.id)
|
|
190
191
|
logger.info("File name: %s", file_record.name)
|
|
191
|
-
logger.info("File type: %s", file_record.
|
|
192
|
+
logger.info("File type: %s", file_record.type)
|
|
192
193
|
logger.info("File status: %s", file_record.status)
|
|
193
194
|
logger.info("File content: %s", file_record.content.decode())
|
|
194
195
|
except Exception:
|
|
@@ -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.
|
|
34
|
+
"agentic-mesh-protocol==1.0.2",
|
|
35
35
|
"agno>=2.8.0,<3",
|
|
36
36
|
"anyio>=4.13.0",
|
|
37
37
|
"grpcio-health-checking==1.82.1",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"pydantic>=2.12.4",
|
|
42
42
|
"redis[hiredis]>=7.4.0,<9",
|
|
43
43
|
]
|
|
44
|
-
version = "1.0.5.
|
|
44
|
+
version = "1.0.5.dev4"
|
|
45
45
|
|
|
46
46
|
[project.optional-dependencies]
|
|
47
47
|
agno = [ "agno>=2.6" ]
|
|
@@ -208,15 +208,15 @@
|
|
|
208
208
|
]
|
|
209
209
|
|
|
210
210
|
ignore = [
|
|
211
|
-
"
|
|
212
|
-
"
|
|
213
|
-
"
|
|
214
|
-
"
|
|
215
|
-
"
|
|
216
|
-
"
|
|
217
|
-
"
|
|
218
|
-
"
|
|
219
|
-
"
|
|
211
|
+
"any-type", # Allow typing.Any — gRPC stubs, callbacks, and dynamic APIs require it
|
|
212
|
+
"missing-trailing-comma", # Disable because of formatter incompatibility
|
|
213
|
+
"docstring-extraneous-exception", # Allow extraneous-exception in docstring
|
|
214
|
+
"unused-import", # Allow unused imports — used for availability checks
|
|
215
|
+
"invalid-function-name", # Allow PascalCase methods — gRPC servicer convention
|
|
216
|
+
"import-outside-top-level", # Allow lazy imports — needed to break circular dependencies
|
|
217
|
+
"bad-dunder-method-name", # Allow __get_pydantic_core_schema__ — Pydantic dunder hook
|
|
218
|
+
"hardcoded-password-string", # Hardcoded-password
|
|
219
|
+
"suspicious-pickle-import", # Allow pickle import
|
|
220
220
|
]
|
|
221
221
|
|
|
222
222
|
fixable = [ "ALL" ]
|
|
@@ -226,40 +226,40 @@
|
|
|
226
226
|
|
|
227
227
|
[tool.ruff.lint.per-file-ignores]
|
|
228
228
|
"tests/**/*.py" = [
|
|
229
|
-
"
|
|
230
|
-
"
|
|
231
|
-
"
|
|
232
|
-
"
|
|
233
|
-
"
|
|
234
|
-
"
|
|
235
|
-
"
|
|
236
|
-
"
|
|
237
|
-
"
|
|
238
|
-
"
|
|
239
|
-
"
|
|
240
|
-
"
|
|
241
|
-
"
|
|
242
|
-
"
|
|
243
|
-
"
|
|
244
|
-
"
|
|
245
|
-
"
|
|
246
|
-
"
|
|
247
|
-
"
|
|
248
|
-
"
|
|
249
|
-
"
|
|
250
|
-
"
|
|
251
|
-
"
|
|
252
|
-
"
|
|
253
|
-
"
|
|
254
|
-
"
|
|
255
|
-
"
|
|
256
|
-
"
|
|
257
|
-
"
|
|
258
|
-
"
|
|
259
|
-
"
|
|
260
|
-
"
|
|
261
|
-
"
|
|
262
|
-
"
|
|
229
|
+
"missing-type-function-argument",
|
|
230
|
+
"missing-type-args",
|
|
231
|
+
"missing-type-kwargs",
|
|
232
|
+
"missing-return-type-undocumented-public-function",
|
|
233
|
+
"any-type",
|
|
234
|
+
"unused-function-argument",
|
|
235
|
+
"unused-method-argument",
|
|
236
|
+
"complex-structure",
|
|
237
|
+
"undocumented-public-module",
|
|
238
|
+
"undocumented-public-class",
|
|
239
|
+
"undocumented-public-method",
|
|
240
|
+
"undocumented-public-function",
|
|
241
|
+
"undocumented-public-init",
|
|
242
|
+
"undocumented-param",
|
|
243
|
+
"docstring-missing-returns",
|
|
244
|
+
"docstring-missing-exception",
|
|
245
|
+
"line-too-long",
|
|
246
|
+
"commented-out-code",
|
|
247
|
+
"boolean-type-hint-positional-argument",
|
|
248
|
+
"boolean-default-value-positional-argument",
|
|
249
|
+
"logging-f-string",
|
|
250
|
+
"invalid-function-name",
|
|
251
|
+
"try-except-in-loop",
|
|
252
|
+
"import-private-name",
|
|
253
|
+
"too-many-return-statements",
|
|
254
|
+
"too-many-branches",
|
|
255
|
+
"too-many-locals",
|
|
256
|
+
"too-many-statements",
|
|
257
|
+
"too-many-nested-blocks",
|
|
258
|
+
"magic-value-comparison",
|
|
259
|
+
"no-self-use",
|
|
260
|
+
"assert",
|
|
261
|
+
"private-member-access",
|
|
262
|
+
"raise-vanilla-class",
|
|
263
263
|
]
|
|
264
264
|
|
|
265
265
|
[tool.ruff.lint.pylint]
|
{digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/agno_adapter.py
RENAMED
|
@@ -676,6 +676,26 @@ class AgnoStreamAdapter:
|
|
|
676
676
|
self._closed_tool_call_ids.add(tool_call_id)
|
|
677
677
|
|
|
678
678
|
content = agno_event.content
|
|
679
|
+
if tool is not None and tool.tool_call_error:
|
|
680
|
+
# Agno flags a raised tool on the completed event, then sends a tool_call_error
|
|
681
|
+
# that the closed-id check drops — so the failure is surfaced here.
|
|
682
|
+
# TODO(validate): AGUI-TOOL-FAILED-STATUS a raised tool surfaces as ToolCallError, not success
|
|
683
|
+
logger.info(
|
|
684
|
+
"[VALIDATE AGUI-TOOL-FAILED-STATUS] tool %s (id=%s) failed: %s",
|
|
685
|
+
tool.tool_name,
|
|
686
|
+
tool_call_id,
|
|
687
|
+
tool.result,
|
|
688
|
+
)
|
|
689
|
+
return [
|
|
690
|
+
ToolCallErrorEvent(
|
|
691
|
+
event=AgentRunEvent.TOOL_CALL_ERROR,
|
|
692
|
+
tool=tool_info,
|
|
693
|
+
error_message=str(tool.result) if tool.result else None,
|
|
694
|
+
subagent_run_id=self._subagent_of(self._run_key),
|
|
695
|
+
timestamp=timestamp,
|
|
696
|
+
metadata=self._last_metadata,
|
|
697
|
+
)
|
|
698
|
+
]
|
|
679
699
|
return [
|
|
680
700
|
ToolCallCompletedEvent(
|
|
681
701
|
event=AgentRunEvent.TOOL_CALL_COMPLETED,
|
|
@@ -11,6 +11,7 @@ import json
|
|
|
11
11
|
import logging
|
|
12
12
|
from typing import TYPE_CHECKING, Any, ClassVar
|
|
13
13
|
|
|
14
|
+
from ag_ui.core.events import Interrupt, RunFinishedInterruptOutcome
|
|
14
15
|
from pydantic import BaseModel, ConfigDict, Field
|
|
15
16
|
|
|
16
17
|
from digitalkin.community.agno.models import PauseInfo
|
|
@@ -268,13 +269,14 @@ class HitlEvents:
|
|
|
268
269
|
run_id: str,
|
|
269
270
|
pending_tool_call_ids: list[str],
|
|
270
271
|
) -> None:
|
|
271
|
-
"""Emit an AG-UI ``RunFinished`` with
|
|
272
|
+
"""Emit an AG-UI ``RunFinished`` with an interrupt outcome.
|
|
272
273
|
|
|
273
274
|
This is the protocol signal telling the front "the run paused on a
|
|
274
|
-
client-side tool; execute it and reply with a ``ToolMessage``".
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
client-side tool; execute it and reply with a ``ToolMessage``". The
|
|
276
|
+
standard ``outcome={type: "interrupt"}`` carries one interrupt per pending
|
|
277
|
+
tool; the legacy ``result.status="awaiting_tool_result"`` is kept for
|
|
278
|
+
existing clients. When an AG-UI run is open, its state first moves the
|
|
279
|
+
tools to ``awaiting_input`` and the run to ``interrupted``.
|
|
278
280
|
|
|
279
281
|
Args:
|
|
280
282
|
context: Current module context.
|
|
@@ -291,11 +293,31 @@ class HitlEvents:
|
|
|
291
293
|
AgUiRunFinishedOutput,
|
|
292
294
|
)
|
|
293
295
|
|
|
296
|
+
run = context.agui_run
|
|
297
|
+
tools = run.state["tools"] if run is not None else {}
|
|
298
|
+
interrupts = [
|
|
299
|
+
Interrupt(
|
|
300
|
+
id=tool_call_id,
|
|
301
|
+
reason="tool_call",
|
|
302
|
+
tool_call_id=tool_call_id,
|
|
303
|
+
message=f"Waiting for the result of {tools.get(tool_call_id, {}).get('name') or 'a frontend tool'}",
|
|
304
|
+
)
|
|
305
|
+
for tool_call_id in pending_tool_call_ids
|
|
306
|
+
]
|
|
307
|
+
if run is not None and run.open:
|
|
308
|
+
run.open = False
|
|
309
|
+
await run.update(
|
|
310
|
+
context,
|
|
311
|
+
*((("tools", tid, "status"), "awaiting_input") for tid in pending_tool_call_ids if tid in tools),
|
|
312
|
+
(("interrupts",), [i.model_dump(mode="json", by_alias=True, exclude_none=True) for i in interrupts]),
|
|
313
|
+
(("run", "status"), "interrupted"),
|
|
314
|
+
)
|
|
294
315
|
output = AgUiOutput(
|
|
295
316
|
root=AgUiRunFinishedOutput(
|
|
296
317
|
event=AgUiRunFinishedEvent(
|
|
297
318
|
thread_id=thread_id,
|
|
298
319
|
run_id=run_id,
|
|
320
|
+
outcome=RunFinishedInterruptOutcome(interrupts=interrupts) if interrupts else None,
|
|
299
321
|
result={
|
|
300
322
|
"status": _AWAITING_STATUS,
|
|
301
323
|
"pending_tool_call_ids": pending_tool_call_ids,
|
{digitalkin-1.0.5.dev2 → digitalkin-1.0.5.dev4}/src/digitalkin/community/agno/module_toolkit.py
RENAMED
|
@@ -25,6 +25,7 @@ from digitalkin.logger import logger
|
|
|
25
25
|
from digitalkin.models.module import ModuleContext
|
|
26
26
|
from digitalkin.models.module.ag_ui import AgUiCustomEventOutput, AgUiOutput
|
|
27
27
|
from digitalkin.models.module.tool_cache import ToolDefinition, ToolModuleInfo
|
|
28
|
+
from digitalkin.services.communication.exceptions import ToolCallError
|
|
28
29
|
|
|
29
30
|
# Default timeout for tool calls in seconds
|
|
30
31
|
DEFAULT_TOOL_TIMEOUT_SECONDS = 300
|
|
@@ -265,7 +266,14 @@ class ModuleToolkit(DkToolkit):
|
|
|
265
266
|
# callbacks is a dict-driven SimpleNamespace (module_context.py:168);
|
|
266
267
|
# send_message may legitimately be absent outside a running job.
|
|
267
268
|
send_message = vars(context.callbacks).get("send_message")
|
|
269
|
+
value = event.get("value")
|
|
270
|
+
url = value.get("url") if isinstance(value, dict) else None
|
|
268
271
|
if send_message is None:
|
|
272
|
+
logger.warning(
|
|
273
|
+
"Dropped custom event '%s' url=%s: no send_message on the agent context",
|
|
274
|
+
event["name"],
|
|
275
|
+
url,
|
|
276
|
+
)
|
|
269
277
|
return
|
|
270
278
|
|
|
271
279
|
try:
|
|
@@ -275,10 +283,15 @@ class ModuleToolkit(DkToolkit):
|
|
|
275
283
|
await send_message(
|
|
276
284
|
AgUiOutput(
|
|
277
285
|
root=AgUiCustomEventOutput(
|
|
278
|
-
event=AgUiCustomEvent(name=event["name"], value=
|
|
286
|
+
event=AgUiCustomEvent(name=event["name"], value=value),
|
|
279
287
|
)
|
|
280
288
|
)
|
|
281
289
|
)
|
|
290
|
+
logger.info(
|
|
291
|
+
"Relayed custom event '%s' url=%s to the agent stream",
|
|
292
|
+
event["name"],
|
|
293
|
+
url,
|
|
294
|
+
)
|
|
282
295
|
except Exception:
|
|
283
296
|
logger.exception("Failed to relay custom event '%s' to the agent stream", event["name"])
|
|
284
297
|
|
|
@@ -467,6 +480,10 @@ class ModuleToolkit(DkToolkit):
|
|
|
467
480
|
Wraps the SDK module's async generator function into an async function
|
|
468
481
|
that Agno can consume, with proper error handling and response formatting.
|
|
469
482
|
|
|
483
|
+
A failure raises ``ToolCallError`` carrying the same JSON body a success-path caller
|
|
484
|
+
would have read: Agno hands ``str(exc)`` to the model unchanged and flags the call
|
|
485
|
+
``tool_call_error``, which is what marks the tool failed for the front.
|
|
486
|
+
|
|
470
487
|
Returns:
|
|
471
488
|
Async function that calls the SDK tool and returns a JSON result, or a
|
|
472
489
|
ToolResult when the tool returned images alongside its text output.
|
|
@@ -509,14 +526,14 @@ class ModuleToolkit(DkToolkit):
|
|
|
509
526
|
duration_ms = round((time.perf_counter() - start_time) * 1000, 2)
|
|
510
527
|
error_msg = f"Tool '{tool_name}' timed out after {timeout}s"
|
|
511
528
|
logger.warning("%s task_id=%s", error_msg, task_id)
|
|
512
|
-
|
|
529
|
+
raise ToolCallError(handle_failure(tool_name, error_msg, duration_ms))
|
|
513
530
|
|
|
514
531
|
except Exception as e:
|
|
515
532
|
outcome = "error"
|
|
516
533
|
duration_ms = round((time.perf_counter() - start_time) * 1000, 2)
|
|
517
534
|
error_msg = f"Failed to call tool '{tool_name}': {e!s}"
|
|
518
535
|
logger.warning("%s task_id=%s", error_msg, task_id, exc_info=True)
|
|
519
|
-
|
|
536
|
+
raise ToolCallError(handle_failure(tool_name, error_msg, duration_ms))
|
|
520
537
|
|
|
521
538
|
else:
|
|
522
539
|
call_timer.mark("gen_consume")
|
|
@@ -536,7 +553,7 @@ class ModuleToolkit(DkToolkit):
|
|
|
536
553
|
|
|
537
554
|
outcome = "no_success"
|
|
538
555
|
error_msg = ModuleToolkit._extract_error_message(error_frame)
|
|
539
|
-
|
|
556
|
+
raise ToolCallError(handle_failure(tool_name, error_msg, duration_ms))
|
|
540
557
|
|
|
541
558
|
finally:
|
|
542
559
|
call_timer.mark("respond")
|
|
@@ -23,6 +23,7 @@ from digitalkin.models.services.registry import (
|
|
|
23
23
|
|
|
24
24
|
if TYPE_CHECKING:
|
|
25
25
|
from digitalkin.community.agno.toolkits.registry.base import RegistryActionCtx
|
|
26
|
+
from digitalkin.models.services.registry import SetupSummary
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
class GetAction(RegistryAction):
|
|
@@ -124,23 +125,36 @@ class SearchAction(RegistryAction):
|
|
|
124
125
|
# would both contradict ``total_returned`` and, at exactly ``cap`` rows, promise an empty
|
|
125
126
|
# next page.
|
|
126
127
|
truncated = len(usable) > cap
|
|
127
|
-
rows = [
|
|
128
|
-
{
|
|
129
|
-
"setup_id": setup.setup_id,
|
|
130
|
-
"name": setup.name,
|
|
131
|
-
"module_name": setup.module_name,
|
|
132
|
-
"version": setup.setup_version,
|
|
133
|
-
# Echoed because they are filterable: a caller cannot use the ``tags``,
|
|
134
|
-
# ``visibilities`` or ``statuses`` filters without first seeing the values in use.
|
|
135
|
-
"tags": setup.tags,
|
|
136
|
-
"visibility": setup.visibility.value if setup.visibility else None,
|
|
137
|
-
"status": setup.status.value if setup.status else None,
|
|
138
|
-
"description": (setup.documentation or "")[: self._DOC_PREVIEW_CHARS],
|
|
139
|
-
}
|
|
140
|
-
for setup in usable[:cap]
|
|
141
|
-
]
|
|
128
|
+
rows = [self._row(setup) for setup in usable[:cap]]
|
|
142
129
|
return {"total_returned": len(rows), "truncated": truncated, "offset": self.offset, "setups": rows}
|
|
143
130
|
|
|
131
|
+
def _row(self, setup: SetupSummary) -> dict[str, Any]:
|
|
132
|
+
"""Trim one search hit to the fields a caller can act on.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
setup: The summary returned by the registry.
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
The rendered row.
|
|
139
|
+
"""
|
|
140
|
+
row: dict[str, Any] = {
|
|
141
|
+
"setup_id": setup.setup_id,
|
|
142
|
+
"name": setup.name,
|
|
143
|
+
"module_name": setup.module_name,
|
|
144
|
+
"version": setup.setup_version,
|
|
145
|
+
# Echoed because they are filterable: a caller cannot use the ``tags``,
|
|
146
|
+
# ``visibilities`` or ``statuses`` filters without first seeing the values in use.
|
|
147
|
+
"tags": setup.tags,
|
|
148
|
+
"visibility": setup.visibility.value if setup.visibility else None,
|
|
149
|
+
"status": setup.status.value if setup.status else None,
|
|
150
|
+
"description": (setup.documentation or "")[: self._DOC_PREVIEW_CHARS],
|
|
151
|
+
}
|
|
152
|
+
# Only service setups carry a map. Omitting the key rather than rendering an empty
|
|
153
|
+
# one keeps the feature out of the tools and kins surfaces entirely.
|
|
154
|
+
if setup.structure:
|
|
155
|
+
row["structure"] = setup.structure
|
|
156
|
+
return row
|
|
157
|
+
|
|
144
158
|
|
|
145
159
|
class UpdateAction(RegistryAction):
|
|
146
160
|
"""Update an instance: cut a new version of its configuration, and rename it.
|
|
@@ -166,6 +180,20 @@ class UpdateAction(RegistryAction):
|
|
|
166
180
|
"without changing what the instance currently serves, then activate it later with "
|
|
167
181
|
"``set_version``.",
|
|
168
182
|
)
|
|
183
|
+
documentation: str | None = Field(
|
|
184
|
+
default=None,
|
|
185
|
+
description="Free text describing what this instance is for, indexed by ``search``. "
|
|
186
|
+
"Omit to keep the text the instance already has; pass a string to replace it, or an "
|
|
187
|
+
"empty string to clear it.",
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
def _type_payload(self) -> dict[str, Any]: # ruff: ignore[no-self-use]
|
|
191
|
+
"""Fields this object type adds to the update.
|
|
192
|
+
|
|
193
|
+
Returns:
|
|
194
|
+
Nothing by default; ``services_manager`` overrides it to refresh the structure map.
|
|
195
|
+
"""
|
|
196
|
+
return {}
|
|
169
197
|
|
|
170
198
|
async def execute(self, ctx: RegistryActionCtx) -> Any:
|
|
171
199
|
"""Cut a new version of the setup's content and rename it.
|
|
@@ -184,6 +212,10 @@ class UpdateAction(RegistryAction):
|
|
|
184
212
|
"name": self.name,
|
|
185
213
|
"content": self.content,
|
|
186
214
|
"set_as_current": self.set_as_current,
|
|
215
|
+
"documentation": (
|
|
216
|
+
setup.current_setup_version.documentation if self.documentation is None else self.documentation
|
|
217
|
+
),
|
|
218
|
+
**self._type_payload(),
|
|
187
219
|
})
|
|
188
220
|
|
|
189
221
|
|
|
@@ -171,22 +171,23 @@ class RegistryAction(BaseAction[RegistryActionCtx], ABC):
|
|
|
171
171
|
|
|
172
172
|
writes: ClassVar[bool] = False
|
|
173
173
|
|
|
174
|
-
@field_validator("name", check_fields=False)
|
|
174
|
+
@field_validator("name", "documentation", check_fields=False)
|
|
175
175
|
@classmethod
|
|
176
|
-
def
|
|
177
|
-
"""Reject control characters in
|
|
176
|
+
def _text_has_no_control_chars(cls, value: str | None) -> str | None:
|
|
177
|
+
"""Reject control characters in user-facing free text so it fails loudly, not silently.
|
|
178
178
|
|
|
179
|
-
|
|
180
|
-
escape would reach persistence and be stripped there, altering the value without
|
|
181
|
-
the caller. Applies to any action declaring
|
|
179
|
+
``name`` and ``documentation`` bypass the content validator, so without this a NUL byte
|
|
180
|
+
or ANSI escape would reach persistence and be stripped there, altering the value without
|
|
181
|
+
telling the caller. Applies to any action declaring either (update, service create).
|
|
182
|
+
``None`` is the "leave unchanged" marker on update and has nothing to check.
|
|
182
183
|
|
|
183
184
|
Returns:
|
|
184
|
-
The
|
|
185
|
+
The value unchanged when clean.
|
|
185
186
|
|
|
186
187
|
Raises:
|
|
187
|
-
ValueError: The
|
|
188
|
+
ValueError: The value carries a control character.
|
|
188
189
|
"""
|
|
189
|
-
return SetupContentValidator.reject_control_chars(value)
|
|
190
|
+
return value if value is None else SetupContentValidator.reject_control_chars(value)
|
|
190
191
|
|
|
191
192
|
@field_validator("content", check_fields=False)
|
|
192
193
|
@classmethod
|
|
@@ -346,7 +347,11 @@ class RegistryObjectToolKit(DkToolkit):
|
|
|
346
347
|
Also echoes ``visibility`` back in the caller's vocabulary — the input enum is
|
|
347
348
|
``public``/``private``/``internal`` but the backend returns the proto name
|
|
348
349
|
``VISIBILITY_INTERNAL``, so a naive round-trip fails. Strip the prefix and
|
|
349
|
-
lower-case it so the field read back matches the field written.
|
|
350
|
+
lower-case it so the field read back matches the field written. Confined to the
|
|
351
|
+
model branch on purpose: every action carrying a real setup visibility returns a
|
|
352
|
+
``SetupData``, while the actions returning a plain dict return a *configuration*
|
|
353
|
+
(``load``) or its key map (``structure``), where a key called ``visibility`` is the
|
|
354
|
+
service's own data and rewriting it would corrupt what the caller asked for.
|
|
350
355
|
|
|
351
356
|
Args:
|
|
352
357
|
value: A Pydantic model, proto message, or plain scalar/collection.
|
|
@@ -134,7 +134,7 @@ class LoadToolAction(LoadAction):
|
|
|
134
134
|
)
|
|
135
135
|
return None
|
|
136
136
|
|
|
137
|
-
async def execute(self, ctx: LoadActionCtx) -> LoadOutcome: #
|
|
137
|
+
async def execute(self, ctx: LoadActionCtx) -> LoadOutcome: # ruff: ignore[complex-structure, too-many-return-statements] — each return is a distinct, LLM-readable outcome
|
|
138
138
|
"""Resolve the setup into a ModuleToolkit and append it to the live tool list.
|
|
139
139
|
|
|
140
140
|
Idempotent per ``setup_id``; never raises. The setup's family is read first so a
|
|
@@ -63,7 +63,7 @@ class LoadManager(DkToolkit):
|
|
|
63
63
|
"""
|
|
64
64
|
self._base_tools = base_tools
|
|
65
65
|
|
|
66
|
-
async def load_manager(self, action: LoadActions) -> str: #
|
|
66
|
+
async def load_manager(self, action: LoadActions) -> str: # ruff: ignore[unused-method-argument] — schema-only stub, never run
|
|
67
67
|
"""Load a discovered object into the agent so it becomes usable right now.
|
|
68
68
|
|
|
69
69
|
Loading is a two-step flow, and this is step two: first DISCOVER the object with its
|