digitalkin 1.0.0.dev4__tar.gz → 1.0.0.dev6__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.dev4 → digitalkin-1.0.0.dev6}/PKG-INFO +3 -3
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/pyproject.toml +3 -3
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/module_runner.py +8 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/proto_streams.py +9 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/gateway_servicer.py +83 -42
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/_base_module.py +8 -3
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/gateway_consumer.py +22 -9
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/PKG-INFO +3 -3
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/requires.txt +2 -2
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/LICENSE +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/README.md +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/services/filesystem_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/setup.cfg +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/agno_adapter.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/hitl.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/graceful_shutdown.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/session_reaper.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/watchdog.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/instrumented.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_checkpoint.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_streams.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/shadow.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_wrapper.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/gateway_constants.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/interceptors/circuit_breaker_interceptor.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/module_server.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/logger.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/agui_mixin.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/registry.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/consumer.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/redis.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/grpc_registry.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/grpc_setup.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/grpc_storage.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/SOURCES.txt +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/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.dev6
|
|
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,12 +453,12 @@ Requires-Python: >=3.10
|
|
|
453
453
|
Description-Content-Type: text/markdown
|
|
454
454
|
License-File: LICENSE
|
|
455
455
|
Requires-Dist: ag-ui-protocol>=0.1.18
|
|
456
|
-
Requires-Dist: agentic-mesh-protocol==1.0.0.
|
|
456
|
+
Requires-Dist: agentic-mesh-protocol==1.0.0.dev2
|
|
457
457
|
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.
|
|
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
|
|
@@ -28,16 +28,16 @@
|
|
|
28
28
|
|
|
29
29
|
dependencies = [
|
|
30
30
|
"ag-ui-protocol>=0.1.18",
|
|
31
|
-
"agentic-mesh-protocol==1.0.0.
|
|
31
|
+
"agentic-mesh-protocol==1.0.0.dev2",
|
|
32
32
|
"anyio>=4.13.0",
|
|
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.
|
|
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.dev6"
|
|
41
41
|
|
|
42
42
|
[project.optional-dependencies]
|
|
43
43
|
performance = [ "uvloop>=0.21" ]
|
{digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/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.dev4 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/gateway_servicer.py
RENAMED
|
@@ -78,7 +78,13 @@ class GatewayServicer:
|
|
|
78
78
|
|
|
79
79
|
@staticmethod
|
|
80
80
|
def _sentinel(seq: int, task_id: str, protocol: str, **fields: Any) -> Any:
|
|
81
|
-
"""Build a
|
|
81
|
+
"""Build a StreamClient carrying a control sentinel (server→client wire).
|
|
82
|
+
|
|
83
|
+
Under dev2 of agentic-mesh-protocol the Stream RPC is
|
|
84
|
+
``rpc Stream(stream StreamServer) returns (stream StreamClient)``,
|
|
85
|
+
so the server-side response type is ``StreamClient``. ``from_seq``
|
|
86
|
+
on StreamClient is the wire-equivalent of the old ``seq`` field
|
|
87
|
+
(same tag 1, same uint64).
|
|
82
88
|
|
|
83
89
|
``seq=0`` distinguishes gateway-emitted control entries (validation
|
|
84
90
|
errors, late-consumer rejections) from Redis-replayed entries
|
|
@@ -92,11 +98,11 @@ class GatewayServicer:
|
|
|
92
98
|
fields: Additional Struct fields under ``data.root``.
|
|
93
99
|
|
|
94
100
|
Returns:
|
|
95
|
-
|
|
101
|
+
StreamClient proto.
|
|
96
102
|
"""
|
|
97
103
|
s = struct_pb2.Struct()
|
|
98
104
|
s.update({"root": {"protocol": protocol, **fields}})
|
|
99
|
-
return gateway_pb2.
|
|
105
|
+
return gateway_pb2.StreamClient(from_seq=seq, task_id=task_id, data=s)
|
|
100
106
|
|
|
101
107
|
async def _fatal_close(self, task_id: str, code: str, message: str) -> AsyncGenerator:
|
|
102
108
|
"""Yield ``stream.error(fatal=true)`` then ``stream.end`` and return.
|
|
@@ -342,27 +348,35 @@ class GatewayServicer:
|
|
|
342
348
|
|
|
343
349
|
async def Stream( # noqa: C901, PLR0912
|
|
344
350
|
self,
|
|
345
|
-
request_iterator: AsyncIterator,
|
|
351
|
+
request_iterator: AsyncIterator[Any],
|
|
346
352
|
context: grpc.aio.ServicerContext, # noqa: ARG002
|
|
347
|
-
) -> AsyncGenerator:
|
|
348
|
-
"""BiDi: client sends
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
``
|
|
352
|
-
|
|
353
|
-
upstream input
|
|
354
|
-
|
|
355
|
-
|
|
353
|
+
) -> AsyncGenerator[Any, None]:
|
|
354
|
+
"""BiDi: client sends StreamServer messages, server yields StreamClient.
|
|
355
|
+
|
|
356
|
+
Dev2 of agentic-mesh-protocol defines the RPC as
|
|
357
|
+
``rpc Stream(stream StreamServer) returns (stream StreamClient)``.
|
|
358
|
+
The naming is inverted from intuition: ``StreamServer`` is the
|
|
359
|
+
message **sent to** the server (upstream input + resume cursor)
|
|
360
|
+
and ``StreamClient`` is the message **sent to** the client
|
|
361
|
+
(module output + lifecycle sentinels).
|
|
362
|
+
|
|
363
|
+
First StreamServer identifies the task (``task_id``), carries the
|
|
364
|
+
resume cursor in ``seq``, and carries the query in ``data``; the
|
|
365
|
+
Struct is delivered to the SDK module as its first input.
|
|
366
|
+
Subsequent StreamServer messages provide additional upstream input
|
|
367
|
+
(optional).
|
|
368
|
+
|
|
369
|
+
Server emits StreamClient per Redis stream entry. First entry is
|
|
356
370
|
``stream.start`` (seeded by StartStream); last is ``stream.end``.
|
|
357
371
|
Errors are emitted as ``stream.error(fatal=true)`` followed by
|
|
358
372
|
``stream.end`` — never via ``context.abort``.
|
|
359
373
|
|
|
360
374
|
Args:
|
|
361
|
-
request_iterator: BiDi stream of
|
|
375
|
+
request_iterator: BiDi stream of StreamServer from the client.
|
|
362
376
|
context: gRPC service context.
|
|
363
377
|
|
|
364
378
|
Yields:
|
|
365
|
-
|
|
379
|
+
StreamClient — sentinels and SDK module output.
|
|
366
380
|
"""
|
|
367
381
|
try:
|
|
368
382
|
first_msg = await anext(request_iterator)
|
|
@@ -370,7 +384,7 @@ class GatewayServicer:
|
|
|
370
384
|
return
|
|
371
385
|
|
|
372
386
|
task_id = first_msg.task_id
|
|
373
|
-
from_seq = first_msg.
|
|
387
|
+
from_seq = first_msg.seq
|
|
374
388
|
|
|
375
389
|
if validate_id(task_id, "task_id") is not None:
|
|
376
390
|
async for out in self._fatal_close(task_id, "INVALID_ARGUMENT", "invalid task_id"):
|
|
@@ -378,7 +392,7 @@ class GatewayServicer:
|
|
|
378
392
|
return
|
|
379
393
|
|
|
380
394
|
if from_seq > MAX_FROM_SEQ:
|
|
381
|
-
async for out in self._fatal_close(task_id, "INVALID_ARGUMENT", "
|
|
395
|
+
async for out in self._fatal_close(task_id, "INVALID_ARGUMENT", "seq out of range"):
|
|
382
396
|
yield out
|
|
383
397
|
return
|
|
384
398
|
|
|
@@ -516,17 +530,23 @@ class GatewayServicer:
|
|
|
516
530
|
no dict conversion, no JSON parsing. ~0.1-0.5ms per message
|
|
517
531
|
instead of ~3-8ms on the JSON path.
|
|
518
532
|
|
|
519
|
-
Yields
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
written by the
|
|
533
|
+
Yields ``StreamClient`` messages (the dev2 server→client wire
|
|
534
|
+
type). The ``from_seq`` field carries the monotonic sequence
|
|
535
|
+
number — same tag as the legacy ``StreamServer.seq``. Lifecycle
|
|
536
|
+
is encoded in ``data.root.protocol`` sentinels written by the
|
|
537
|
+
producer (``stream.start`` already seeded by StartStream;
|
|
538
|
+
``stream.end`` emitted explicitly below on reader EOS).
|
|
539
|
+
|
|
540
|
+
Callers that need a ``StreamServer`` (the dial-back outbound
|
|
541
|
+
direction) re-wrap each yielded message; both messages share
|
|
542
|
+
identical field tags so the conversion is a field rename.
|
|
523
543
|
|
|
524
544
|
Args:
|
|
525
545
|
task_id: Task reference ID.
|
|
526
546
|
from_seq: Resume point.
|
|
527
547
|
|
|
528
548
|
Yields:
|
|
529
|
-
|
|
549
|
+
StreamClient messages.
|
|
530
550
|
"""
|
|
531
551
|
t0 = time.perf_counter_ns()
|
|
532
552
|
reader = ProtoStreamReader(task_id, self._redis_client) # type: ignore[arg-type]
|
|
@@ -549,14 +569,22 @@ class GatewayServicer:
|
|
|
549
569
|
)
|
|
550
570
|
first = False
|
|
551
571
|
seq += 1
|
|
552
|
-
yield gateway_pb2.
|
|
572
|
+
yield gateway_pb2.StreamClient(from_seq=seq, task_id=task_id, data=struct_data)
|
|
553
573
|
|
|
554
574
|
# Reader exited because EOS was hit (Redis `{"eos": "true"}` marker is
|
|
555
575
|
# consumed silently by ProtoStreamReader). Emit an explicit stream.end
|
|
556
576
|
# sentinel so the wire contract is uniform: every stream ends with
|
|
557
577
|
# exactly one stream.end entry, regardless of how it concluded.
|
|
578
|
+
t_after_reader = time.perf_counter_ns()
|
|
558
579
|
seq += 1
|
|
559
580
|
yield self._sentinel(seq, task_id, "stream.end")
|
|
581
|
+
t_after_yield = time.perf_counter_ns()
|
|
582
|
+
logger.info(
|
|
583
|
+
"[close-debug] gateway_stream_end: reader_to_yield=%.2fms t_yielded_ns=%d task_id=%s",
|
|
584
|
+
(t_after_yield - t_after_reader) / 1e6,
|
|
585
|
+
t_after_yield,
|
|
586
|
+
task_id,
|
|
587
|
+
)
|
|
560
588
|
|
|
561
589
|
async def _dial_consumer( # noqa: C901, PLR0912, PLR0915
|
|
562
590
|
self,
|
|
@@ -569,16 +597,16 @@ class GatewayServicer:
|
|
|
569
597
|
|
|
570
598
|
Flow:
|
|
571
599
|
|
|
572
|
-
1. Send ``stream.init`` as the first ``
|
|
600
|
+
1. Send ``stream.init`` as the first ``StreamServer``.
|
|
573
601
|
2. Read the consumer's first ``StreamServer`` — that's the query.
|
|
574
602
|
3. Push the query onto ``session.input_queue`` so the dispatcher
|
|
575
603
|
unblocks (matches the M2M client-initiated path).
|
|
576
604
|
4. Concurrently:
|
|
577
605
|
|
|
578
|
-
- forward subsequent ``
|
|
606
|
+
- forward subsequent ``StreamClient`` messages from the
|
|
579
607
|
consumer → ``session.input_queue`` (multi-turn input).
|
|
580
608
|
- pull module outputs from ``_consume_from_redis`` and push
|
|
581
|
-
each as a ``
|
|
609
|
+
each as a ``StreamServer(task_id, from_seq=<seq>, data=…)``
|
|
582
610
|
to the consumer.
|
|
583
611
|
|
|
584
612
|
5. End cleanly when ``stream.end`` flows through.
|
|
@@ -646,12 +674,11 @@ class GatewayServicer:
|
|
|
646
674
|
try:
|
|
647
675
|
state = chan.get_state(try_to_connect=False)
|
|
648
676
|
return getattr(state, "name", str(state))
|
|
649
|
-
except Exception as exc:
|
|
677
|
+
except Exception as exc:
|
|
650
678
|
return f"err:{type(exc).__name__}"
|
|
651
679
|
|
|
652
680
|
logger.info(
|
|
653
|
-
"[dial-debug] channel_ready dt_init=%.3fms ch_state=%s "
|
|
654
|
-
"channel_id=%s ref_count=%d cache_keys=%d",
|
|
681
|
+
"[dial-debug] channel_ready dt_init=%.3fms ch_state=%s channel_id=%s ref_count=%d cache_keys=%d",
|
|
655
682
|
(t_stub - t_dial0) / 1e6,
|
|
656
683
|
_ch_state(comm._channel),
|
|
657
684
|
id(comm._channel),
|
|
@@ -669,19 +696,28 @@ class GatewayServicer:
|
|
|
669
696
|
await release()
|
|
670
697
|
return
|
|
671
698
|
|
|
672
|
-
#
|
|
673
|
-
#
|
|
674
|
-
|
|
675
|
-
|
|
699
|
+
# Dial-back contract under dev2's RPC signature
|
|
700
|
+
# ``Stream(stream StreamServer) returns (stream StreamClient)``:
|
|
701
|
+
# - gateway is the gRPC client and sends ``StreamServer``
|
|
702
|
+
# (module output + sentinels) on the request stream.
|
|
703
|
+
# - gateway receives ``StreamClient`` (query + follow-up upstream)
|
|
704
|
+
# on the response stream.
|
|
705
|
+
# ``_consume_from_redis`` yields ``StreamClient`` for the regular
|
|
706
|
+
# consumer-facing path; here we re-wrap each one into the
|
|
707
|
+
# ``StreamServer`` the dial-back wire expects (field tags are
|
|
708
|
+
# identical so it's a rename: ``from_seq`` → ``seq``).
|
|
709
|
+
init_struct = struct_pb2.Struct()
|
|
710
|
+
init_struct.update({"root": {"protocol": "stream.init"}})
|
|
711
|
+
init_server = gateway_pb2.StreamServer(seq=0, task_id=task_id, data=init_struct)
|
|
676
712
|
|
|
677
713
|
# Gate the output drain on the first upstream message arriving:
|
|
678
714
|
# the dispatcher can't produce anything until the query lands on
|
|
679
715
|
# session.input_queue, which happens when we receive the consumer's
|
|
680
|
-
# first
|
|
716
|
+
# first StreamClient reply (carrying the query).
|
|
681
717
|
output_started = asyncio.Event()
|
|
682
718
|
|
|
683
719
|
async def _outgoing() -> AsyncGenerator:
|
|
684
|
-
yield
|
|
720
|
+
yield init_server
|
|
685
721
|
logger.info(
|
|
686
722
|
"→ stream.init sent, waiting for consumer query before draining outputs",
|
|
687
723
|
extra={"task_id": task_id, "mission_id": mission_id, "setup_id": setup_id},
|
|
@@ -691,11 +727,11 @@ class GatewayServicer:
|
|
|
691
727
|
"✓ Output drain started — streaming module outputs to consumer",
|
|
692
728
|
extra={"task_id": task_id, "mission_id": mission_id, "setup_id": setup_id},
|
|
693
729
|
)
|
|
694
|
-
async for
|
|
695
|
-
yield gateway_pb2.
|
|
730
|
+
async for cli_msg in self._consume_from_redis(task_id, from_seq=0):
|
|
731
|
+
yield gateway_pb2.StreamServer(
|
|
696
732
|
task_id=task_id,
|
|
697
|
-
|
|
698
|
-
data=
|
|
733
|
+
seq=cli_msg.from_seq,
|
|
734
|
+
data=cli_msg.data,
|
|
699
735
|
)
|
|
700
736
|
|
|
701
737
|
async def _runner_fatal(code: str, message: str) -> None:
|
|
@@ -721,6 +757,12 @@ class GatewayServicer:
|
|
|
721
757
|
)
|
|
722
758
|
responses = stub.Stream(_outgoing(), timeout=DIAL_BACK_BIDI_TIMEOUT_S)
|
|
723
759
|
first = True
|
|
760
|
+
# `responses` items are deserialised by gRPC as the proto's
|
|
761
|
+
# response type (StreamServer), but per the dial-back contract
|
|
762
|
+
# the consumer is sending StreamClient bytes — the field tags
|
|
763
|
+
# match so reading `.data` / `.task_id` works either way. The
|
|
764
|
+
# consumer-emitted message is the query (first) or follow-up
|
|
765
|
+
# upstream input (subsequent).
|
|
724
766
|
async for upstream in responses:
|
|
725
767
|
if not (upstream.data and len(upstream.data.fields) > 0):
|
|
726
768
|
continue
|
|
@@ -781,8 +823,7 @@ class GatewayServicer:
|
|
|
781
823
|
except _GrpcUsageError:
|
|
782
824
|
t_fail = time.perf_counter_ns()
|
|
783
825
|
logger.warning(
|
|
784
|
-
"[dial-debug] UsageError raised dt_total=%.3fms dt_pre_to_call=%.3fms "
|
|
785
|
-
"ch_state=%s addr=%s",
|
|
826
|
+
"[dial-debug] UsageError raised dt_total=%.3fms dt_pre_to_call=%.3fms ch_state=%s addr=%s",
|
|
786
827
|
(t_fail - t_dial0) / 1e6,
|
|
787
828
|
(t_fail - t_pre_stream) / 1e6,
|
|
788
829
|
_ch_state(comm._channel),
|
|
@@ -832,5 +873,5 @@ class GatewayServicer:
|
|
|
832
873
|
removed = await self._registry.unregister(task_id)
|
|
833
874
|
if removed is not None:
|
|
834
875
|
await removed.teardown()
|
|
835
|
-
except Exception:
|
|
876
|
+
except Exception:
|
|
836
877
|
logger.exception("end-of-stream unregister failed", extra=log_extra)
|
|
@@ -618,7 +618,7 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
|
|
|
618
618
|
timer.mark("init_handlers")
|
|
619
619
|
|
|
620
620
|
self._prepared = True
|
|
621
|
-
timer.log("module.prepare", task_id=self.context.session.current_ids().get("
|
|
621
|
+
timer.log("module.prepare", task_id=self.context.session.current_ids().get("job_id", ""))
|
|
622
622
|
|
|
623
623
|
async def start(
|
|
624
624
|
self,
|
|
@@ -658,7 +658,7 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
|
|
|
658
658
|
self._status = ModuleStatus.FAILED
|
|
659
659
|
logger.exception("Error during module lifecyle")
|
|
660
660
|
finally:
|
|
661
|
-
timer.log("module.start", task_id=self.context.session.current_ids().get("
|
|
661
|
+
timer.log("module.start", task_id=self.context.session.current_ids().get("job_id", ""))
|
|
662
662
|
await self.stop()
|
|
663
663
|
|
|
664
664
|
async def stop(self) -> None:
|
|
@@ -694,12 +694,17 @@ class BaseModule( # Module SDK base class requires many public methods # noqa:
|
|
|
694
694
|
)
|
|
695
695
|
t3 = _t.perf_counter_ns()
|
|
696
696
|
self._status = ModuleStatus.STOPPED
|
|
697
|
+
ids = self.context.session.current_ids()
|
|
697
698
|
logger.info(
|
|
698
|
-
"module.stop: cleanup=%.
|
|
699
|
+
"[close-debug] module.stop: cleanup=%.2fms flush=%.2fms eos=%.2fms "
|
|
700
|
+
"total=%.2fms t_done_ns=%d task_id=%s mission_id=%s",
|
|
699
701
|
(t1 - t0) / 1e6,
|
|
700
702
|
(t2 - t1) / 1e6,
|
|
701
703
|
(t3 - t2) / 1e6,
|
|
702
704
|
(t3 - t0) / 1e6,
|
|
705
|
+
t3,
|
|
706
|
+
ids.get("job_id", ""),
|
|
707
|
+
ids.get("mission_id", ""),
|
|
703
708
|
)
|
|
704
709
|
except Exception:
|
|
705
710
|
self._status = ModuleStatus.FAILED
|
|
@@ -3,9 +3,15 @@
|
|
|
3
3
|
A *consumer* (UI, dev tool, eval harness, M2M caller) calls
|
|
4
4
|
``StartStream`` on the gateway with ``x-client-address`` metadata, then
|
|
5
5
|
serves a local ``GatewayService.Stream`` server that the gateway dials
|
|
6
|
-
back into.
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
back into. Dial-back contract (inverts the standard Stream RPC roles):
|
|
7
|
+
|
|
8
|
+
- gateway → consumer: ``StreamServer`` (``stream.init`` first, then
|
|
9
|
+
module outputs + lifecycle sentinels).
|
|
10
|
+
- consumer → gateway: ``StreamClient`` (the query as the first reply,
|
|
11
|
+
then any follow-up upstream input).
|
|
12
|
+
|
|
13
|
+
Wire-compatible with ``Stream(StreamClient) → StreamServer`` because both
|
|
14
|
+
messages share identical proto field tags.
|
|
9
15
|
|
|
10
16
|
Two construction modes:
|
|
11
17
|
|
|
@@ -132,10 +138,17 @@ class _TaskHandle:
|
|
|
132
138
|
class _DialBackServicer(gateway_service_pb2_grpc.GatewayServiceServicer):
|
|
133
139
|
"""Serves the gateway-initiated ``Stream`` BiDi.
|
|
134
140
|
|
|
135
|
-
|
|
141
|
+
Dial-back contract (inverts the standard Stream RPC roles): the
|
|
142
|
+
gateway emits ``StreamServer`` (module output + sentinels) and the
|
|
143
|
+
consumer (this servicer) replies with ``StreamClient`` (query +
|
|
144
|
+
follow-up upstream input). Wire-compatible with the proto's
|
|
145
|
+
``Stream(StreamClient) → StreamServer`` signature because both
|
|
146
|
+
messages share identical field tags.
|
|
147
|
+
|
|
148
|
+
Reads the first ``StreamServer`` (always ``stream.init``), looks up
|
|
136
149
|
the matching task, replies with the query as the first
|
|
137
|
-
``
|
|
138
|
-
payload onto the per-task output queue.
|
|
150
|
+
``StreamClient``, then forwards every subsequent ``StreamServer``
|
|
151
|
+
payload (module output) onto the per-task output queue.
|
|
139
152
|
"""
|
|
140
153
|
|
|
141
154
|
def __init__(self, registry: dict[str, _TaskHandle]) -> None:
|
|
@@ -143,9 +156,9 @@ class _DialBackServicer(gateway_service_pb2_grpc.GatewayServiceServicer):
|
|
|
143
156
|
|
|
144
157
|
async def Stream(
|
|
145
158
|
self,
|
|
146
|
-
request_iterator: AsyncIterator[gateway_pb2.
|
|
159
|
+
request_iterator: AsyncIterator[gateway_pb2.StreamServer],
|
|
147
160
|
context: grpc.aio.ServicerContext, # noqa: ARG002
|
|
148
|
-
) -> AsyncGenerator[gateway_pb2.
|
|
161
|
+
) -> AsyncGenerator[gateway_pb2.StreamClient, None]:
|
|
149
162
|
handle: _TaskHandle | None = None
|
|
150
163
|
try:
|
|
151
164
|
async for upstream in request_iterator:
|
|
@@ -157,7 +170,7 @@ class _DialBackServicer(gateway_service_pb2_grpc.GatewayServiceServicer):
|
|
|
157
170
|
extra={"task_id": upstream.task_id},
|
|
158
171
|
)
|
|
159
172
|
return
|
|
160
|
-
yield gateway_pb2.
|
|
173
|
+
yield gateway_pb2.StreamClient(task_id=handle.task_id, from_seq=0, data=handle.query)
|
|
161
174
|
continue
|
|
162
175
|
if upstream.data and len(upstream.data.fields) > 0:
|
|
163
176
|
await handle.output_queue.put(upstream.data)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 1.0.0.
|
|
3
|
+
Version: 1.0.0.dev6
|
|
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,12 +453,12 @@ Requires-Python: >=3.10
|
|
|
453
453
|
Description-Content-Type: text/markdown
|
|
454
454
|
License-File: LICENSE
|
|
455
455
|
Requires-Dist: ag-ui-protocol>=0.1.18
|
|
456
|
-
Requires-Dist: agentic-mesh-protocol==1.0.0.
|
|
456
|
+
Requires-Dist: agentic-mesh-protocol==1.0.0.dev2
|
|
457
457
|
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.
|
|
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
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
ag-ui-protocol>=0.1.18
|
|
2
|
-
agentic-mesh-protocol==1.0.0.
|
|
2
|
+
agentic-mesh-protocol==1.0.0.dev2
|
|
3
3
|
anyio>=4.13.0
|
|
4
4
|
grpcio-health-checking==1.80.0
|
|
5
5
|
grpcio-reflection==1.80.0
|
|
6
6
|
grpcio-status==1.80.0
|
|
7
|
-
pydantic>=2.
|
|
7
|
+
pydantic>=2.12.4
|
|
8
8
|
pydantic-settings>=2.14.0
|
|
9
9
|
redis[hiredis]<8,>=7.4.0
|
|
10
10
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/examples/base_server/server_async_insecure.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/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.dev4 → digitalkin-1.0.0.dev6}/examples/bench_module/triggers/message_trigger.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev4 → digitalkin-1.0.0.dev6}/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.dev4 → digitalkin-1.0.0.dev6}/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.dev4 → digitalkin-1.0.0.dev6}/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
|