digitalkin 1.0.0.dev5__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.dev5 → digitalkin-1.0.0.dev6}/PKG-INFO +2 -2
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/pyproject.toml +2 -2
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/gateway_servicer.py +76 -44
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/_base_module.py +6 -4
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/gateway_consumer.py +22 -9
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/PKG-INFO +2 -2
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/requires.txt +1 -1
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/LICENSE +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/README.md +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/echo_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/server.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/redis_demo/triggers/message_trigger.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/services/filesystem_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/setup.cfg +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/agno_adapter.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/community/agno/hitl.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/graceful_shutdown.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/session_reaper.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/watchdog.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/module_runner.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/instrumented.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_checkpoint.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_state.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/redis_streams.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/redis/shadow.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/task_wrapper.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/gateway_constants.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/interceptors/circuit_breaker_interceptor.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/module_server.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/logger.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/agui_mixin.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/registry.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/consumer.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/redis.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/grpc_registry.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/grpc_setup.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/grpc_storage.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/SOURCES.txt +0 -0
- {digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.0.dev5 → 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,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.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
|
|
@@ -28,7 +28,7 @@
|
|
|
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",
|
|
@@ -37,7 +37,7 @@
|
|
|
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.dev5 → 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,7 +569,7 @@ 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
|
|
@@ -560,8 +580,7 @@ class GatewayServicer:
|
|
|
560
580
|
yield self._sentinel(seq, task_id, "stream.end")
|
|
561
581
|
t_after_yield = time.perf_counter_ns()
|
|
562
582
|
logger.info(
|
|
563
|
-
"[close-debug] gateway_stream_end: reader_to_yield=%.2fms "
|
|
564
|
-
"t_yielded_ns=%d task_id=%s",
|
|
583
|
+
"[close-debug] gateway_stream_end: reader_to_yield=%.2fms t_yielded_ns=%d task_id=%s",
|
|
565
584
|
(t_after_yield - t_after_reader) / 1e6,
|
|
566
585
|
t_after_yield,
|
|
567
586
|
task_id,
|
|
@@ -578,16 +597,16 @@ class GatewayServicer:
|
|
|
578
597
|
|
|
579
598
|
Flow:
|
|
580
599
|
|
|
581
|
-
1. Send ``stream.init`` as the first ``
|
|
600
|
+
1. Send ``stream.init`` as the first ``StreamServer``.
|
|
582
601
|
2. Read the consumer's first ``StreamServer`` — that's the query.
|
|
583
602
|
3. Push the query onto ``session.input_queue`` so the dispatcher
|
|
584
603
|
unblocks (matches the M2M client-initiated path).
|
|
585
604
|
4. Concurrently:
|
|
586
605
|
|
|
587
|
-
- forward subsequent ``
|
|
606
|
+
- forward subsequent ``StreamClient`` messages from the
|
|
588
607
|
consumer → ``session.input_queue`` (multi-turn input).
|
|
589
608
|
- pull module outputs from ``_consume_from_redis`` and push
|
|
590
|
-
each as a ``
|
|
609
|
+
each as a ``StreamServer(task_id, from_seq=<seq>, data=…)``
|
|
591
610
|
to the consumer.
|
|
592
611
|
|
|
593
612
|
5. End cleanly when ``stream.end`` flows through.
|
|
@@ -655,12 +674,11 @@ class GatewayServicer:
|
|
|
655
674
|
try:
|
|
656
675
|
state = chan.get_state(try_to_connect=False)
|
|
657
676
|
return getattr(state, "name", str(state))
|
|
658
|
-
except Exception as exc:
|
|
677
|
+
except Exception as exc:
|
|
659
678
|
return f"err:{type(exc).__name__}"
|
|
660
679
|
|
|
661
680
|
logger.info(
|
|
662
|
-
"[dial-debug] channel_ready dt_init=%.3fms ch_state=%s "
|
|
663
|
-
"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",
|
|
664
682
|
(t_stub - t_dial0) / 1e6,
|
|
665
683
|
_ch_state(comm._channel),
|
|
666
684
|
id(comm._channel),
|
|
@@ -678,19 +696,28 @@ class GatewayServicer:
|
|
|
678
696
|
await release()
|
|
679
697
|
return
|
|
680
698
|
|
|
681
|
-
#
|
|
682
|
-
#
|
|
683
|
-
|
|
684
|
-
|
|
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)
|
|
685
712
|
|
|
686
713
|
# Gate the output drain on the first upstream message arriving:
|
|
687
714
|
# the dispatcher can't produce anything until the query lands on
|
|
688
715
|
# session.input_queue, which happens when we receive the consumer's
|
|
689
|
-
# first
|
|
716
|
+
# first StreamClient reply (carrying the query).
|
|
690
717
|
output_started = asyncio.Event()
|
|
691
718
|
|
|
692
719
|
async def _outgoing() -> AsyncGenerator:
|
|
693
|
-
yield
|
|
720
|
+
yield init_server
|
|
694
721
|
logger.info(
|
|
695
722
|
"→ stream.init sent, waiting for consumer query before draining outputs",
|
|
696
723
|
extra={"task_id": task_id, "mission_id": mission_id, "setup_id": setup_id},
|
|
@@ -700,11 +727,11 @@ class GatewayServicer:
|
|
|
700
727
|
"✓ Output drain started — streaming module outputs to consumer",
|
|
701
728
|
extra={"task_id": task_id, "mission_id": mission_id, "setup_id": setup_id},
|
|
702
729
|
)
|
|
703
|
-
async for
|
|
704
|
-
yield gateway_pb2.
|
|
730
|
+
async for cli_msg in self._consume_from_redis(task_id, from_seq=0):
|
|
731
|
+
yield gateway_pb2.StreamServer(
|
|
705
732
|
task_id=task_id,
|
|
706
|
-
|
|
707
|
-
data=
|
|
733
|
+
seq=cli_msg.from_seq,
|
|
734
|
+
data=cli_msg.data,
|
|
708
735
|
)
|
|
709
736
|
|
|
710
737
|
async def _runner_fatal(code: str, message: str) -> None:
|
|
@@ -730,6 +757,12 @@ class GatewayServicer:
|
|
|
730
757
|
)
|
|
731
758
|
responses = stub.Stream(_outgoing(), timeout=DIAL_BACK_BIDI_TIMEOUT_S)
|
|
732
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).
|
|
733
766
|
async for upstream in responses:
|
|
734
767
|
if not (upstream.data and len(upstream.data.fields) > 0):
|
|
735
768
|
continue
|
|
@@ -790,8 +823,7 @@ class GatewayServicer:
|
|
|
790
823
|
except _GrpcUsageError:
|
|
791
824
|
t_fail = time.perf_counter_ns()
|
|
792
825
|
logger.warning(
|
|
793
|
-
"[dial-debug] UsageError raised dt_total=%.3fms dt_pre_to_call=%.3fms "
|
|
794
|
-
"ch_state=%s addr=%s",
|
|
826
|
+
"[dial-debug] UsageError raised dt_total=%.3fms dt_pre_to_call=%.3fms ch_state=%s addr=%s",
|
|
795
827
|
(t_fail - t_dial0) / 1e6,
|
|
796
828
|
(t_fail - t_pre_stream) / 1e6,
|
|
797
829
|
_ch_state(comm._channel),
|
|
@@ -841,5 +873,5 @@ class GatewayServicer:
|
|
|
841
873
|
removed = await self._registry.unregister(task_id)
|
|
842
874
|
if removed is not None:
|
|
843
875
|
await removed.teardown()
|
|
844
|
-
except Exception:
|
|
876
|
+
except Exception:
|
|
845
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,15 +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
699
|
"[close-debug] module.stop: cleanup=%.2fms flush=%.2fms eos=%.2fms "
|
|
699
|
-
"total=%.2fms t_done_ns=%d task_id=%s",
|
|
700
|
+
"total=%.2fms t_done_ns=%d task_id=%s mission_id=%s",
|
|
700
701
|
(t1 - t0) / 1e6,
|
|
701
702
|
(t2 - t1) / 1e6,
|
|
702
703
|
(t3 - t2) / 1e6,
|
|
703
704
|
(t3 - t0) / 1e6,
|
|
704
705
|
t3,
|
|
705
|
-
|
|
706
|
+
ids.get("job_id", ""),
|
|
707
|
+
ids.get("mission_id", ""),
|
|
706
708
|
)
|
|
707
709
|
except Exception:
|
|
708
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,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.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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/examples/base_server/server_async_insecure.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev5 → 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.dev5 → digitalkin-1.0.0.dev6}/examples/bench_module/triggers/message_trigger.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev5 → 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.dev5 → 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.dev5 → 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
|
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/job_manager/base_job_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/profiling/task_profiler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/graceful_shutdown.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/session_reaper.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/resilience/task_supervisor.py
RENAMED
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/src/digitalkin/core/task_manager/module_runner.py
RENAMED
|
File without changes
|
{digitalkin-1.0.0.dev5 → digitalkin-1.0.0.dev6}/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
|