digitalkin 0.3.5.dev9__tar.gz → 0.3.5.dev11__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.3.5.dev9 → digitalkin-0.3.5.dev11}/PKG-INFO +1 -1
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/pyproject.toml +1 -1
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/__version__.py +1 -1
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/community/agno/agno_adapter.py +225 -96
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/agui_mixin.py +95 -176
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/events/__init__.py +4 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/events/agent_events.py +23 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin.egg-info/PKG-INFO +1 -1
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/LICENSE +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/README.md +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/base_server/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/base_server/mock/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/base_server/mock/mock_pb2.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/base_server/mock/mock_pb2_grpc.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/base_server/server_async_insecure.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/base_server/server_async_secure.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/base_server/server_sync_insecure.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/base_server/server_sync_secure.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/modules/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/modules/archetype_with_tools_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/modules/cpu_intensive_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/modules/dynamic_setup_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/modules/minimal_llm_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/modules/text_transform_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/monitoring/digitalkin_observability/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/monitoring/digitalkin_observability/http_server.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/monitoring/digitalkin_observability/interceptors.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/monitoring/digitalkin_observability/metrics.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/monitoring/digitalkin_observability/prometheus.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/monitoring/tests/test_metrics.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/services/filesystem_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/examples/services/storage_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/setup.cfg +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/community/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/community/agno/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/common/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/common/factories.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/job_manager/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/job_manager/base_job_manager.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/job_manager/single_job_manager.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/job_manager/taskiq_broker.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/job_manager/taskiq_job_manager.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/profiling/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/profiling/asyncio_monitor.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/profiling/task_profiler.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/task_manager/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/task_manager/base_task_manager.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/task_manager/local_task_manager.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/task_manager/remote_task_manager.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/task_manager/task_executor.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/core/task_manager/task_session.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/_base_server.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/module_server.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/module_servicer.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/utils/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/utils/exceptions.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/utils/grpc_client_wrapper.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/utils/grpc_error_handler.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/grpc_servers/utils/utility_schema_extender.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/logger.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/base_mixin.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/callback_mixin.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/chat_history_mixin.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/cost_mixin.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/file_history_mixin.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/filesystem_mixin.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/logger_mixin.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/mixins/storage_mixin.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/core/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/core/job_manager_models.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/core/task_monitor.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/grpc_servers/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/grpc_servers/models.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/grpc_servers/types.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/ag_ui.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/base_types.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/module_context.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/module_types.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/request_metadata.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/select_schema.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/setup_types.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/tool_cache.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/tool_reference.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/module/utility.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/services/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/services/cost.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/services/registry.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/models/services/storage.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/_base_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/archetype_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/tool_module.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/trigger_handler.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/triggers/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/triggers/healthcheck_ping_trigger.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/triggers/healthcheck_services_trigger.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/modules/triggers/healthcheck_status_trigger.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/py.typed +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/agent/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/agent/agent_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/agent/default_agent.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/base_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/communication/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/communication/communication_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/communication/default_communication.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/communication/grpc_communication.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/cost/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/cost/cost_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/cost/default_cost.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/cost/grpc_cost.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/filesystem/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/filesystem/default_filesystem.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/filesystem/filesystem_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/filesystem/grpc_filesystem.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/identity/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/identity/default_identity.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/identity/identity_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/registry/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/registry/default_registry.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/registry/exceptions.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/registry/grpc_registry.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/registry/registry_models.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/registry/registry_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/services_config.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/services_models.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/setup/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/setup/default_setup.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/setup/grpc_setup.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/setup/setup_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/snapshot/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/snapshot/default_snapshot.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/snapshot/snapshot_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/storage/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/storage/default_storage.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/storage/grpc_storage.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/storage/storage_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/task_manager/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/task_manager/default_task_manager.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/task_manager/grpc_task_manager.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/task_manager/task_manager_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/user_profile/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/user_profile/default_user_profile.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/user_profile/grpc_user_profile.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/services/user_profile/user_profile_strategy.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/__init__.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/arg_parser.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/conditional_schema.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/development_mode_action.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/dynamic_schema.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/llm_ready_schema.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/package_discover.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/proto_utils.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/utils/schema_splitter.py +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin.egg-info/SOURCES.txt +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin.egg-info/dependency_links.txt +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin.egg-info/requires.txt +0 -0
- {digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin.egg-info/top_level.txt +0 -0
{digitalkin-0.3.5.dev9 → digitalkin-0.3.5.dev11}/src/digitalkin/community/agno/agno_adapter.py
RENAMED
|
@@ -2,11 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
This adapter bridges Agno-specific events to the DigitalKin event model,
|
|
4
4
|
allowing the core DigitalKin SDK to remain independent of Agno.
|
|
5
|
+
|
|
6
|
+
The adapter owns ALL state management: tracking reasoning/content lifecycle,
|
|
7
|
+
generating message_id and reasoning_id on each phase start, and emitting
|
|
8
|
+
proper start/completed events for text message and reasoning sequences.
|
|
5
9
|
"""
|
|
6
10
|
|
|
7
11
|
from __future__ import annotations
|
|
8
12
|
|
|
9
13
|
import logging
|
|
14
|
+
import uuid
|
|
10
15
|
from typing import Any
|
|
11
16
|
|
|
12
17
|
from digitalkin.models.events import (
|
|
@@ -20,6 +25,8 @@ from digitalkin.models.events import (
|
|
|
20
25
|
RunContentEvent,
|
|
21
26
|
RunErrorEvent,
|
|
22
27
|
RunStartedEvent,
|
|
28
|
+
TextMessageCompletedEvent,
|
|
29
|
+
TextMessageStartedEvent,
|
|
23
30
|
ToolCallCompletedEvent,
|
|
24
31
|
ToolCallErrorEvent,
|
|
25
32
|
ToolCallStartedEvent,
|
|
@@ -32,9 +39,9 @@ logger = logging.getLogger(__name__)
|
|
|
32
39
|
class AgnoStreamAdapter:
|
|
33
40
|
"""Stateful converter: Agno streaming events -> DigitalKin events.
|
|
34
41
|
|
|
35
|
-
Tracks reasoning state so that
|
|
36
|
-
``RunEvent.run_content``
|
|
37
|
-
|
|
42
|
+
Tracks reasoning and content state so that events arriving on
|
|
43
|
+
``RunEvent.run_content`` are automatically wrapped in proper
|
|
44
|
+
lifecycle events (TextMessageStarted/Completed, ReasoningStarted/Completed).
|
|
38
45
|
|
|
39
46
|
Usage::
|
|
40
47
|
|
|
@@ -47,14 +54,16 @@ class AgnoStreamAdapter:
|
|
|
47
54
|
"""
|
|
48
55
|
|
|
49
56
|
def __init__(self) -> None:
|
|
50
|
-
"""Initialize the AgnoStreamAdapter.
|
|
51
|
-
|
|
52
|
-
This adapter tracks reasoning state to properly handle reasoning_content
|
|
53
|
-
that arrives on RunEvent.run_content events.
|
|
54
|
-
"""
|
|
57
|
+
"""Initialize the AgnoStreamAdapter."""
|
|
55
58
|
self._reasoning_active: bool = False
|
|
59
|
+
self._current_reasoning_id: str | None = None
|
|
60
|
+
|
|
61
|
+
self._content_active: bool = False
|
|
62
|
+
self._current_message_id: str | None = None
|
|
56
63
|
|
|
57
|
-
|
|
64
|
+
self._closed_tool_call_ids: set[str] = set()
|
|
65
|
+
|
|
66
|
+
def to_digitalkin_events(self, agno_event: Any) -> list[BaseAgentRunEvent]: # noqa: C901, PLR0911, PLR0912, PLR0915
|
|
58
67
|
"""Convert one Agno event into one or more DigitalKin events.
|
|
59
68
|
|
|
60
69
|
Args:
|
|
@@ -73,10 +82,8 @@ class AgnoStreamAdapter:
|
|
|
73
82
|
raise ImportError(message) from exc
|
|
74
83
|
|
|
75
84
|
event_type = agno_event.event
|
|
76
|
-
event_types = getattr(agno_event, "events", None)
|
|
77
85
|
|
|
78
86
|
logger.info("[DK STREAM-DEBUG => agno_adapter] Converting Agno event type: %s", event_type)
|
|
79
|
-
logger.info("[DK STREAM-DEBUG => agno_adapter event_types] Converting Agno event types: %s", event_types)
|
|
80
87
|
|
|
81
88
|
timestamp = getattr(agno_event, "timestamp", None)
|
|
82
89
|
|
|
@@ -97,7 +104,15 @@ class AgnoStreamAdapter:
|
|
|
97
104
|
return self._handle_run_content(agno_event, timestamp)
|
|
98
105
|
|
|
99
106
|
if event_type == RunEvent.run_completed:
|
|
100
|
-
|
|
107
|
+
events: list[BaseAgentRunEvent] = []
|
|
108
|
+
|
|
109
|
+
# Close any open sequences before completing the run
|
|
110
|
+
if self._content_active:
|
|
111
|
+
events.extend(self._close_content(timestamp))
|
|
112
|
+
if self._reasoning_active:
|
|
113
|
+
events.extend(self._close_reasoning(timestamp))
|
|
114
|
+
|
|
115
|
+
events.append(
|
|
101
116
|
RunCompletedEvent(
|
|
102
117
|
event=AgentRunEvent.RUN_COMPLETED,
|
|
103
118
|
run_id=getattr(agno_event, "run_id", None),
|
|
@@ -106,7 +121,8 @@ class AgnoStreamAdapter:
|
|
|
106
121
|
timestamp=timestamp,
|
|
107
122
|
metadata=None,
|
|
108
123
|
)
|
|
109
|
-
|
|
124
|
+
)
|
|
125
|
+
return events
|
|
110
126
|
|
|
111
127
|
if event_type == RunEvent.run_error:
|
|
112
128
|
return [
|
|
@@ -123,15 +139,27 @@ class AgnoStreamAdapter:
|
|
|
123
139
|
# ── Explicit Reasoning Events (native Agno reasoning models) ────
|
|
124
140
|
|
|
125
141
|
if event_type == RunEvent.reasoning_started:
|
|
142
|
+
events = []
|
|
143
|
+
|
|
144
|
+
# Close content if active
|
|
145
|
+
if self._content_active:
|
|
146
|
+
events.extend(self._close_content(timestamp))
|
|
147
|
+
|
|
148
|
+
self._current_reasoning_id = str(uuid.uuid4())
|
|
126
149
|
self._reasoning_active = True
|
|
127
|
-
logger.info(
|
|
128
|
-
|
|
150
|
+
logger.info(
|
|
151
|
+
"[DK STREAM-DEBUG => agno_adapter] Reasoning started (explicit), id=%s",
|
|
152
|
+
self._current_reasoning_id,
|
|
153
|
+
)
|
|
154
|
+
events.append(
|
|
129
155
|
ReasoningStartedEvent(
|
|
130
156
|
event=AgentRunEvent.REASONING_STARTED,
|
|
157
|
+
reasoning_id=self._current_reasoning_id,
|
|
131
158
|
timestamp=timestamp,
|
|
132
159
|
metadata=None,
|
|
133
160
|
)
|
|
134
|
-
|
|
161
|
+
)
|
|
162
|
+
return events
|
|
135
163
|
|
|
136
164
|
if event_type == RunEvent.reasoning_content_delta:
|
|
137
165
|
reasoning_content = getattr(agno_event, "reasoning_content", "")
|
|
@@ -139,6 +167,7 @@ class AgnoStreamAdapter:
|
|
|
139
167
|
ReasoningContentDeltaEvent(
|
|
140
168
|
event=AgentRunEvent.REASONING_CONTENT_DELTA,
|
|
141
169
|
delta=reasoning_content,
|
|
170
|
+
reasoning_id=self._current_reasoning_id,
|
|
142
171
|
timestamp=timestamp,
|
|
143
172
|
metadata=None,
|
|
144
173
|
)
|
|
@@ -150,38 +179,27 @@ class AgnoStreamAdapter:
|
|
|
150
179
|
ReasoningStepEvent(
|
|
151
180
|
event=AgentRunEvent.REASONING_STEP,
|
|
152
181
|
delta=reasoning_content,
|
|
182
|
+
reasoning_id=self._current_reasoning_id,
|
|
153
183
|
timestamp=timestamp,
|
|
154
184
|
metadata=None,
|
|
155
185
|
)
|
|
156
186
|
]
|
|
157
187
|
|
|
158
188
|
if event_type == RunEvent.reasoning_completed:
|
|
159
|
-
self._reasoning_active = False
|
|
160
189
|
logger.info("[DK STREAM-DEBUG => agno_adapter] Reasoning completed (explicit)")
|
|
161
|
-
return
|
|
162
|
-
ReasoningCompletedEvent(
|
|
163
|
-
event=AgentRunEvent.REASONING_COMPLETED,
|
|
164
|
-
timestamp=timestamp,
|
|
165
|
-
metadata=None,
|
|
166
|
-
)
|
|
167
|
-
]
|
|
190
|
+
return self._close_reasoning(timestamp)
|
|
168
191
|
|
|
169
192
|
# ── Tool Call Events ─────────────────────────────────────────────
|
|
170
193
|
|
|
171
194
|
if event_type == RunEvent.tool_call_started:
|
|
172
|
-
events
|
|
195
|
+
events = []
|
|
173
196
|
|
|
174
|
-
#
|
|
197
|
+
# Close both reasoning and content before tool calls
|
|
175
198
|
if self._reasoning_active:
|
|
176
199
|
logger.info("[DK STREAM-DEBUG => agno_adapter] Reasoning auto-completed (tool call started)")
|
|
177
|
-
events.
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
timestamp=timestamp,
|
|
181
|
-
metadata=None,
|
|
182
|
-
)
|
|
183
|
-
)
|
|
184
|
-
self._reasoning_active = False
|
|
200
|
+
events.extend(self._close_reasoning(timestamp))
|
|
201
|
+
if self._content_active:
|
|
202
|
+
events.extend(self._close_content(timestamp))
|
|
185
203
|
|
|
186
204
|
tool = getattr(agno_event, "tool", None)
|
|
187
205
|
tool_info = None
|
|
@@ -205,13 +223,20 @@ class AgnoStreamAdapter:
|
|
|
205
223
|
if event_type == RunEvent.tool_call_completed:
|
|
206
224
|
tool = getattr(agno_event, "tool", None)
|
|
207
225
|
tool_info = None
|
|
226
|
+
tool_call_id = None
|
|
208
227
|
if tool:
|
|
228
|
+
tool_call_id = getattr(tool, "tool_call_id", None)
|
|
209
229
|
tool_info = ToolInfo(
|
|
210
|
-
tool_call_id=
|
|
230
|
+
tool_call_id=tool_call_id,
|
|
211
231
|
tool_name=getattr(tool, "tool_name", None),
|
|
212
232
|
tool_args=getattr(tool, "tool_args", None),
|
|
213
233
|
result=getattr(tool, "result", None),
|
|
214
234
|
)
|
|
235
|
+
|
|
236
|
+
# Track closed tool call to prevent duplicate end from ToolCallError
|
|
237
|
+
if tool_call_id:
|
|
238
|
+
self._closed_tool_call_ids.add(tool_call_id)
|
|
239
|
+
|
|
215
240
|
return [
|
|
216
241
|
ToolCallCompletedEvent(
|
|
217
242
|
event=AgentRunEvent.TOOL_CALL_COMPLETED,
|
|
@@ -224,14 +249,28 @@ class AgnoStreamAdapter:
|
|
|
224
249
|
|
|
225
250
|
if event_type == RunEvent.tool_call_error:
|
|
226
251
|
tool = getattr(agno_event, "tool", None)
|
|
252
|
+
tool_call_id = getattr(tool, "tool_call_id", None) if tool else None
|
|
253
|
+
|
|
254
|
+
# Skip if already closed by ToolCallCompleted (Agno emits both for the same tool_call_id)
|
|
255
|
+
if tool_call_id and tool_call_id in self._closed_tool_call_ids:
|
|
256
|
+
logger.info(
|
|
257
|
+
"[DK STREAM-DEBUG => agno_adapter] Skipping duplicate ToolCallError for already-closed tool %s",
|
|
258
|
+
tool_call_id,
|
|
259
|
+
)
|
|
260
|
+
return []
|
|
261
|
+
|
|
227
262
|
tool_info = None
|
|
228
263
|
if tool:
|
|
229
264
|
tool_info = ToolInfo(
|
|
230
|
-
tool_call_id=
|
|
265
|
+
tool_call_id=tool_call_id,
|
|
231
266
|
tool_name=getattr(tool, "tool_name", None),
|
|
232
267
|
tool_args=None,
|
|
233
268
|
result=None,
|
|
234
269
|
)
|
|
270
|
+
|
|
271
|
+
if tool_call_id:
|
|
272
|
+
self._closed_tool_call_ids.add(tool_call_id)
|
|
273
|
+
|
|
235
274
|
return [
|
|
236
275
|
ToolCallErrorEvent(
|
|
237
276
|
event=AgentRunEvent.TOOL_CALL_ERROR,
|
|
@@ -247,99 +286,189 @@ class AgnoStreamAdapter:
|
|
|
247
286
|
return []
|
|
248
287
|
|
|
249
288
|
def flush(self) -> list[BaseAgentRunEvent]:
|
|
250
|
-
"""Emit closing events
|
|
289
|
+
"""Emit closing events for any active sequences at end of stream.
|
|
251
290
|
|
|
252
291
|
Returns:
|
|
253
|
-
List of closing events (empty if
|
|
292
|
+
List of closing events (empty if nothing is active).
|
|
254
293
|
"""
|
|
255
294
|
events: list[BaseAgentRunEvent] = []
|
|
295
|
+
if self._content_active:
|
|
296
|
+
logger.info("[DK STREAM-DEBUG => agno_adapter] Flushing: closing active content")
|
|
297
|
+
events.extend(self._close_content(None))
|
|
256
298
|
if self._reasoning_active:
|
|
257
299
|
logger.info("[DK STREAM-DEBUG => agno_adapter] Flushing: closing active reasoning")
|
|
258
|
-
events.
|
|
259
|
-
ReasoningCompletedEvent(
|
|
260
|
-
event=AgentRunEvent.REASONING_COMPLETED,
|
|
261
|
-
timestamp=None,
|
|
262
|
-
metadata=None,
|
|
263
|
-
)
|
|
264
|
-
)
|
|
265
|
-
self._reasoning_active = False
|
|
300
|
+
events.extend(self._close_reasoning(None))
|
|
266
301
|
return events
|
|
267
302
|
|
|
268
303
|
# ── Private Helpers ──────────────────────────────────────────────────
|
|
269
304
|
|
|
270
|
-
def
|
|
271
|
-
"""
|
|
305
|
+
def _close_reasoning(self, timestamp: Any) -> list[BaseAgentRunEvent]:
|
|
306
|
+
"""Close active reasoning sequence.
|
|
272
307
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
308
|
+
Returns:
|
|
309
|
+
List of closing events (empty if reasoning is not active).
|
|
310
|
+
"""
|
|
311
|
+
if not self._reasoning_active:
|
|
312
|
+
return []
|
|
313
|
+
|
|
314
|
+
events: list[BaseAgentRunEvent] = [
|
|
315
|
+
ReasoningCompletedEvent(
|
|
316
|
+
event=AgentRunEvent.REASONING_COMPLETED,
|
|
317
|
+
reasoning_id=self._current_reasoning_id,
|
|
318
|
+
timestamp=timestamp,
|
|
319
|
+
metadata=None,
|
|
320
|
+
)
|
|
321
|
+
]
|
|
322
|
+
self._reasoning_active = False
|
|
323
|
+
self._current_reasoning_id = None
|
|
324
|
+
return events
|
|
276
325
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
timestamp: The timestamp for the event.
|
|
326
|
+
def _close_content(self, timestamp: Any) -> list[BaseAgentRunEvent]:
|
|
327
|
+
"""Close active text message sequence.
|
|
280
328
|
|
|
281
329
|
Returns:
|
|
282
|
-
List of
|
|
330
|
+
List of closing events (empty if content is not active).
|
|
331
|
+
"""
|
|
332
|
+
if not self._content_active:
|
|
333
|
+
return []
|
|
334
|
+
|
|
335
|
+
events: list[BaseAgentRunEvent] = [
|
|
336
|
+
TextMessageCompletedEvent(
|
|
337
|
+
event=AgentRunEvent.TEXT_MESSAGE_COMPLETED,
|
|
338
|
+
message_id=self._current_message_id or "",
|
|
339
|
+
timestamp=timestamp,
|
|
340
|
+
metadata=None,
|
|
341
|
+
)
|
|
342
|
+
]
|
|
343
|
+
self._content_active = False
|
|
344
|
+
self._current_message_id = None
|
|
345
|
+
return events
|
|
346
|
+
|
|
347
|
+
def _handle_run_content(self, agno_event: Any, timestamp: Any) -> list[BaseAgentRunEvent]:
|
|
348
|
+
"""Handle RunEvent.run_content — the core state machine.
|
|
349
|
+
|
|
350
|
+
Rules:
|
|
351
|
+
- reasoning_content non-empty: reasoning data (close content if transitioning)
|
|
352
|
+
- content non-empty: text data (close reasoning if transitioning)
|
|
353
|
+
- reasoning_content == "": close reasoning if active
|
|
354
|
+
- content == "": close content if active
|
|
355
|
+
- None values: ignored
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
List of DigitalKin events for this run_content chunk.
|
|
283
359
|
"""
|
|
284
360
|
events: list[BaseAgentRunEvent] = []
|
|
285
361
|
|
|
286
362
|
reasoning_content = getattr(agno_event, "reasoning_content", None)
|
|
287
363
|
content = agno_event.content
|
|
288
364
|
|
|
289
|
-
# ── Reasoning content
|
|
290
|
-
if reasoning_content:
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
365
|
+
# ── Reasoning content handling ──
|
|
366
|
+
if reasoning_content is not None:
|
|
367
|
+
events.extend(self._process_reasoning_content(reasoning_content, timestamp))
|
|
368
|
+
|
|
369
|
+
# ── Text content handling ──
|
|
370
|
+
if content is not None:
|
|
371
|
+
events.extend(self._process_text_content(content, timestamp))
|
|
372
|
+
|
|
373
|
+
# Edge case: neither reasoning_content nor content
|
|
374
|
+
if reasoning_content is None and content is None:
|
|
375
|
+
logger.debug("[DK STREAM-DEBUG => agno_adapter] run_content with no content, skipping")
|
|
376
|
+
|
|
377
|
+
return events
|
|
378
|
+
|
|
379
|
+
def _process_reasoning_content(self, reasoning_content: str, timestamp: Any) -> list[BaseAgentRunEvent]:
|
|
380
|
+
"""Process reasoning_content from a run_content event.
|
|
381
|
+
|
|
382
|
+
Returns:
|
|
383
|
+
List of reasoning lifecycle and content events.
|
|
384
|
+
"""
|
|
385
|
+
events: list[BaseAgentRunEvent] = []
|
|
386
|
+
|
|
387
|
+
if not reasoning_content:
|
|
388
|
+
# Empty string "" → signal to close reasoning
|
|
389
|
+
if self._reasoning_active:
|
|
390
|
+
events.extend(self._close_reasoning(timestamp))
|
|
391
|
+
return events
|
|
392
|
+
|
|
393
|
+
# Non-empty string → reasoning data
|
|
394
|
+
# Close text message if transitioning from content to reasoning
|
|
395
|
+
if self._content_active:
|
|
396
|
+
events.extend(self._close_content(timestamp))
|
|
302
397
|
|
|
398
|
+
# Auto-open reasoning on first chunk
|
|
399
|
+
if not self._reasoning_active:
|
|
400
|
+
self._current_reasoning_id = str(uuid.uuid4())
|
|
303
401
|
logger.info(
|
|
304
|
-
"[DK STREAM-DEBUG => agno_adapter] Reasoning
|
|
305
|
-
|
|
402
|
+
"[DK STREAM-DEBUG => agno_adapter] Reasoning auto-started from run_content, id=%s",
|
|
403
|
+
self._current_reasoning_id,
|
|
306
404
|
)
|
|
307
405
|
events.append(
|
|
308
|
-
|
|
309
|
-
event=AgentRunEvent.
|
|
310
|
-
|
|
406
|
+
ReasoningStartedEvent(
|
|
407
|
+
event=AgentRunEvent.REASONING_STARTED,
|
|
408
|
+
reasoning_id=self._current_reasoning_id,
|
|
311
409
|
timestamp=timestamp,
|
|
312
410
|
metadata=None,
|
|
313
411
|
)
|
|
314
412
|
)
|
|
413
|
+
self._reasoning_active = True
|
|
414
|
+
|
|
415
|
+
logger.info(
|
|
416
|
+
"[DK STREAM-DEBUG => agno_adapter] Reasoning content delta (len=%d)",
|
|
417
|
+
len(reasoning_content),
|
|
418
|
+
)
|
|
419
|
+
events.append(
|
|
420
|
+
ReasoningContentDeltaEvent(
|
|
421
|
+
event=AgentRunEvent.REASONING_CONTENT_DELTA,
|
|
422
|
+
delta=reasoning_content,
|
|
423
|
+
reasoning_id=self._current_reasoning_id,
|
|
424
|
+
timestamp=timestamp,
|
|
425
|
+
metadata=None,
|
|
426
|
+
)
|
|
427
|
+
)
|
|
428
|
+
return events
|
|
315
429
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
)
|
|
328
|
-
|
|
430
|
+
def _process_text_content(self, content: str, timestamp: Any) -> list[BaseAgentRunEvent]:
|
|
431
|
+
"""Process text content from a run_content event.
|
|
432
|
+
|
|
433
|
+
Returns:
|
|
434
|
+
List of text message lifecycle and content events.
|
|
435
|
+
"""
|
|
436
|
+
events: list[BaseAgentRunEvent] = []
|
|
437
|
+
|
|
438
|
+
if not content:
|
|
439
|
+
# Empty string "" → signal to close text message
|
|
440
|
+
if self._content_active:
|
|
441
|
+
events.extend(self._close_content(timestamp))
|
|
442
|
+
return events
|
|
443
|
+
|
|
444
|
+
# Non-empty string → text data
|
|
445
|
+
# Close reasoning if transitioning from reasoning to content
|
|
446
|
+
if self._reasoning_active:
|
|
447
|
+
logger.info("[DK STREAM-DEBUG => agno_adapter] Reasoning auto-completed (text content arrived)")
|
|
448
|
+
events.extend(self._close_reasoning(timestamp))
|
|
329
449
|
|
|
450
|
+
# Auto-open text message on first chunk
|
|
451
|
+
if not self._content_active:
|
|
452
|
+
self._current_message_id = str(uuid.uuid4())
|
|
330
453
|
events.append(
|
|
331
|
-
|
|
332
|
-
event=AgentRunEvent.
|
|
333
|
-
|
|
334
|
-
reasoning_content=None,
|
|
335
|
-
content_type=None,
|
|
454
|
+
TextMessageStartedEvent(
|
|
455
|
+
event=AgentRunEvent.TEXT_MESSAGE_STARTED,
|
|
456
|
+
message_id=self._current_message_id,
|
|
336
457
|
timestamp=timestamp,
|
|
337
458
|
metadata=None,
|
|
338
459
|
)
|
|
339
460
|
)
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
461
|
+
self._content_active = True
|
|
462
|
+
|
|
463
|
+
events.append(
|
|
464
|
+
RunContentEvent(
|
|
465
|
+
event=AgentRunEvent.RUN_CONTENT,
|
|
466
|
+
content=str(content),
|
|
467
|
+
message_id=self._current_message_id,
|
|
468
|
+
reasoning_content=None,
|
|
469
|
+
content_type=None,
|
|
470
|
+
timestamp=timestamp,
|
|
471
|
+
metadata=None,
|
|
472
|
+
)
|
|
473
|
+
)
|
|
345
474
|
return events
|