agentbyte 0.45.0__tar.gz → 0.47.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.45.0 → agentbyte-0.47.0}/.gitignore +3 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/CHANGELOG.md +45 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/PKG-INFO +21 -8
- {agentbyte-0.45.0 → agentbyte-0.47.0}/README.md +14 -7
- {agentbyte-0.45.0 → agentbyte-0.47.0}/pyproject.toml +8 -0
- agentbyte-0.47.0/src/agentbyte/__about__.py +2 -0
- agentbyte-0.47.0/src/agentbyte/a2a/__init__.py +47 -0
- agentbyte-0.47.0/src/agentbyte/a2a/app.py +98 -0
- agentbyte-0.47.0/src/agentbyte/a2a/distributed_context.py +180 -0
- agentbyte-0.47.0/src/agentbyte/a2a/executor.py +231 -0
- agentbyte-0.47.0/src/agentbyte/a2a/tool.py +221 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/cli/eval_commands.py +1 -1
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/cli/main.py +5 -1
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/cli/optim_commands.py +1 -1
- agentbyte-0.47.0/src/agentbyte/cli/serve_commands.py +55 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/component.py +0 -1
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/importer.py +56 -38
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/sqlite.py +2 -0
- agentbyte-0.47.0/src/agentbyte/tools/mcp/__init__.py +56 -0
- agentbyte-0.47.0/src/agentbyte/tools/mcp/client.py +250 -0
- agentbyte-0.47.0/src/agentbyte/tools/mcp/config.py +45 -0
- agentbyte-0.47.0/src/agentbyte/tools/mcp/errors.py +12 -0
- agentbyte-0.47.0/src/agentbyte/tools/mcp/tool.py +101 -0
- agentbyte-0.47.0/src/agentbyte/tools/mcp/transports.py +56 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/tools/research_tools.py +8 -128
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/eval_routes.py +24 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp/__init__.py +5 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp/servers/__init__.py +8 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp/servers/apps_server.py +119 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp/servers/auth_server.py +85 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp/servers/basic_server.py +67 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp/servers/mrtr_server.py +52 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp/servers/notify_server.py +54 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp_playground.py +393 -0
- agentbyte-0.47.0/src/agentbyte/webui/mcp_routes.py +312 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/models.py +4 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/server.py +31 -0
- agentbyte-0.47.0/src/agentbyte/webui/ui/assets/index-BVwldkgS.js +82 -0
- agentbyte-0.47.0/src/agentbyte/webui/ui/assets/index-u5LbPGVH.css +1 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/ui/index.html +2 -2
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/sqlite_checkpoint.py +2 -0
- agentbyte-0.47.0/tests/a2a/a2a_helpers.py +104 -0
- agentbyte-0.47.0/tests/a2a/test_a2a_adapters.py +369 -0
- agentbyte-0.47.0/tests/a2a/test_distributed_context.py +185 -0
- agentbyte-0.47.0/tests/cli/test_serve_command.py +65 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/dataset/test_sqlite_db.py +159 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_eval_workbench.py +1 -1
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_optional_extras.py +14 -0
- agentbyte-0.47.0/tests/tools/fixtures/mcp_stdio_server.py +27 -0
- agentbyte-0.47.0/tests/tools/test_mcp_tools.py +544 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/tools/test_research_tools.py +4 -32
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/test_eval_routes.py +28 -1
- agentbyte-0.47.0/tests/webui/test_mcp_routes.py +478 -0
- agentbyte-0.45.0/src/agentbyte/__about__.py +0 -2
- agentbyte-0.45.0/src/agentbyte/webui/ui/assets/index-BsS4WYZu.css +0 -1
- agentbyte-0.45.0/src/agentbyte/webui/ui/assets/index-tGvO1yue.js +0 -82
- {agentbyte-0.45.0 → agentbyte-0.47.0}/LICENSE +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/_optional.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/agents/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/agents/agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/agents/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/agents/embedding_agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/agents/types.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/catalog.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/cli/__main__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/cli/loading.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/compaction/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/compaction/counters.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/compaction/errors.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/compaction/grouping.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/compaction/strategies.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/context.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/context_providers/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/context_providers/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/context_providers/skills.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/loader.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/publish.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/publish_config.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/publishers.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/s3.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/sources.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/sqlite.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/write_config.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/dataset/writers.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/checks/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/checks/decorator.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/checks/keyword.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/checks/local.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/checks/process.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/checks/tool.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/checks/types.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/comparison.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/eval_dataset.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/conformance.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/errors.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/models.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/recorder.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/sql.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/store.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/history/transitions.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/judges/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/judges/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/judges/composite.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/judges/llm.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/judges/reference.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/judges/validation.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/pairwise.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/report.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/runner.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/splitting.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/targets/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/targets/agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/targets/model.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/targets/runtime.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/targets/workflow.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/types.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/workbench/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/workbench/coordinator.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/workbench/jobs.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/workbench/suite.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/eval/workbench/verdict.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/execution_trace/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/execution_trace/collector.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/execution_trace/models.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/azure/auth.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/azure/chat.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/azure/embedding.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/pricing.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/logger.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/middleware/otel.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/middleware/sql_usage.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/middleware/usage_logger.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/config.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/gepa.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/mipro.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/pareto.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/reflective.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/report.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/spec.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/optim/trace.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/orchestration/ai.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/orchestration/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/orchestration/handoff.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/orchestration/plan.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/orchestration/policies.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/orchestration/round_robin.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/instruction_registry.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/streaming.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/skills/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/skills/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/skills/resources.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/skills/scripts.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/skills/sources.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/skills/validation.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/tools/base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/tools/coding_tools.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/types.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/execution.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/errors.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/steps/agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/src/agentbyte/workflow/visualizer.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_as_tool.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_context_providers.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_error_response.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_response_accessors.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_stop_at_tools.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_embedding_agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_tool_batch_resolution.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/agents/test_tool_metadata.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/cli/test_loading.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/cli/test_registry_check.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/compaction/test_compaction.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/context_providers/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/context_providers/test_skill_tools.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/context_providers/test_skills_provider.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/dataset/fake_s3.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/dataset/test_dataset_exit.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/dataset/test_loader.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/dataset/test_multi_table.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/dataset/test_publish.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_eval_dataset.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_eval_history.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_eval_history_backends.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_eval_jobs.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_execution_trajectories.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_multi_turn.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_pairwise.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_score_integrity.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_splitting.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/eval/test_types_and_judges.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/examples/test_compaction_webapp.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_pricing.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/llm/test_retryable_error_substrings.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/middleware/test_context_compaction.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/middleware/test_sql_usage.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/middleware/test_usage_logger.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_base_integration.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_config.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_description_tunable.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_gepa.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_mipro.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_orchestrator_optim.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_pareto.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_reflective.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_report.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_score_integrity.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_spec.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/optim/test_trace.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_base_orchestrator.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_history_tool_call_pairing.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_orchestration_usage_breakdown.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_orchestrator_agent_contract.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_orchestrator_member_events.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_orchestrator_otel.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_orchestrator_synthesis.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/orchestration/test_round_robin.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/presets/test_instruction_registry.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/presets/test_streaming.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/skills/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/skills/test_base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/skills/test_resources.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/skills/test_scripts.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/skills/test_sources.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_base.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_external.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_source.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_context.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_logger.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_messages.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_option_enums.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_package_api.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_session_store.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_types.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/test_vanilla_chunker.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/tools/test_coding_tools.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/__init__.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/helpers.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/test_server.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/webui/test_workflow_streaming.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/recovery_worker.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_agent_step_imports.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_workflow_reliability.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.45.0 → agentbyte-0.47.0}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -6,6 +6,51 @@ The format follows Keep a Changelog principles and semantic versioning.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.47.0] - 2026-10-06
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- MCP tool bridge (spec 0013, `mcp` extra): `agentbyte.tools.mcp` with `MCPClientManager`, `MCPTool`
|
|
14
|
+
and `create_mcp_tools()` over the official MCP SDK (v2).
|
|
15
|
+
- WebUI MCP Playground: connect to MCP servers, browse capabilities and tools, call tools, read app
|
|
16
|
+
resources, and answer pending inputs from the Playground. It is off by default
|
|
17
|
+
(`AgentbyteWebUIServer(mcp_playground=True)`) because it can launch subprocesses and make outbound
|
|
18
|
+
connections on request.
|
|
19
|
+
- A2A 1.0 adapters (spec 0013, `a2a` extra): `AgentByteExecutor`, `create_a2a_app`,
|
|
20
|
+
`agent_card_from_agent` to serve an agent, and `A2ATool` to call one, as thin adapters over the
|
|
21
|
+
official `a2a-sdk` 1.x. Human approval maps to `input-required` and resumes on the same task.
|
|
22
|
+
- `agentbyte serve`: a localhost-only development command for serving an agent over A2A.
|
|
23
|
+
- `DistributedContextManager` and two `examples/distributed/` patterns.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- Local SQLite state now lives under `.agentbyte/` instead of the working-directory root. The default
|
|
28
|
+
evaluation history is `.agentbyte/eval/default/eval.sqlite` (was `./eval.sqlite`) for
|
|
29
|
+
`agentbyte eval`, `agentbyte optim` and `agentbyte webui --eval-catalog`, and examples and notebooks use
|
|
30
|
+
one folder per project (`.agentbyte/eval/<project>/eval.sqlite` with its `.writer.lock` beside it).
|
|
31
|
+
`SQLiteEvalRunStore` (writers) and `SQLiteCheckpointStore` create the parent directories on open.
|
|
32
|
+
Explicit paths, `--history PATH` and `:memory:` behave as before. Existing history files are not moved
|
|
33
|
+
automatically: pass `--history` or move them into the new folder.
|
|
34
|
+
|
|
35
|
+
### Removed
|
|
36
|
+
|
|
37
|
+
- **Breaking:** the hand-written A2A 0.3 client, server, models and errors (`agentbyte.a2a` from the
|
|
38
|
+
unreleased 0.6.0/0.7.0 development phases) are gone, with no 0.3 compatibility. Use the A2A 1.0
|
|
39
|
+
adapters above; authentication is left to host Starlette middleware or SDK interceptors.
|
|
40
|
+
|
|
41
|
+
## [0.46.0] - 2026-10-05
|
|
42
|
+
|
|
43
|
+
### Added
|
|
44
|
+
|
|
45
|
+
- Evaluation UI: read-only optimization pages (spec 0068 phase 3). The Evaluations home page lists
|
|
46
|
+
stored optimization runs (suite, optimizer, seed → best, cost); `#/evals/optimizations/<id>`
|
|
47
|
+
renders the report — proposed changes as seed/best text, per-task outcomes, remaining failures
|
|
48
|
+
with the judge's reasoning, reflector diagnoses and edits, candidates, cost — with Copy markdown
|
|
49
|
+
and Download report.md.
|
|
50
|
+
- `GET /api/eval/optimizations?suite=` and `GET /api/eval/optimizations/{id}` (`{run, report,
|
|
51
|
+
markdown}`). They read the history store directly, so runs recorded for suites outside the
|
|
52
|
+
server's catalog (e.g. notebook suites) are shown.
|
|
53
|
+
|
|
9
54
|
## [0.45.0] - 2026-10-05
|
|
10
55
|
|
|
11
56
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agentbyte
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.47.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
|
|
@@ -77,7 +83,7 @@ Description-Content-Type: text/markdown
|
|
|
77
83
|
|
|
78
84
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
79
85
|
|
|
80
|
-
Current release: **0.
|
|
86
|
+
Current release: **0.47.0**
|
|
81
87
|
|
|
82
88
|
## Building an Agent
|
|
83
89
|
|
|
@@ -318,10 +324,17 @@ uv add "agentbyte[openai,sqlite]"
|
|
|
318
324
|
| `optim` | `gepa` | `optimize_with_gepa()` |
|
|
319
325
|
| `viz` | `graphviz` | `WorkflowVisualizer.to_dot()` |
|
|
320
326
|
| `research` | `beautifulsoup4`, `html2text`, `arxiv`, `youtube-transcript-api` | `agentbyte.tools.research_tools` |
|
|
321
|
-
| `
|
|
327
|
+
| `mcp` | `mcp` (SDK v2) | `agentbyte.tools.mcp`: MCP tool bridge (`MCPClientManager`, `MCPTool`, `create_mcp_tools()`); also enables the WebUI MCP Playground routes |
|
|
328
|
+
| `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 |
|
|
329
|
+
| `all` | every extra above except `mcp`/`a2a`* | Everything except the MCP/A2A protocol bridges |
|
|
330
|
+
|
|
331
|
+
*`mcp` and `a2a` are deliberately excluded from `all`: both let an agent reach outside the
|
|
332
|
+
process (subprocess tools, outbound HTTP to arbitrary agents) and are opt-in rather than
|
|
333
|
+
bundled by default. Install them explicitly: `pip install "agentbyte[mcp,a2a]"`.
|
|
322
334
|
|
|
323
335
|
Contributors working in this repository install every extra plus the local tooling groups
|
|
324
|
-
(`test`, `dev`, `experiment`)
|
|
336
|
+
(`test`, `dev`, `experiment`) — this always includes `mcp`/`a2a` regardless of the `all`
|
|
337
|
+
composite above, since `--all-extras` syncs every defined extra individually:
|
|
325
338
|
|
|
326
339
|
```bash
|
|
327
340
|
uv sync --all-extras --all-groups
|
|
@@ -342,7 +355,7 @@ No API key needed: three demo agents, a team and a workflow on a fake model clie
|
|
|
342
355
|
|
|
343
356
|
```bash
|
|
344
357
|
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
|
|
358
|
+
uv run python examples/webui/in_memory.py --eval-history .agentbyte/eval/default/eval.sqlite # plus Evaluations
|
|
346
359
|
```
|
|
347
360
|
|
|
348
361
|
With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workflow:
|
|
@@ -350,7 +363,7 @@ With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workf
|
|
|
350
363
|
```bash
|
|
351
364
|
uv sync --extra webui --extra openai # or --extra azureopenai
|
|
352
365
|
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
|
|
366
|
+
uv run python examples/webui/presets_webui.py --eval-history .agentbyte/eval/default/eval.sqlite
|
|
354
367
|
```
|
|
355
368
|
|
|
356
369
|
Both launchers accept `--port`, `--no-open`, `--eval-history PATH` and `--eval-catalog CATALOG`
|
|
@@ -368,7 +381,7 @@ uv run agentbyte eval ui --catalog examples/eval/workbench_catalog.py # htt
|
|
|
368
381
|
|
|
369
382
|
- `--catalog` takes a `.py` file or a module path (`myapp.evaluations`); add `:name` only when the
|
|
370
383
|
file defines more than one registry. Without `--catalog` it serves the built-in smoke suite.
|
|
371
|
-
- Runs are stored in
|
|
384
|
+
- Runs are stored in `./.agentbyte/eval/default/eval.sqlite` unless you pass `--history PATH`. Only one process can write
|
|
372
385
|
a history file: stop the UI before `agentbyte eval run` on the same file, or use another file.
|
|
373
386
|
- The same catalog works in the terminal: `uv run agentbyte eval run capitals --catalog examples/eval/workbench_catalog.py`.
|
|
374
387
|
- To serve agents and Evaluations together: `agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py`.
|
|
@@ -399,7 +412,7 @@ uv run agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py #
|
|
|
399
412
|
from agentbyte.webui import serve
|
|
400
413
|
|
|
401
414
|
serve(entities=[agent], port=8080)
|
|
402
|
-
serve(entities=[agent], eval_registry=registry, eval_history="eval.sqlite") # with Evaluations
|
|
415
|
+
serve(entities=[agent], eval_registry=registry, eval_history=".agentbyte/eval/default/eval.sqlite") # with Evaluations
|
|
403
416
|
```
|
|
404
417
|
|
|
405
418
|
### 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.47.0**
|
|
6
6
|
|
|
7
7
|
## Building an Agent
|
|
8
8
|
|
|
@@ -243,10 +243,17 @@ uv add "agentbyte[openai,sqlite]"
|
|
|
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
|
|
@@ -66,6 +66,14 @@ research = [
|
|
|
66
66
|
"arxiv>=2.1",
|
|
67
67
|
"youtube-transcript-api>=0.6",
|
|
68
68
|
]
|
|
69
|
+
mcp = [
|
|
70
|
+
"mcp>=2.0.0,<3",
|
|
71
|
+
]
|
|
72
|
+
# A2A 1.0 via the official SDK; uvicorn (webui) runs `agentbyte serve`.
|
|
73
|
+
a2a = [
|
|
74
|
+
"a2a-sdk[http-server]>=1.2,<2",
|
|
75
|
+
"agentbyte[webui]",
|
|
76
|
+
]
|
|
69
77
|
all = [
|
|
70
78
|
"agentbyte[openai,azureopenai,aws,otel,webui,gunicorn,sql,tiktoken,optim,viz,research]",
|
|
71
79
|
]
|
|
@@ -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
|