agentbyte 0.40.0__tar.gz → 0.42.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.40.0 → agentbyte-0.42.0}/.gitignore +3 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/CHANGELOG.md +67 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/PKG-INFO +2 -2
- {agentbyte-0.40.0 → agentbyte-0.42.0}/README.md +1 -1
- {agentbyte-0.40.0 → agentbyte-0.42.0}/pyproject.toml +1 -0
- agentbyte-0.42.0/src/agentbyte/__about__.py +2 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/agents/types.py +37 -9
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/targets/orchestrator.py +18 -12
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/execution_trace/collector.py +34 -13
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/__init__.py +2 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/spec.py +31 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/orchestration/ai.py +10 -8
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/orchestration/base.py +651 -204
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/orchestration/handoff.py +17 -7
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/orchestration/plan.py +69 -11
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/orchestration/policies.py +18 -1
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/orchestration/round_robin.py +5 -4
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/streaming.py +4 -5
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/types.py +73 -34
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/execution.py +9 -7
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/server.py +1 -0
- agentbyte-0.40.0/src/agentbyte/webui/ui/assets/index-C-wj-OzO.js → agentbyte-0.42.0/src/agentbyte/webui/ui/assets/index-MgF-3P2c.js +1 -1
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/ui/index.html +1 -1
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_phase1_runner_and_targets.py +22 -13
- agentbyte-0.42.0/tests/optim/test_description_tunable.py +86 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/orchestration/test_ai_orchestrator.py +4 -4
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/orchestration/test_base_orchestrator.py +13 -15
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/orchestration/test_handoff_orchestrator.py +5 -5
- agentbyte-0.42.0/tests/orchestration/test_history_tool_call_pairing.py +162 -0
- agentbyte-0.42.0/tests/orchestration/test_orchestration_usage_breakdown.py +285 -0
- agentbyte-0.42.0/tests/orchestration/test_orchestrator_agent_contract.py +329 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/orchestration/test_orchestrator_finalization.py +15 -15
- agentbyte-0.42.0/tests/orchestration/test_orchestrator_member_events.py +192 -0
- agentbyte-0.42.0/tests/orchestration/test_orchestrator_otel.py +104 -0
- agentbyte-0.42.0/tests/orchestration/test_orchestrator_synthesis.py +658 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/orchestration/test_plan_orchestrator.py +18 -18
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/orchestration/test_round_robin.py +2 -2
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_types.py +83 -44
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/test_server.py +3 -2
- agentbyte-0.40.0/src/agentbyte/__about__.py +0 -2
- {agentbyte-0.40.0 → agentbyte-0.42.0}/LICENSE +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/_optional.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/agents/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/agents/agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/agents/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/agents/embedding_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/catalog.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/cli/__main__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/cli/eval_commands.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/cli/loading.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/cli/main.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/compaction/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/compaction/counters.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/compaction/errors.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/compaction/grouping.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/compaction/strategies.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/component.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/context.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/context_providers/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/context_providers/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/context_providers/skills.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/importer.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/loader.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/publish.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/publish_config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/publishers.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/s3.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/sources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/sqlite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/write_config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/dataset/writers.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/checks/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/checks/decorator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/checks/keyword.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/checks/local.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/checks/process.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/checks/tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/checks/types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/comparison.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/eval_dataset.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/conformance.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/errors.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/recorder.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/sql.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/sqlite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/store.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/history/transitions.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/judges/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/judges/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/judges/composite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/judges/llm.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/judges/reference.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/judges/validation.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/pairwise.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/report.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/runner.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/splitting.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/targets/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/targets/agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/targets/model.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/targets/runtime.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/targets/workflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/workbench/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/workbench/coordinator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/workbench/jobs.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/workbench/suite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/eval/workbench/verdict.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/execution_trace/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/execution_trace/models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/azure/auth.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/azure/chat.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/azure/embedding.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/pricing.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/logger.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/middleware/otel.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/middleware/sql_usage.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/middleware/usage_logger.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/gepa.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/mipro.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/pareto.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/reflective.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/optim/trace.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/instruction_registry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/skills/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/skills/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/skills/resources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/skills/scripts.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/skills/sources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/skills/validation.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/tools/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/tools/coding_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/tools/research_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/eval_routes.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/ui/assets/index-DW8IDODJ.css +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/errors.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/sqlite_checkpoint.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/steps/agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/src/agentbyte/workflow/visualizer.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_as_tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_context_providers.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_error_response.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_response_accessors.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_embedding_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_tool_batch_resolution.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/agents/test_tool_metadata.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/cli/test_loading.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/cli/test_registry_check.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/compaction/test_compaction.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/context_providers/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/context_providers/test_skill_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/context_providers/test_skills_provider.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/dataset/fake_s3.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/dataset/test_dataset_exit.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/dataset/test_loader.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/dataset/test_multi_table.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/dataset/test_publish.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/dataset/test_sqlite_db.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_eval_dataset.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_eval_history.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_eval_history_backends.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_eval_jobs.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_eval_workbench.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_execution_trajectories.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_multi_turn.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_pairwise.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_score_integrity.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_splitting.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/eval/test_types_and_judges.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/examples/test_compaction_webapp.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_pricing.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/llm/test_retryable_error_substrings.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/middleware/test_context_compaction.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/middleware/test_sql_usage.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/middleware/test_usage_logger.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_base_integration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_gepa.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_mipro.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_orchestrator_optim.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_pareto.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_reflective.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_score_integrity.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_spec.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/optim/test_trace.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/presets/test_instruction_registry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/presets/test_streaming.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/skills/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/skills/test_base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/skills/test_resources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/skills/test_scripts.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/skills/test_sources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_external.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_source.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_context.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_logger.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_messages.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_optional_extras.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_package_api.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_session_store.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/test_vanilla_chunker.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/tools/test_coding_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/tools/test_research_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/helpers.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/test_eval_routes.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/webui/test_workflow_streaming.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/recovery_worker.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_agent_step_imports.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_workflow_reliability.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.42.0}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -6,6 +6,73 @@ The format follows Keep a Changelog principles and semantic versioning.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.42.0] - 2026-10-04
|
|
10
|
+
|
|
11
|
+
### Changed (breaking)
|
|
12
|
+
|
|
13
|
+
- Orchestrators share the agent run contract (spec 0066 Part B). `BaseOrchestrator.run` and
|
|
14
|
+
`run_stream` take the agent parameter order `(task=None, context=None, cancellation_token=None,
|
|
15
|
+
...)` and return the same `AgentResponse` as agents. Team-only detail is on the new optional
|
|
16
|
+
`AgentResponse.orchestration` (`OrchestrationDetail`). `OrchestrationResponse` is removed.
|
|
17
|
+
Migration:
|
|
18
|
+
|
|
19
|
+
| Before | After |
|
|
20
|
+
|---|---|
|
|
21
|
+
| `isinstance(x, OrchestrationResponse)` | `isinstance(x, AgentResponse) and x.orchestration is not None` |
|
|
22
|
+
| `result.final_result` | `result.final_content` (or `result.orchestration.final_result`) |
|
|
23
|
+
| `result.final_structured_result` | `result.structured_output` |
|
|
24
|
+
| `result.stop_message` / `pattern_metadata` / `usage_breakdown` | `result.orchestration.<same>` |
|
|
25
|
+
| `result.messages` | unchanged (`context.messages`) |
|
|
26
|
+
| `run(task, token, context)` positional | `run(task, context, token)` |
|
|
27
|
+
|
|
28
|
+
- A team response sets `source` (orchestrator name), `finish_reason` (mapped from the stop source:
|
|
29
|
+
`stop`, `max_iterations`, `max_iterations_finalized`, `approval_needed`, `error`, `cancelled`),
|
|
30
|
+
`error` (exception, synthesis failure, fallback), and `context` (the caller's context, updated in
|
|
31
|
+
place on every terminal path). `final_message` is the selected answer, not necessarily the last
|
|
32
|
+
message.
|
|
33
|
+
- Cancelling a team now returns a response with `finish_reason="cancelled"`, as for agents, instead
|
|
34
|
+
of re-raising `CancelledError` after the final item.
|
|
35
|
+
- `task=None` runs a team on the trailing user message(s) already in `context`.
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- Orchestrator member event streaming (spec 0066 Part A): with `verbose=True`, member tool, model and
|
|
40
|
+
approval events are forwarded with `source` attribution; orchestration events gain `event_type`,
|
|
41
|
+
`turn_kind`, and per-turn `usage`; `run_stream` accepts `stream_tokens`.
|
|
42
|
+
- Reserved final synthesis and full-run usage breakdown for orchestrators (spec 0065), and the
|
|
43
|
+
built-in `DescriptionTunable`.
|
|
44
|
+
|
|
45
|
+
### Fixed
|
|
46
|
+
|
|
47
|
+
- `PlanBasedOrchestrator` planned the oldest message of a multi-turn session instead of the current
|
|
48
|
+
task.
|
|
49
|
+
- With `AGENTBYTE_ENABLE_OTEL` on, a failing orchestration was re-run untraced, duplicating turns
|
|
50
|
+
and cost.
|
|
51
|
+
|
|
52
|
+
## [0.41.0] - 2026-10-04
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- Tool-call-pair-safe recent history window (spec 0064). `BaseOrchestrator._select_history_messages`
|
|
57
|
+
implemented `AgentHistoryPolicy(window="recent")` as a blind `shared_messages[-message_limit:]`
|
|
58
|
+
slice, which could cut between a tool-calling `AssistantMessage` and its `ToolMessage` reply once
|
|
59
|
+
enough turns accumulated (a multi-step plan, or a step-retry loop), handing the next agent a
|
|
60
|
+
transcript that opens on an orphaned tool result and gets rejected by the provider. The `"recent"`
|
|
61
|
+
branch now reuses `agentbyte.compaction.grouping.group_messages` (spec 0049) to keep each tool
|
|
62
|
+
exchange whole, growing the window left by the few messages needed rather than splitting it.
|
|
63
|
+
`message_limit` is therefore a floor, not an exact count, only when a tool exchange would
|
|
64
|
+
otherwise be split; histories with no tool calls are unaffected. Lives in `BaseOrchestrator`, so
|
|
65
|
+
every pattern (`PlanBasedOrchestrator`, `AIOrchestrator`, `RoundRobinOrchestrator`,
|
|
66
|
+
`HandoffOrchestrator`) is covered by the one change.
|
|
67
|
+
|
|
68
|
+
### Added
|
|
69
|
+
|
|
70
|
+
- New optim usecase notebook `notebooks/usecases/optim/02-optim-it-helpdesk-triage.ipynb`: a
|
|
71
|
+
`PlanBasedOrchestrator` supervisor over three structured-output specialists (`hardware`,
|
|
72
|
+
`software`, `access-control`, each with a `lookup_asset` tool) plus a `synthesizer`, optimized
|
|
73
|
+
with `ReflectiveOptimizer` against a routing-correctness judge. Introduces a `DescriptionTunable`
|
|
74
|
+
(the planner routes off each member's `description`, which the built-in tunables did not expose).
|
|
75
|
+
|
|
9
76
|
## [0.40.0] - 2026-10-02
|
|
10
77
|
|
|
11
78
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agentbyte
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.42.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
|
|
@@ -77,7 +77,7 @@ Description-Content-Type: text/markdown
|
|
|
77
77
|
|
|
78
78
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
79
79
|
|
|
80
|
-
Current release: **0.
|
|
80
|
+
Current release: **0.42.0**
|
|
81
81
|
|
|
82
82
|
## Building an Agent
|
|
83
83
|
|
|
@@ -9,7 +9,7 @@ from pydantic import BaseModel, ConfigDict, Field
|
|
|
9
9
|
|
|
10
10
|
from agentbyte.context import AgentContext, ToolApprovalRequest
|
|
11
11
|
from agentbyte.messages import AssistantMessage, Message, Usage
|
|
12
|
-
from agentbyte.types import ToolResult
|
|
12
|
+
from agentbyte.types import OrchestrationDetail, ToolResult
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class BaseEvent(BaseModel):
|
|
@@ -193,12 +193,17 @@ class AgentErrorDetail(BaseModel):
|
|
|
193
193
|
|
|
194
194
|
|
|
195
195
|
class AgentResponse(BaseModel):
|
|
196
|
-
"""Final response payload for a completed agent run.
|
|
196
|
+
"""Final response payload for a completed agent or orchestrator (team) run.
|
|
197
|
+
|
|
198
|
+
Agents and orchestrators return this same type, so a consumer handles both
|
|
199
|
+
with one code path. ``orchestration`` carries team-only detail and is
|
|
200
|
+
``None`` for a single agent.
|
|
201
|
+
"""
|
|
197
202
|
|
|
198
203
|
model_config = ConfigDict(frozen=False)
|
|
199
204
|
|
|
200
205
|
context: AgentContext = Field(..., description="Final execution context")
|
|
201
|
-
source: str = Field(..., description="Agent name")
|
|
206
|
+
source: str = Field(..., description="Agent or orchestrator name")
|
|
202
207
|
finish_reason: str = Field(
|
|
203
208
|
...,
|
|
204
209
|
description="Why the agent stopped: stop, approval_needed, max_iterations, max_iterations_finalized, tool_executed, error, cancelled",
|
|
@@ -212,6 +217,10 @@ class AgentResponse(BaseModel):
|
|
|
212
217
|
default_factory=datetime.now,
|
|
213
218
|
description="When the response was created",
|
|
214
219
|
)
|
|
220
|
+
orchestration: Optional[OrchestrationDetail] = Field(
|
|
221
|
+
default=None,
|
|
222
|
+
description="Team-only detail; set when an orchestrator produced this response",
|
|
223
|
+
)
|
|
215
224
|
|
|
216
225
|
@property
|
|
217
226
|
def messages(self) -> List[Message]:
|
|
@@ -220,8 +229,13 @@ class AgentResponse(BaseModel):
|
|
|
220
229
|
|
|
221
230
|
@property
|
|
222
231
|
def needs_approval(self) -> bool:
|
|
223
|
-
"""Check if response is waiting for approvals.
|
|
224
|
-
|
|
232
|
+
"""Check if response is waiting for approvals.
|
|
233
|
+
|
|
234
|
+
A team stops with ``finish_reason="approval_needed"`` when a member waits on
|
|
235
|
+
tool approval; the member's pending tools are in
|
|
236
|
+
``orchestration.stop_message.metadata``.
|
|
237
|
+
"""
|
|
238
|
+
return self.context.waiting_for_approval or self.finish_reason == "approval_needed"
|
|
225
239
|
|
|
226
240
|
@property
|
|
227
241
|
def approval_requests(self) -> List[ToolApprovalRequest]:
|
|
@@ -234,20 +248,34 @@ class AgentResponse(BaseModel):
|
|
|
234
248
|
|
|
235
249
|
When the run failed, the error text is not in ``context.messages`` (it is
|
|
236
250
|
deliberately kept out of the replayed history), so it is surfaced from
|
|
237
|
-
``error`` here for display and logging.
|
|
251
|
+
``error`` here for display and logging. For a team it is the answer chosen
|
|
252
|
+
by the orchestrator (``orchestration.final_result``).
|
|
238
253
|
"""
|
|
239
254
|
if self.error is not None:
|
|
240
255
|
return f"Error: {self.error.message}"
|
|
256
|
+
if self.orchestration is not None:
|
|
257
|
+
return self.orchestration.final_result
|
|
241
258
|
if not self.context.messages:
|
|
242
259
|
return ""
|
|
243
260
|
return self.context.messages[-1].content
|
|
244
261
|
|
|
245
262
|
@property
|
|
246
263
|
def final_message(self) -> AssistantMessage | None:
|
|
247
|
-
"""Final assistant message if the run ended with one.
|
|
248
|
-
|
|
264
|
+
"""Final assistant message if the run ended with one.
|
|
265
|
+
|
|
266
|
+
For a team this is the message the orchestrator selected as the answer
|
|
267
|
+
(e.g. the synthesizer's), which is not necessarily the last message.
|
|
268
|
+
"""
|
|
269
|
+
messages = self.context.messages
|
|
270
|
+
if self.orchestration is not None:
|
|
271
|
+
index = self.orchestration.final_message_index
|
|
272
|
+
if index is None or not 0 <= index < len(messages):
|
|
273
|
+
return None
|
|
274
|
+
message = messages[index]
|
|
275
|
+
elif not messages:
|
|
249
276
|
return None
|
|
250
|
-
|
|
277
|
+
else:
|
|
278
|
+
message = messages[-1]
|
|
251
279
|
if isinstance(message, AssistantMessage):
|
|
252
280
|
return message
|
|
253
281
|
return None
|
|
@@ -47,19 +47,25 @@ class OrchestratorEvalTarget(BaseEvalTarget):
|
|
|
47
47
|
task.input, cancellation_token=cancellation_token
|
|
48
48
|
)
|
|
49
49
|
messages, usage = list(response.messages), response.usage
|
|
50
|
-
status = normalize_status(response.
|
|
50
|
+
status = normalize_status(response.finish_reason)
|
|
51
|
+
detail = response.orchestration
|
|
51
52
|
if status == "failed":
|
|
52
|
-
error =
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
53
|
+
error = (
|
|
54
|
+
detail.stop_message.content
|
|
55
|
+
if detail is not None
|
|
56
|
+
else response.final_content
|
|
57
|
+
)
|
|
58
|
+
if detail is not None:
|
|
59
|
+
metadata.update(
|
|
60
|
+
pattern=detail.pattern_metadata.get(
|
|
61
|
+
"pattern", detail.pattern
|
|
62
|
+
),
|
|
63
|
+
iterations=detail.pattern_metadata.get(
|
|
64
|
+
"iterations_completed", 0
|
|
65
|
+
),
|
|
66
|
+
stop_reason=detail.stop_message.content,
|
|
67
|
+
stop_source=detail.stop_message.source,
|
|
68
|
+
)
|
|
63
69
|
if not collector.trace.spans:
|
|
64
70
|
collector.incomplete(
|
|
65
71
|
"Custom orchestrator exposes response evidence only"
|
|
@@ -41,6 +41,8 @@ def normalize_status(reason: str) -> ExecutionStatus:
|
|
|
41
41
|
"MaxIterations": "incomplete",
|
|
42
42
|
"Error": "failed",
|
|
43
43
|
"Exception": "failed",
|
|
44
|
+
"SynthesisFailed": "failed",
|
|
45
|
+
"ApprovalRequired": "suspended",
|
|
44
46
|
}
|
|
45
47
|
return statuses.get(reason, "completed")
|
|
46
48
|
|
|
@@ -105,16 +107,12 @@ class TraceCollector:
|
|
|
105
107
|
if span.kind == "agent":
|
|
106
108
|
span.usage = span.usage + self.trace.aggregate_usage(span.id)
|
|
107
109
|
span.error = item.error.message if item.error is not None else None
|
|
110
|
+
orchestration = getattr(item, "orchestration", None)
|
|
111
|
+
if orchestration is not None:
|
|
112
|
+
span.metadata["stop_reason"] = snapshot(orchestration.stop_message)
|
|
108
113
|
if self.capture_payloads:
|
|
109
114
|
span.output = item.final_content
|
|
110
115
|
return
|
|
111
|
-
if hasattr(item, "stop_message"):
|
|
112
|
-
span.status = normalize_status(item.stop_message.source)
|
|
113
|
-
span.metadata["stop_reason"] = snapshot(item.stop_message)
|
|
114
|
-
span.usage = item.usage
|
|
115
|
-
if self.capture_payloads:
|
|
116
|
-
span.output = item.final_result
|
|
117
|
-
return
|
|
118
116
|
if hasattr(item, "event_type") or isinstance(item, OrchestrationEvent):
|
|
119
117
|
if self.capture_payloads and span.kind != "workflow_agent":
|
|
120
118
|
self.trace.events.append(
|
|
@@ -243,6 +241,10 @@ def trace_stream(kind: str, *, accounting: bool = False) -> Callable:
|
|
|
243
241
|
if workflow is not None:
|
|
244
242
|
name = workflow.id
|
|
245
243
|
span = collector.start(kind, name)
|
|
244
|
+
turn_kind = bound.arguments.get("turn_kind")
|
|
245
|
+
if turn_kind:
|
|
246
|
+
# Orchestration turn role, e.g. "worker" or "synthesis" (spec 0065)
|
|
247
|
+
span.metadata["turn_kind"] = turn_kind
|
|
246
248
|
started = time.perf_counter()
|
|
247
249
|
if collector.capture_payloads:
|
|
248
250
|
span.input = snapshot(
|
|
@@ -261,7 +263,13 @@ def trace_stream(kind: str, *, accounting: bool = False) -> Callable:
|
|
|
261
263
|
pt = _parent.set(span.id)
|
|
262
264
|
try:
|
|
263
265
|
item = await anext(stream)
|
|
264
|
-
|
|
266
|
+
is_forwarded_member_event = (
|
|
267
|
+
kind == "orchestrator"
|
|
268
|
+
and hasattr(item, "event_type")
|
|
269
|
+
and getattr(item, "source", "orchestrator") != "orchestrator"
|
|
270
|
+
)
|
|
271
|
+
if not is_forwarded_member_event:
|
|
272
|
+
collector.observe(span, item)
|
|
265
273
|
if kind == "invocation" and hasattr(item, "finish_reason"):
|
|
266
274
|
if any(
|
|
267
275
|
s.parent_id == span.id for s in collector.trace.spans
|
|
@@ -349,12 +357,25 @@ def trace_stream(kind: str, *, accounting: bool = False) -> Callable:
|
|
|
349
357
|
|
|
350
358
|
@trace_stream("invocation")
|
|
351
359
|
async def capture_agent_stream(
|
|
352
|
-
agent: Any,
|
|
360
|
+
agent: Any,
|
|
361
|
+
task: Any,
|
|
362
|
+
*,
|
|
363
|
+
cancellation_token=None,
|
|
364
|
+
verbose: bool = False,
|
|
365
|
+
turn_kind: str | None = None,
|
|
366
|
+
stream_tokens: bool = False,
|
|
353
367
|
) -> AsyncIterator[Any]:
|
|
354
|
-
"""Capture custom and native agents uniformly inside orchestration streams.
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
368
|
+
"""Capture custom and native agents uniformly inside orchestration streams.
|
|
369
|
+
|
|
370
|
+
``turn_kind`` is recorded on the span only; it is not passed to the agent.
|
|
371
|
+
"""
|
|
372
|
+
stream_kwargs: dict[str, Any] = {
|
|
373
|
+
"cancellation_token": cancellation_token,
|
|
374
|
+
"verbose": verbose,
|
|
375
|
+
}
|
|
376
|
+
if stream_tokens:
|
|
377
|
+
stream_kwargs["stream_tokens"] = True
|
|
378
|
+
stream = agent.run_stream(task, **stream_kwargs)
|
|
358
379
|
try:
|
|
359
380
|
async for item in stream:
|
|
360
381
|
yield item
|
|
@@ -27,6 +27,7 @@ from .reflective import EditOut, ReflectionOut, ReflectiveOptimizer
|
|
|
27
27
|
from .spec import (
|
|
28
28
|
CatalogEntry,
|
|
29
29
|
Component,
|
|
30
|
+
DescriptionTunable,
|
|
30
31
|
Edit,
|
|
31
32
|
InstructionTunable,
|
|
32
33
|
MemberOptimizationSpec,
|
|
@@ -59,6 +60,7 @@ __all__ = [
|
|
|
59
60
|
"Edit",
|
|
60
61
|
"Tunable",
|
|
61
62
|
"InstructionTunable",
|
|
63
|
+
"DescriptionTunable",
|
|
62
64
|
"SkillTunable",
|
|
63
65
|
"SkillDescriptionTunable",
|
|
64
66
|
"SkillTriggersTunable",
|
|
@@ -114,6 +114,36 @@ class InstructionTunable(Tunable):
|
|
|
114
114
|
return config.model_copy(update={"instructions": rewrites[-1].value})
|
|
115
115
|
|
|
116
116
|
|
|
117
|
+
class DescriptionTunable(Tunable):
|
|
118
|
+
"""Rewrite the agent's description. Free-form, single component.
|
|
119
|
+
|
|
120
|
+
Plan-based and AI-driven orchestrators route on member descriptions, not
|
|
121
|
+
instructions, so this is the component a routing judge can observe. Opt-in:
|
|
122
|
+
not part of the default ``OptimizationSpec`` tunables.
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
kind = "description"
|
|
126
|
+
ops = frozenset({Operation.REWRITE})
|
|
127
|
+
mode = ProposalMode.GENERATIVE
|
|
128
|
+
|
|
129
|
+
def read(self, config: AgentConfig) -> list[Component]:
|
|
130
|
+
return [
|
|
131
|
+
Component(
|
|
132
|
+
name="description",
|
|
133
|
+
kind=self.kind,
|
|
134
|
+
value=config.description,
|
|
135
|
+
ops=self.ops,
|
|
136
|
+
mode=self.mode,
|
|
137
|
+
)
|
|
138
|
+
]
|
|
139
|
+
|
|
140
|
+
def apply(self, config: AgentConfig, edits: list[Edit]) -> AgentConfig:
|
|
141
|
+
rewrites = [e for e in edits if e.op is Operation.REWRITE and e.value]
|
|
142
|
+
if not rewrites:
|
|
143
|
+
return config
|
|
144
|
+
return config.model_copy(update={"description": rewrites[-1].value})
|
|
145
|
+
|
|
146
|
+
|
|
117
147
|
class SkillTunable(Tunable):
|
|
118
148
|
"""Add / rewrite / remove named skills. Free-form (generative).
|
|
119
149
|
|
|
@@ -379,6 +409,7 @@ __all__ = [
|
|
|
379
409
|
"Edit",
|
|
380
410
|
"Tunable",
|
|
381
411
|
"InstructionTunable",
|
|
412
|
+
"DescriptionTunable",
|
|
382
413
|
"SkillTunable",
|
|
383
414
|
"SkillDescriptionTunable",
|
|
384
415
|
"SkillTriggersTunable",
|
|
@@ -120,9 +120,9 @@ class AIOrchestrator(BaseOrchestrator):
|
|
|
120
120
|
return self._last_selection_reason
|
|
121
121
|
return super()._get_selection_reason(selected_agent)
|
|
122
122
|
|
|
123
|
-
def
|
|
123
|
+
def _get_orchestrator_usage_stats(self) -> list[tuple[str, Usage]]:
|
|
124
124
|
"""Include selector LLM calls in orchestration usage aggregation."""
|
|
125
|
-
return
|
|
125
|
+
return [("selector", usage) for usage in self._selector_usage_stats]
|
|
126
126
|
|
|
127
127
|
def _reset_for_run(self) -> None:
|
|
128
128
|
"""Reset AI-driven runtime state for new run."""
|
|
@@ -151,7 +151,7 @@ class AIOrchestrator(BaseOrchestrator):
|
|
|
151
151
|
|
|
152
152
|
def _build_selection_prompt(self) -> str:
|
|
153
153
|
"""Build LLM prompt for choosing the next best agent."""
|
|
154
|
-
agent_names = ", ".join(agent.name for agent in self.
|
|
154
|
+
agent_names = ", ".join(agent.name for agent in self._worker_agents)
|
|
155
155
|
capabilities = self.get_agent_capabilities_summary()
|
|
156
156
|
conversation_context = self._format_conversation_for_selection()
|
|
157
157
|
|
|
@@ -228,13 +228,14 @@ class AIOrchestrator(BaseOrchestrator):
|
|
|
228
228
|
return json.dumps(payload, indent=2)
|
|
229
229
|
|
|
230
230
|
def _find_agent_by_name(self, agent_name: str) -> Optional[BaseAgent]:
|
|
231
|
-
"""Resolve agent by exact name first, then case-insensitive match."""
|
|
232
|
-
|
|
231
|
+
"""Resolve a worker agent by exact name first, then case-insensitive match."""
|
|
232
|
+
workers = self._worker_agents
|
|
233
|
+
for agent in workers:
|
|
233
234
|
if agent.name == agent_name:
|
|
234
235
|
return agent
|
|
235
236
|
|
|
236
237
|
target = agent_name.casefold()
|
|
237
|
-
for agent in
|
|
238
|
+
for agent in workers:
|
|
238
239
|
if agent.name.casefold() == target:
|
|
239
240
|
return agent
|
|
240
241
|
|
|
@@ -242,8 +243,9 @@ class AIOrchestrator(BaseOrchestrator):
|
|
|
242
243
|
|
|
243
244
|
def _select_next_by_fallback(self, reason: str) -> BaseAgent:
|
|
244
245
|
"""Round-robin fallback selection used when AI selection fails."""
|
|
245
|
-
|
|
246
|
-
|
|
246
|
+
workers = self._worker_agents
|
|
247
|
+
agent = workers[self._fallback_agent_index]
|
|
248
|
+
self._fallback_agent_index = (self._fallback_agent_index + 1) % len(workers)
|
|
247
249
|
self._last_selection_reason = (
|
|
248
250
|
f"{reason}. Fallback round-robin selected '{agent.name}'"
|
|
249
251
|
)
|