agentbyte 0.46.0__tar.gz → 0.48.0__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.46.0 → agentbyte-0.48.0}/.gitignore +3 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/CHANGELOG.md +59 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/PKG-INFO +24 -10
- {agentbyte-0.46.0 → agentbyte-0.48.0}/README.md +16 -9
- {agentbyte-0.46.0 → agentbyte-0.48.0}/pyproject.toml +9 -0
- agentbyte-0.48.0/src/agentbyte/__about__.py +2 -0
- agentbyte-0.48.0/src/agentbyte/a2a/__init__.py +47 -0
- agentbyte-0.48.0/src/agentbyte/a2a/app.py +98 -0
- agentbyte-0.48.0/src/agentbyte/a2a/distributed_context.py +180 -0
- agentbyte-0.48.0/src/agentbyte/a2a/executor.py +231 -0
- agentbyte-0.48.0/src/agentbyte/a2a/tool.py +221 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/eval_commands.py +1 -1
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/main.py +5 -1
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/optim_commands.py +1 -1
- agentbyte-0.48.0/src/agentbyte/cli/serve_commands.py +55 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/component.py +0 -1
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/importer.py +56 -38
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/base.py +5 -1
- agentbyte-0.48.0/src/agentbyte/eval/history/_writer_lock.py +46 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/conformance.py +41 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/models.py +73 -8
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/recorder.py +12 -4
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/sql.py +219 -13
- agentbyte-0.48.0/src/agentbyte/eval/history/sqlite.py +48 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/store.py +13 -4
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/agent.py +11 -2
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/__init__.py +4 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/coordinator.py +13 -3
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/jobs.py +18 -2
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/suite.py +77 -2
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/verdict.py +4 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/__init__.py +4 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/base.py +8 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/report.py +133 -7
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/trace.py +12 -1
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/__init__.py +12 -0
- agentbyte-0.48.0/src/agentbyte/presets/capitals.py +87 -0
- agentbyte-0.48.0/src/agentbyte/tools/mcp/__init__.py +56 -0
- agentbyte-0.48.0/src/agentbyte/tools/mcp/client.py +250 -0
- agentbyte-0.48.0/src/agentbyte/tools/mcp/config.py +45 -0
- agentbyte-0.48.0/src/agentbyte/tools/mcp/errors.py +12 -0
- agentbyte-0.48.0/src/agentbyte/tools/mcp/tool.py +101 -0
- agentbyte-0.48.0/src/agentbyte/tools/mcp/transports.py +56 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/research_tools.py +8 -128
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/eval_routes.py +27 -4
- agentbyte-0.48.0/src/agentbyte/webui/mcp/__init__.py +5 -0
- agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/__init__.py +8 -0
- agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/apps_server.py +119 -0
- agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/auth_server.py +85 -0
- agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/basic_server.py +67 -0
- agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/mrtr_server.py +52 -0
- agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/notify_server.py +54 -0
- agentbyte-0.48.0/src/agentbyte/webui/mcp_playground.py +393 -0
- agentbyte-0.48.0/src/agentbyte/webui/mcp_routes.py +312 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/models.py +4 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/server.py +31 -0
- agentbyte-0.48.0/src/agentbyte/webui/ui/assets/index-DGIjPh4H.css +1 -0
- agentbyte-0.48.0/src/agentbyte/webui/ui/assets/index-XUXdsPv4.js +82 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/ui/index.html +2 -2
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/sqlite_checkpoint.py +2 -0
- agentbyte-0.48.0/tests/a2a/a2a_helpers.py +104 -0
- agentbyte-0.48.0/tests/a2a/test_a2a_adapters.py +369 -0
- agentbyte-0.48.0/tests/a2a/test_distributed_context.py +185 -0
- agentbyte-0.48.0/tests/cli/test_serve_command.py +65 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_sqlite_db.py +159 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_history.py +32 -7
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_history_backends.py +1 -1
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_jobs.py +5 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_workbench.py +33 -1
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_report.py +165 -0
- agentbyte-0.48.0/tests/presets/test_capitals.py +63 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_optional_extras.py +14 -0
- agentbyte-0.48.0/tests/tools/fixtures/mcp_stdio_server.py +27 -0
- agentbyte-0.48.0/tests/tools/test_mcp_tools.py +544 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/tools/test_research_tools.py +4 -32
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_eval_routes.py +31 -1
- agentbyte-0.48.0/tests/webui/test_mcp_routes.py +478 -0
- agentbyte-0.46.0/src/agentbyte/__about__.py +0 -2
- agentbyte-0.46.0/src/agentbyte/eval/history/sqlite.py +0 -496
- agentbyte-0.46.0/src/agentbyte/webui/ui/assets/index-CrAxIGFr.js +0 -82
- agentbyte-0.46.0/src/agentbyte/webui/ui/assets/index-m9IRI-Jx.css +0 -1
- {agentbyte-0.46.0 → agentbyte-0.48.0}/LICENSE +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/_optional.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/agent.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/embedding_agent.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/types.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/catalog.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/__main__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/loading.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/counters.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/errors.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/grouping.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/strategies.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context_providers/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context_providers/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context_providers/skills.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/loader.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/publish.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/publish_config.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/publishers.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/s3.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/sources.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/sqlite.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/write_config.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/writers.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/decorator.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/keyword.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/local.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/process.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/tool.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/types.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/comparison.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/eval_dataset.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/errors.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/transitions.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/composite.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/llm.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/reference.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/validation.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/pairwise.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/report.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/runner.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/splitting.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/model.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/runtime.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/workflow.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/types.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/execution_trace/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/execution_trace/collector.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/execution_trace/models.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/auth.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/chat.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/embedding.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/pricing.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/logger.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/otel.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/sql_usage.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/usage_logger.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/config.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/gepa.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/mipro.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/pareto.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/reflective.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/spec.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/ai.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/handoff.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/plan.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/policies.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/round_robin.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instruction_registry.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/streaming.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/resources.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/scripts.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/sources.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/validation.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/coding_tools.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/types.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/execution.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/errors.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/agent.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/visualizer.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_as_tool.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_context_providers.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_error_response.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_response_accessors.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_stop_at_tools.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_embedding_agent.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_tool_batch_resolution.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_tool_metadata.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/cli/test_loading.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/cli/test_registry_check.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/compaction/test_compaction.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/context_providers/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/context_providers/test_skill_tools.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/context_providers/test_skills_provider.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/fake_s3.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_dataset_exit.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_loader.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_multi_table.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_publish.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_dataset.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_execution_trajectories.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_multi_turn.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_pairwise.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_score_integrity.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_splitting.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_types_and_judges.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/examples/test_compaction_webapp.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_pricing.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_retryable_error_substrings.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_context_compaction.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_sql_usage.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_usage_logger.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_base_integration.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_config.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_description_tunable.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_gepa.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_mipro.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_orchestrator_optim.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_pareto.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_reflective.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_score_integrity.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_spec.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_trace.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_base_orchestrator.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_history_tool_call_pairing.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestration_usage_breakdown.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_agent_contract.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_member_events.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_otel.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_synthesis.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_round_robin.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_instruction_registry.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_streaming.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/test_base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/test_resources.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/test_scripts.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/test_sources.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_base.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_external.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_source.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_context.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_logger.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_messages.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_option_enums.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_package_api.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_session_store.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_types.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_vanilla_chunker.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/tools/test_coding_tools.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/__init__.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/helpers.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_server.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_workflow_streaming.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/recovery_worker.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_agent_step_imports.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_reliability.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -6,6 +6,65 @@ The format follows Keep a Changelog principles and semantic versioning.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.48.0] - 2026-10-06
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Evaluation suite workspace and score-aware optimization outcome (spec 0069): `suite` is a
|
|
14
|
+
first-class, indexed column on eval runs (`list_runs(suite=)`, `GET /api/eval/runs?suite=`), and
|
|
15
|
+
`OptimizationReport`/`OptimizationRunRecord` expose a shared `OptimizationOutcome`
|
|
16
|
+
(`improved` / `seed_kept` / `best_candidate_changed`) via `classify_outcome`.
|
|
17
|
+
- Agent as a first-class history dimension (spec 0070): `agent_id`/`agent_name` on `EvalRunRecord`
|
|
18
|
+
and `OptimizationRunRecord` (indexed `agent_id`, defaulted from `target_id`), `list_runs(agent=)`
|
|
19
|
+
/ `list_optimizations(agent=)`, `GET /api/eval/agents` and `?agent=` filters. `EvalSuite` declares
|
|
20
|
+
`agent_id`/`agent_name`/`agent_description`; `EvalSuiteRegistry` builds agent cards and raises
|
|
21
|
+
`DuplicateAgentError` when one `agent_id` maps to two names. The WebUI Evaluations tab is now an
|
|
22
|
+
agent-card gallery with per-agent pages (suites + Run, grouped history, server-side pagination).
|
|
23
|
+
- `SqlEvalRunStore.from_sqlite_path` / `from_url` convenience constructors that own the engine
|
|
24
|
+
(spec 0071).
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- One storage backend for evaluation history (spec 0071): `SqlEvalRunStore` (SQLAlchemy Core) now
|
|
29
|
+
serves both SQLite and PostgreSQL. The hand-written raw-SQL SQLite store was retired;
|
|
30
|
+
`SQLiteEvalRunStore` is kept as a thin backward-compatible alias. SQLite gets a single-writer file
|
|
31
|
+
lock, `PRAGMA synchronous=FULL` and schema auto-migration; the row format is unchanged, so existing
|
|
32
|
+
`.sqlite` files open with no data migration. History store schema migrates forward to layout 4.
|
|
33
|
+
- The `sqlite` extra now also provides `sqlalchemy[asyncio]` (needed by the unified store); `import
|
|
34
|
+
agentbyte` with core dependencies only is unchanged.
|
|
35
|
+
|
|
36
|
+
## [0.47.0] - 2026-10-06
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- MCP tool bridge (spec 0013, `mcp` extra): `agentbyte.tools.mcp` with `MCPClientManager`, `MCPTool`
|
|
41
|
+
and `create_mcp_tools()` over the official MCP SDK (v2).
|
|
42
|
+
- WebUI MCP Playground: connect to MCP servers, browse capabilities and tools, call tools, read app
|
|
43
|
+
resources, and answer pending inputs from the Playground. It is off by default
|
|
44
|
+
(`AgentbyteWebUIServer(mcp_playground=True)`) because it can launch subprocesses and make outbound
|
|
45
|
+
connections on request.
|
|
46
|
+
- A2A 1.0 adapters (spec 0013, `a2a` extra): `AgentByteExecutor`, `create_a2a_app`,
|
|
47
|
+
`agent_card_from_agent` to serve an agent, and `A2ATool` to call one, as thin adapters over the
|
|
48
|
+
official `a2a-sdk` 1.x. Human approval maps to `input-required` and resumes on the same task.
|
|
49
|
+
- `agentbyte serve`: a localhost-only development command for serving an agent over A2A.
|
|
50
|
+
- `DistributedContextManager` and two `examples/distributed/` patterns.
|
|
51
|
+
|
|
52
|
+
### Changed
|
|
53
|
+
|
|
54
|
+
- Local SQLite state now lives under `.agentbyte/` instead of the working-directory root. The default
|
|
55
|
+
evaluation history is `.agentbyte/eval/default/eval.sqlite` (was `./eval.sqlite`) for
|
|
56
|
+
`agentbyte eval`, `agentbyte optim` and `agentbyte webui --eval-catalog`, and examples and notebooks use
|
|
57
|
+
one folder per project (`.agentbyte/eval/<project>/eval.sqlite` with its `.writer.lock` beside it).
|
|
58
|
+
`SQLiteEvalRunStore` (writers) and `SQLiteCheckpointStore` create the parent directories on open.
|
|
59
|
+
Explicit paths, `--history PATH` and `:memory:` behave as before. Existing history files are not moved
|
|
60
|
+
automatically: pass `--history` or move them into the new folder.
|
|
61
|
+
|
|
62
|
+
### Removed
|
|
63
|
+
|
|
64
|
+
- **Breaking:** the hand-written A2A 0.3 client, server, models and errors (`agentbyte.a2a` from the
|
|
65
|
+
unreleased 0.6.0/0.7.0 development phases) are gone, with no 0.3 compatibility. Use the A2A 1.0
|
|
66
|
+
adapters above; authentication is left to host Starlette middleware or SDK interceptors.
|
|
67
|
+
|
|
9
68
|
## [0.46.0] - 2026-10-05
|
|
10
69
|
|
|
11
70
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agentbyte
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.48.0
|
|
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
|
|
@@ -10,6 +10,10 @@ Requires-Dist: httpx>=0.28.1
|
|
|
10
10
|
Requires-Dist: pydantic-settings>=2.13.0
|
|
11
11
|
Requires-Dist: pydantic>=2.12.5
|
|
12
12
|
Requires-Dist: pyyaml>=6.0.3
|
|
13
|
+
Provides-Extra: a2a
|
|
14
|
+
Requires-Dist: a2a-sdk[http-server]<2,>=1.2; extra == 'a2a'
|
|
15
|
+
Requires-Dist: fastapi>=0.135.2; extra == 'a2a'
|
|
16
|
+
Requires-Dist: uvicorn[standard]>=0.44.0; extra == 'a2a'
|
|
13
17
|
Provides-Extra: all
|
|
14
18
|
Requires-Dist: aioboto3>=15.5.0; extra == 'all'
|
|
15
19
|
Requires-Dist: aiosqlite>=0.22.1; extra == 'all'
|
|
@@ -40,6 +44,8 @@ Provides-Extra: gunicorn
|
|
|
40
44
|
Requires-Dist: fastapi>=0.135.2; extra == 'gunicorn'
|
|
41
45
|
Requires-Dist: gunicorn>=23.0.0; extra == 'gunicorn'
|
|
42
46
|
Requires-Dist: uvicorn[standard]>=0.44.0; extra == 'gunicorn'
|
|
47
|
+
Provides-Extra: mcp
|
|
48
|
+
Requires-Dist: mcp<3,>=2.0.0; extra == 'mcp'
|
|
43
49
|
Provides-Extra: openai
|
|
44
50
|
Requires-Dist: openai>=1.107.1; extra == 'openai'
|
|
45
51
|
Provides-Extra: optim
|
|
@@ -64,6 +70,7 @@ Requires-Dist: sqlalchemy[asyncio]>=2.0.43; extra == 'sql'
|
|
|
64
70
|
Requires-Dist: sqlmodel>=0.0.38; extra == 'sql'
|
|
65
71
|
Provides-Extra: sqlite
|
|
66
72
|
Requires-Dist: aiosqlite>=0.22.1; extra == 'sqlite'
|
|
73
|
+
Requires-Dist: sqlalchemy[asyncio]>=2.0.43; extra == 'sqlite'
|
|
67
74
|
Provides-Extra: tiktoken
|
|
68
75
|
Requires-Dist: tiktoken>=0.9.0; extra == 'tiktoken'
|
|
69
76
|
Provides-Extra: viz
|
|
@@ -77,7 +84,7 @@ Description-Content-Type: text/markdown
|
|
|
77
84
|
|
|
78
85
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
79
86
|
|
|
80
|
-
Current release: **0.
|
|
87
|
+
Current release: **0.48.0**
|
|
81
88
|
|
|
82
89
|
## Building an Agent
|
|
83
90
|
|
|
@@ -311,17 +318,24 @@ uv add "agentbyte[openai,sqlite]"
|
|
|
311
318
|
| `otel` | OpenTelemetry API, SDK, OTLP exporter | OpenTelemetry tracing and metrics |
|
|
312
319
|
| `webui` | `fastapi`, `uvicorn` | `agentbyte webui` |
|
|
313
320
|
| `gunicorn` | `webui` + `gunicorn` | Production single-worker serving (`gunicorn -k uvicorn.workers.UvicornWorker -w 1`) |
|
|
314
|
-
| `sqlite` | `aiosqlite` | SQLite datasets, workflow checkpoints, evaluation history |
|
|
315
|
-
| `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, `SqlEvalRunStore` |
|
|
321
|
+
| `sqlite` | `aiosqlite`, `sqlalchemy[asyncio]` | SQLite datasets, workflow checkpoints, evaluation history (`SqlEvalRunStore` over `sqlite+aiosqlite`) |
|
|
322
|
+
| `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, PostgreSQL `SqlEvalRunStore` |
|
|
316
323
|
| `sql` | `sqlite` + `postgres` | Both SQL backends |
|
|
317
324
|
| `tiktoken` | `tiktoken` | `TiktokenCounter` for exact compaction token counts |
|
|
318
325
|
| `optim` | `gepa` | `optimize_with_gepa()` |
|
|
319
326
|
| `viz` | `graphviz` | `WorkflowVisualizer.to_dot()` |
|
|
320
327
|
| `research` | `beautifulsoup4`, `html2text`, `arxiv`, `youtube-transcript-api` | `agentbyte.tools.research_tools` |
|
|
321
|
-
| `
|
|
328
|
+
| `mcp` | `mcp` (SDK v2) | `agentbyte.tools.mcp`: MCP tool bridge (`MCPClientManager`, `MCPTool`, `create_mcp_tools()`); also enables the WebUI MCP Playground routes |
|
|
329
|
+
| `a2a` | `a2a-sdk[http-server]` 1.x, `agentbyte[webui]` | `agentbyte.a2a`: A2A 1.0 adapters on the official SDK — `create_a2a_app` / `AgentByteExecutor` to serve an agent, `A2ATool` to call one, `agentbyte serve` for local dev |
|
|
330
|
+
| `all` | every extra above except `mcp`/`a2a`* | Everything except the MCP/A2A protocol bridges |
|
|
331
|
+
|
|
332
|
+
*`mcp` and `a2a` are deliberately excluded from `all`: both let an agent reach outside the
|
|
333
|
+
process (subprocess tools, outbound HTTP to arbitrary agents) and are opt-in rather than
|
|
334
|
+
bundled by default. Install them explicitly: `pip install "agentbyte[mcp,a2a]"`.
|
|
322
335
|
|
|
323
336
|
Contributors working in this repository install every extra plus the local tooling groups
|
|
324
|
-
(`test`, `dev`, `experiment`)
|
|
337
|
+
(`test`, `dev`, `experiment`) — this always includes `mcp`/`a2a` regardless of the `all`
|
|
338
|
+
composite above, since `--all-extras` syncs every defined extra individually:
|
|
325
339
|
|
|
326
340
|
```bash
|
|
327
341
|
uv sync --all-extras --all-groups
|
|
@@ -342,7 +356,7 @@ No API key needed: three demo agents, a team and a workflow on a fake model clie
|
|
|
342
356
|
|
|
343
357
|
```bash
|
|
344
358
|
uv run python examples/webui/in_memory.py # http://127.0.0.1:8070
|
|
345
|
-
uv run python examples/webui/in_memory.py --eval-history eval.sqlite # plus Evaluations
|
|
359
|
+
uv run python examples/webui/in_memory.py --eval-history .agentbyte/eval/default/eval.sqlite # plus Evaluations
|
|
346
360
|
```
|
|
347
361
|
|
|
348
362
|
With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workflow:
|
|
@@ -350,7 +364,7 @@ With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workf
|
|
|
350
364
|
```bash
|
|
351
365
|
uv sync --extra webui --extra openai # or --extra azureopenai
|
|
352
366
|
uv run python examples/webui/presets_webui.py # http://127.0.0.1:8080
|
|
353
|
-
uv run python examples/webui/presets_webui.py --eval-history eval.sqlite
|
|
367
|
+
uv run python examples/webui/presets_webui.py --eval-history .agentbyte/eval/default/eval.sqlite
|
|
354
368
|
```
|
|
355
369
|
|
|
356
370
|
Both launchers accept `--port`, `--no-open`, `--eval-history PATH` and `--eval-catalog CATALOG`
|
|
@@ -368,7 +382,7 @@ uv run agentbyte eval ui --catalog examples/eval/workbench_catalog.py # htt
|
|
|
368
382
|
|
|
369
383
|
- `--catalog` takes a `.py` file or a module path (`myapp.evaluations`); add `:name` only when the
|
|
370
384
|
file defines more than one registry. Without `--catalog` it serves the built-in smoke suite.
|
|
371
|
-
- Runs are stored in
|
|
385
|
+
- Runs are stored in `./.agentbyte/eval/default/eval.sqlite` unless you pass `--history PATH`. Only one process can write
|
|
372
386
|
a history file: stop the UI before `agentbyte eval run` on the same file, or use another file.
|
|
373
387
|
- The same catalog works in the terminal: `uv run agentbyte eval run capitals --catalog examples/eval/workbench_catalog.py`.
|
|
374
388
|
- To serve agents and Evaluations together: `agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py`.
|
|
@@ -399,7 +413,7 @@ uv run agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py #
|
|
|
399
413
|
from agentbyte.webui import serve
|
|
400
414
|
|
|
401
415
|
serve(entities=[agent], port=8080)
|
|
402
|
-
serve(entities=[agent], eval_registry=registry, eval_history="eval.sqlite") # with Evaluations
|
|
416
|
+
serve(entities=[agent], eval_registry=registry, eval_history=".agentbyte/eval/default/eval.sqlite") # with Evaluations
|
|
403
417
|
```
|
|
404
418
|
|
|
405
419
|
### Quick Troubleshooting
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
4
4
|
|
|
5
|
-
Current release: **0.
|
|
5
|
+
Current release: **0.48.0**
|
|
6
6
|
|
|
7
7
|
## Building an Agent
|
|
8
8
|
|
|
@@ -236,17 +236,24 @@ uv add "agentbyte[openai,sqlite]"
|
|
|
236
236
|
| `otel` | OpenTelemetry API, SDK, OTLP exporter | OpenTelemetry tracing and metrics |
|
|
237
237
|
| `webui` | `fastapi`, `uvicorn` | `agentbyte webui` |
|
|
238
238
|
| `gunicorn` | `webui` + `gunicorn` | Production single-worker serving (`gunicorn -k uvicorn.workers.UvicornWorker -w 1`) |
|
|
239
|
-
| `sqlite` | `aiosqlite` | SQLite datasets, workflow checkpoints, evaluation history |
|
|
240
|
-
| `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, `SqlEvalRunStore` |
|
|
239
|
+
| `sqlite` | `aiosqlite`, `sqlalchemy[asyncio]` | SQLite datasets, workflow checkpoints, evaluation history (`SqlEvalRunStore` over `sqlite+aiosqlite`) |
|
|
240
|
+
| `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, PostgreSQL `SqlEvalRunStore` |
|
|
241
241
|
| `sql` | `sqlite` + `postgres` | Both SQL backends |
|
|
242
242
|
| `tiktoken` | `tiktoken` | `TiktokenCounter` for exact compaction token counts |
|
|
243
243
|
| `optim` | `gepa` | `optimize_with_gepa()` |
|
|
244
244
|
| `viz` | `graphviz` | `WorkflowVisualizer.to_dot()` |
|
|
245
245
|
| `research` | `beautifulsoup4`, `html2text`, `arxiv`, `youtube-transcript-api` | `agentbyte.tools.research_tools` |
|
|
246
|
-
| `
|
|
246
|
+
| `mcp` | `mcp` (SDK v2) | `agentbyte.tools.mcp`: MCP tool bridge (`MCPClientManager`, `MCPTool`, `create_mcp_tools()`); also enables the WebUI MCP Playground routes |
|
|
247
|
+
| `a2a` | `a2a-sdk[http-server]` 1.x, `agentbyte[webui]` | `agentbyte.a2a`: A2A 1.0 adapters on the official SDK — `create_a2a_app` / `AgentByteExecutor` to serve an agent, `A2ATool` to call one, `agentbyte serve` for local dev |
|
|
248
|
+
| `all` | every extra above except `mcp`/`a2a`* | Everything except the MCP/A2A protocol bridges |
|
|
249
|
+
|
|
250
|
+
*`mcp` and `a2a` are deliberately excluded from `all`: both let an agent reach outside the
|
|
251
|
+
process (subprocess tools, outbound HTTP to arbitrary agents) and are opt-in rather than
|
|
252
|
+
bundled by default. Install them explicitly: `pip install "agentbyte[mcp,a2a]"`.
|
|
247
253
|
|
|
248
254
|
Contributors working in this repository install every extra plus the local tooling groups
|
|
249
|
-
(`test`, `dev`, `experiment`)
|
|
255
|
+
(`test`, `dev`, `experiment`) — this always includes `mcp`/`a2a` regardless of the `all`
|
|
256
|
+
composite above, since `--all-extras` syncs every defined extra individually:
|
|
250
257
|
|
|
251
258
|
```bash
|
|
252
259
|
uv sync --all-extras --all-groups
|
|
@@ -267,7 +274,7 @@ No API key needed: three demo agents, a team and a workflow on a fake model clie
|
|
|
267
274
|
|
|
268
275
|
```bash
|
|
269
276
|
uv run python examples/webui/in_memory.py # http://127.0.0.1:8070
|
|
270
|
-
uv run python examples/webui/in_memory.py --eval-history eval.sqlite # plus Evaluations
|
|
277
|
+
uv run python examples/webui/in_memory.py --eval-history .agentbyte/eval/default/eval.sqlite # plus Evaluations
|
|
271
278
|
```
|
|
272
279
|
|
|
273
280
|
With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workflow:
|
|
@@ -275,7 +282,7 @@ With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workf
|
|
|
275
282
|
```bash
|
|
276
283
|
uv sync --extra webui --extra openai # or --extra azureopenai
|
|
277
284
|
uv run python examples/webui/presets_webui.py # http://127.0.0.1:8080
|
|
278
|
-
uv run python examples/webui/presets_webui.py --eval-history eval.sqlite
|
|
285
|
+
uv run python examples/webui/presets_webui.py --eval-history .agentbyte/eval/default/eval.sqlite
|
|
279
286
|
```
|
|
280
287
|
|
|
281
288
|
Both launchers accept `--port`, `--no-open`, `--eval-history PATH` and `--eval-catalog CATALOG`
|
|
@@ -293,7 +300,7 @@ uv run agentbyte eval ui --catalog examples/eval/workbench_catalog.py # htt
|
|
|
293
300
|
|
|
294
301
|
- `--catalog` takes a `.py` file or a module path (`myapp.evaluations`); add `:name` only when the
|
|
295
302
|
file defines more than one registry. Without `--catalog` it serves the built-in smoke suite.
|
|
296
|
-
- Runs are stored in
|
|
303
|
+
- Runs are stored in `./.agentbyte/eval/default/eval.sqlite` unless you pass `--history PATH`. Only one process can write
|
|
297
304
|
a history file: stop the UI before `agentbyte eval run` on the same file, or use another file.
|
|
298
305
|
- The same catalog works in the terminal: `uv run agentbyte eval run capitals --catalog examples/eval/workbench_catalog.py`.
|
|
299
306
|
- To serve agents and Evaluations together: `agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py`.
|
|
@@ -324,7 +331,7 @@ uv run agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py #
|
|
|
324
331
|
from agentbyte.webui import serve
|
|
325
332
|
|
|
326
333
|
serve(entities=[agent], port=8080)
|
|
327
|
-
serve(entities=[agent], eval_registry=registry, eval_history="eval.sqlite") # with Evaluations
|
|
334
|
+
serve(entities=[agent], eval_registry=registry, eval_history=".agentbyte/eval/default/eval.sqlite") # with Evaluations
|
|
328
335
|
```
|
|
329
336
|
|
|
330
337
|
### Quick Troubleshooting
|
|
@@ -42,6 +42,7 @@ gunicorn = [
|
|
|
42
42
|
]
|
|
43
43
|
sqlite = [
|
|
44
44
|
"aiosqlite>=0.22.1",
|
|
45
|
+
"sqlalchemy[asyncio]>=2.0.43",
|
|
45
46
|
]
|
|
46
47
|
postgres = [
|
|
47
48
|
"sqlalchemy[asyncio]>=2.0.43",
|
|
@@ -66,6 +67,14 @@ research = [
|
|
|
66
67
|
"arxiv>=2.1",
|
|
67
68
|
"youtube-transcript-api>=0.6",
|
|
68
69
|
]
|
|
70
|
+
mcp = [
|
|
71
|
+
"mcp>=2.0.0,<3",
|
|
72
|
+
]
|
|
73
|
+
# A2A 1.0 via the official SDK; uvicorn (webui) runs `agentbyte serve`.
|
|
74
|
+
a2a = [
|
|
75
|
+
"a2a-sdk[http-server]>=1.2,<2",
|
|
76
|
+
"agentbyte[webui]",
|
|
77
|
+
]
|
|
69
78
|
all = [
|
|
70
79
|
"agentbyte[openai,azureopenai,aws,otel,webui,gunicorn,sql,tiktoken,optim,viz,research]",
|
|
71
80
|
]
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"""A2A 1.0 adapters on the official SDK (`a2a-sdk`), plus distributed-context helpers.
|
|
2
|
+
|
|
3
|
+
Import from this package explicitly; no parent package re-exports it. The SDK owns
|
|
4
|
+
the protocol (wire format, transports, task store, streaming); AgentByte adds only:
|
|
5
|
+
|
|
6
|
+
- `AgentByteExecutor` — serve an AgentByte agent as an SDK `AgentExecutor`
|
|
7
|
+
- `create_a2a_app` / `agent_card_from_agent` — a ready Starlette app and default card
|
|
8
|
+
- `A2ATool` — call a remote A2A agent as a native tool, over an SDK `Client`
|
|
9
|
+
|
|
10
|
+
No authentication is built in: hosts add Starlette middleware on the server and SDK
|
|
11
|
+
interceptors on the client. SDK-backed names need the ``a2a`` extra and are imported
|
|
12
|
+
lazily, so `DistributedContextManager` works with the base install.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import importlib
|
|
18
|
+
from typing import TYPE_CHECKING, Any
|
|
19
|
+
|
|
20
|
+
if TYPE_CHECKING:
|
|
21
|
+
from agentbyte.a2a.app import agent_card_from_agent, create_a2a_app
|
|
22
|
+
from agentbyte.a2a.distributed_context import DistributedContextManager
|
|
23
|
+
from agentbyte.a2a.executor import AgentByteExecutor
|
|
24
|
+
from agentbyte.a2a.tool import A2ATool
|
|
25
|
+
|
|
26
|
+
_EXPORTS = {
|
|
27
|
+
"A2ATool": "agentbyte.a2a.tool",
|
|
28
|
+
"AgentByteExecutor": "agentbyte.a2a.executor",
|
|
29
|
+
"DistributedContextManager": "agentbyte.a2a.distributed_context",
|
|
30
|
+
"agent_card_from_agent": "agentbyte.a2a.app",
|
|
31
|
+
"create_a2a_app": "agentbyte.a2a.app",
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
"A2ATool",
|
|
36
|
+
"AgentByteExecutor",
|
|
37
|
+
"DistributedContextManager",
|
|
38
|
+
"agent_card_from_agent",
|
|
39
|
+
"create_a2a_app",
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def __getattr__(name: str) -> Any:
|
|
44
|
+
module = _EXPORTS.get(name)
|
|
45
|
+
if module is None:
|
|
46
|
+
raise AttributeError(f"module 'agentbyte.a2a' has no attribute {name!r}")
|
|
47
|
+
return getattr(importlib.import_module(module), name)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"""Agent Card and ASGI app helpers around the official A2A 1.0 SDK.
|
|
2
|
+
|
|
3
|
+
`create_a2a_app()` adds no authentication: pass the host's own Starlette
|
|
4
|
+
middleware (e.g. `AuthenticationMiddleware`). The SDK scopes tasks to the
|
|
5
|
+
authenticated user name; without auth every caller shares one anonymous owner,
|
|
6
|
+
which is only acceptable on localhost.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from collections.abc import AsyncIterator, Sequence
|
|
12
|
+
from contextlib import asynccontextmanager
|
|
13
|
+
from typing import Any
|
|
14
|
+
from urllib.parse import urlsplit
|
|
15
|
+
|
|
16
|
+
from agentbyte._optional import MissingExtraError
|
|
17
|
+
from agentbyte.a2a.executor import AgentByteExecutor
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
from a2a.server.request_handlers import DefaultRequestHandler
|
|
21
|
+
from a2a.server.routes import create_agent_card_routes, create_jsonrpc_routes
|
|
22
|
+
from a2a.server.tasks import InMemoryTaskStore, TaskStore
|
|
23
|
+
from a2a.types import (
|
|
24
|
+
AgentCapabilities,
|
|
25
|
+
AgentCard,
|
|
26
|
+
AgentInterface,
|
|
27
|
+
AgentSkill,
|
|
28
|
+
)
|
|
29
|
+
from a2a.utils.constants import PROTOCOL_VERSION_1_0, TransportProtocol
|
|
30
|
+
from starlette.applications import Starlette
|
|
31
|
+
from starlette.middleware import Middleware
|
|
32
|
+
except ImportError as exc:
|
|
33
|
+
raise MissingExtraError("agentbyte.a2a (missing a2a-sdk)", "a2a", name="a2a") from exc
|
|
34
|
+
|
|
35
|
+
TEXT_AND_JSON = ["text/plain", "application/json"]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def agent_card_from_agent(agent: Any, *, url: str, version: str = "1.0.0") -> AgentCard:
|
|
39
|
+
"""Build a default A2A 1.0 card: one JSON-RPC interface at `url`, one skill.
|
|
40
|
+
|
|
41
|
+
The card advertises no security scheme. To advertise one, set
|
|
42
|
+
`card.security_schemes` / `card.security_requirements` on the returned
|
|
43
|
+
protobuf, and enforce it with the host's middleware.
|
|
44
|
+
"""
|
|
45
|
+
description = agent.description or agent.name
|
|
46
|
+
return AgentCard(
|
|
47
|
+
name=agent.name,
|
|
48
|
+
description=description,
|
|
49
|
+
version=version,
|
|
50
|
+
supported_interfaces=[AgentInterface(
|
|
51
|
+
url=url,
|
|
52
|
+
protocol_binding=TransportProtocol.JSONRPC.value,
|
|
53
|
+
protocol_version=PROTOCOL_VERSION_1_0,
|
|
54
|
+
)],
|
|
55
|
+
capabilities=AgentCapabilities(streaming=True, push_notifications=False),
|
|
56
|
+
default_input_modes=TEXT_AND_JSON,
|
|
57
|
+
default_output_modes=TEXT_AND_JSON,
|
|
58
|
+
skills=[AgentSkill(
|
|
59
|
+
id=agent.name, name=agent.name, description=description, tags=[],
|
|
60
|
+
examples=list(getattr(agent, "example_tasks", None) or []),
|
|
61
|
+
)],
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def create_a2a_app(
|
|
66
|
+
agent: Any,
|
|
67
|
+
*,
|
|
68
|
+
url: str,
|
|
69
|
+
agent_card: AgentCard | None = None,
|
|
70
|
+
task_store: TaskStore | None = None,
|
|
71
|
+
middleware: Sequence[Middleware] = (),
|
|
72
|
+
max_contexts: int = 1024,
|
|
73
|
+
) -> Starlette:
|
|
74
|
+
"""Serve `agent` over A2A 1.0 JSON-RPC as a Starlette app.
|
|
75
|
+
|
|
76
|
+
Routes: `/.well-known/agent-card.json` and the JSON-RPC endpoint at `url`'s
|
|
77
|
+
path. `task_store` defaults to the SDK's in-memory store; native agent
|
|
78
|
+
conversation state is always process-local (see `AgentByteExecutor`).
|
|
79
|
+
"""
|
|
80
|
+
card = agent_card or agent_card_from_agent(agent, url=url)
|
|
81
|
+
handler = DefaultRequestHandler(
|
|
82
|
+
agent_executor=AgentByteExecutor(agent, max_contexts=max_contexts),
|
|
83
|
+
task_store=task_store or InMemoryTaskStore(),
|
|
84
|
+
agent_card=card,
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
@asynccontextmanager
|
|
88
|
+
async def lifespan(app: Starlette) -> AsyncIterator[None]:
|
|
89
|
+
try:
|
|
90
|
+
yield
|
|
91
|
+
finally:
|
|
92
|
+
await handler.aclose()
|
|
93
|
+
|
|
94
|
+
routes = [
|
|
95
|
+
*create_agent_card_routes(card),
|
|
96
|
+
*create_jsonrpc_routes(handler, rpc_url=urlsplit(url).path or "/"),
|
|
97
|
+
]
|
|
98
|
+
return Starlette(routes=routes, middleware=list(middleware), lifespan=lifespan)
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"""Owner-scoped, process-local artifact references with host-controlled resolution."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
import math
|
|
7
|
+
import time
|
|
8
|
+
from collections import OrderedDict
|
|
9
|
+
from collections.abc import Awaitable, Callable
|
|
10
|
+
from dataclasses import dataclass, replace
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass(frozen=True)
|
|
14
|
+
class _Reference:
|
|
15
|
+
uri: str
|
|
16
|
+
expires_at: float
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class DistributedContextManager:
|
|
20
|
+
"""Track references for one authenticated owner on one event loop.
|
|
21
|
+
|
|
22
|
+
The host supplies ``resolver(owner_id, uri)`` and is responsible for URI
|
|
23
|
+
allowlisting, authorization, transport limits and external storage lifecycle.
|
|
24
|
+
No URI is fetched implicitly. Use a separate manager per owner; never derive
|
|
25
|
+
owner_id from untrusted task input. Cached reads bypass the resolver until
|
|
26
|
+
cache expiry, so authorization revocation must call invalidate or unregister.
|
|
27
|
+
|
|
28
|
+
Registrations expire after ``artifact_ttl``; cached UTF-8 text has a separate
|
|
29
|
+
TTL and LRU byte/entry limits. Oversized text is rejected. Failures and
|
|
30
|
+
cancellations are not cached or retried. Concurrent misses resolve separately.
|
|
31
|
+
Invalidation during a resolve rejects its result with KeyError. All state is
|
|
32
|
+
lost on restart; clear/unregister never delete external artifacts.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
*,
|
|
38
|
+
owner_id: str,
|
|
39
|
+
resolver: Callable[[str, str], Awaitable[str]],
|
|
40
|
+
max_artifacts: int = 1024,
|
|
41
|
+
max_cache_entries: int = 128,
|
|
42
|
+
max_cache_bytes: int = 8 * 1024 * 1024,
|
|
43
|
+
max_content_bytes: int = 1024 * 1024,
|
|
44
|
+
artifact_ttl: float = 3600,
|
|
45
|
+
cache_ttl: float = 60,
|
|
46
|
+
resolve_timeout: float = 30,
|
|
47
|
+
clock: Callable[[], float] = time.monotonic,
|
|
48
|
+
) -> None:
|
|
49
|
+
"""Configure finite positive limits; clock must be monotonic."""
|
|
50
|
+
self._validate_text(owner_id, "owner_id")
|
|
51
|
+
for name, value in (
|
|
52
|
+
("max_artifacts", max_artifacts),
|
|
53
|
+
("max_cache_entries", max_cache_entries),
|
|
54
|
+
("max_cache_bytes", max_cache_bytes),
|
|
55
|
+
("max_content_bytes", max_content_bytes),
|
|
56
|
+
):
|
|
57
|
+
if isinstance(value, bool) or not isinstance(value, int) or value <= 0:
|
|
58
|
+
raise ValueError(f"{name} must be a positive integer")
|
|
59
|
+
for value in (artifact_ttl, cache_ttl, resolve_timeout):
|
|
60
|
+
self._validate_ttl(value)
|
|
61
|
+
if not callable(resolver):
|
|
62
|
+
raise TypeError("resolver must be an async callable")
|
|
63
|
+
self._owner_id = owner_id
|
|
64
|
+
self._resolver = resolver
|
|
65
|
+
self._max_artifacts = max_artifacts
|
|
66
|
+
self._max_cache_entries = max_cache_entries
|
|
67
|
+
self._max_cache_bytes = max_cache_bytes
|
|
68
|
+
self._max_content_bytes = max_content_bytes
|
|
69
|
+
self._artifact_ttl = artifact_ttl
|
|
70
|
+
self._cache_ttl = cache_ttl
|
|
71
|
+
self._resolve_timeout = resolve_timeout
|
|
72
|
+
self._clock = clock
|
|
73
|
+
self._references: dict[str, _Reference] = {}
|
|
74
|
+
self._cache: OrderedDict[str, tuple[str, float, int]] = OrderedDict()
|
|
75
|
+
self._cache_bytes = 0
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def owner_id(self) -> str:
|
|
79
|
+
"""The host-authenticated scope of this manager (read-only)."""
|
|
80
|
+
return self._owner_id
|
|
81
|
+
|
|
82
|
+
@staticmethod
|
|
83
|
+
def _validate_text(value: str, name: str) -> None:
|
|
84
|
+
if not isinstance(value, str) or not value.strip():
|
|
85
|
+
raise ValueError(f"{name} must be nonempty text")
|
|
86
|
+
|
|
87
|
+
@staticmethod
|
|
88
|
+
def _validate_ttl(value: float) -> None:
|
|
89
|
+
if isinstance(value, bool) or not math.isfinite(value) or value <= 0:
|
|
90
|
+
raise ValueError("TTL and timeout must be finite and positive")
|
|
91
|
+
|
|
92
|
+
def _drop_cache(self, key: str) -> None:
|
|
93
|
+
cached = self._cache.pop(key, None)
|
|
94
|
+
if cached is not None:
|
|
95
|
+
self._cache_bytes -= cached[2]
|
|
96
|
+
|
|
97
|
+
def _prune(self) -> None:
|
|
98
|
+
now = self._clock()
|
|
99
|
+
for key, reference in list(self._references.items()):
|
|
100
|
+
if reference.expires_at <= now:
|
|
101
|
+
del self._references[key]
|
|
102
|
+
self._drop_cache(key)
|
|
103
|
+
for key, (_, expires_at, _) in list(self._cache.items()):
|
|
104
|
+
if expires_at <= now:
|
|
105
|
+
self._drop_cache(key)
|
|
106
|
+
|
|
107
|
+
def register_artifact(self, key: str, uri: str, *, ttl: float | None = None) -> None:
|
|
108
|
+
"""Register/replace an opaque URI; replacement invalidates cached reads.
|
|
109
|
+
|
|
110
|
+
At registration capacity, raise ValueError instead of evicting references.
|
|
111
|
+
``ttl`` overrides the default lifetime starting at registration time.
|
|
112
|
+
"""
|
|
113
|
+
self._validate_text(key, "key")
|
|
114
|
+
self._validate_text(uri, "uri")
|
|
115
|
+
lifetime = self._artifact_ttl if ttl is None else ttl
|
|
116
|
+
self._validate_ttl(lifetime)
|
|
117
|
+
self._prune()
|
|
118
|
+
if key not in self._references and len(self._references) >= self._max_artifacts:
|
|
119
|
+
raise ValueError("Artifact registration capacity reached")
|
|
120
|
+
self._drop_cache(key)
|
|
121
|
+
self._references[key] = _Reference(uri, self._clock() + lifetime)
|
|
122
|
+
|
|
123
|
+
async def resolve(self, key: str) -> str:
|
|
124
|
+
"""Resolve registered text, raising KeyError for absent/stale references.
|
|
125
|
+
|
|
126
|
+
Resolver exceptions propagate unchanged; TimeoutError bounds each fetch.
|
|
127
|
+
A resolved payload exceeding max_content_bytes raises ValueError. Payloads
|
|
128
|
+
larger than the cache byte budget are returned without caching.
|
|
129
|
+
"""
|
|
130
|
+
self._prune()
|
|
131
|
+
reference = self._references[key]
|
|
132
|
+
if key in self._cache:
|
|
133
|
+
self._cache.move_to_end(key)
|
|
134
|
+
return self._cache[key][0]
|
|
135
|
+
async with asyncio.timeout(self._resolve_timeout):
|
|
136
|
+
content = await self._resolver(self._owner_id, reference.uri)
|
|
137
|
+
self._prune()
|
|
138
|
+
if self._references.get(key) is not reference:
|
|
139
|
+
raise KeyError(key)
|
|
140
|
+
if not isinstance(content, str):
|
|
141
|
+
raise TypeError("Artifact resolver must return str")
|
|
142
|
+
size = len(content.encode("utf-8"))
|
|
143
|
+
if size > self._max_content_bytes:
|
|
144
|
+
raise ValueError("Resolved artifact exceeds max_content_bytes")
|
|
145
|
+
if size <= self._max_cache_bytes:
|
|
146
|
+
self._drop_cache(key)
|
|
147
|
+
while self._cache and (
|
|
148
|
+
len(self._cache) >= self._max_cache_entries
|
|
149
|
+
or self._cache_bytes + size > self._max_cache_bytes
|
|
150
|
+
):
|
|
151
|
+
self._drop_cache(next(iter(self._cache)))
|
|
152
|
+
self._cache[key] = (
|
|
153
|
+
content,
|
|
154
|
+
min(reference.expires_at, self._clock() + self._cache_ttl),
|
|
155
|
+
size,
|
|
156
|
+
)
|
|
157
|
+
self._cache_bytes += size
|
|
158
|
+
return content
|
|
159
|
+
|
|
160
|
+
def invalidate(self, key: str) -> bool:
|
|
161
|
+
"""Forget fetched content and reject in-flight reads, retaining the URI."""
|
|
162
|
+
self._prune()
|
|
163
|
+
self._drop_cache(key)
|
|
164
|
+
reference = self._references.get(key)
|
|
165
|
+
if reference is None:
|
|
166
|
+
return False
|
|
167
|
+
self._references[key] = replace(reference)
|
|
168
|
+
return True
|
|
169
|
+
|
|
170
|
+
def unregister(self, key: str) -> bool:
|
|
171
|
+
"""Remove a reference/cache entry and reject its in-flight reads."""
|
|
172
|
+
self._prune()
|
|
173
|
+
self._drop_cache(key)
|
|
174
|
+
return self._references.pop(key, None) is not None
|
|
175
|
+
|
|
176
|
+
def clear(self) -> None:
|
|
177
|
+
"""Forget all local references/content and reject all in-flight reads."""
|
|
178
|
+
self._references.clear()
|
|
179
|
+
self._cache.clear()
|
|
180
|
+
self._cache_bytes = 0
|