digitalkin 1.0.0.dev3__tar.gz → 1.0.0.dev5__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.0.dev3 → digitalkin-1.0.0.dev5}/PKG-INFO +2 -2
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/pyproject.toml +6 -6
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/job_manager/single_job_manager.py +9 -2
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/module_runner.py +8 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/proto_streams.py +9 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/gateway_constants.py +0 -2
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/gateway_servicer.py +9 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/stream_registry.py +12 -58
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/gateway.py +0 -1
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/_base_module.py +4 -1
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin.egg-info/PKG-INFO +2 -2
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin.egg-info/requires.txt +1 -1
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/LICENSE +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/README.md +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/services/filesystem_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/setup.cfg +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/community/agno/agno_adapter.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/community/agno/hitl.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/graceful_shutdown.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/session_reaper.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/watchdog.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/instrumented.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/redis_checkpoint.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/redis_streams.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/shadow.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/task_wrapper.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/interceptors/circuit_breaker_interceptor.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/module_server.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/logger.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/mixins/agui_mixin.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/services/registry.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/consumer.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/redis.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/communication/gateway_consumer.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/registry/grpc_registry.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/setup/grpc_setup.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/storage/grpc_storage.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin.egg-info/SOURCES.txt +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/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.0.
|
|
3
|
+
Version: 1.0.0.dev5
|
|
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
|
|
@@ -458,7 +458,7 @@ Requires-Dist: anyio>=4.13.0
|
|
|
458
458
|
Requires-Dist: grpcio-health-checking==1.80.0
|
|
459
459
|
Requires-Dist: grpcio-reflection==1.80.0
|
|
460
460
|
Requires-Dist: grpcio-status==1.80.0
|
|
461
|
-
Requires-Dist: pydantic>=2.12.
|
|
461
|
+
Requires-Dist: pydantic>=2.12.4
|
|
462
462
|
Requires-Dist: pydantic-settings>=2.14.0
|
|
463
463
|
Requires-Dist: redis[hiredis]<8,>=7.4.0
|
|
464
464
|
Provides-Extra: performance
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
"grpcio-health-checking==1.80.0",
|
|
34
34
|
"grpcio-reflection==1.80.0",
|
|
35
35
|
"grpcio-status==1.80.0",
|
|
36
|
-
"pydantic>=2.12.
|
|
36
|
+
"pydantic>=2.12.4",
|
|
37
37
|
"pydantic-settings>=2.14.0",
|
|
38
38
|
"redis[hiredis]>=7.4.0,<8",
|
|
39
39
|
]
|
|
40
|
-
version = "1.0.0.
|
|
40
|
+
version = "1.0.0.dev5"
|
|
41
41
|
|
|
42
42
|
[project.optional-dependencies]
|
|
43
43
|
performance = [ "uvloop>=0.21" ]
|
|
@@ -59,8 +59,8 @@
|
|
|
59
59
|
dev = [
|
|
60
60
|
"build>=1.5.0",
|
|
61
61
|
"bump-my-version>=1.3.0",
|
|
62
|
-
"cryptography>=
|
|
63
|
-
"mypy>=
|
|
62
|
+
"cryptography>=48.0.0",
|
|
63
|
+
"mypy>=2.0.0",
|
|
64
64
|
"pre-commit>=4.6.0",
|
|
65
65
|
"pyright>=1.1.409",
|
|
66
66
|
"ruff>=0.15.12",
|
|
@@ -68,8 +68,8 @@
|
|
|
68
68
|
"types-grpcio-health-checking>=1.0.0.20260408",
|
|
69
69
|
"types-grpcio-reflection>=1.0.0.20260408",
|
|
70
70
|
"types-grpcio>=1.0.0.20260408",
|
|
71
|
-
"types-protobuf>=7.34.1.
|
|
72
|
-
"typos>=1.
|
|
71
|
+
"types-protobuf>=7.34.1.20260503",
|
|
72
|
+
"typos>=1.46.0",
|
|
73
73
|
]
|
|
74
74
|
docs = [
|
|
75
75
|
"griffe-inherited-docstrings>=1.1.3",
|
|
@@ -83,6 +83,13 @@ class SingleJobManager(BaseJobManager[InputModelT, OutputModelT, SetupModelT]):
|
|
|
83
83
|
self._redis_client = redis_client
|
|
84
84
|
self._stream_writers: dict[str, RedisStreamWriter] = {}
|
|
85
85
|
|
|
86
|
+
# Pool one RedisTaskManager across all preload_instance calls.
|
|
87
|
+
# The class is task-id-stateless; its `_listener` is already a
|
|
88
|
+
# process-wide singleton via SharedRedisListener.get_or_create.
|
|
89
|
+
from digitalkin.services.task_manager.redis_task_manager import RedisTaskManager
|
|
90
|
+
|
|
91
|
+
self._task_manager_strategy = RedisTaskManager(self._redis_client)
|
|
92
|
+
|
|
86
93
|
async def start(self) -> None:
|
|
87
94
|
"""Start manager (no-op, no external connections needed)."""
|
|
88
95
|
|
|
@@ -273,7 +280,6 @@ class SingleJobManager(BaseJobManager[InputModelT, OutputModelT, SetupModelT]):
|
|
|
273
280
|
``(module, job_id, callback)`` — pass to ``run_preloaded``.
|
|
274
281
|
"""
|
|
275
282
|
from digitalkin.core.profiling.step_timer import StepTimer
|
|
276
|
-
from digitalkin.services.task_manager.redis_task_manager import RedisTaskManager
|
|
277
283
|
|
|
278
284
|
timer = StepTimer()
|
|
279
285
|
job_id = job_id or str(uuid.uuid4())
|
|
@@ -288,7 +294,8 @@ class SingleJobManager(BaseJobManager[InputModelT, OutputModelT, SetupModelT]):
|
|
|
288
294
|
)
|
|
289
295
|
timer.mark("factory_create")
|
|
290
296
|
|
|
291
|
-
|
|
297
|
+
# Reuse the pooled RedisTaskManager — task-id-stateless, safe to share.
|
|
298
|
+
module.context.task_manager = self._task_manager_strategy
|
|
292
299
|
timer.mark("redis_task_manager")
|
|
293
300
|
|
|
294
301
|
if callback is None:
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/module_runner.py
RENAMED
|
@@ -115,8 +115,16 @@ class ModuleRunner:
|
|
|
115
115
|
nonlocal first_logged
|
|
116
116
|
data = output_data.model_dump(mode="json")
|
|
117
117
|
if data.get("root", {}).get("protocol") == "stream.end":
|
|
118
|
+
t_eos_write_start = time.perf_counter_ns()
|
|
118
119
|
await self._redis_client.xadd(stream_key, {"eos": b"true"})
|
|
119
120
|
await self._redis_client.expire(stream_key, 60)
|
|
121
|
+
t_eos_write_end = time.perf_counter_ns()
|
|
122
|
+
logger.info(
|
|
123
|
+
"[close-debug] producer_eos_write: xadd_expire=%.2fms t_done_ns=%d task_id=%s",
|
|
124
|
+
(t_eos_write_end - t_eos_write_start) / 1e6,
|
|
125
|
+
t_eos_write_end,
|
|
126
|
+
task_id,
|
|
127
|
+
)
|
|
120
128
|
return
|
|
121
129
|
s = struct_pb2.Struct()
|
|
122
130
|
s.update(data)
|
|
@@ -369,11 +369,13 @@ class ProtoStreamReader:
|
|
|
369
369
|
"""
|
|
370
370
|
entries_since_save = 0
|
|
371
371
|
while True:
|
|
372
|
+
t_xread_start = time.perf_counter_ns()
|
|
372
373
|
result = await self._redis_client.xread(
|
|
373
374
|
{self._stream_key: self._last_id},
|
|
374
375
|
count=count,
|
|
375
376
|
block=block_ms,
|
|
376
377
|
)
|
|
378
|
+
t_xread_end = time.perf_counter_ns()
|
|
377
379
|
if not result:
|
|
378
380
|
continue
|
|
379
381
|
|
|
@@ -383,6 +385,13 @@ class ProtoStreamReader:
|
|
|
383
385
|
|
|
384
386
|
eos = fields.get(b"eos", b"")
|
|
385
387
|
if eos == b"true":
|
|
388
|
+
logger.info(
|
|
389
|
+
"[close-debug] reader_saw_eos: last_xread_block=%.2fms "
|
|
390
|
+
"t_seen_ns=%d task_id=%s",
|
|
391
|
+
(t_xread_end - t_xread_start) / 1e6,
|
|
392
|
+
t_xread_end,
|
|
393
|
+
self._task_id,
|
|
394
|
+
)
|
|
386
395
|
await self._save_cursor()
|
|
387
396
|
return
|
|
388
397
|
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/gateway_constants.py
RENAMED
|
@@ -19,7 +19,6 @@ _prof = ProfilingSettings()
|
|
|
19
19
|
# Redis Key Patterns (not configurable — structural)
|
|
20
20
|
# ══════════════════════════════════════════════════════════════════
|
|
21
21
|
|
|
22
|
-
REDIS_KEY_SESSION = "gateway:session:{task_id}"
|
|
23
22
|
REDIS_KEY_STREAM = "task:{task_id}:stream"
|
|
24
23
|
REDIS_KEY_INPUT_STREAM = "task:{task_id}:input"
|
|
25
24
|
REDIS_KEY_CURSOR = "task:{task_id}:cursor"
|
|
@@ -31,7 +30,6 @@ REDIS_KEY_SIGNAL_CHANNEL = "signal_ch:{task_id}"
|
|
|
31
30
|
|
|
32
31
|
MAX_STREAMS = _gw.max_streams
|
|
33
32
|
MAX_LOCAL_CACHE = _gw.max_local_cache
|
|
34
|
-
SESSION_STATE_TTL_S = _gw.session_state_ttl
|
|
35
33
|
DIAL_BACK_BIDI_TIMEOUT_S = _gw.dial_back_bidi_timeout_s
|
|
36
34
|
|
|
37
35
|
# ══════════════════════════════════════════════════════════════════
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/gateway_servicer.py
RENAMED
|
@@ -555,8 +555,17 @@ class GatewayServicer:
|
|
|
555
555
|
# consumed silently by ProtoStreamReader). Emit an explicit stream.end
|
|
556
556
|
# sentinel so the wire contract is uniform: every stream ends with
|
|
557
557
|
# exactly one stream.end entry, regardless of how it concluded.
|
|
558
|
+
t_after_reader = time.perf_counter_ns()
|
|
558
559
|
seq += 1
|
|
559
560
|
yield self._sentinel(seq, task_id, "stream.end")
|
|
561
|
+
t_after_yield = time.perf_counter_ns()
|
|
562
|
+
logger.info(
|
|
563
|
+
"[close-debug] gateway_stream_end: reader_to_yield=%.2fms "
|
|
564
|
+
"t_yielded_ns=%d task_id=%s",
|
|
565
|
+
(t_after_yield - t_after_reader) / 1e6,
|
|
566
|
+
t_after_yield,
|
|
567
|
+
task_id,
|
|
568
|
+
)
|
|
560
569
|
|
|
561
570
|
async def _dial_consumer( # noqa: C901, PLR0912, PLR0915
|
|
562
571
|
self,
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/stream_registry.py
RENAMED
|
@@ -6,10 +6,9 @@ bound to the dial-back asyncio task: the task's ``finally`` calls
|
|
|
6
6
|
``BaseException`` propagated past finally), the task done-callback
|
|
7
7
|
force-unregisters as a backstop.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
were getting cut off when their heartbeat zset entry went stale.
|
|
9
|
+
No Redis I/O on register/unregister — the gateway is fully local for
|
|
10
|
+
session lifecycle. The previous Redis session-state mirror had no readers
|
|
11
|
+
once the heartbeat reaper was retired.
|
|
13
12
|
"""
|
|
14
13
|
|
|
15
14
|
from __future__ import annotations
|
|
@@ -18,13 +17,10 @@ import asyncio
|
|
|
18
17
|
from collections import OrderedDict
|
|
19
18
|
from typing import TYPE_CHECKING, Any
|
|
20
19
|
|
|
21
|
-
from redis.exceptions import RedisError
|
|
22
|
-
|
|
23
20
|
from digitalkin.core.resilience.task_supervisor import log_unhandled
|
|
24
21
|
from digitalkin.grpc_servers.gateway_constants import (
|
|
25
22
|
MAX_LOCAL_CACHE,
|
|
26
23
|
MAX_STREAMS,
|
|
27
|
-
SESSION_STATE_TTL_S,
|
|
28
24
|
)
|
|
29
25
|
from digitalkin.logger import logger
|
|
30
26
|
|
|
@@ -32,62 +28,38 @@ if TYPE_CHECKING:
|
|
|
32
28
|
from digitalkin.core.task_manager.redis.redis_client import RedisClient
|
|
33
29
|
from digitalkin.grpc_servers.stream_session import StreamSession
|
|
34
30
|
|
|
35
|
-
# Lua: atomic session-state write on register.
|
|
36
|
-
# KEYS: [1]=session_key (empty string to skip)
|
|
37
|
-
# ARGV: [1]=setup_id, [2]=mission_id, [3]=session_ttl
|
|
38
|
-
# Returns 1 unconditionally — capacity is enforced process-locally now.
|
|
39
|
-
_LUA_REGISTER = """
|
|
40
|
-
local session_key = KEYS[1]
|
|
41
|
-
if session_key ~= '' then
|
|
42
|
-
redis.call('HSET', session_key, 'status', 'starting', 'setup_id', ARGV[1], 'mission_id', ARGV[2])
|
|
43
|
-
redis.call('EXPIRE', session_key, tonumber(ARGV[3]))
|
|
44
|
-
end
|
|
45
|
-
return 1
|
|
46
|
-
"""
|
|
47
|
-
|
|
48
31
|
|
|
49
32
|
class StreamRegistry:
|
|
50
33
|
"""Tracks active stream sessions per-instance + supervises spawned tasks.
|
|
51
34
|
|
|
52
35
|
Local dict is a bounded LRU cache of sessions with active BiDi
|
|
53
36
|
connections on this gateway instance. Capacity is enforced
|
|
54
|
-
process-locally against ``max_streams``.
|
|
55
|
-
mirrors session metadata for observability.
|
|
37
|
+
process-locally against ``max_streams``.
|
|
56
38
|
"""
|
|
57
39
|
|
|
58
40
|
_local_cache: OrderedDict[str, StreamSession]
|
|
59
41
|
_max_local: int
|
|
60
42
|
_max_streams: int
|
|
61
43
|
_monitored_tasks: set[asyncio.Task[Any]]
|
|
62
|
-
_redis_client: RedisClient
|
|
63
|
-
|
|
64
|
-
@staticmethod
|
|
65
|
-
def session_key(task_id: str) -> str:
|
|
66
|
-
"""Redis hash key for session metadata.
|
|
67
|
-
|
|
68
|
-
Returns:
|
|
69
|
-
Key in the format ``gateway:session:{task_id}``.
|
|
70
|
-
"""
|
|
71
|
-
return f"gateway:session:{task_id}"
|
|
72
44
|
|
|
73
45
|
def __init__(
|
|
74
46
|
self,
|
|
75
|
-
redis_client: RedisClient,
|
|
47
|
+
redis_client: RedisClient | None = None, # noqa: ARG002 — kept for back-compat with callers
|
|
76
48
|
max_streams: int = MAX_STREAMS,
|
|
77
49
|
max_local: int = MAX_LOCAL_CACHE,
|
|
78
50
|
) -> None:
|
|
79
51
|
"""Initialize the stream registry.
|
|
80
52
|
|
|
81
53
|
Args:
|
|
54
|
+
redis_client: Unused (kept for back-compat); the registry no
|
|
55
|
+
longer touches Redis on register/unregister.
|
|
82
56
|
max_streams: Maximum concurrent streams on this instance.
|
|
83
57
|
max_local: Maximum sessions cached locally on this instance.
|
|
84
|
-
redis_client: Redis client for the optional session-state mirror.
|
|
85
58
|
"""
|
|
86
59
|
self._local_cache = OrderedDict()
|
|
87
60
|
self._max_local = max_local
|
|
88
61
|
self._max_streams = max_streams
|
|
89
62
|
self._monitored_tasks = set()
|
|
90
|
-
self._redis_client = redis_client
|
|
91
63
|
|
|
92
64
|
@property
|
|
93
65
|
def active_count(self) -> int:
|
|
@@ -97,15 +69,15 @@ class StreamRegistry:
|
|
|
97
69
|
async def register(
|
|
98
70
|
self,
|
|
99
71
|
session: StreamSession,
|
|
100
|
-
setup_id: str = "",
|
|
101
|
-
mission_id: str = "",
|
|
72
|
+
setup_id: str = "", # noqa: ARG002 — accepted for back-compat with callers
|
|
73
|
+
mission_id: str = "", # noqa: ARG002 — accepted for back-compat with callers
|
|
102
74
|
) -> bool:
|
|
103
75
|
"""Register a new session. Capacity is enforced process-locally.
|
|
104
76
|
|
|
105
77
|
Args:
|
|
106
78
|
session: The stream session to register.
|
|
107
|
-
setup_id:
|
|
108
|
-
mission_id:
|
|
79
|
+
setup_id: Accepted for back-compat; no longer persisted to Redis.
|
|
80
|
+
mission_id: Accepted for back-compat; no longer persisted to Redis.
|
|
109
81
|
|
|
110
82
|
Returns:
|
|
111
83
|
True if registered, False if at capacity (this instance).
|
|
@@ -114,18 +86,6 @@ class StreamRegistry:
|
|
|
114
86
|
if len(self._local_cache) >= self._max_streams:
|
|
115
87
|
return False
|
|
116
88
|
|
|
117
|
-
# Optional: mirror session metadata to Redis for observability.
|
|
118
|
-
if setup_id:
|
|
119
|
-
try:
|
|
120
|
-
await self._redis_client.eval(
|
|
121
|
-
_LUA_REGISTER,
|
|
122
|
-
[self.session_key(session.task_id)],
|
|
123
|
-
[setup_id, mission_id, str(SESSION_STATE_TTL_S)],
|
|
124
|
-
)
|
|
125
|
-
except RedisError:
|
|
126
|
-
logger.exception("Redis session-state write failed: task_id=%s", session.task_id)
|
|
127
|
-
# Continue — local registration is enough.
|
|
128
|
-
|
|
129
89
|
# LRU cache — evict oldest if past max_local (separate from
|
|
130
90
|
# max_streams which gates new admissions above).
|
|
131
91
|
if len(self._local_cache) >= self._max_local:
|
|
@@ -151,7 +111,7 @@ class StreamRegistry:
|
|
|
151
111
|
return session
|
|
152
112
|
|
|
153
113
|
async def unregister(self, task_id: str) -> StreamSession | None:
|
|
154
|
-
"""Unregister a session
|
|
114
|
+
"""Unregister a session from the local cache.
|
|
155
115
|
|
|
156
116
|
Args:
|
|
157
117
|
task_id: Session to remove.
|
|
@@ -160,12 +120,6 @@ class StreamRegistry:
|
|
|
160
120
|
The removed session, or None if not found locally.
|
|
161
121
|
"""
|
|
162
122
|
session = self._local_cache.pop(task_id, None)
|
|
163
|
-
|
|
164
|
-
try:
|
|
165
|
-
await self._redis_client.delete(self.session_key(task_id))
|
|
166
|
-
except RedisError:
|
|
167
|
-
logger.exception("Redis session-state delete failed: task_id=%s", task_id)
|
|
168
|
-
|
|
169
123
|
if session is not None:
|
|
170
124
|
logger.debug("StreamRegistry.unregister: task_id=%s local=%d", task_id, len(self._local_cache))
|
|
171
125
|
return session
|
|
@@ -56,7 +56,6 @@ class GatewaySettings(BaseSettings):
|
|
|
56
56
|
|
|
57
57
|
max_streams: int = Field(default=20000, description="Max concurrent gateway sessions (per instance)")
|
|
58
58
|
max_local_cache: int = Field(default=5000, description="Max local session cache entries")
|
|
59
|
-
session_state_ttl: int = Field(default=3600, description="Session metadata TTL in seconds")
|
|
60
59
|
redis_health_timeout: float = Field(default=5.0, description="Redis health check timeout in seconds")
|
|
61
60
|
dial_back_bidi_timeout_s: float = Field(
|
|
62
61
|
default=300.0,
|
|
@@ -695,11 +695,14 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
|
|
|
695
695
|
t3 = _t.perf_counter_ns()
|
|
696
696
|
self._status = ModuleStatus.STOPPED
|
|
697
697
|
logger.info(
|
|
698
|
-
"module.stop: cleanup=%.
|
|
698
|
+
"[close-debug] module.stop: cleanup=%.2fms flush=%.2fms eos=%.2fms "
|
|
699
|
+
"total=%.2fms t_done_ns=%d task_id=%s",
|
|
699
700
|
(t1 - t0) / 1e6,
|
|
700
701
|
(t2 - t1) / 1e6,
|
|
701
702
|
(t3 - t2) / 1e6,
|
|
702
703
|
(t3 - t0) / 1e6,
|
|
704
|
+
t3,
|
|
705
|
+
self.context.session.current_ids().get("task_id", ""),
|
|
703
706
|
)
|
|
704
707
|
except Exception:
|
|
705
708
|
self._status = ModuleStatus.FAILED
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev5
|
|
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
|
|
@@ -458,7 +458,7 @@ Requires-Dist: anyio>=4.13.0
|
|
|
458
458
|
Requires-Dist: grpcio-health-checking==1.80.0
|
|
459
459
|
Requires-Dist: grpcio-reflection==1.80.0
|
|
460
460
|
Requires-Dist: grpcio-status==1.80.0
|
|
461
|
-
Requires-Dist: pydantic>=2.12.
|
|
461
|
+
Requires-Dist: pydantic>=2.12.4
|
|
462
462
|
Requires-Dist: pydantic-settings>=2.14.0
|
|
463
463
|
Requires-Dist: redis[hiredis]<8,>=7.4.0
|
|
464
464
|
Provides-Extra: performance
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/server_async_insecure.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/base_server/server_sync_insecure.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/bench_module/triggers/message_trigger.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/modules/archetype_with_tools_module.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/examples/redis_demo/triggers/message_trigger.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/community/agno/agno_adapter.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/job_manager/base_job_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/profiling/task_profiler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/graceful_shutdown.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/session_reaper.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/resilience/task_supervisor.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/redis/shadow.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/task_executor.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/task_session.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/core/task_manager/task_wrapper.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/interceptors/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/module_server.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/module_servicer.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/stream_error_codes.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/stream_session.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/__init__.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/circuit_breaker.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev3 → digitalkin-1.0.0.dev5}/src/digitalkin/grpc_servers/utils/exceptions.py
RENAMED
|
File without changes
|