digitalkin 1.0.5.dev6__tar.gz → 1.0.5.dev7__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/PKG-INFO +89 -144
- digitalkin-1.0.5.dev7/README.md +133 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/triggers/message_trigger.py +3 -3
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/modules/dynamic_setup_module.py +4 -1
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/echo_module.py +4 -1
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/server.py +3 -4
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/triggers/message_trigger.py +3 -3
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/pyproject.toml +4 -6
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/__version__.py +1 -1
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/__init__.py +11 -1
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/agno_adapter.py +113 -17
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/hitl.py +123 -86
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/models.py +96 -2
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/module_toolkit.py +69 -9
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/base.py +35 -4
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/action.py +27 -2
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/module_runner.py +17 -1
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/module_server.py +7 -1
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/mixins/agui_mixin.py +165 -23
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/events/agent_events.py +3 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/ag_ui.py +6 -48
- digitalkin-1.0.5.dev7/src/digitalkin/models/settings/agui.py +33 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/_base_module.py +19 -12
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/dynamic_schema.py +1 -1
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin.egg-info/PKG-INFO +89 -144
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin.egg-info/SOURCES.txt +1 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin.egg-info/requires.txt +1 -2
- digitalkin-1.0.5.dev6/README.md +0 -187
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/LICENSE +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/base_server/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/echo_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/models/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/models/input.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/models/output.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/models/secret.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/models/setup.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/server.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/triggers/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/modules/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/client.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/models/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/models/input.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/models/output.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/models/secret.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/models/setup.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/triggers/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/services/filesystem_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/services/storage_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/setup.cfg +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/agui_tools.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/chat_history.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/defaults.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/base.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/action.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/kins/kit.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/action.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/loader/kit.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/services/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/services/action.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/services/kit.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/action.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/registry/tools/kit.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/community/agno/toolkits/user_profile.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/profiling/step_timer.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/resilience/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/resilience/bulkhead.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/resilience/task_supervisor.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/redis/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/redis/proto_streams.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/redis/redis_client.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/redis/redis_idempotency.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/redis/redis_signal.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/gateway_servicer.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/interceptors/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/interceptors/permission.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/interceptors/request_ids.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/interceptors/validation.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/m2m_call_registry.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/stream_registry.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/stream_session.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/utils/circuit_breaker.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/grpc_servers/utils/validators.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/logger.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/core/redis.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/grpc_servers/circuit_breaker.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/grpc_servers/m2m.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/grpc_servers/stream_error_codes.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/knowledge_files.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/loaded_tools.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/services/filesystem.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/services/registry.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/services/services.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/certificate.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/client/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/client/channel.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/client/circuit_breaker.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/client/client.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/client/grpc.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/gateway.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/log.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/profiling.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/queue.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/redis.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/registry.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/resilience.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/server/servicer.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/task_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/utils/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/models/utils/dynamic_schema.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/py.typed +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/communication/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/cost/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/filesystem/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/registry/grpc_registry.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/secret/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/secret/default_secret.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/secret/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/secret/grpc_secret.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/secret/secret_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/setup/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/setup/grpc_setup.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/storage/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/storage/grpc_storage.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/task_manager/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/task_manager/redis_task_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/user_profile/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/env_manager.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/env_template.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/exceptions.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/json_structure.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin/utils/setup_content_validator.py +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/src/digitalkin.egg-info/top_level.txt +0 -0
- {digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/tests/test_exceptions.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: digitalkin
|
|
3
|
-
Version: 1.0.5.
|
|
3
|
+
Version: 1.0.5.dev7
|
|
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
|
|
@@ -452,9 +452,8 @@ Classifier: Topic :: Software Development :: Libraries
|
|
|
452
452
|
Requires-Python: >=3.10
|
|
453
453
|
Description-Content-Type: text/markdown
|
|
454
454
|
License-File: LICENSE
|
|
455
|
-
Requires-Dist: ag-ui-protocol==
|
|
455
|
+
Requires-Dist: ag-ui-protocol==1.0.0
|
|
456
456
|
Requires-Dist: agentic-mesh-protocol==1.2.0
|
|
457
|
-
Requires-Dist: agno<4,>=3.1.1
|
|
458
457
|
Requires-Dist: anyio>=4.13.0
|
|
459
458
|
Requires-Dist: cel-python>=0.5
|
|
460
459
|
Requires-Dist: grpcio-health-checking==1.82.1
|
|
@@ -474,190 +473,136 @@ Requires-Dist: viztracer>=1.1.1; extra == "profiling"
|
|
|
474
473
|
Requires-Dist: yappi>=1.7.6; extra == "profiling"
|
|
475
474
|
Dynamic: license-file
|
|
476
475
|
|
|
476
|
+
<!-- --8<-- [start:intro] -->
|
|
477
477
|
# DigitalKin Python SDK
|
|
478
478
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
[](https://github.com/DigitalKin-ai/digitalkin/blob/main/LICENSE)
|
|
479
|
+
`digitalkin` is the Python SDK for writing modules (tools and archetypes) of the DigitalKin agentic mesh.
|
|
480
|
+
You declare typed Pydantic contracts and trigger handlers; the SDK serves them over gRPC.
|
|
481
|
+
Each module process embeds a gateway that persists outputs to Redis Streams and pushes them to the consumer.
|
|
483
482
|
|
|
484
|
-
|
|
485
|
-
DigitalKin agentic mesh. Create custom **Tools** and **Archetypes** that
|
|
486
|
-
communicate over gRPC, register with a service mesh, and scale independently.
|
|
483
|
+
**What it is not**
|
|
487
484
|
|
|
488
|
-
|
|
485
|
+
- Not a standalone gateway process: the gateway runs inside each module server.
|
|
486
|
+
- Not a registry server: modules register with an external registry in remote mode.
|
|
487
|
+
- Not a client library: the consumer calls `StartStream` and hosts the dial-back `Stream` endpoint itself.
|
|
488
|
+
- Not the wire contract: protos come from the `agentic-mesh-protocol` package.
|
|
489
489
|
|
|
490
|
-
|
|
491
|
-
`grpcio` with full async support
|
|
492
|
-
- **Typed module contracts** — Pydantic models for Input, Output, Setup, and
|
|
493
|
-
Secret schemas with protocol-based trigger dispatch
|
|
494
|
-
- **Module-to-module communication** — tools and archetypes discover each other
|
|
495
|
-
via the registry and exchange requests over gRPC
|
|
496
|
-
- **Tool resolution** — archetypes dynamically resolve and invoke tool modules
|
|
497
|
-
at runtime
|
|
498
|
-
- **Admission queue & backpressure** — built-in request admission with
|
|
499
|
-
configurable concurrency limits
|
|
500
|
-
- **Healthcheck protocols** — automatic ping, services, and status healthcheck
|
|
501
|
-
triggers registered on every module
|
|
502
|
-
- **Profiling** — optional `[profiling]` extra with asyncio-inspector,
|
|
503
|
-
pyinstrument, viztracer, and yappi
|
|
504
|
-
- **Batched history writes** — efficient storage writes for conversation history
|
|
505
|
-
- **Redis Streams** — durable message passing, crash recovery, and reconnection
|
|
490
|
+
## Install
|
|
506
491
|
|
|
507
|
-
|
|
492
|
+
`uv add digitalkin` or `pip install digitalkin` (Python 3.10+); add `[agno]` for the Agno integration.
|
|
493
|
+
Extras: `agno` (Agno integration), `performance` (uvloop), `profiling`.
|
|
508
494
|
|
|
509
|
-
|
|
510
|
-
# With uv (recommended)
|
|
511
|
-
uv add digitalkin
|
|
512
|
-
|
|
513
|
-
# With pip
|
|
514
|
-
pip install digitalkin
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
**Optional extras:**
|
|
518
|
-
|
|
519
|
-
```bash
|
|
520
|
-
# Async profiling tools
|
|
521
|
-
uv add "digitalkin[profiling]"
|
|
522
|
-
|
|
523
|
-
# uvloop for faster event loop
|
|
524
|
-
uv add "digitalkin[performance]"
|
|
525
|
-
```
|
|
495
|
+
## Quick start
|
|
526
496
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
### 1. Define your models
|
|
497
|
+
Files: `echo_module.py`, `server.py`, `triggers/__init__.py`, `triggers/echo_trigger.py` (discovery imports `*_trigger.py`).
|
|
530
498
|
|
|
531
499
|
```python
|
|
500
|
+
# echo_module.py
|
|
501
|
+
from typing import Any, ClassVar, Literal
|
|
532
502
|
from pydantic import BaseModel
|
|
533
|
-
from digitalkin
|
|
534
|
-
|
|
503
|
+
from digitalkin import ModuleContext, ToolModule
|
|
504
|
+
from digitalkin.models.module import DataModel, DataTrigger, SetupModel
|
|
505
|
+
from digitalkin.utils.package_discover import ModuleDiscoverer
|
|
535
506
|
|
|
536
|
-
class
|
|
537
|
-
protocol:
|
|
538
|
-
|
|
507
|
+
class EchoIn(DataTrigger):
|
|
508
|
+
protocol: Literal["message"] = "message"
|
|
509
|
+
text: str
|
|
539
510
|
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
root: MessageInput
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
class MessageOutput(DataTrigger):
|
|
546
|
-
protocol: str = "message"
|
|
511
|
+
class EchoOut(DataTrigger):
|
|
512
|
+
protocol: Literal["message"] = "message"
|
|
547
513
|
reply: str
|
|
548
514
|
|
|
515
|
+
class EchoInput(DataModel[EchoIn]):
|
|
516
|
+
root: EchoIn
|
|
549
517
|
|
|
550
|
-
class
|
|
551
|
-
root:
|
|
552
|
-
```
|
|
553
|
-
|
|
554
|
-
### 2. Create a module and trigger
|
|
518
|
+
class EchoOutput(DataModel[EchoOut]):
|
|
519
|
+
root: EchoOut
|
|
555
520
|
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
from digitalkin.models.module.setup_types import SetupModel
|
|
521
|
+
class EchoSetup(SetupModel):
|
|
522
|
+
prefix: str = "echo: "
|
|
559
523
|
|
|
524
|
+
class EchoModule(ToolModule[EchoInput, EchoOutput, EchoSetup, BaseModel]):
|
|
525
|
+
name = "EchoModule"
|
|
526
|
+
description = "Echoes the input text."
|
|
527
|
+
input_format = EchoInput
|
|
528
|
+
output_format = EchoOutput
|
|
529
|
+
setup_format = EchoSetup
|
|
530
|
+
secret_format = BaseModel # no secrets
|
|
531
|
+
metadata: ClassVar[dict[str, Any]] = {"module_id": "modules:echo", "version": "0.1.0"}
|
|
532
|
+
services_config_params: ClassVar[dict[str, Any]] = {"storage": {"config": {}}, "cost": {"config": {}}}
|
|
533
|
+
triggers_discoverer = ModuleDiscoverer(packages=["triggers"])
|
|
560
534
|
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
pass
|
|
535
|
+
async def initialize(self, context: ModuleContext, setup_data: EchoSetup) -> None:
|
|
536
|
+
pass # open clients, build agents
|
|
564
537
|
|
|
565
|
-
async def cleanup(self
|
|
538
|
+
async def cleanup(self) -> None:
|
|
566
539
|
pass
|
|
540
|
+
```
|
|
567
541
|
|
|
542
|
+
```python
|
|
543
|
+
# triggers/echo_trigger.py
|
|
544
|
+
from digitalkin import ModuleContext, TriggerHandler
|
|
545
|
+
from echo_module import EchoIn, EchoModule, EchoOut, EchoOutput, EchoSetup
|
|
568
546
|
|
|
569
|
-
@
|
|
570
|
-
class
|
|
547
|
+
@EchoModule.register
|
|
548
|
+
class EchoTrigger(TriggerHandler):
|
|
571
549
|
protocol = "message"
|
|
572
|
-
input_format =
|
|
573
|
-
output_format =
|
|
574
|
-
|
|
575
|
-
def __init__(self, context: ModuleContext) -> None:
|
|
576
|
-
super().__init__(context)
|
|
550
|
+
input_format = EchoIn
|
|
551
|
+
output_format = EchoOut
|
|
577
552
|
|
|
578
|
-
async def handle(
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
setup_data: SetupModel,
|
|
582
|
-
context: ModuleContext,
|
|
583
|
-
) -> None:
|
|
584
|
-
output = OutputModel(root=MessageOutput(reply=f"Echo: {input_data.root.content}"))
|
|
585
|
-
await self.send_message(context, output)
|
|
553
|
+
async def handle(self, input_data: EchoIn, setup_data: EchoSetup, context: ModuleContext) -> None:
|
|
554
|
+
reply = EchoOut(reply=setup_data.prefix + input_data.text)
|
|
555
|
+
await context.callbacks.send_message(EchoOutput(root=reply))
|
|
586
556
|
```
|
|
587
557
|
|
|
588
|
-
### 3. Run the server
|
|
589
|
-
|
|
590
558
|
```python
|
|
559
|
+
# server.py
|
|
591
560
|
import asyncio
|
|
592
561
|
from digitalkin.grpc_servers.module_server import ModuleServer
|
|
562
|
+
from echo_module import EchoModule
|
|
593
563
|
|
|
594
564
|
async def main() -> None:
|
|
595
|
-
server = ModuleServer(
|
|
565
|
+
server = ModuleServer(EchoModule)
|
|
596
566
|
await server.start_async()
|
|
597
|
-
|
|
567
|
+
try:
|
|
568
|
+
await server.await_termination()
|
|
569
|
+
finally:
|
|
570
|
+
await server.stop_async()
|
|
598
571
|
|
|
599
572
|
asyncio.run(main())
|
|
600
573
|
```
|
|
601
574
|
|
|
602
|
-
## Redis Gateway
|
|
603
|
-
|
|
604
|
-
The embedded gateway enables real-time bidirectional communication between
|
|
605
|
-
modules via Redis Streams, with crash recovery and horizontal scaling.
|
|
606
|
-
|
|
607
|
-
- **Durable Streaming**: Output persisted to Redis Streams — reconnection via `from_seq`.
|
|
608
|
-
- **Zero-Copy Proto**: Binary proto serialization to Redis — no JSON intermediary.
|
|
609
|
-
- **Horizontal Scaling**: Each module instance embeds its own gateway. Scale by adding replicas behind a load balancer.
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
## Development
|
|
613
|
-
|
|
614
|
-
### Prerequisites
|
|
615
|
-
|
|
616
|
-
- Python 3.10+
|
|
617
|
-
- [uv](https://astral.sh/uv) — modern Python package management
|
|
618
|
-
- [Task](https://taskfile.dev/) — task runner
|
|
619
|
-
|
|
620
|
-
### Setup
|
|
621
|
-
|
|
622
575
|
```bash
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
task setup-dev
|
|
627
|
-
source .venv/bin/activate
|
|
576
|
+
docker compose -f examples/redis_demo/docker-compose.yml up -d # Redis on localhost:6379
|
|
577
|
+
SERVICE_MODE=local DIGITALKIN_REDIS_URL=redis://localhost:6379/0 python server.py
|
|
628
578
|
```
|
|
629
579
|
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
task linter # Format + lint (ruff) + type check (mypy)
|
|
634
|
-
task check # Linter + mypy + tests
|
|
635
|
-
task run-tests # Run pytest via Docker
|
|
636
|
-
task build-package # Build distribution
|
|
637
|
-
task bump-version -- patch|minor|major
|
|
580
|
+
The server listens on `SERVER_CHANNEL_HOST:SERVER_CHANNEL_PORT` (default `[::]:50055`).
|
|
581
|
+
`SERVICE_MODE=local` (or `-d LOCAL`) uses in-process services; remote mode (default) needs the variables in `.env.minimum`.
|
|
582
|
+
Consumers drive the module with the gateway RPCs described in the gateway protocol page.
|
|
638
583
|
|
|
639
|
-
|
|
640
|
-
task docs-build # Build docs
|
|
641
|
-
|
|
642
|
-
task generate-certificates # Generate mTLS certs for gRPC
|
|
643
|
-
task clean # Remove build artifacts + __pycache__
|
|
644
|
-
task clean-all # Above + remove .venv
|
|
645
|
-
```
|
|
584
|
+
<!-- --8<-- [end:intro] -->
|
|
646
585
|
|
|
647
|
-
|
|
586
|
+
## Documentation
|
|
648
587
|
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
588
|
+
| Topic | Page |
|
|
589
|
+
| --- | --- |
|
|
590
|
+
| Architecture, data and signal flow | [docs/architecture.md](docs/architecture.md) |
|
|
591
|
+
| Writing modules | [docs/module_authoring.md](docs/module_authoring.md) |
|
|
592
|
+
| Wire contracts | [docs/gateway_protocol.md](docs/gateway_protocol.md), [docs/agui_events.md](docs/agui_events.md) (AG-UI) |
|
|
593
|
+
| Deploy and tune | [docs/operations.md](docs/operations.md) |
|
|
594
|
+
| Environment variables | [docs/environment_variables.md](docs/environment_variables.md) |
|
|
595
|
+
| Testing | [docs/testing.md](docs/testing.md) |
|
|
596
|
+
| Changelog | [docs/changelog/index.md](docs/changelog/index.md) |
|
|
597
|
+
| API reference | [docs/api/api.md](docs/api/api.md) |
|
|
654
598
|
|
|
655
|
-
##
|
|
656
|
-
|
|
657
|
-
This project is licensed under the terms specified in the LICENSE file.
|
|
599
|
+
## Development
|
|
658
600
|
|
|
659
|
-
|
|
601
|
+
```bash
|
|
602
|
+
task setup-dev # venv, dev/docs/tests deps, pre-commit hooks
|
|
603
|
+
task check # ruff format + lint, mypy, tests
|
|
604
|
+
task run-tests # full suite in docker compose (needs Redis)
|
|
605
|
+
task docs-serve # mkdocs serve
|
|
606
|
+
```
|
|
660
607
|
|
|
661
|
-
|
|
662
|
-
report issues on our
|
|
663
|
-
[Issues page](https://github.com/DigitalKin-ai/digitalkin/issues).
|
|
608
|
+
License: [CC BY-NC-SA 4.0](LICENSE).
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
<!-- --8<-- [start:intro] -->
|
|
2
|
+
# DigitalKin Python SDK
|
|
3
|
+
|
|
4
|
+
`digitalkin` is the Python SDK for writing modules (tools and archetypes) of the DigitalKin agentic mesh.
|
|
5
|
+
You declare typed Pydantic contracts and trigger handlers; the SDK serves them over gRPC.
|
|
6
|
+
Each module process embeds a gateway that persists outputs to Redis Streams and pushes them to the consumer.
|
|
7
|
+
|
|
8
|
+
**What it is not**
|
|
9
|
+
|
|
10
|
+
- Not a standalone gateway process: the gateway runs inside each module server.
|
|
11
|
+
- Not a registry server: modules register with an external registry in remote mode.
|
|
12
|
+
- Not a client library: the consumer calls `StartStream` and hosts the dial-back `Stream` endpoint itself.
|
|
13
|
+
- Not the wire contract: protos come from the `agentic-mesh-protocol` package.
|
|
14
|
+
|
|
15
|
+
## Install
|
|
16
|
+
|
|
17
|
+
`uv add digitalkin` or `pip install digitalkin` (Python 3.10+); add `[agno]` for the Agno integration.
|
|
18
|
+
Extras: `agno` (Agno integration), `performance` (uvloop), `profiling`.
|
|
19
|
+
|
|
20
|
+
## Quick start
|
|
21
|
+
|
|
22
|
+
Files: `echo_module.py`, `server.py`, `triggers/__init__.py`, `triggers/echo_trigger.py` (discovery imports `*_trigger.py`).
|
|
23
|
+
|
|
24
|
+
```python
|
|
25
|
+
# echo_module.py
|
|
26
|
+
from typing import Any, ClassVar, Literal
|
|
27
|
+
from pydantic import BaseModel
|
|
28
|
+
from digitalkin import ModuleContext, ToolModule
|
|
29
|
+
from digitalkin.models.module import DataModel, DataTrigger, SetupModel
|
|
30
|
+
from digitalkin.utils.package_discover import ModuleDiscoverer
|
|
31
|
+
|
|
32
|
+
class EchoIn(DataTrigger):
|
|
33
|
+
protocol: Literal["message"] = "message"
|
|
34
|
+
text: str
|
|
35
|
+
|
|
36
|
+
class EchoOut(DataTrigger):
|
|
37
|
+
protocol: Literal["message"] = "message"
|
|
38
|
+
reply: str
|
|
39
|
+
|
|
40
|
+
class EchoInput(DataModel[EchoIn]):
|
|
41
|
+
root: EchoIn
|
|
42
|
+
|
|
43
|
+
class EchoOutput(DataModel[EchoOut]):
|
|
44
|
+
root: EchoOut
|
|
45
|
+
|
|
46
|
+
class EchoSetup(SetupModel):
|
|
47
|
+
prefix: str = "echo: "
|
|
48
|
+
|
|
49
|
+
class EchoModule(ToolModule[EchoInput, EchoOutput, EchoSetup, BaseModel]):
|
|
50
|
+
name = "EchoModule"
|
|
51
|
+
description = "Echoes the input text."
|
|
52
|
+
input_format = EchoInput
|
|
53
|
+
output_format = EchoOutput
|
|
54
|
+
setup_format = EchoSetup
|
|
55
|
+
secret_format = BaseModel # no secrets
|
|
56
|
+
metadata: ClassVar[dict[str, Any]] = {"module_id": "modules:echo", "version": "0.1.0"}
|
|
57
|
+
services_config_params: ClassVar[dict[str, Any]] = {"storage": {"config": {}}, "cost": {"config": {}}}
|
|
58
|
+
triggers_discoverer = ModuleDiscoverer(packages=["triggers"])
|
|
59
|
+
|
|
60
|
+
async def initialize(self, context: ModuleContext, setup_data: EchoSetup) -> None:
|
|
61
|
+
pass # open clients, build agents
|
|
62
|
+
|
|
63
|
+
async def cleanup(self) -> None:
|
|
64
|
+
pass
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
```python
|
|
68
|
+
# triggers/echo_trigger.py
|
|
69
|
+
from digitalkin import ModuleContext, TriggerHandler
|
|
70
|
+
from echo_module import EchoIn, EchoModule, EchoOut, EchoOutput, EchoSetup
|
|
71
|
+
|
|
72
|
+
@EchoModule.register
|
|
73
|
+
class EchoTrigger(TriggerHandler):
|
|
74
|
+
protocol = "message"
|
|
75
|
+
input_format = EchoIn
|
|
76
|
+
output_format = EchoOut
|
|
77
|
+
|
|
78
|
+
async def handle(self, input_data: EchoIn, setup_data: EchoSetup, context: ModuleContext) -> None:
|
|
79
|
+
reply = EchoOut(reply=setup_data.prefix + input_data.text)
|
|
80
|
+
await context.callbacks.send_message(EchoOutput(root=reply))
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```python
|
|
84
|
+
# server.py
|
|
85
|
+
import asyncio
|
|
86
|
+
from digitalkin.grpc_servers.module_server import ModuleServer
|
|
87
|
+
from echo_module import EchoModule
|
|
88
|
+
|
|
89
|
+
async def main() -> None:
|
|
90
|
+
server = ModuleServer(EchoModule)
|
|
91
|
+
await server.start_async()
|
|
92
|
+
try:
|
|
93
|
+
await server.await_termination()
|
|
94
|
+
finally:
|
|
95
|
+
await server.stop_async()
|
|
96
|
+
|
|
97
|
+
asyncio.run(main())
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
docker compose -f examples/redis_demo/docker-compose.yml up -d # Redis on localhost:6379
|
|
102
|
+
SERVICE_MODE=local DIGITALKIN_REDIS_URL=redis://localhost:6379/0 python server.py
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
The server listens on `SERVER_CHANNEL_HOST:SERVER_CHANNEL_PORT` (default `[::]:50055`).
|
|
106
|
+
`SERVICE_MODE=local` (or `-d LOCAL`) uses in-process services; remote mode (default) needs the variables in `.env.minimum`.
|
|
107
|
+
Consumers drive the module with the gateway RPCs described in the gateway protocol page.
|
|
108
|
+
|
|
109
|
+
<!-- --8<-- [end:intro] -->
|
|
110
|
+
|
|
111
|
+
## Documentation
|
|
112
|
+
|
|
113
|
+
| Topic | Page |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| Architecture, data and signal flow | [docs/architecture.md](docs/architecture.md) |
|
|
116
|
+
| Writing modules | [docs/module_authoring.md](docs/module_authoring.md) |
|
|
117
|
+
| Wire contracts | [docs/gateway_protocol.md](docs/gateway_protocol.md), [docs/agui_events.md](docs/agui_events.md) (AG-UI) |
|
|
118
|
+
| Deploy and tune | [docs/operations.md](docs/operations.md) |
|
|
119
|
+
| Environment variables | [docs/environment_variables.md](docs/environment_variables.md) |
|
|
120
|
+
| Testing | [docs/testing.md](docs/testing.md) |
|
|
121
|
+
| Changelog | [docs/changelog/index.md](docs/changelog/index.md) |
|
|
122
|
+
| API reference | [docs/api/api.md](docs/api/api.md) |
|
|
123
|
+
|
|
124
|
+
## Development
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
task setup-dev # venv, dev/docs/tests deps, pre-commit hooks
|
|
128
|
+
task check # ruff format + lint, mypy, tests
|
|
129
|
+
task run-tests # full suite in docker compose (needs Redis)
|
|
130
|
+
task docs-serve # mkdocs serve
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
License: [CC BY-NC-SA 4.0](LICENSE).
|
{digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/bench_module/triggers/message_trigger.py
RENAMED
|
@@ -5,7 +5,7 @@ from typing import ClassVar, Literal
|
|
|
5
5
|
|
|
6
6
|
from echo_module import EchoToolModule
|
|
7
7
|
from models.input import MessageInputPayload
|
|
8
|
-
from models.output import MessageOutputPayload
|
|
8
|
+
from models.output import EchoOutput, MessageOutputPayload
|
|
9
9
|
from models.setup import EchoSetup
|
|
10
10
|
|
|
11
11
|
from digitalkin.models.module import ModuleContext
|
|
@@ -56,8 +56,8 @@ class MessageTrigger(TriggerHandler):
|
|
|
56
56
|
result = f"{setup_data.prefix}{result}"
|
|
57
57
|
chunk = f"[{i + 1}/{repeat}] {result}"
|
|
58
58
|
|
|
59
|
-
output = MessageOutputPayload(response=chunk)
|
|
60
|
-
await
|
|
59
|
+
output = EchoOutput(root=MessageOutputPayload(response=chunk))
|
|
60
|
+
await context.callbacks.send_message(output)
|
|
61
61
|
|
|
62
62
|
if i < repeat - 1 and delay_s > 0:
|
|
63
63
|
await asyncio.sleep(delay_s)
|
|
@@ -255,7 +255,10 @@ class DynamicSetupModule(
|
|
|
255
255
|
|
|
256
256
|
# Services configuration (empty for this example)
|
|
257
257
|
services_config_strategies: ClassVar[dict[str, ServicesStrategy | None]] = {}
|
|
258
|
-
services_config_params: ClassVar[dict[str, dict[str, Any | None] | None]] = {
|
|
258
|
+
services_config_params: ClassVar[dict[str, dict[str, Any | None] | None]] = {
|
|
259
|
+
"storage": {"config": {}},
|
|
260
|
+
"cost": {"config": {}},
|
|
261
|
+
}
|
|
259
262
|
|
|
260
263
|
async def initialize(self, context: ModuleContext, setup_data: DynamicAgentSetup) -> None:
|
|
261
264
|
"""Initialize the module with setup data.
|
|
@@ -35,7 +35,10 @@ class EchoToolModule(ToolModule[EchoInput, EchoOutput, EchoSetup, EchoSecret]):
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
services_config_strategies: ClassVar[dict[str, Any]] = {}
|
|
38
|
-
services_config_params: ClassVar[dict[str, Any]] = {
|
|
38
|
+
services_config_params: ClassVar[dict[str, Any]] = {
|
|
39
|
+
"storage": {"config": {}},
|
|
40
|
+
"cost": {"config": {}},
|
|
41
|
+
}
|
|
39
42
|
|
|
40
43
|
triggers_discoverer = ModuleDiscoverer(packages=["triggers"])
|
|
41
44
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""EchoModule server — same pattern as template-tool.
|
|
2
2
|
|
|
3
|
-
Uses ModuleServer
|
|
3
|
+
Uses ModuleServer, which embeds the GatewayServicer.
|
|
4
4
|
Server config via env vars (ServerSettings from pydantic-settings):
|
|
5
5
|
SERVER_CHANNEL_HOST, SERVER_CHANNEL_PORT, SERVER_CHANNEL_SECURITY, etc.
|
|
6
6
|
|
|
@@ -9,10 +9,9 @@ Usage:
|
|
|
9
9
|
docker compose -f examples/redis_demo/docker-compose.yml up -d
|
|
10
10
|
|
|
11
11
|
# 2. Set env and start:
|
|
12
|
-
DIGITALKIN_REDIS_URL=redis://localhost:6379/0 python examples/redis_demo/server.py
|
|
12
|
+
SERVICE_MODE=local DIGITALKIN_REDIS_URL=redis://localhost:6379/0 python examples/redis_demo/server.py
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
python examples/redis_demo/client.py full --prompt "Hello world"
|
|
14
|
+
A consumer then calls StartStream; see docs/gateway_protocol.md.
|
|
16
15
|
"""
|
|
17
16
|
|
|
18
17
|
import asyncio
|
{digitalkin-1.0.5.dev6 → digitalkin-1.0.5.dev7}/examples/redis_demo/triggers/message_trigger.py
RENAMED
|
@@ -7,7 +7,7 @@ from digitalkin.models.module import ModuleContext
|
|
|
7
7
|
from digitalkin.modules.trigger_handler import TriggerHandler
|
|
8
8
|
|
|
9
9
|
from models.input import MessageInputPayload
|
|
10
|
-
from models.output import MessageOutputPayload
|
|
10
|
+
from models.output import EchoOutput, MessageOutputPayload
|
|
11
11
|
from models.setup import EchoSetup
|
|
12
12
|
from echo_module import EchoToolModule
|
|
13
13
|
|
|
@@ -56,8 +56,8 @@ class MessageTrigger(TriggerHandler):
|
|
|
56
56
|
result = f"{setup_data.prefix}{result}"
|
|
57
57
|
chunk = f"[{i + 1}/{repeat}] {result}"
|
|
58
58
|
|
|
59
|
-
output = MessageOutputPayload(response=chunk)
|
|
60
|
-
await
|
|
59
|
+
output = EchoOutput(root=MessageOutputPayload(response=chunk))
|
|
60
|
+
await context.callbacks.send_message(output)
|
|
61
61
|
|
|
62
62
|
if i < repeat - 1 and delay_s > 0:
|
|
63
63
|
await asyncio.sleep(delay_s)
|
|
@@ -27,12 +27,8 @@
|
|
|
27
27
|
]
|
|
28
28
|
|
|
29
29
|
dependencies = [
|
|
30
|
-
|
|
31
|
-
# which is how a nested run's output is attributed to its author. Pinned exactly
|
|
32
|
-
# because it is a dated prerelease; move to >=0.1.21 once that ships stable.
|
|
33
|
-
"ag-ui-protocol==0.1.21.dev1787220377",
|
|
30
|
+
"ag-ui-protocol==1.0.0",
|
|
34
31
|
"agentic-mesh-protocol==1.2.0",
|
|
35
|
-
"agno>=3.1.1,<4",
|
|
36
32
|
"anyio>=4.13.0",
|
|
37
33
|
"cel-python>=0.5",
|
|
38
34
|
"grpcio-health-checking==1.82.1",
|
|
@@ -43,7 +39,7 @@
|
|
|
43
39
|
"pydantic>=2.12.4",
|
|
44
40
|
"redis[hiredis]>=7.4.0,<9",
|
|
45
41
|
]
|
|
46
|
-
version = "1.0.5.
|
|
42
|
+
version = "1.0.5.dev7"
|
|
47
43
|
|
|
48
44
|
[project.optional-dependencies]
|
|
49
45
|
agno = [ "agno>=3.1.1,<4" ]
|
|
@@ -64,6 +60,7 @@ version = "1.0.5.dev6"
|
|
|
64
60
|
|
|
65
61
|
[dependency-groups]
|
|
66
62
|
dev = [
|
|
63
|
+
"agno>=3.1.1,<4",
|
|
67
64
|
"build>=1.5.0",
|
|
68
65
|
"bump-my-version>=1.3.0",
|
|
69
66
|
"cryptography>=48.0.0",
|
|
@@ -103,6 +100,7 @@ version = "1.0.5.dev6"
|
|
|
103
100
|
"tomli>=2.4.1",
|
|
104
101
|
]
|
|
105
102
|
tests = [
|
|
103
|
+
"agno>=3.1.1,<4",
|
|
106
104
|
"fakeredis[lua]>=2.35.1",
|
|
107
105
|
"freezegun>=1.5.5",
|
|
108
106
|
"grpcio-testing>=1.81.0",
|
|
@@ -12,6 +12,8 @@ on top of the Agno agent framework. Exports:
|
|
|
12
12
|
paused Agno run via the module's
|
|
13
13
|
:class:`~digitalkin.services.storage.StorageStrategy` and resumes it
|
|
14
14
|
when the front replies with a ``ToolMessage``.
|
|
15
|
+
- :class:`AgUiStreamInput` — AG-UI 1.0 run input trigger; upgrades legacy
|
|
16
|
+
``binary`` attachments to 1.0 media parts.
|
|
15
17
|
- :class:`ToolCallMetadata`, :class:`ToolOutputMetadata` — metadata models
|
|
16
18
|
for module tool calls made through the toolkit.
|
|
17
19
|
|
|
@@ -36,10 +38,18 @@ from digitalkin.community.agno.hitl import (
|
|
|
36
38
|
PausedRunRecord,
|
|
37
39
|
PausedRunStore,
|
|
38
40
|
)
|
|
39
|
-
from digitalkin.community.agno.models import
|
|
41
|
+
from digitalkin.community.agno.models import (
|
|
42
|
+
AgUiRunInput,
|
|
43
|
+
AgUiStreamInput,
|
|
44
|
+
PauseInfo,
|
|
45
|
+
ToolCallMetadata,
|
|
46
|
+
ToolOutputMetadata,
|
|
47
|
+
)
|
|
40
48
|
|
|
41
49
|
__all__ = [
|
|
42
50
|
"HITL_STORAGE_CONFIG",
|
|
51
|
+
"AgUiRunInput",
|
|
52
|
+
"AgUiStreamInput",
|
|
43
53
|
"AgnoHitlRunner",
|
|
44
54
|
"AgnoStreamAdapter",
|
|
45
55
|
"AguiTools",
|