agentbyte 0.40.0__tar.gz → 0.41.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.41.0}/CHANGELOG.md +24 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/PKG-INFO +1 -1
- agentbyte-0.41.0/src/agentbyte/__about__.py +2 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/base.py +25 -1
- agentbyte-0.41.0/tests/orchestration/test_history_tool_call_pairing.py +162 -0
- agentbyte-0.40.0/src/agentbyte/__about__.py +0 -2
- {agentbyte-0.40.0 → agentbyte-0.41.0}/.gitignore +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/LICENSE +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/README.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/pyproject.toml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/_optional.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/embedding_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/catalog.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/__main__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/eval_commands.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/loading.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/main.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/counters.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/errors.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/grouping.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/strategies.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/component.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context_providers/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context_providers/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context_providers/skills.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/importer.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/loader.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/publish.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/publish_config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/publishers.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/s3.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/sources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/sqlite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/write_config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/writers.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/decorator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/keyword.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/local.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/process.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/comparison.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/eval_dataset.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/conformance.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/errors.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/recorder.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/sql.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/sqlite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/store.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/transitions.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/composite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/llm.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/reference.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/validation.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/pairwise.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/report.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/runner.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/splitting.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/model.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/runtime.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/workflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/coordinator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/jobs.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/suite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/verdict.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/execution_trace/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/execution_trace/collector.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/execution_trace/models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/auth.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/chat.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/embedding.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/pricing.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/logger.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/otel.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/sql_usage.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/usage_logger.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/gepa.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/mipro.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/pareto.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/reflective.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/spec.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/trace.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/ai.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/handoff.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/plan.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/policies.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/round_robin.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instruction_registry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/streaming.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/resources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/scripts.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/sources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/validation.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/coding_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/research_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/eval_routes.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/execution.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/server.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/ui/assets/index-C-wj-OzO.js +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/ui/assets/index-DW8IDODJ.css +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/ui/index.html +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/errors.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/sqlite_checkpoint.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/visualizer.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_as_tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_context_providers.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_error_response.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_response_accessors.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_embedding_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_tool_batch_resolution.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_tool_metadata.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/cli/test_loading.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/cli/test_registry_check.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/compaction/test_compaction.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/context_providers/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/context_providers/test_skill_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/context_providers/test_skills_provider.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/fake_s3.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_dataset_exit.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_loader.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_multi_table.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_publish.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_sqlite_db.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_dataset.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_history.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_history_backends.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_jobs.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_workbench.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_execution_trajectories.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_multi_turn.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_pairwise.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_score_integrity.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_splitting.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_types_and_judges.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/examples/test_compaction_webapp.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_pricing.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_retryable_error_substrings.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_context_compaction.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_sql_usage.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_usage_logger.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_base_integration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_config.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_gepa.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_mipro.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_orchestrator_optim.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_pareto.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_reflective.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_score_integrity.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_spec.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_trace.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_base_orchestrator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_round_robin.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_instruction_registry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_streaming.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/test_base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/test_resources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/test_scripts.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/test_sources.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_base.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_external.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_source.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_context.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_logger.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_messages.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_optional_extras.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_package_api.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_session_store.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_types.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_vanilla_chunker.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/tools/test_coding_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/tools/test_research_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/__init__.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/helpers.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_eval_routes.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_server.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_workflow_streaming.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/recovery_worker.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_agent_step_imports.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_reliability.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -6,6 +6,30 @@ The format follows Keep a Changelog principles and semantic versioning.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.41.0] - 2026-10-04
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Tool-call-pair-safe recent history window (spec 0064). `BaseOrchestrator._select_history_messages`
|
|
14
|
+
implemented `AgentHistoryPolicy(window="recent")` as a blind `shared_messages[-message_limit:]`
|
|
15
|
+
slice, which could cut between a tool-calling `AssistantMessage` and its `ToolMessage` reply once
|
|
16
|
+
enough turns accumulated (a multi-step plan, or a step-retry loop), handing the next agent a
|
|
17
|
+
transcript that opens on an orphaned tool result and gets rejected by the provider. The `"recent"`
|
|
18
|
+
branch now reuses `agentbyte.compaction.grouping.group_messages` (spec 0049) to keep each tool
|
|
19
|
+
exchange whole, growing the window left by the few messages needed rather than splitting it.
|
|
20
|
+
`message_limit` is therefore a floor, not an exact count, only when a tool exchange would
|
|
21
|
+
otherwise be split; histories with no tool calls are unaffected. Lives in `BaseOrchestrator`, so
|
|
22
|
+
every pattern (`PlanBasedOrchestrator`, `AIOrchestrator`, `RoundRobinOrchestrator`,
|
|
23
|
+
`HandoffOrchestrator`) is covered by the one change.
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- New optim usecase notebook `notebooks/usecases/optim/02-optim-it-helpdesk-triage.ipynb`: a
|
|
28
|
+
`PlanBasedOrchestrator` supervisor over three structured-output specialists (`hardware`,
|
|
29
|
+
`software`, `access-control`, each with a `lookup_asset` tool) plus a `synthesizer`, optimized
|
|
30
|
+
with `ReflectiveOptimizer` against a routing-correctness judge. Introduces a `DescriptionTunable`
|
|
31
|
+
(the planner routes off each member's `description`, which the built-in tunables did not expose).
|
|
32
|
+
|
|
9
33
|
## [0.40.0] - 2026-10-02
|
|
10
34
|
|
|
11
35
|
### Added
|
|
@@ -16,6 +16,7 @@ from agentbyte.agents.types import AgentResponse, Usage
|
|
|
16
16
|
from agentbyte.execution_trace import trace_stream
|
|
17
17
|
from agentbyte.execution_trace.collector import capture_agent_stream, normalize_status
|
|
18
18
|
from agentbyte.cancellation_token import CancellationToken
|
|
19
|
+
from agentbyte.compaction.grouping import MessageGroup, group_messages
|
|
19
20
|
from agentbyte.context import AgentContext
|
|
20
21
|
from agentbyte.messages import Message, UserMessage
|
|
21
22
|
from agentbyte.termination import BaseTermination
|
|
@@ -827,9 +828,32 @@ class BaseOrchestrator(ABC):
|
|
|
827
828
|
def _select_history_messages(self, policy: AgentHistoryPolicy) -> list[Message]:
|
|
828
829
|
"""Return the relevant shared-message slice for a history policy."""
|
|
829
830
|
if policy.window == "recent" and policy.message_limit is not None:
|
|
830
|
-
return
|
|
831
|
+
return self._select_recent_messages(policy.message_limit)
|
|
831
832
|
return list(self.shared_messages)
|
|
832
833
|
|
|
834
|
+
def _select_recent_messages(self, message_limit: int) -> list[Message]:
|
|
835
|
+
"""Last `message_limit` messages, never splitting a tool-call exchange.
|
|
836
|
+
|
|
837
|
+
A plain ``shared_messages[-message_limit:]`` slice can cut between a
|
|
838
|
+
tool-calling ``AssistantMessage`` and its ``ToolMessage`` reply once enough
|
|
839
|
+
turns accumulate, leaving the next agent a transcript that opens on an
|
|
840
|
+
orphaned tool result (spec 0064). ``group_messages`` (spec 0049) already
|
|
841
|
+
groups each exchange into one indivisible unit; keep whole groups from the
|
|
842
|
+
newest end until at least ``message_limit`` messages are covered, so the
|
|
843
|
+
limit becomes a floor rather than an exact count when a tool exchange
|
|
844
|
+
would otherwise be split.
|
|
845
|
+
"""
|
|
846
|
+
groups = group_messages(self.shared_messages)
|
|
847
|
+
kept: list[MessageGroup] = []
|
|
848
|
+
count = 0
|
|
849
|
+
for group in reversed(groups):
|
|
850
|
+
kept.append(group)
|
|
851
|
+
count += len(group.messages)
|
|
852
|
+
if count >= message_limit:
|
|
853
|
+
break
|
|
854
|
+
kept.reverse()
|
|
855
|
+
return [message for group in kept for message in group.messages]
|
|
856
|
+
|
|
833
857
|
def _build_agent_context_from_history(
|
|
834
858
|
self, agent: BaseAgent
|
|
835
859
|
) -> UserMessage | list[Message]:
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncGenerator
|
|
4
|
+
from typing import Any, Optional, Union
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from agentbyte.agents.base import BaseAgent
|
|
9
|
+
from agentbyte.agents.types import AgentResponse, Usage
|
|
10
|
+
from agentbyte.cancellation_token import CancellationToken
|
|
11
|
+
from agentbyte.context import AgentContext
|
|
12
|
+
from agentbyte.messages import (
|
|
13
|
+
AssistantMessage,
|
|
14
|
+
Message,
|
|
15
|
+
ToolCallRequest,
|
|
16
|
+
ToolMessage,
|
|
17
|
+
UserMessage,
|
|
18
|
+
)
|
|
19
|
+
from agentbyte.orchestration import AgentHistoryPolicy, HistoryContextPolicy
|
|
20
|
+
from agentbyte.orchestration.round_robin import RoundRobinOrchestrator
|
|
21
|
+
from agentbyte.termination.max_message import MaxMessageTermination
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class MockAgent(BaseAgent):
|
|
25
|
+
"""Minimal BaseAgent stub -- these tests only exercise history selection,
|
|
26
|
+
never the orchestration run loop, so responses are fixed and unused."""
|
|
27
|
+
|
|
28
|
+
def __init__(self, name: str):
|
|
29
|
+
self.name = name
|
|
30
|
+
self.description = f"Description of {name}"
|
|
31
|
+
self.tools = []
|
|
32
|
+
|
|
33
|
+
async def run(
|
|
34
|
+
self,
|
|
35
|
+
task: Optional[Union[UserMessage, list[Message]]] = None,
|
|
36
|
+
context: Optional[AgentContext] = None,
|
|
37
|
+
cancellation_token: Optional[CancellationToken] = None,
|
|
38
|
+
) -> AgentResponse:
|
|
39
|
+
del cancellation_token
|
|
40
|
+
ctx = context or AgentContext()
|
|
41
|
+
if task and not ctx.messages:
|
|
42
|
+
if isinstance(task, UserMessage):
|
|
43
|
+
ctx.messages.append(task)
|
|
44
|
+
else:
|
|
45
|
+
ctx.messages.extend(task)
|
|
46
|
+
msg = AssistantMessage(content="ok", source=self.name)
|
|
47
|
+
ctx.messages.append(msg)
|
|
48
|
+
return AgentResponse(source=self.name, context=ctx, finish_reason="stop")
|
|
49
|
+
|
|
50
|
+
async def run_stream(
|
|
51
|
+
self,
|
|
52
|
+
task: Optional[Union[UserMessage, list[Message]]] = None,
|
|
53
|
+
context: Optional[AgentContext] = None,
|
|
54
|
+
cancellation_token: Optional[CancellationToken] = None,
|
|
55
|
+
verbose: bool = False,
|
|
56
|
+
stream_tokens: bool = False,
|
|
57
|
+
) -> AsyncGenerator[Union[Message, Any, AgentResponse], None]:
|
|
58
|
+
del cancellation_token, verbose, stream_tokens
|
|
59
|
+
ctx = context or AgentContext()
|
|
60
|
+
if task:
|
|
61
|
+
if isinstance(task, UserMessage):
|
|
62
|
+
yield task
|
|
63
|
+
if not ctx.messages:
|
|
64
|
+
ctx.messages.append(task)
|
|
65
|
+
else:
|
|
66
|
+
for message in task:
|
|
67
|
+
yield message
|
|
68
|
+
if not ctx.messages:
|
|
69
|
+
ctx.messages.append(message)
|
|
70
|
+
msg = AssistantMessage(content="ok", source=self.name)
|
|
71
|
+
yield msg
|
|
72
|
+
ctx.messages.append(msg)
|
|
73
|
+
yield AgentResponse(
|
|
74
|
+
source=self.name, context=ctx, usage=Usage(), finish_reason="stop"
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _recent(limit: int) -> HistoryContextPolicy:
|
|
79
|
+
return HistoryContextPolicy(
|
|
80
|
+
default=AgentHistoryPolicy(window="recent", message_limit=limit, format="messages")
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@pytest.mark.asyncio
|
|
85
|
+
class TestToolCallPairSafety:
|
|
86
|
+
async def test_naive_cut_between_pair_grows_window_left(self):
|
|
87
|
+
a1 = MockAgent("a1")
|
|
88
|
+
orchestrator = RoundRobinOrchestrator(
|
|
89
|
+
[a1], MaxMessageTermination(2), history_policy=_recent(2)
|
|
90
|
+
)
|
|
91
|
+
orchestrator.shared_messages = [
|
|
92
|
+
UserMessage(content="task", source="user"),
|
|
93
|
+
AssistantMessage(
|
|
94
|
+
content="",
|
|
95
|
+
source="a1",
|
|
96
|
+
tool_calls=[ToolCallRequest(tool_name="lookup", parameters={}, call_id="c1")],
|
|
97
|
+
),
|
|
98
|
+
ToolMessage(
|
|
99
|
+
content="result", tool_call_id="c1", tool_name="lookup", source="a1", success=True
|
|
100
|
+
),
|
|
101
|
+
]
|
|
102
|
+
|
|
103
|
+
# A naive shared_messages[-2:] would return [AssistantMessage(tool_calls), ToolMessage] --
|
|
104
|
+
# that one is actually still paired. Force the cut one message later so the naive slice
|
|
105
|
+
# would be [ToolMessage] alone, with its issuing AssistantMessage left out.
|
|
106
|
+
orchestrator.shared_messages.append(AssistantMessage(content="final", source="a1"))
|
|
107
|
+
|
|
108
|
+
context = await orchestrator.prepare_context_for_agent(a1)
|
|
109
|
+
|
|
110
|
+
assert isinstance(context, list)
|
|
111
|
+
# The orphaned ToolMessage's issuing AssistantMessage must be present, and it must come
|
|
112
|
+
# immediately before the ToolMessage -- never open on a bare 'tool' message.
|
|
113
|
+
roles = [type(m).__name__ for m in context]
|
|
114
|
+
tool_index = roles.index("ToolMessage")
|
|
115
|
+
assert roles[tool_index - 1] == "AssistantMessage"
|
|
116
|
+
assert context[tool_index - 1].tool_calls is not None
|
|
117
|
+
|
|
118
|
+
async def test_cut_on_group_boundary_is_unchanged(self):
|
|
119
|
+
"""No tool calls: behavior is byte-identical to the pre-fix raw slice."""
|
|
120
|
+
a1 = MockAgent("a1")
|
|
121
|
+
orchestrator = RoundRobinOrchestrator(
|
|
122
|
+
[a1], MaxMessageTermination(2), history_policy=_recent(2)
|
|
123
|
+
)
|
|
124
|
+
orchestrator.shared_messages = [
|
|
125
|
+
UserMessage(content="one", source="user"),
|
|
126
|
+
AssistantMessage(content="two", source="a1"),
|
|
127
|
+
AssistantMessage(content="three", source="a1"),
|
|
128
|
+
]
|
|
129
|
+
|
|
130
|
+
context = await orchestrator.prepare_context_for_agent(a1)
|
|
131
|
+
|
|
132
|
+
assert isinstance(context, list)
|
|
133
|
+
assert [message.content for message in context] == ["two", "three"]
|
|
134
|
+
|
|
135
|
+
async def test_multi_call_batch_is_kept_whole(self):
|
|
136
|
+
a1 = MockAgent("a1")
|
|
137
|
+
orchestrator = RoundRobinOrchestrator(
|
|
138
|
+
[a1], MaxMessageTermination(2), history_policy=_recent(1)
|
|
139
|
+
)
|
|
140
|
+
orchestrator.shared_messages = [
|
|
141
|
+
UserMessage(content="task", source="user"),
|
|
142
|
+
AssistantMessage(
|
|
143
|
+
content="",
|
|
144
|
+
source="a1",
|
|
145
|
+
tool_calls=[
|
|
146
|
+
ToolCallRequest(tool_name="lookup", parameters={}, call_id="c1"),
|
|
147
|
+
ToolCallRequest(tool_name="lookup", parameters={}, call_id="c2"),
|
|
148
|
+
],
|
|
149
|
+
),
|
|
150
|
+
ToolMessage(
|
|
151
|
+
content="r1", tool_call_id="c1", tool_name="lookup", source="a1", success=True
|
|
152
|
+
),
|
|
153
|
+
ToolMessage(
|
|
154
|
+
content="r2", tool_call_id="c2", tool_name="lookup", source="a1", success=True
|
|
155
|
+
),
|
|
156
|
+
]
|
|
157
|
+
|
|
158
|
+
context = await orchestrator.prepare_context_for_agent(a1)
|
|
159
|
+
|
|
160
|
+
assert isinstance(context, list)
|
|
161
|
+
roles = [type(m).__name__ for m in context]
|
|
162
|
+
assert roles == ["AssistantMessage", "ToolMessage", "ToolMessage"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|