digitalkin 0.4.0.dev1__tar.gz → 0.4.1.dev1__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-0.4.0.dev1 → digitalkin-0.4.1.dev1}/PKG-INFO +1 -1
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/pyproject.toml +1 -1
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/__version__.py +1 -1
- digitalkin-0.4.1.dev1/src/digitalkin/community/agno/__init__.py +43 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/community/agno/agno_adapter.py +99 -0
- digitalkin-0.4.1.dev1/src/digitalkin/community/agno/agui_tools.py +122 -0
- digitalkin-0.4.1.dev1/src/digitalkin/community/agno/hitl.py +860 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin.egg-info/PKG-INFO +1 -1
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin.egg-info/SOURCES.txt +2 -0
- digitalkin-0.4.0.dev1/src/digitalkin/community/agno/__init__.py +0 -9
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/LICENSE +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/README.md +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/base_server/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/modules/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/services/filesystem_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/examples/services/storage_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/setup.cfg +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/job_manager/taskiq_broker.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/job_manager/taskiq_job_manager.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/profiling/asyncio_monitor.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/module_server.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/logger.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/agui_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/callback_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/chat_history_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/events/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/events/agent_events.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/services/registry.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/settings/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/settings/server/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/settings/server/channel.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/settings/server/grpc.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/settings/server/server.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/settings/utils/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/models/settings/utils/channel.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/_base_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/py.typed +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/agent/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/agent/agent_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/agent/default_agent.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/registry/grpc_registry.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/setup/grpc_setup.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/snapshot/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/snapshot/default_snapshot.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/snapshot/snapshot_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/storage/grpc_storage.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/task_manager/grpc_task_manager.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin.egg-info/requires.txt +0 -0
- {digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""Agno framework integration for DigitalKin.
|
|
2
|
+
|
|
3
|
+
Adapters, converters, and HITL helpers for building DigitalKin modules
|
|
4
|
+
on top of the Agno agent framework. Exports:
|
|
5
|
+
|
|
6
|
+
- :class:`AgnoStreamAdapter` — Agno streaming events → DigitalKin events.
|
|
7
|
+
- :func:`agui_tool_to_external_function` / :func:`make_tools_factory` —
|
|
8
|
+
register AG-UI client-side (frontend) tools as Agno external Functions.
|
|
9
|
+
- :class:`AgnoHitlRunner`, :class:`PausedRunStore`, :class:`PauseInfo`,
|
|
10
|
+
:class:`PausedRunRecord`, :data:`HITL_STORAGE_CONFIG`,
|
|
11
|
+
:func:`emit_awaiting_tool_result` — human-in-the-loop (HITL) runner
|
|
12
|
+
that persists a paused Agno run via the module's
|
|
13
|
+
:class:`~digitalkin.services.storage.StorageStrategy` and resumes it
|
|
14
|
+
when the front replies with a ``ToolMessage``.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from digitalkin.community.agno.agno_adapter import AgnoStreamAdapter
|
|
18
|
+
from digitalkin.community.agno.agui_tools import (
|
|
19
|
+
agui_tool_to_external_function,
|
|
20
|
+
make_tools_factory,
|
|
21
|
+
)
|
|
22
|
+
from digitalkin.community.agno.hitl import (
|
|
23
|
+
HITL_STORAGE_CONFIG,
|
|
24
|
+
AgnoHitlRunner,
|
|
25
|
+
PausedRunRecord,
|
|
26
|
+
PausedRunStore,
|
|
27
|
+
PauseInfo,
|
|
28
|
+
emit_awaiting_tool_result,
|
|
29
|
+
emit_messages_snapshot,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
__all__ = [
|
|
33
|
+
"HITL_STORAGE_CONFIG",
|
|
34
|
+
"AgnoHitlRunner",
|
|
35
|
+
"AgnoStreamAdapter",
|
|
36
|
+
"PauseInfo",
|
|
37
|
+
"PausedRunRecord",
|
|
38
|
+
"PausedRunStore",
|
|
39
|
+
"agui_tool_to_external_function",
|
|
40
|
+
"emit_awaiting_tool_result",
|
|
41
|
+
"emit_messages_snapshot",
|
|
42
|
+
"make_tools_factory",
|
|
43
|
+
]
|
{digitalkin-0.4.0.dev1 → digitalkin-0.4.1.dev1}/src/digitalkin/community/agno/agno_adapter.py
RENAMED
|
@@ -69,8 +69,30 @@ class AgnoStreamAdapter:
|
|
|
69
69
|
self._active_run_id: str | None = None
|
|
70
70
|
self._completed_run_ids: set[str] = set()
|
|
71
71
|
|
|
72
|
+
# HITL pause state — populated when a RunPausedEvent is seen
|
|
73
|
+
# (tools with external_execution=True). Callers can inspect these
|
|
74
|
+
# after streaming to decide whether to persist and resume later.
|
|
75
|
+
self._is_paused: bool = False
|
|
76
|
+
self._paused_tool_executions: list[Any] = []
|
|
77
|
+
self._paused_requirements: list[Any] = []
|
|
78
|
+
|
|
72
79
|
self._dispatch: dict[Any, Callable[[Any, Any], list[BaseAgentRunEvent]]] | None = None
|
|
73
80
|
|
|
81
|
+
@property
|
|
82
|
+
def is_paused(self) -> bool:
|
|
83
|
+
"""Whether the last stream ended on a run_paused event (external tool HITL)."""
|
|
84
|
+
return self._is_paused
|
|
85
|
+
|
|
86
|
+
@property
|
|
87
|
+
def paused_tool_executions(self) -> list[Any]:
|
|
88
|
+
"""Agno ``ToolExecution`` objects awaiting external execution (HITL)."""
|
|
89
|
+
return list(self._paused_tool_executions)
|
|
90
|
+
|
|
91
|
+
@property
|
|
92
|
+
def paused_requirements(self) -> list[Any]:
|
|
93
|
+
"""Agno ``RunRequirement`` objects carried by the paused run."""
|
|
94
|
+
return list(self._paused_requirements)
|
|
95
|
+
|
|
74
96
|
def to_digitalkin_events(self, agno_event: Any) -> list[BaseAgentRunEvent]:
|
|
75
97
|
"""Convert one Agno event into one or more DigitalKin events.
|
|
76
98
|
|
|
@@ -95,6 +117,7 @@ class AgnoStreamAdapter:
|
|
|
95
117
|
RunEvent.run_content: self._handle_run_content,
|
|
96
118
|
RunEvent.run_completed: self._handle_run_completed,
|
|
97
119
|
RunEvent.run_error: self._handle_run_error,
|
|
120
|
+
RunEvent.run_paused: self._handle_run_paused,
|
|
98
121
|
RunEvent.reasoning_started: self._handle_reasoning_started,
|
|
99
122
|
RunEvent.reasoning_content_delta: self._handle_reasoning_content_delta,
|
|
100
123
|
RunEvent.reasoning_step: self._handle_reasoning_step,
|
|
@@ -331,6 +354,82 @@ class AgnoStreamAdapter:
|
|
|
331
354
|
)
|
|
332
355
|
]
|
|
333
356
|
|
|
357
|
+
def _handle_run_paused(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
|
|
358
|
+
"""Handle ``RunEvent.run_paused`` — HITL pause on external tool execution.
|
|
359
|
+
|
|
360
|
+
Agno does NOT emit ``tool_call_started`` / ``tool_call_completed`` for
|
|
361
|
+
tools declared with ``external_execution=True`` (see
|
|
362
|
+
``agno/models/base.py`` where the emission is short-circuited). The
|
|
363
|
+
front therefore never sees the corresponding AG-UI ``ToolCallStart``
|
|
364
|
+
/ ``ToolCallArgs`` / ``ToolCallEnd`` events unless we synthesize them.
|
|
365
|
+
|
|
366
|
+
This handler:
|
|
367
|
+
|
|
368
|
+
1. Closes any active reasoning / content sequence.
|
|
369
|
+
2. Iterates ``RunPausedEvent.tools`` and emits one pair of
|
|
370
|
+
``ToolCallStartedEvent`` + ``ToolCallCompletedEvent`` per tool.
|
|
371
|
+
The ``ToolCallCompletedEvent`` carries ``content=None`` and
|
|
372
|
+
``tool.result=None`` so the downstream AG-UI bridge emits
|
|
373
|
+
``ToolCallEnd`` *without* a ``ToolCallResult`` (guarded by the
|
|
374
|
+
``if result_content:`` check in ``AgUiMixin``).
|
|
375
|
+
3. Records pause state on the adapter (``is_paused``,
|
|
376
|
+
``paused_tool_executions``, ``paused_requirements``) so callers
|
|
377
|
+
can detect the pause after streaming and persist the run for
|
|
378
|
+
later resumption.
|
|
379
|
+
|
|
380
|
+
Returns:
|
|
381
|
+
Synthesized tool-call events for the paused tools. The caller
|
|
382
|
+
is responsible for subsequently emitting the AG-UI
|
|
383
|
+
``RunFinished`` with ``result.status = "awaiting_tool_result"``
|
|
384
|
+
— this adapter stays protocol-agnostic.
|
|
385
|
+
"""
|
|
386
|
+
events: list[BaseAgentRunEvent] = []
|
|
387
|
+
|
|
388
|
+
if self._reasoning_active:
|
|
389
|
+
events.extend(self._close_reasoning(timestamp))
|
|
390
|
+
if self._content_active:
|
|
391
|
+
events.extend(self._close_content(timestamp))
|
|
392
|
+
|
|
393
|
+
tools = getattr(agno_event, "tools", None) or []
|
|
394
|
+
requirements = getattr(agno_event, "requirements", None) or []
|
|
395
|
+
|
|
396
|
+
self._is_paused = True
|
|
397
|
+
self._paused_tool_executions = list(tools)
|
|
398
|
+
self._paused_requirements = list(requirements)
|
|
399
|
+
|
|
400
|
+
for tool_exec in tools:
|
|
401
|
+
tool_call_id = getattr(tool_exec, "tool_call_id", None)
|
|
402
|
+
tool_info = ToolInfo(
|
|
403
|
+
tool_call_id=tool_call_id,
|
|
404
|
+
tool_name=getattr(tool_exec, "tool_name", None),
|
|
405
|
+
tool_args=getattr(tool_exec, "tool_args", None),
|
|
406
|
+
result=None,
|
|
407
|
+
)
|
|
408
|
+
logger.debug(
|
|
409
|
+
"Synthesizing tool-call events for external_execution tool %s (id=%s)",
|
|
410
|
+
tool_info.tool_name,
|
|
411
|
+
tool_call_id,
|
|
412
|
+
)
|
|
413
|
+
events.extend((
|
|
414
|
+
ToolCallStartedEvent(
|
|
415
|
+
event=AgentRunEvent.TOOL_CALL_STARTED,
|
|
416
|
+
tool=tool_info,
|
|
417
|
+
timestamp=timestamp,
|
|
418
|
+
metadata=None,
|
|
419
|
+
),
|
|
420
|
+
ToolCallCompletedEvent(
|
|
421
|
+
event=AgentRunEvent.TOOL_CALL_COMPLETED,
|
|
422
|
+
tool=tool_info,
|
|
423
|
+
content=None,
|
|
424
|
+
timestamp=timestamp,
|
|
425
|
+
metadata=None,
|
|
426
|
+
),
|
|
427
|
+
))
|
|
428
|
+
if tool_call_id:
|
|
429
|
+
self._closed_tool_call_ids.add(tool_call_id)
|
|
430
|
+
|
|
431
|
+
return events
|
|
432
|
+
|
|
334
433
|
def _handle_tool_call_error(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
|
|
335
434
|
"""Handle RunEvent.tool_call_error.
|
|
336
435
|
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""AG-UI frontend tools → Agno external Functions.
|
|
2
|
+
|
|
3
|
+
The AG-UI protocol lets the client declare its own tools in
|
|
4
|
+
``RunAgentInput.tools``. Those tools are meant to be executed on the
|
|
5
|
+
frontend (a UI widget, a browser-local API call, a user prompt, …) rather
|
|
6
|
+
than by the agent process. This module provides the glue to expose them
|
|
7
|
+
to an Agno :class:`~agno.agent.Agent` as regular :class:`~agno.tools.function.Function`
|
|
8
|
+
objects marked with ``external_execution=True``: when the LLM "calls" one,
|
|
9
|
+
Agno pauses the run (via :class:`~agno.run.agent.RunPausedEvent`) instead
|
|
10
|
+
of executing an entrypoint — letting the caller stream the tool-call
|
|
11
|
+
events to the front and resume later via :meth:`~agno.agent.Agent.acontinue_run`.
|
|
12
|
+
|
|
13
|
+
Usage::
|
|
14
|
+
|
|
15
|
+
from digitalkin.community.agno import make_tools_factory
|
|
16
|
+
from agno.agent import Agent
|
|
17
|
+
|
|
18
|
+
agent = Agent(
|
|
19
|
+
tools=make_tools_factory([AsyncDuckDuckGoTools()]),
|
|
20
|
+
cache_callables=False, # critical — see make_tools_factory
|
|
21
|
+
...
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
async for ev in agent.arun(
|
|
25
|
+
message,
|
|
26
|
+
dependencies={"agui_tools": input_data.tools},
|
|
27
|
+
stream=True,
|
|
28
|
+
stream_events=True,
|
|
29
|
+
):
|
|
30
|
+
...
|
|
31
|
+
|
|
32
|
+
Notes:
|
|
33
|
+
``dependencies`` is Agno's standard per-run injection bus. We use it
|
|
34
|
+
as a transport channel to hand the frontend tools to the tools
|
|
35
|
+
factory on every run — the tools themselves are actually registered
|
|
36
|
+
through the ``tools=factory`` mechanism, not through ``dependencies``.
|
|
37
|
+
``cache_callables=False`` is required so the factory is re-invoked on
|
|
38
|
+
each run (otherwise the first resolved tool list is cached forever and
|
|
39
|
+
subsequent requests would not see new frontend tools).
|
|
40
|
+
"""
|
|
41
|
+
|
|
42
|
+
from __future__ import annotations
|
|
43
|
+
|
|
44
|
+
from typing import TYPE_CHECKING, Any
|
|
45
|
+
|
|
46
|
+
if TYPE_CHECKING:
|
|
47
|
+
from collections.abc import Callable
|
|
48
|
+
|
|
49
|
+
from ag_ui.core.types import Tool as AgUiTool
|
|
50
|
+
from agno.run.base import RunContext
|
|
51
|
+
from agno.tools.function import Function
|
|
52
|
+
|
|
53
|
+
_DEFAULT_DEPENDENCY_KEY = "agui_tools"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _unreachable_entrypoint(**_: Any) -> None:
|
|
57
|
+
"""Placeholder — never invoked because ``external_execution=True`` pauses the run."""
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def agui_tool_to_external_function(tool: AgUiTool) -> Function:
|
|
61
|
+
"""Wrap an AG-UI tool definition as an Agno external ``Function``.
|
|
62
|
+
|
|
63
|
+
The resulting :class:`Function` carries the AG-UI schema as-is (Agno
|
|
64
|
+
accepts raw JSON Schema via ``parameters``) and is marked with
|
|
65
|
+
``external_execution=True`` so Agno emits the tool-call events but
|
|
66
|
+
skips the entrypoint and pauses the run when the LLM invokes it.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
tool: An :class:`ag_ui.core.types.Tool` from ``RunAgentInput.tools``.
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
An :class:`agno.tools.function.Function` ready to be plugged into
|
|
73
|
+
an Agno agent's tool list.
|
|
74
|
+
"""
|
|
75
|
+
from agno.tools.function import Function # pyright: ignore[reportMissingImports]
|
|
76
|
+
|
|
77
|
+
parameters = tool.parameters or {"type": "object", "properties": {}, "required": []}
|
|
78
|
+
return Function(
|
|
79
|
+
name=tool.name,
|
|
80
|
+
description=tool.description,
|
|
81
|
+
parameters=parameters,
|
|
82
|
+
entrypoint=_unreachable_entrypoint,
|
|
83
|
+
external_execution=True,
|
|
84
|
+
skip_entrypoint_processing=True,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def make_tools_factory(
|
|
89
|
+
base_tools: list[Any],
|
|
90
|
+
dependency_key: str = _DEFAULT_DEPENDENCY_KEY,
|
|
91
|
+
) -> Callable[[RunContext], list[Any]]:
|
|
92
|
+
"""Build an Agno ``tools`` factory that merges base tools with per-run AG-UI tools.
|
|
93
|
+
|
|
94
|
+
The returned callable is the value you pass to ``Agent(tools=...)``. On
|
|
95
|
+
every run, Agno resolves the factory with the current
|
|
96
|
+
:class:`~agno.run.base.RunContext` (see
|
|
97
|
+
:func:`agno.utils.callables.aresolve_callable_tools`). The factory
|
|
98
|
+
reads ``run_context.dependencies[dependency_key]`` — the list of
|
|
99
|
+
:class:`~ag_ui.core.types.Tool` you passed via
|
|
100
|
+
``agent.arun(dependencies={dependency_key: [...]})`` — converts them to
|
|
101
|
+
external :class:`Function` objects, and concatenates them with the
|
|
102
|
+
``base_tools``.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
base_tools: Toolkits / Functions always available to the agent
|
|
106
|
+
(e.g. ``AsyncDuckDuckGoTools()``). Passed through unchanged.
|
|
107
|
+
dependency_key: The key in ``run_context.dependencies`` under which
|
|
108
|
+
the caller places the per-run AG-UI tool list. Defaults to
|
|
109
|
+
``"agui_tools"``.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
A callable suitable for :class:`agno.agent.Agent`'s ``tools=``
|
|
113
|
+
parameter. Set ``cache_callables=False`` on the ``Agent`` so this
|
|
114
|
+
factory is re-invoked on every run.
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
def factory(run_context: RunContext) -> list[Any]:
|
|
118
|
+
deps = getattr(run_context, "dependencies", None) or {}
|
|
119
|
+
agui_tools: list[AgUiTool] = deps.get(dependency_key) or []
|
|
120
|
+
return [*base_tools, *[agui_tool_to_external_function(t) for t in agui_tools]]
|
|
121
|
+
|
|
122
|
+
return factory
|