agentbyte 0.22.0__tar.gz → 0.22.1__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.
- {agentbyte-0.22.0 → agentbyte-0.22.1}/.gitignore +12 -1
- {agentbyte-0.22.0 → agentbyte-0.22.1}/CHANGELOG.md +32 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/PKG-INFO +4 -2
- {agentbyte-0.22.0 → agentbyte-0.22.1}/README.md +1 -1
- {agentbyte-0.22.0 → agentbyte-0.22.1}/pyproject.toml +7 -0
- agentbyte-0.22.1/src/agentbyte/__about__.py +2 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/__init__.py +2 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/base.py +4 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/importer.py +69 -3
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/loader.py +10 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/sources.py +35 -4
- agentbyte-0.22.1/src/agentbyte/dataset/sqlite_db.py +172 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/logger.py +39 -18
- agentbyte-0.22.1/tests/dataset/test_sqlite_db.py +288 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/test_logger.py +9 -12
- agentbyte-0.22.0/src/agentbyte/__about__.py +0 -2
- {agentbyte-0.22.0 → agentbyte-0.22.1}/LICENSE +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/agents/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/agents/agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/agents/agent_as_tool.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/agents/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/agents/embedding_agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/agents/types.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/catalog.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/cli/main.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/component.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/context.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/context_providers/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/context_providers/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/context_providers/skill_tools.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/context_providers/skills.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/publish.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/publish_config.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/publishers.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/sqlite.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/write_config.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/dataset/writers.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/checks/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/checks/decorator.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/checks/keyword.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/checks/local.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/checks/tool.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/checks/types.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/comparison.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/eval_dataset.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/judges/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/judges/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/judges/composite.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/judges/llm.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/judges/pairwise.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/judges/reference.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/pairwise.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/report.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/runner.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/targets/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/targets/agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/targets/model.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/targets/multi_turn.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/targets/orchestrator.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/eval/types.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/azure/auth.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/azure/chat.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/azure/embedding.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/openai.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/pricing.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/microwebui/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/microwebui/server.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/microwebui/ui/index.html +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/middleware/otel.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/middleware/sql_usage.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/middleware/usage_logger.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/orchestration/ai.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/orchestration/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/orchestration/handoff.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/orchestration/plan.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/orchestration/policies.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/orchestration/round_robin.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/instruction_registry.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/instructions/writer.yaml +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/streaming.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/skills/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/skills/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/skills/resources.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/skills/scripts.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/skills/sources.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/tools/base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/tools/coding_tools.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/tools/research_tools.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/types.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/execution.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/.gitignore +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/README.md +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/components.json +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/eslint.config.js +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/index.html +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/package-lock.json +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/package.json +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/plan.md +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/public/vite.svg +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/App.css +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/App.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/assets/react.svg +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/agent/agent-view.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/message_renderer/ContentRenderer.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/message_renderer/MessageRenderer.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/message_renderer/index.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/message_renderer/types.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/mode-toggle.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/orchestrator/orchestrator-view.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/shared/app-header.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/shared/chat-base.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/shared/context-inspector.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/shared/debug-panel.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/shared/entity-selector.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/shared/example-tasks-display.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/shared/session-switcher.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/shared/tool-approval-banner.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/theme-provider.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/attachment-gallery.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/badge.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/button.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/card.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/dialog.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/dropdown-menu.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/file-upload.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/input.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/label.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/loading-spinner.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/loading-state.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/message-input.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/scroll-area.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/slider.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/tabs.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/ui/textarea.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/workflow/workflow-result-renderer.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/components/workflow/workflow-view.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/hooks/messageHandlers.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/hooks/useEntityExecution.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/index.css +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/lib/format-utils.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/lib/user-id.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/lib/utils.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/main.tsx +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/services/api.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/types/index.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/types/picoagents.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/utils/message-utils.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/src/vite-env.d.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/tsconfig.app.json +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/tsconfig.json +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/tsconfig.node.json +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/vite.config.ts +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/frontend/yarn.lock +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/models.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/server.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/ui/assets/index-DDp5MYFO.js +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/ui/assets/index-ar5tOeqt.css +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/ui/index.html +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/steps/agentbyte_agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/src/agentbyte/workflow/visualizer.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_agent_as_tool.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_agent_context_providers.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_embedding_agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/cli/test_registry_check.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/context_providers/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/context_providers/test_skill_tools.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/context_providers/test_skills_provider.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/dataset/test_loader.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/dataset/test_multi_table.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/dataset/test_publish.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/eval/test_eval_dataset.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/eval/test_multi_turn.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/eval/test_pairwise.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/eval/test_phase1_runner_and_targets.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/eval/test_phase2_checks_and_reports.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/eval/test_types_and_judges.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/middleware/test_sql_usage.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/middleware/test_usage_logger.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/orchestration/test_ai_orchestrator.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/orchestration/test_base_orchestrator.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/orchestration/test_handoff_orchestrator.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/orchestration/test_plan_orchestrator.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/orchestration/test_round_robin.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/presets/test_instruction_registry.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/presets/test_streaming.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/skills/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/skills/test_base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/skills/test_resources.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/skills/test_scripts.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/skills/test_sources.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_base.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_external.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_source.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/test_context.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/test_messages.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/test_package_api.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/test_session_store.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/test_types.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/tools/test_coding_tools.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/tools/test_research_tools.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/webui/__init__.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/webui/helpers.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/webui/test_microwebui_server.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/webui/test_server.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.22.0 → agentbyte-0.22.1}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -7,8 +7,15 @@ wheels/
|
|
|
7
7
|
*.egg-info
|
|
8
8
|
|
|
9
9
|
# Virtual environments
|
|
10
|
-
.venv
|
|
10
|
+
.venv/
|
|
11
|
+
venv/
|
|
12
|
+
env/
|
|
13
|
+
|
|
14
|
+
# Local environment files
|
|
11
15
|
.env
|
|
16
|
+
.env.*
|
|
17
|
+
!.env.example
|
|
18
|
+
!.env.*.example
|
|
12
19
|
|
|
13
20
|
# IDE
|
|
14
21
|
.vscode/
|
|
@@ -49,3 +56,7 @@ artifacts/
|
|
|
49
56
|
|
|
50
57
|
# Machine-local agent config (each machine maintains its own)
|
|
51
58
|
AGENTS.LOCAL.md
|
|
59
|
+
data/datasets/
|
|
60
|
+
|
|
61
|
+
# lean-ctx context runtime cache
|
|
62
|
+
.lean-ctx/
|
|
@@ -4,6 +4,38 @@ All notable changes to Agentbyte are documented in this file.
|
|
|
4
4
|
|
|
5
5
|
The format follows Keep a Changelog principles and semantic versioning.
|
|
6
6
|
|
|
7
|
+
## [0.22.1] - 2026-06-30
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- Added `StreamEventLogger.log(event)` — a single dispatcher that routes any stream event to the correct log level, replacing the need for callers to invoke all five level methods per event.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- `StepProgressEvent` is now logged at `INFO` (moved from `DEBUG`) so that step progress messages emitted via `context.emit_progress()` appear in standard Lambda/application logs without enabling debug output.
|
|
16
|
+
|
|
17
|
+
## [0.22.0] - 2026-05-30
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
|
|
21
|
+
- Added async-first `SQLiteDataset` rewrite: `connect()` is now async, `__aenter__`/`__aexit__` context manager support added via `aiosqlite`.
|
|
22
|
+
- Added `DatasetImportConfig` and `create_dataset()` importer that converts `list[dict]`, CSV file, and raw CSV string into dataset artifacts on disk.
|
|
23
|
+
- Added `LocalDatasetWriteConfig` and `S3DatasetWriteConfig` as the write-side mirror of the existing source config pattern (`write_config.py`, `writers.py`).
|
|
24
|
+
- Added spec `0020-dataset-importer` registered in `docs/specs/README.md`.
|
|
25
|
+
- Added `hr-analyst` multifile skill demonstrating selective resource loading: agent loads only the schema file relevant to each question rather than injecting the full schema set into every prompt.
|
|
26
|
+
- Added notebook `12.2-agent-skills-multifile-skill` for the HR-analyst pattern.
|
|
27
|
+
- Added notebook `14.1-dataset-importer` covering 10 importer use cases (single/multi-table, all source types, overwrite protection, schema inspection, Pandas DataFrame path).
|
|
28
|
+
- Added `agentbyte-runtime-skills` agent skill (`SKILL.md`) for skill authoring guidance.
|
|
29
|
+
- Added study doc `03_topic_skills_provider.md` under `docs/study/08-skills_topics/`.
|
|
30
|
+
|
|
31
|
+
### Changed
|
|
32
|
+
|
|
33
|
+
- Reorganised usecase notebooks from flat numbered files into topic subfolders mirroring `notebooks/concepts/`: `agents/`, `configuration/`, `workflows/`, `tools/`, `skills/`, `eval/`, `dataset/`, `rag/`; numbers reset to `01` within each group.
|
|
34
|
+
- Updated `docs/study` dataset topics and concept notebooks (`01-dataset-module-examples`, `02-loading-asmd-esmd-datasets`) for the async API.
|
|
35
|
+
- Removed old `skill-authoring/SKILL.md`; replaced by `agentbyte-runtime-skills/SKILL.md`.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
7
39
|
## [0.21.0] - 2026-05-22
|
|
8
40
|
|
|
9
41
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentbyte
|
|
3
|
-
Version: 0.22.
|
|
3
|
+
Version: 0.22.1
|
|
4
4
|
Summary: A toolkit for designing multiagent systems
|
|
5
5
|
Author-email: MrDataPsycho <mr.data.psycho@gmail.com>
|
|
6
6
|
License-Expression: LicenseRef-Proprietary
|
|
@@ -30,6 +30,8 @@ Provides-Extra: azureopenai
|
|
|
30
30
|
Requires-Dist: azure-identity>=1.25.1; extra == 'azureopenai'
|
|
31
31
|
Requires-Dist: openai>=1.107.1; extra == 'azureopenai'
|
|
32
32
|
Provides-Extra: coding
|
|
33
|
+
Provides-Extra: dataset
|
|
34
|
+
Requires-Dist: aiosqlite>=0.22.1; extra == 'dataset'
|
|
33
35
|
Provides-Extra: dev
|
|
34
36
|
Requires-Dist: ipykernel>=7.1.0; extra == 'dev'
|
|
35
37
|
Requires-Dist: nbclient>=0.10.4; extra == 'dev'
|
|
@@ -76,7 +78,7 @@ Description-Content-Type: text/markdown
|
|
|
76
78
|
|
|
77
79
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
78
80
|
|
|
79
|
-
Current release: **0.
|
|
81
|
+
Current release: **0.22.1**
|
|
80
82
|
|
|
81
83
|
## Current Capabilities
|
|
82
84
|
|
|
@@ -38,6 +38,9 @@ webui = [
|
|
|
38
38
|
"fastapi>=0.135.2",
|
|
39
39
|
"uvicorn[standard]>=0.44.0",
|
|
40
40
|
]
|
|
41
|
+
dataset = [
|
|
42
|
+
"aiosqlite>=0.22.1",
|
|
43
|
+
]
|
|
41
44
|
sql = [
|
|
42
45
|
"sqlmodel>=0.0.38",
|
|
43
46
|
"asyncpg>=0.31.0",
|
|
@@ -139,6 +142,9 @@ otel = [
|
|
|
139
142
|
"opentelemetry-exporter-otlp-proto-http>=1.39.1",
|
|
140
143
|
"opentelemetry-sdk>=1.39.1",
|
|
141
144
|
]
|
|
145
|
+
dataset = [
|
|
146
|
+
"aiosqlite>=0.22.1",
|
|
147
|
+
]
|
|
142
148
|
sql = [
|
|
143
149
|
"sqlmodel>=0.0.38",
|
|
144
150
|
"asyncpg>=0.31.0",
|
|
@@ -175,6 +181,7 @@ all = [
|
|
|
175
181
|
"openai>=1.107.1",
|
|
176
182
|
"azure-identity>=1.25.1",
|
|
177
183
|
"aioboto3>=15.5.0",
|
|
184
|
+
"aiosqlite>=0.22.1",
|
|
178
185
|
"opentelemetry-api>=1.39.1",
|
|
179
186
|
"opentelemetry-exporter-otlp-proto-http>=1.39.1",
|
|
180
187
|
"opentelemetry-sdk>=1.39.1",
|
|
@@ -113,6 +113,7 @@ from agentbyte.dataset.sqlite import (
|
|
|
113
113
|
SqliteColumn,
|
|
114
114
|
SqliteSchema,
|
|
115
115
|
)
|
|
116
|
+
from agentbyte.dataset.sqlite_db import SQLiteDbDataset
|
|
116
117
|
|
|
117
118
|
__all__ = [
|
|
118
119
|
# Source configuration
|
|
@@ -134,6 +135,7 @@ __all__ = [
|
|
|
134
135
|
"BaseDataset",
|
|
135
136
|
# Implementations
|
|
136
137
|
"SQLiteDataset",
|
|
138
|
+
"SQLiteDbDataset",
|
|
137
139
|
"JSONDataset",
|
|
138
140
|
"DatasetPublisher",
|
|
139
141
|
"S3DatasetPublisher",
|
|
@@ -87,11 +87,15 @@ class DatasetConfig(BaseModel):
|
|
|
87
87
|
engine: str = Field(default="sqlite", description="Database engine")
|
|
88
88
|
table_name: str = Field(default="", description="Table name for single-table datasets")
|
|
89
89
|
tables: list[TableDef] = Field(default_factory=list, description="Table definitions for multi-table datasets")
|
|
90
|
+
table_names: list[str] = Field(default_factory=list, description="Table names for sqlite_db engine")
|
|
90
91
|
in_memory: bool = Field(default=True, description="Use in-memory storage")
|
|
91
92
|
description: str = Field(default="", description="Dataset description")
|
|
92
93
|
|
|
93
94
|
@model_validator(mode="after")
|
|
94
95
|
def _validate_table_mode(self) -> "DatasetConfig":
|
|
96
|
+
# sqlite_db uses table_names instead of table_name/tables
|
|
97
|
+
if self.engine == "sqlite_db":
|
|
98
|
+
return self
|
|
95
99
|
has_single = bool(self.table_name)
|
|
96
100
|
has_multi = bool(self.tables)
|
|
97
101
|
if has_single and has_multi:
|
|
@@ -286,6 +286,69 @@ def _assemble_all_files(
|
|
|
286
286
|
return files
|
|
287
287
|
|
|
288
288
|
|
|
289
|
+
# ---------------------------------------------------------------------------
|
|
290
|
+
# sqlite_db binary file assembly — pure sqlite3 + thread, no aiosqlite
|
|
291
|
+
# ---------------------------------------------------------------------------
|
|
292
|
+
|
|
293
|
+
|
|
294
|
+
def _build_db_files(
|
|
295
|
+
config: "DatasetImportConfig",
|
|
296
|
+
sources: list[DataSource],
|
|
297
|
+
) -> dict[str, bytes]:
|
|
298
|
+
"""Build config.json + dataset.db bytes for the sqlite_db engine.
|
|
299
|
+
|
|
300
|
+
Runs in a thread (called via asyncio.to_thread). Uses only stdlib sqlite3
|
|
301
|
+
and sqlite3.Connection.backup() which is available since Python 3.7.
|
|
302
|
+
"""
|
|
303
|
+
import os
|
|
304
|
+
import sqlite3
|
|
305
|
+
import tempfile
|
|
306
|
+
from pathlib import Path as _Path
|
|
307
|
+
|
|
308
|
+
table_names: list[str] = []
|
|
309
|
+
mem = sqlite3.connect(":memory:")
|
|
310
|
+
try:
|
|
311
|
+
for source in sources:
|
|
312
|
+
records = source.load()
|
|
313
|
+
schema = _infer_schema(records)
|
|
314
|
+
serialized = _serialize_for_sqlite(records, schema)
|
|
315
|
+
mem.execute(_build_create_table_sql(source.name, schema))
|
|
316
|
+
if serialized:
|
|
317
|
+
col_names = [col["name"] for col in schema]
|
|
318
|
+
placeholders = ", ".join(["?"] * len(col_names))
|
|
319
|
+
insert_sql = (
|
|
320
|
+
f"INSERT INTO {source.name} ({', '.join(col_names)}) "
|
|
321
|
+
f"VALUES ({placeholders})"
|
|
322
|
+
)
|
|
323
|
+
mem.executemany(
|
|
324
|
+
insert_sql,
|
|
325
|
+
[tuple(r.get(c) for c in col_names) for r in serialized],
|
|
326
|
+
)
|
|
327
|
+
table_names.append(source.name)
|
|
328
|
+
mem.commit()
|
|
329
|
+
|
|
330
|
+
with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
|
|
331
|
+
tmp = f.name
|
|
332
|
+
try:
|
|
333
|
+
with sqlite3.connect(tmp) as dst:
|
|
334
|
+
mem.backup(dst)
|
|
335
|
+
db_bytes = _Path(tmp).read_bytes()
|
|
336
|
+
finally:
|
|
337
|
+
os.unlink(tmp)
|
|
338
|
+
finally:
|
|
339
|
+
mem.close()
|
|
340
|
+
|
|
341
|
+
cfg_dict = {
|
|
342
|
+
"engine": "sqlite_db",
|
|
343
|
+
"table_names": table_names,
|
|
344
|
+
"description": config.description,
|
|
345
|
+
}
|
|
346
|
+
return {
|
|
347
|
+
"config.json": json.dumps(cfg_dict, indent=2).encode(),
|
|
348
|
+
"dataset.db": db_bytes,
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
|
|
289
352
|
# ---------------------------------------------------------------------------
|
|
290
353
|
# aiosqlite validation — runs before writing any files
|
|
291
354
|
# ---------------------------------------------------------------------------
|
|
@@ -361,10 +424,13 @@ class DatasetImporter:
|
|
|
361
424
|
"Set overwrite=True to replace it."
|
|
362
425
|
)
|
|
363
426
|
|
|
364
|
-
if self._config.engine == "
|
|
365
|
-
await
|
|
427
|
+
if self._config.engine == "sqlite_db":
|
|
428
|
+
files = await asyncio.to_thread(_build_db_files, self._config, sources)
|
|
429
|
+
else:
|
|
430
|
+
if self._config.engine == "sqlite":
|
|
431
|
+
await _validate_with_aiosqlite(self._config, sources)
|
|
432
|
+
files = await asyncio.to_thread(_assemble_all_files, self._config, sources)
|
|
366
433
|
|
|
367
|
-
files = await asyncio.to_thread(_assemble_all_files, self._config, sources)
|
|
368
434
|
return await asyncio.to_thread(writer.write_files, self._config.dataset_id, files)
|
|
369
435
|
|
|
370
436
|
|
|
@@ -5,6 +5,7 @@ from agentbyte.dataset.config import DatasetSourceConfig
|
|
|
5
5
|
from agentbyte.dataset.json import JSONDataset
|
|
6
6
|
from agentbyte.dataset.sources import DatasetFiles
|
|
7
7
|
from agentbyte.dataset.sqlite import SQLiteDataset
|
|
8
|
+
from agentbyte.dataset.sqlite_db import SQLiteDbDataset
|
|
8
9
|
|
|
9
10
|
# Engine registry: maps engine name → BaseDataset subclass.
|
|
10
11
|
# Third-party engines can register themselves via register_engine().
|
|
@@ -35,6 +36,7 @@ def register_engine(name: str, cls: type[BaseDataset]) -> None:
|
|
|
35
36
|
# Pre-register built-in engines
|
|
36
37
|
register_engine("sqlite", SQLiteDataset)
|
|
37
38
|
register_engine("json", JSONDataset)
|
|
39
|
+
register_engine("sqlite_db", SQLiteDbDataset)
|
|
38
40
|
|
|
39
41
|
|
|
40
42
|
async def load_dataset(dataset_id: str, config: DatasetSourceConfig) -> BaseDataset:
|
|
@@ -94,6 +96,14 @@ def _build_dataset(dataset_id: str, dataset_files: DatasetFiles) -> BaseDataset:
|
|
|
94
96
|
f"Registered engines: {registered}. "
|
|
95
97
|
f"Use register_engine() to add a new engine."
|
|
96
98
|
)
|
|
99
|
+
if config.engine == "sqlite_db":
|
|
100
|
+
return cls(
|
|
101
|
+
dataset_id=dataset_id,
|
|
102
|
+
config=config,
|
|
103
|
+
source_uri=dataset_files.source_uri,
|
|
104
|
+
db_path=dataset_files.db_path,
|
|
105
|
+
db_bytes=dataset_files.db_bytes,
|
|
106
|
+
)
|
|
97
107
|
return cls(
|
|
98
108
|
dataset_id=dataset_id,
|
|
99
109
|
config=config,
|
|
@@ -46,6 +46,7 @@ class DatasetFiles:
|
|
|
46
46
|
|
|
47
47
|
For single-table datasets: ``data_text`` and ``schema_text`` are populated.
|
|
48
48
|
For multi-table datasets: ``table_files`` is populated; ``data_text`` is empty.
|
|
49
|
+
For sqlite_db datasets: ``db_path`` (local) or ``db_bytes`` (S3) is populated.
|
|
49
50
|
"""
|
|
50
51
|
|
|
51
52
|
dataset_id: str
|
|
@@ -54,6 +55,8 @@ class DatasetFiles:
|
|
|
54
55
|
data_text: str = ""
|
|
55
56
|
schema_text: str | None = None
|
|
56
57
|
table_files: list[TableFiles] = field(default_factory=list)
|
|
58
|
+
db_path: "Path | None" = None
|
|
59
|
+
db_bytes: bytes | None = None
|
|
57
60
|
|
|
58
61
|
|
|
59
62
|
def validate_dataset_id(dataset_id: str) -> None:
|
|
@@ -99,6 +102,17 @@ class LocalDatasetSource(DatasetSource):
|
|
|
99
102
|
config_text = self._read_required_text(config_path, "Config file not found")
|
|
100
103
|
config = DatasetConfig(**json.loads(config_text))
|
|
101
104
|
|
|
105
|
+
if config.engine == "sqlite_db":
|
|
106
|
+
db_path = dataset_dir / "dataset.db"
|
|
107
|
+
if not db_path.exists():
|
|
108
|
+
raise FileNotFoundError(f"dataset.db not found: {db_path}")
|
|
109
|
+
return DatasetFiles(
|
|
110
|
+
dataset_id=dataset_id,
|
|
111
|
+
config=config,
|
|
112
|
+
source_uri=str(dataset_dir),
|
|
113
|
+
db_path=db_path,
|
|
114
|
+
)
|
|
115
|
+
|
|
102
116
|
if config.is_multi_table:
|
|
103
117
|
table_files = []
|
|
104
118
|
for td in config.tables:
|
|
@@ -167,6 +181,16 @@ class S3DatasetSource(DatasetSource):
|
|
|
167
181
|
|
|
168
182
|
source_uri = f"s3://{self.config.s3_bucket}/{self._dataset_prefix(dataset_id)}"
|
|
169
183
|
|
|
184
|
+
if config.engine == "sqlite_db":
|
|
185
|
+
db_key = self._build_key(dataset_id, "dataset.db")
|
|
186
|
+
db_bytes = self._read_required_bytes(db_key)
|
|
187
|
+
return DatasetFiles(
|
|
188
|
+
dataset_id=dataset_id,
|
|
189
|
+
config=config,
|
|
190
|
+
source_uri=source_uri,
|
|
191
|
+
db_bytes=db_bytes,
|
|
192
|
+
)
|
|
193
|
+
|
|
170
194
|
if config.is_multi_table:
|
|
171
195
|
table_files = []
|
|
172
196
|
for td in config.tables:
|
|
@@ -209,6 +233,12 @@ class S3DatasetSource(DatasetSource):
|
|
|
209
233
|
except FileNotFoundError as exc:
|
|
210
234
|
raise FileNotFoundError(f"Dataset object not found: s3://{self.config.s3_bucket}/{key}") from exc
|
|
211
235
|
|
|
236
|
+
def _read_required_bytes(self, key: str) -> bytes:
|
|
237
|
+
try:
|
|
238
|
+
return self._read_raw_bytes(key)
|
|
239
|
+
except FileNotFoundError as exc:
|
|
240
|
+
raise FileNotFoundError(f"Dataset object not found: s3://{self.config.s3_bucket}/{key}") from exc
|
|
241
|
+
|
|
212
242
|
def _read_optional_text(self, key: str) -> str | None:
|
|
213
243
|
try:
|
|
214
244
|
return self._read_text(key)
|
|
@@ -216,6 +246,10 @@ class S3DatasetSource(DatasetSource):
|
|
|
216
246
|
return None
|
|
217
247
|
|
|
218
248
|
def _read_text(self, key: str) -> str:
|
|
249
|
+
body = self._read_raw_bytes(key)
|
|
250
|
+
return body.decode("utf-8")
|
|
251
|
+
|
|
252
|
+
def _read_raw_bytes(self, key: str) -> bytes:
|
|
219
253
|
client = self._get_client()
|
|
220
254
|
try:
|
|
221
255
|
response = client.get_object(Bucket=self.config.s3_bucket, Key=key)
|
|
@@ -223,11 +257,8 @@ class S3DatasetSource(DatasetSource):
|
|
|
223
257
|
if self._is_not_found_error(exc):
|
|
224
258
|
raise FileNotFoundError(f"s3://{self.config.s3_bucket}/{key}") from exc
|
|
225
259
|
raise
|
|
226
|
-
|
|
227
260
|
body = response["Body"].read()
|
|
228
|
-
if isinstance(body, bytes)
|
|
229
|
-
return body.decode("utf-8")
|
|
230
|
-
return body
|
|
261
|
+
return body if isinstance(body, bytes) else body.encode("utf-8")
|
|
231
262
|
|
|
232
263
|
@staticmethod
|
|
233
264
|
def _is_not_found_error(exc: Exception) -> bool:
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""SQLite .db binary dataset backed by a native SQLite file via aiosqlite."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import tempfile
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import Any
|
|
7
|
+
|
|
8
|
+
import aiosqlite
|
|
9
|
+
|
|
10
|
+
from agentbyte.dataset.base import BaseDataset, DatasetConfig
|
|
11
|
+
from agentbyte.dataset.sqlite import SqliteColumn, SqliteSchema, validate_sqlite_identifier
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SQLiteDbDataset(BaseDataset):
|
|
15
|
+
"""Async SQLite dataset backed by a native .db binary file.
|
|
16
|
+
|
|
17
|
+
For local sources the .db file is opened directly. For S3 sources the
|
|
18
|
+
binary bytes are written to a temp file which is deleted on ``aclose()``.
|
|
19
|
+
|
|
20
|
+
Use as an async context manager:
|
|
21
|
+
|
|
22
|
+
async with load_dataset("hr/employees", LocalDatasetConfig(...)) as ds:
|
|
23
|
+
rows = await ds.fetch_all()
|
|
24
|
+
|
|
25
|
+
Or call ``aclose()`` explicitly when done.
|
|
26
|
+
|
|
27
|
+
Attributes:
|
|
28
|
+
dataset_id: Canonical ``category/name`` identifier.
|
|
29
|
+
config: Dataset configuration (engine, table_names, description).
|
|
30
|
+
source_uri: Human-readable dataset location.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
def __init__(
|
|
34
|
+
self,
|
|
35
|
+
dataset_id: str,
|
|
36
|
+
config: DatasetConfig,
|
|
37
|
+
source_uri: str,
|
|
38
|
+
db_path: Path | None = None,
|
|
39
|
+
db_bytes: bytes | None = None,
|
|
40
|
+
# Accept and ignore these for compatibility with _build_dataset()
|
|
41
|
+
data_text: str = "",
|
|
42
|
+
schema_text: str | None = None,
|
|
43
|
+
table_files: list | None = None,
|
|
44
|
+
) -> None:
|
|
45
|
+
if config.engine != "sqlite_db":
|
|
46
|
+
raise ValueError(
|
|
47
|
+
f"SQLiteDbDataset requires engine='sqlite_db', got {config.engine!r}."
|
|
48
|
+
)
|
|
49
|
+
if db_path is None and db_bytes is None:
|
|
50
|
+
raise ValueError("Either db_path or db_bytes must be provided.")
|
|
51
|
+
self.dataset_id = dataset_id
|
|
52
|
+
self.config = config
|
|
53
|
+
self.source_uri = source_uri
|
|
54
|
+
self._db_path = db_path
|
|
55
|
+
self._db_bytes = db_bytes
|
|
56
|
+
self._connection: aiosqlite.Connection | None = None
|
|
57
|
+
self._tmp_path: str | None = None
|
|
58
|
+
self._schema: SqliteSchema | None = None
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def engine(self) -> str:
|
|
62
|
+
return "sqlite_db"
|
|
63
|
+
|
|
64
|
+
@property
|
|
65
|
+
def table_name(self) -> str:
|
|
66
|
+
"""First table name, or empty string for multi-table datasets."""
|
|
67
|
+
names = self.config.table_names
|
|
68
|
+
return names[0] if names else ""
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def table_names(self) -> list[str]:
|
|
72
|
+
return self.config.table_names
|
|
73
|
+
|
|
74
|
+
@property
|
|
75
|
+
def schema(self) -> SqliteSchema | None:
|
|
76
|
+
"""Schema for single-table datasets (populated on first connect())."""
|
|
77
|
+
return self._schema
|
|
78
|
+
|
|
79
|
+
async def _open_connection(self) -> aiosqlite.Connection:
|
|
80
|
+
if self._db_path is not None:
|
|
81
|
+
conn = await aiosqlite.connect(str(self._db_path))
|
|
82
|
+
else:
|
|
83
|
+
with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
|
|
84
|
+
f.write(self._db_bytes) # type: ignore[arg-type]
|
|
85
|
+
self._tmp_path = f.name
|
|
86
|
+
conn = await aiosqlite.connect(self._tmp_path)
|
|
87
|
+
conn.row_factory = aiosqlite.Row
|
|
88
|
+
return conn
|
|
89
|
+
|
|
90
|
+
async def _load_schema(self, conn: aiosqlite.Connection, table_name: str) -> SqliteSchema:
|
|
91
|
+
"""Derive SqliteSchema from PRAGMA table_info + index_list."""
|
|
92
|
+
unique_cols: set[str] = set()
|
|
93
|
+
async with conn.execute(f"PRAGMA index_list({table_name})") as cur:
|
|
94
|
+
indexes = await cur.fetchall()
|
|
95
|
+
for idx in indexes:
|
|
96
|
+
if idx["unique"]:
|
|
97
|
+
async with conn.execute(f"PRAGMA index_info({idx['name']})") as cur:
|
|
98
|
+
for info in await cur.fetchall():
|
|
99
|
+
unique_cols.add(info["name"])
|
|
100
|
+
|
|
101
|
+
async with conn.execute(f"PRAGMA table_info({table_name})") as cur:
|
|
102
|
+
rows = await cur.fetchall()
|
|
103
|
+
|
|
104
|
+
columns = [
|
|
105
|
+
SqliteColumn(
|
|
106
|
+
name=row["name"],
|
|
107
|
+
type=row["type"] or "TEXT",
|
|
108
|
+
primary_key=bool(row["pk"]),
|
|
109
|
+
not_null=bool(row["notnull"]),
|
|
110
|
+
unique=row["name"] in unique_cols,
|
|
111
|
+
)
|
|
112
|
+
for row in rows
|
|
113
|
+
]
|
|
114
|
+
return SqliteSchema(columns=columns)
|
|
115
|
+
|
|
116
|
+
async def connect(self) -> aiosqlite.Connection:
|
|
117
|
+
"""Open (or return cached) aiosqlite connection to the .db file.
|
|
118
|
+
|
|
119
|
+
Populates ``schema`` for single-table datasets on first call.
|
|
120
|
+
|
|
121
|
+
Returns:
|
|
122
|
+
aiosqlite.Connection ready to query.
|
|
123
|
+
"""
|
|
124
|
+
if self._connection is not None:
|
|
125
|
+
return self._connection
|
|
126
|
+
conn = await self._open_connection()
|
|
127
|
+
if len(self.config.table_names) == 1:
|
|
128
|
+
self._schema = await self._load_schema(conn, self.config.table_names[0])
|
|
129
|
+
self._connection = conn
|
|
130
|
+
return conn
|
|
131
|
+
|
|
132
|
+
async def fetch_all(self) -> list[dict[str, Any]] | dict[str, list[dict[str, Any]]]:
|
|
133
|
+
"""Return all rows as a list (single-table) or dict of lists (multi-table).
|
|
134
|
+
|
|
135
|
+
- Single-table: returns ``list[dict[str, Any]]`` — one dict per row.
|
|
136
|
+
- Multi-table: returns ``dict[str, list[dict[str, Any]]]`` — one key per table.
|
|
137
|
+
|
|
138
|
+
Use ``connect()`` directly for SQL JOINs across tables.
|
|
139
|
+
"""
|
|
140
|
+
conn = await self.connect()
|
|
141
|
+
if len(self.config.table_names) <= 1:
|
|
142
|
+
table = validate_sqlite_identifier(self.table_name, field_name="table_name")
|
|
143
|
+
async with conn.execute(f"SELECT * FROM {table}") as cursor: # noqa: S608
|
|
144
|
+
return [dict(row) for row in await cursor.fetchall()]
|
|
145
|
+
result: dict[str, list[dict[str, Any]]] = {}
|
|
146
|
+
for name in self.config.table_names:
|
|
147
|
+
table = validate_sqlite_identifier(name, field_name="table_name")
|
|
148
|
+
async with conn.execute(f"SELECT * FROM {table}") as cursor: # noqa: S608
|
|
149
|
+
result[name] = [dict(row) for row in await cursor.fetchall()]
|
|
150
|
+
return result
|
|
151
|
+
|
|
152
|
+
async def aclose(self) -> None:
|
|
153
|
+
"""Close the connection and delete any S3-sourced temp file."""
|
|
154
|
+
if self._connection is not None:
|
|
155
|
+
await self._connection.close()
|
|
156
|
+
self._connection = None
|
|
157
|
+
if self._tmp_path is not None:
|
|
158
|
+
try:
|
|
159
|
+
os.unlink(self._tmp_path)
|
|
160
|
+
except OSError:
|
|
161
|
+
pass
|
|
162
|
+
self._tmp_path = None
|
|
163
|
+
|
|
164
|
+
async def __aenter__(self) -> "SQLiteDbDataset":
|
|
165
|
+
return self
|
|
166
|
+
|
|
167
|
+
async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
|
|
168
|
+
await self.aclose()
|
|
169
|
+
|
|
170
|
+
def __repr__(self) -> str:
|
|
171
|
+
tables = ", ".join(self.config.table_names)
|
|
172
|
+
return f"SQLiteDbDataset(id='{self.dataset_id}', tables=[{tables}])"
|
|
@@ -103,8 +103,28 @@ class StreamEventLogger:
|
|
|
103
103
|
str(event_type),
|
|
104
104
|
)
|
|
105
105
|
|
|
106
|
+
def log(self, item: Any) -> None:
|
|
107
|
+
"""Route item to the appropriate log level and emit it.
|
|
108
|
+
|
|
109
|
+
Calls ``info``, ``debug``, ``warning``, ``error``, and ``exception``
|
|
110
|
+
in sequence; each silently ignores items it does not own, so exactly
|
|
111
|
+
one call produces output per event. Unknown or non-event objects are
|
|
112
|
+
silently dropped.
|
|
113
|
+
|
|
114
|
+
This is the recommended entry point for ``run_stream()`` loops::
|
|
115
|
+
|
|
116
|
+
async for event in runner.run_stream(workflow, input_data):
|
|
117
|
+
stream_logger.log(event)
|
|
118
|
+
"""
|
|
119
|
+
self.info(item)
|
|
120
|
+
self.debug(item)
|
|
121
|
+
self.warning(item)
|
|
122
|
+
self.error(item)
|
|
123
|
+
self.exception(item)
|
|
124
|
+
|
|
106
125
|
def info(self, item: Any) -> None:
|
|
107
|
-
"""Emit INFO for task/tool start-complete
|
|
126
|
+
"""Emit INFO for task/tool start-complete, workflow progress milestones,
|
|
127
|
+
and step progress messages emitted via ``context.emit_progress()``.
|
|
108
128
|
|
|
109
129
|
All other items are silently ignored.
|
|
110
130
|
"""
|
|
@@ -122,6 +142,7 @@ class StreamEventLogger:
|
|
|
122
142
|
)
|
|
123
143
|
from agentbyte.workflow.core.models import (
|
|
124
144
|
StepCompletedEvent,
|
|
145
|
+
StepProgressEvent,
|
|
125
146
|
StepStartedEvent,
|
|
126
147
|
WorkflowCompletedEvent,
|
|
127
148
|
WorkflowEvent,
|
|
@@ -195,6 +216,20 @@ class StreamEventLogger:
|
|
|
195
216
|
len(item.execution.step_executions),
|
|
196
217
|
)
|
|
197
218
|
|
|
219
|
+
elif isinstance(item, StepProgressEvent):
|
|
220
|
+
progress_suffix = ""
|
|
221
|
+
if item.completed is not None and item.total is not None:
|
|
222
|
+
progress_suffix = f" progress={item.completed}/{item.total}"
|
|
223
|
+
self._logger.info(
|
|
224
|
+
"[%s] %s | %s step=%s message=%s%s",
|
|
225
|
+
source,
|
|
226
|
+
time_str,
|
|
227
|
+
event_type,
|
|
228
|
+
item.step_id,
|
|
229
|
+
item.message,
|
|
230
|
+
progress_suffix,
|
|
231
|
+
)
|
|
232
|
+
|
|
198
233
|
elif isinstance(item, StepStartedEvent):
|
|
199
234
|
self._logger.info(
|
|
200
235
|
"[%s] %s | %s step=%s",
|
|
@@ -220,8 +255,9 @@ class StreamEventLogger:
|
|
|
220
255
|
Handles ``ModelCallEvent``, ``ModelResponseEvent``,
|
|
221
256
|
``ModelStreamChunkEvent``, ``ToolCallResponseEvent``,
|
|
222
257
|
``ToolValidationEvent`` (when valid), ``MemoryUpdateEvent``,
|
|
223
|
-
``MemoryRetrievalEvent``, and workflow
|
|
224
|
-
``
|
|
258
|
+
``MemoryRetrievalEvent``, and workflow internals such as
|
|
259
|
+
``EdgeActivatedEvent`` and ``CheckpointSavedEvent``.
|
|
260
|
+
All other items are silently ignored.
|
|
225
261
|
"""
|
|
226
262
|
from agentbyte.agents.types import (
|
|
227
263
|
BaseEvent,
|
|
@@ -241,7 +277,6 @@ class StreamEventLogger:
|
|
|
241
277
|
from agentbyte.workflow.core.models import (
|
|
242
278
|
CheckpointSavedEvent,
|
|
243
279
|
EdgeActivatedEvent,
|
|
244
|
-
StepProgressEvent,
|
|
245
280
|
WorkflowEvent,
|
|
246
281
|
WorkflowResumedEvent,
|
|
247
282
|
)
|
|
@@ -281,20 +316,6 @@ class StreamEventLogger:
|
|
|
281
316
|
):
|
|
282
317
|
self._logger.debug("[%s] %s | %s", source, time_str, event_type)
|
|
283
318
|
|
|
284
|
-
elif isinstance(item, StepProgressEvent):
|
|
285
|
-
progress_suffix = ""
|
|
286
|
-
if item.completed is not None and item.total is not None:
|
|
287
|
-
progress_suffix = f" progress={item.completed}/{item.total}"
|
|
288
|
-
self._logger.debug(
|
|
289
|
-
"[%s] %s | %s step=%s message=%s%s",
|
|
290
|
-
source,
|
|
291
|
-
time_str,
|
|
292
|
-
event_type,
|
|
293
|
-
item.step_id,
|
|
294
|
-
item.message,
|
|
295
|
-
progress_suffix,
|
|
296
|
-
)
|
|
297
|
-
|
|
298
319
|
elif isinstance(item, EdgeActivatedEvent):
|
|
299
320
|
self._logger.debug(
|
|
300
321
|
"[%s] %s | %s from=%s to=%s",
|