agentbyte 0.53.0__tar.gz → 0.55.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.53.0 → agentbyte-0.55.0}/CHANGELOG.md +41 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/PKG-INFO +2 -2
- {agentbyte-0.53.0 → agentbyte-0.55.0}/README.md +1 -1
- agentbyte-0.55.0/src/agentbyte/__about__.py +2 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/agents/__init__.py +3 -1
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/agents/agent.py +17 -4
- agentbyte-0.55.0/src/agentbyte/agents/agent_as_tool.py +366 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/agents/base.py +15 -2
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/compaction/grouping.py +24 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/anthropic/_conversion.py +18 -2
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/pricing.py +7 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/orchestration/base.py +5 -19
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/base.py +16 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_as_tool.py +514 -1
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_anthropic_bedrock_client.py +32 -1
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_anthropic_client.py +87 -1
- agentbyte-0.53.0/src/agentbyte/__about__.py +0 -2
- agentbyte-0.53.0/src/agentbyte/agents/agent_as_tool.py +0 -192
- {agentbyte-0.53.0 → agentbyte-0.55.0}/.gitignore +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/LICENSE +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/pyproject.toml +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/_optional.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/a2a/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/a2a/app.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/a2a/distributed_context.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/a2a/executor.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/a2a/tool.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/agents/types.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/catalog.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/__main__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/eval_commands.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/history_args.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/loading.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/main.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/optim_commands.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/report_output.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/cli/serve_commands.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/compaction/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/compaction/counters.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/compaction/errors.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/compaction/strategies.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/component.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/context.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/context_providers/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/context_providers/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/context_providers/skills.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/importer.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/loader.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/publish.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/publish_config.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/publishers.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/s3.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/sources.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/sqlite.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/write_config.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/dataset/writers.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/checks/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/checks/decorator.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/checks/keyword.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/checks/local.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/checks/process.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/checks/tool.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/checks/types.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/comparison.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/eval_dataset.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/_writer_lock.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/config.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/conformance.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/errors.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/models.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/recorder.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/sql.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/sqlite.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/store.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/history/transitions.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/judges/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/judges/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/judges/composite.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/judges/llm.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/judges/reference.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/judges/validation.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/pairwise.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/report.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/runner.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/splitting.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/targets/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/targets/agent.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/targets/model.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/targets/runtime.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/targets/workflow.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/types.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/benchmark.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/compare.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/coordinator.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/jobs.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/suite.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/eval/workbench/verdict.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/execution_trace/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/execution_trace/collector.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/execution_trace/models.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/anthropic/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/anthropic/chat.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/anthropic/settings.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/azure/auth.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/azure/chat.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/azure/embedding.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/bedrock/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/bedrock/_client.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/bedrock/anthropic_chat.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/bedrock/cohere_embedding.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/bedrock/settings.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/embedding_batcher.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/logger.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/middleware/otel.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/middleware/sql_usage.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/middleware/usage_logger.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/binding.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/config.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/gepa.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/job.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/mipro.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/pareto.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/reflective.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/report.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/spec.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/optim/trace.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/orchestration/ai.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/orchestration/handoff.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/orchestration/plan.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/orchestration/policies.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/orchestration/round_robin.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/benchmark.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/capitals.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/instruction_registry.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/skills/capitals-format/SKILL.md +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/streaming.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/skills/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/skills/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/skills/resources.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/skills/scripts.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/skills/sources.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/skills/validation.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/coding_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/mcp/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/mcp/client.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/mcp/config.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/mcp/errors.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/mcp/tool.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/mcp/transports.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/tools/research_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/types.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/eval_routes.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/execution.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp/servers/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp/servers/apps_server.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp/servers/auth_server.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp/servers/basic_server.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp/servers/mrtr_server.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp/servers/notify_server.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp_playground.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/mcp_routes.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/models.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/server.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/ui/assets/index-BreogZut.js +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/ui/assets/index-ptxe7GHs.css +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/ui/index.html +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/errors.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/sqlite_checkpoint.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/steps/agent.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/src/agentbyte/workflow/visualizer.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/a2a/a2a_helpers.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/a2a/test_a2a_adapters.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/a2a/test_distributed_context.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_client_middleware_overlap.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_context_providers.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_error_response.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_response_accessors.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_stop_at_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_tool_batch_resolution.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/agents/test_tool_metadata.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/cli/test_eval_benchmark_commands.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/cli/test_loading.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/cli/test_registry_check.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/cli/test_report_output.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/cli/test_serve_command.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/compaction/test_compaction.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/conftest.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/context_providers/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/context_providers/test_skill_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/context_providers/test_skills_provider.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/dataset/fake_s3.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/dataset/test_dataset_exit.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/dataset/test_loader.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/dataset/test_multi_table.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/dataset/test_publish.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/dataset/test_sqlite_db.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_dimension_scores.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_eval_benchmarks.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_eval_dataset.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_eval_history.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_eval_history_backends.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_eval_jobs.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_eval_workbench.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_execution_trajectories.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_history_config.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_multi_turn.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_pairwise.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_run_comparison.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_score_integrity.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_splitting.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/eval/test_types_and_judges.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_client_middleware.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_cohere_bedrock_embedding_client.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_embedding_batcher.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_pricing.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/llm/test_retryable_error_substrings.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/middleware/test_context_compaction.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/middleware/test_sql_usage.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/middleware/test_usage_logger.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/fakes.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_base_integration.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_binding.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_config.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_description_tunable.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_gepa.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_mipro.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_orchestrator_optim.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_pareto.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_reflective.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_report.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_score_integrity.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_spec.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/optim/test_trace.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_base_orchestrator.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_history_tool_call_pairing.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_orchestration_usage_breakdown.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_orchestrator_agent_contract.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_orchestrator_member_events.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_orchestrator_otel.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_orchestrator_synthesis.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/orchestration/test_round_robin.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/presets/test_benchmark.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/presets/test_capitals.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/presets/test_instruction_registry.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/presets/test_streaming.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/skills/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/skills/test_base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/skills/test_resources.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/skills/test_scripts.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/skills/test_sources.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_base.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_external.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_source.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_context.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_logger.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_messages.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_option_enums.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_optional_extras.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_package_api.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_session_store.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/test_types.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/tools/fixtures/mcp_stdio_server.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/tools/test_coding_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/tools/test_mcp_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/tools/test_research_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/__init__.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/helpers.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/test_eval_routes.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/test_mcp_routes.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/test_server.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/webui/test_workflow_streaming.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/recovery_worker.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_agent_step_imports.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_workflow_reliability.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.53.0 → agentbyte-0.55.0}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -6,6 +6,47 @@ The format follows Keep a Changelog principles and semantic versioning.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.55.0] - 2026-10-12
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- `AgentToolContextPolicy` (strategy enum plus `message_limit`) configures what a sub-agent tool
|
|
14
|
+
inherits from its caller via `context_policy` on `AgentAsTool` and `Agent.as_tool()`. Strategies:
|
|
15
|
+
`identity` (default), `last_task`, `recent`, `full`, or a callable. `session_id`/`user_id` are always
|
|
16
|
+
inherited. `BaseTool.accepts_context()` lets the agent loop forward its working context to opted-in tools.
|
|
17
|
+
- `compaction.grouping.select_recent_messages()`: shared last-N window that never splits a tool exchange,
|
|
18
|
+
now used by both orchestration and agent tools.
|
|
19
|
+
|
|
20
|
+
### Changed
|
|
21
|
+
|
|
22
|
+
- The in-flight delegation call is excluded from seeded sub-agent history so it is always a valid sequence.
|
|
23
|
+
- `AgentToolContextPolicy` rejects `message_limit` for any strategy other than `recent`.
|
|
24
|
+
|
|
25
|
+
## [0.54.0] - 2026-10-12
|
|
26
|
+
|
|
27
|
+
### Added
|
|
28
|
+
|
|
29
|
+
- Anthropic/Bedrock prompt caching: `AnthropicConversionMixin` now tags the `system` block
|
|
30
|
+
with a `cache_control: {"type": "ephemeral"}` breakpoint whenever a `SystemMessage` is
|
|
31
|
+
present, so both `AnthropicChatCompletionClient` and `AnthropicBedrockChatCompletionClient`
|
|
32
|
+
get cache-read discounting through the same shared request-building code — no config flag,
|
|
33
|
+
no-op below the per-model minimum cacheable size. Added a matching
|
|
34
|
+
`examples/llm/anthropic_bedrock_prompt_caching_cost_smoke_test.py` alongside the existing
|
|
35
|
+
OpenAI/Azure smoke test.
|
|
36
|
+
- `examples/agents/anthropic_agent_example.py`: Bedrock Claude injected via
|
|
37
|
+
`AnthropicBedrockChatCompletionClient.from_region()` driven through `Agent.run()`/
|
|
38
|
+
`Agent.run_stream()`. `examples/agents/cohere_bedrock_embedding_example.py`: raw
|
|
39
|
+
`CohereBedrockEmbeddingClient` calls, then the same client wrapped in `EmbeddingBatcher`,
|
|
40
|
+
then with `LoggingMiddleware` added — both live-verified end to end against real Bedrock.
|
|
41
|
+
|
|
42
|
+
### Fixed
|
|
43
|
+
|
|
44
|
+
- `PricingRegistry.ANTHROPIC_CHAT_PRICING` had no exact entry for `claude-sonnet-4-5` or
|
|
45
|
+
`claude-sonnet-4-6`; both resolved only through the generic `claude-sonnet-4` prefix
|
|
46
|
+
fallback, which happened to match current pricing ($3/$15 per MTok) but offered no
|
|
47
|
+
protection against a future divergent repricing (the same reasoning that already justified
|
|
48
|
+
separate `claude-opus-4-5`..`claude-opus-4-8` entries). Added explicit entries for both.
|
|
49
|
+
|
|
9
50
|
## [0.53.0] - 2026-10-10
|
|
10
51
|
|
|
11
52
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agentbyte
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.55.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
|
|
@@ -90,7 +90,7 @@ Description-Content-Type: text/markdown
|
|
|
90
90
|
|
|
91
91
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
92
92
|
|
|
93
|
-
Current release: **0.
|
|
93
|
+
Current release: **0.55.0**
|
|
94
94
|
|
|
95
95
|
## Building an Agent
|
|
96
96
|
|
|
@@ -3,7 +3,7 @@ Agent implementations and abstractions.
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from .agent import Agent
|
|
6
|
-
from .agent_as_tool import AgentAsTool
|
|
6
|
+
from .agent_as_tool import AgentAsTool, AgentToolContextPolicy, ContextStrategy
|
|
7
7
|
from .base import (
|
|
8
8
|
AgentConfigurationError,
|
|
9
9
|
AgentError,
|
|
@@ -35,6 +35,8 @@ __all__ = [
|
|
|
35
35
|
"BaseAgent",
|
|
36
36
|
"Agent",
|
|
37
37
|
"AgentAsTool",
|
|
38
|
+
"ContextStrategy",
|
|
39
|
+
"AgentToolContextPolicy",
|
|
38
40
|
"AgentError",
|
|
39
41
|
"AgentConfigurationError",
|
|
40
42
|
"AgentExecutionError",
|
|
@@ -188,10 +188,19 @@ class Agent(BaseAgent):
|
|
|
188
188
|
"tool_call payload parameters must be a dictionary"
|
|
189
189
|
)
|
|
190
190
|
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
191
|
+
if tool.accepts_context():
|
|
192
|
+
stream = tool.execute_stream(
|
|
193
|
+
tool_parameters,
|
|
194
|
+
agent_context=working_context,
|
|
195
|
+
cancellation_token=cancellation_token,
|
|
196
|
+
)
|
|
197
|
+
else:
|
|
198
|
+
stream = tool.execute_stream(
|
|
199
|
+
tool_parameters,
|
|
200
|
+
cancellation_token=cancellation_token,
|
|
201
|
+
)
|
|
202
|
+
|
|
203
|
+
async for item in stream:
|
|
195
204
|
yield item
|
|
196
205
|
|
|
197
206
|
streamed_result: object | None = None
|
|
@@ -280,6 +289,10 @@ class Agent(BaseAgent):
|
|
|
280
289
|
raise ValueError(
|
|
281
290
|
"tool_call payload parameters must be a dictionary"
|
|
282
291
|
)
|
|
292
|
+
if tool.accepts_context():
|
|
293
|
+
return await tool.execute(
|
|
294
|
+
tool_parameters, agent_context=working_context
|
|
295
|
+
)
|
|
283
296
|
return await tool.execute(tool_parameters)
|
|
284
297
|
|
|
285
298
|
result: object | None = None
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Wrap agents as tools for hierarchical agent composition.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from collections.abc import AsyncGenerator, Callable
|
|
6
|
+
from enum import StrEnum
|
|
7
|
+
from typing import Any, Dict, List, Optional, Protocol, Union, runtime_checkable
|
|
8
|
+
|
|
9
|
+
from pydantic import BaseModel, ConfigDict, StrictInt, model_validator
|
|
10
|
+
|
|
11
|
+
from agentbyte.cancellation_token import CancellationToken
|
|
12
|
+
from agentbyte.compaction.grouping import select_recent_messages
|
|
13
|
+
from agentbyte.context import AgentContext
|
|
14
|
+
from agentbyte.llm.types import ChatCompletionChunk
|
|
15
|
+
from agentbyte.messages import AssistantMessage, Message, ToolMessage, UserMessage
|
|
16
|
+
from agentbyte.tools.base import BaseTool
|
|
17
|
+
from agentbyte.types import ToolResult
|
|
18
|
+
|
|
19
|
+
from .types import AgentEvent, AgentResponse
|
|
20
|
+
|
|
21
|
+
ResultStrategy = Union[str, Callable[[List[Message]], str]]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ContextStrategy(StrEnum):
|
|
25
|
+
"""Which slice of the caller's conversation a sub-agent inherits.
|
|
26
|
+
|
|
27
|
+
Identity (``session_id``/``user_id``) is always inherited so sub-agent usage
|
|
28
|
+
aggregates under the parent; each strategy adds messages on top of it. The
|
|
29
|
+
recent window mirrors the orchestrator's ``HistoryWindow`` vocabulary and
|
|
30
|
+
reuses its whole-tool-exchange windowing (spec 0064).
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
IDENTITY = "identity"
|
|
34
|
+
"""Identity only — no messages (default, no context bloat)."""
|
|
35
|
+
LAST_TASK = "last_task"
|
|
36
|
+
"""Identity plus the caller's most recent user task."""
|
|
37
|
+
RECENT = "recent"
|
|
38
|
+
"""Identity plus the last ``message_limit`` messages (never splitting a tool
|
|
39
|
+
exchange)."""
|
|
40
|
+
FULL = "full"
|
|
41
|
+
"""Identity plus the whole caller conversation."""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class AgentToolContextPolicy(BaseModel):
|
|
45
|
+
"""How much of the caller's conversation a sub-agent tool inherits."""
|
|
46
|
+
|
|
47
|
+
model_config = ConfigDict(extra="forbid", frozen=True)
|
|
48
|
+
|
|
49
|
+
strategy: ContextStrategy = ContextStrategy.IDENTITY
|
|
50
|
+
"""Which messages to seed. Plain strings are accepted."""
|
|
51
|
+
message_limit: Optional[StrictInt] = None
|
|
52
|
+
"""Minimum messages for ``recent``; more are kept to preserve whole tool
|
|
53
|
+
exchanges. Required (>= 1) for ``recent`` and rejected otherwise."""
|
|
54
|
+
|
|
55
|
+
@model_validator(mode="after")
|
|
56
|
+
def validate_limit(self) -> "AgentToolContextPolicy":
|
|
57
|
+
"""Require a limit for the recent strategy and reject it elsewhere."""
|
|
58
|
+
if self.strategy is ContextStrategy.RECENT:
|
|
59
|
+
if self.message_limit is None or self.message_limit < 1:
|
|
60
|
+
raise ValueError(
|
|
61
|
+
"message_limit must be >= 1 when strategy='recent'"
|
|
62
|
+
)
|
|
63
|
+
elif self.message_limit is not None:
|
|
64
|
+
raise ValueError("message_limit is only valid when strategy='recent'")
|
|
65
|
+
return self
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
# A callable selector is the escape hatch for fully custom curation.
|
|
69
|
+
ContextPolicyInput = Union[
|
|
70
|
+
AgentToolContextPolicy, Callable[[AgentContext], List[Message]]
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
@runtime_checkable
|
|
75
|
+
class AgentToolCompatible(Protocol):
|
|
76
|
+
name: str
|
|
77
|
+
description: str
|
|
78
|
+
|
|
79
|
+
async def run(
|
|
80
|
+
self,
|
|
81
|
+
task: Optional[Union[str, UserMessage, List[Message]]] = None,
|
|
82
|
+
context: Optional[AgentContext] = None,
|
|
83
|
+
cancellation_token: Optional[CancellationToken] = None,
|
|
84
|
+
) -> AgentResponse: ...
|
|
85
|
+
|
|
86
|
+
def run_stream(
|
|
87
|
+
self,
|
|
88
|
+
task: Optional[Union[str, UserMessage, List[Message]]] = None,
|
|
89
|
+
context: Optional[AgentContext] = None,
|
|
90
|
+
cancellation_token: Optional[CancellationToken] = None,
|
|
91
|
+
verbose: bool = False,
|
|
92
|
+
stream_tokens: bool = False,
|
|
93
|
+
) -> AsyncGenerator[
|
|
94
|
+
Union[Message, AgentEvent, AgentResponse, ChatCompletionChunk], None
|
|
95
|
+
]: ...
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class AgentAsTool(BaseTool):
|
|
99
|
+
"""Expose any BaseAgent as a BaseTool."""
|
|
100
|
+
|
|
101
|
+
def __init__(
|
|
102
|
+
self,
|
|
103
|
+
agent: AgentToolCompatible,
|
|
104
|
+
task_parameter_name: str = "task",
|
|
105
|
+
result_strategy: ResultStrategy = "last",
|
|
106
|
+
context_policy: Optional[ContextPolicyInput] = None,
|
|
107
|
+
) -> None:
|
|
108
|
+
if not isinstance(agent, AgentToolCompatible):
|
|
109
|
+
raise TypeError("agent must implement the agent tool interface")
|
|
110
|
+
|
|
111
|
+
super().__init__(name=agent.name, description=agent.description)
|
|
112
|
+
|
|
113
|
+
self.agent = agent
|
|
114
|
+
self.task_parameter_name = task_parameter_name
|
|
115
|
+
self.result_strategy = result_strategy
|
|
116
|
+
if context_policy is None:
|
|
117
|
+
context_policy = AgentToolContextPolicy()
|
|
118
|
+
if not callable(context_policy) and not isinstance(
|
|
119
|
+
context_policy, AgentToolContextPolicy
|
|
120
|
+
):
|
|
121
|
+
raise TypeError(
|
|
122
|
+
"context_policy must be an AgentToolContextPolicy or callable"
|
|
123
|
+
)
|
|
124
|
+
self.context_policy = context_policy
|
|
125
|
+
self._validate_result_strategy()
|
|
126
|
+
|
|
127
|
+
def _validate_result_strategy(self) -> None:
|
|
128
|
+
if callable(self.result_strategy):
|
|
129
|
+
return
|
|
130
|
+
|
|
131
|
+
if not isinstance(self.result_strategy, str):
|
|
132
|
+
raise TypeError("result_strategy must be a string or callable")
|
|
133
|
+
|
|
134
|
+
if self.result_strategy in {"last", "all"}:
|
|
135
|
+
return
|
|
136
|
+
|
|
137
|
+
if self.result_strategy.startswith("last:"):
|
|
138
|
+
try:
|
|
139
|
+
count = int(self.result_strategy.split(":", maxsplit=1)[1])
|
|
140
|
+
except ValueError as exc:
|
|
141
|
+
raise ValueError(
|
|
142
|
+
"Invalid result_strategy format, expected 'last:N'",
|
|
143
|
+
) from exc
|
|
144
|
+
|
|
145
|
+
if count <= 0:
|
|
146
|
+
raise ValueError("N must be positive in 'last:N' strategy")
|
|
147
|
+
return
|
|
148
|
+
|
|
149
|
+
raise ValueError(
|
|
150
|
+
"Unknown result_strategy. Use 'last', 'last:N', 'all', or callable.",
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
def _select_inherited_messages(
|
|
154
|
+
self, agent_context: AgentContext
|
|
155
|
+
) -> List[Message]:
|
|
156
|
+
"""Pick which caller messages to seed into the sub-agent.
|
|
157
|
+
|
|
158
|
+
Built-in strategies operate on the caller's resolved history (its live
|
|
159
|
+
in-flight delegation call excluded) and always yield a valid sequence:
|
|
160
|
+
``identity`` carries none, ``last_task`` the most recent user task,
|
|
161
|
+
``recent`` the last ``message_limit`` messages (whole tool exchanges, via
|
|
162
|
+
the shared :func:`select_recent_messages`), and ``full`` the entire
|
|
163
|
+
history. A callable returns a fully custom selection and owns its own
|
|
164
|
+
validity.
|
|
165
|
+
"""
|
|
166
|
+
policy = self.context_policy
|
|
167
|
+
if not isinstance(policy, AgentToolContextPolicy):
|
|
168
|
+
return list(policy(agent_context))
|
|
169
|
+
|
|
170
|
+
strategy = policy.strategy
|
|
171
|
+
if strategy is ContextStrategy.IDENTITY:
|
|
172
|
+
return []
|
|
173
|
+
|
|
174
|
+
history = self._resolved_history(agent_context.messages)
|
|
175
|
+
|
|
176
|
+
if strategy is ContextStrategy.LAST_TASK:
|
|
177
|
+
for message in reversed(history):
|
|
178
|
+
if isinstance(message, UserMessage):
|
|
179
|
+
return [message]
|
|
180
|
+
return []
|
|
181
|
+
|
|
182
|
+
if strategy is ContextStrategy.FULL:
|
|
183
|
+
return history
|
|
184
|
+
|
|
185
|
+
# RECENT — the policy guarantees message_limit >= 1.
|
|
186
|
+
assert policy.message_limit is not None
|
|
187
|
+
return select_recent_messages(history, policy.message_limit)
|
|
188
|
+
|
|
189
|
+
@staticmethod
|
|
190
|
+
def _resolved_history(messages: List[Message]) -> List[Message]:
|
|
191
|
+
"""Return the caller's history with its in-flight delegation call removed.
|
|
192
|
+
|
|
193
|
+
``AgentAsTool`` runs inside the caller's live working context, whose last
|
|
194
|
+
assistant message is the tool call that triggered this sub-agent — its
|
|
195
|
+
result does not exist yet. That trailing exchange is pending (it would
|
|
196
|
+
fail grouping), so exclude it before windowing; earlier turns are already
|
|
197
|
+
complete.
|
|
198
|
+
"""
|
|
199
|
+
resolved = list(messages)
|
|
200
|
+
trailing_results: List[Message] = []
|
|
201
|
+
while resolved and isinstance(resolved[-1], ToolMessage):
|
|
202
|
+
trailing_results.append(resolved.pop())
|
|
203
|
+
|
|
204
|
+
if (
|
|
205
|
+
resolved
|
|
206
|
+
and isinstance(resolved[-1], AssistantMessage)
|
|
207
|
+
and resolved[-1].tool_calls
|
|
208
|
+
):
|
|
209
|
+
answered = {m.tool_call_id for m in trailing_results}
|
|
210
|
+
if not all(tc.call_id in answered for tc in resolved[-1].tool_calls):
|
|
211
|
+
resolved.pop() # unresolved in-flight delegation batch
|
|
212
|
+
return resolved
|
|
213
|
+
|
|
214
|
+
# Tail is a complete exchange (or no tool exchange) — keep everything.
|
|
215
|
+
return list(messages)
|
|
216
|
+
|
|
217
|
+
def _extract_result(self, messages: List[Message]) -> str:
|
|
218
|
+
if not messages:
|
|
219
|
+
return ""
|
|
220
|
+
|
|
221
|
+
if callable(self.result_strategy):
|
|
222
|
+
return self.result_strategy(messages)
|
|
223
|
+
|
|
224
|
+
if self.result_strategy == "last":
|
|
225
|
+
return messages[-1].content
|
|
226
|
+
|
|
227
|
+
if self.result_strategy == "all":
|
|
228
|
+
return "\n".join(message.content for message in messages)
|
|
229
|
+
|
|
230
|
+
count = int(self.result_strategy.split(":", maxsplit=1)[1])
|
|
231
|
+
selected = messages[-count:]
|
|
232
|
+
return "\n".join(message.content for message in selected)
|
|
233
|
+
|
|
234
|
+
@property
|
|
235
|
+
def parameters(self) -> Dict[str, Any]:
|
|
236
|
+
return {
|
|
237
|
+
"type": "object",
|
|
238
|
+
"properties": {
|
|
239
|
+
self.task_parameter_name: {
|
|
240
|
+
"type": "string",
|
|
241
|
+
"description": f"Task for {self.agent.name} to complete",
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
"required": [self.task_parameter_name],
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
def accepts_context(self) -> bool:
|
|
248
|
+
"""Opt in to receiving the calling agent's context for identity reuse."""
|
|
249
|
+
return True
|
|
250
|
+
|
|
251
|
+
def _resolve_context(
|
|
252
|
+
self,
|
|
253
|
+
context: Optional[AgentContext],
|
|
254
|
+
agent_context: Optional[AgentContext],
|
|
255
|
+
) -> Optional[AgentContext]:
|
|
256
|
+
"""Resolve the context the sub-agent should run with.
|
|
257
|
+
|
|
258
|
+
An explicit ``context`` (passed by a direct caller) is used as-is. When
|
|
259
|
+
the agent loop forwards its ``agent_context`` instead, the sub-agent runs
|
|
260
|
+
in a fresh, isolated context that inherits identity — ``session_id`` and
|
|
261
|
+
``user_id`` — so its usage records aggregate under the parent
|
|
262
|
+
session/user without polluting the parent conversation. The sub-run keeps
|
|
263
|
+
its own ``run_id`` because it is a distinct agent invocation.
|
|
264
|
+
|
|
265
|
+
``context_policy`` optionally seeds a slice of the parent conversation
|
|
266
|
+
into that fresh context (default ``identity`` seeds none), letting the
|
|
267
|
+
sub-agent see recent turns without copying the full history.
|
|
268
|
+
"""
|
|
269
|
+
if context is not None:
|
|
270
|
+
return context
|
|
271
|
+
if agent_context is None:
|
|
272
|
+
return None
|
|
273
|
+
|
|
274
|
+
child = AgentContext(
|
|
275
|
+
session_id=agent_context.session_id,
|
|
276
|
+
user_id=agent_context.user_id,
|
|
277
|
+
)
|
|
278
|
+
for message in self._select_inherited_messages(agent_context):
|
|
279
|
+
child.add_message(message)
|
|
280
|
+
return child
|
|
281
|
+
|
|
282
|
+
async def execute(
|
|
283
|
+
self,
|
|
284
|
+
parameters: Dict[str, Any],
|
|
285
|
+
context: Optional[AgentContext] = None,
|
|
286
|
+
agent_context: Optional[AgentContext] = None,
|
|
287
|
+
) -> ToolResult:
|
|
288
|
+
task_str = parameters.get(self.task_parameter_name, "")
|
|
289
|
+
task = UserMessage(content=task_str, source="user")
|
|
290
|
+
run_context = self._resolve_context(context, agent_context)
|
|
291
|
+
|
|
292
|
+
try:
|
|
293
|
+
response = await self.agent.run(task=task, context=run_context)
|
|
294
|
+
final_content = self._extract_result(response.messages)
|
|
295
|
+
return ToolResult(
|
|
296
|
+
success=True,
|
|
297
|
+
result=final_content,
|
|
298
|
+
metadata={
|
|
299
|
+
"agent_name": self.agent.name,
|
|
300
|
+
"message_count": len(response.messages),
|
|
301
|
+
"usage": response.usage.model_dump() if response.usage else None,
|
|
302
|
+
"finish_reason": response.finish_reason,
|
|
303
|
+
},
|
|
304
|
+
)
|
|
305
|
+
except Exception as exc:
|
|
306
|
+
return ToolResult(
|
|
307
|
+
success=False,
|
|
308
|
+
result="",
|
|
309
|
+
error=f"Agent execution failed: {exc}",
|
|
310
|
+
metadata={"agent_name": self.agent.name},
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
async def execute_stream(
|
|
314
|
+
self,
|
|
315
|
+
parameters: Dict[str, Any],
|
|
316
|
+
context: Optional[AgentContext] = None,
|
|
317
|
+
cancellation_token: Optional[CancellationToken] = None,
|
|
318
|
+
agent_context: Optional[AgentContext] = None,
|
|
319
|
+
) -> AsyncGenerator[Union[Message, AgentEvent, ToolResult], None]:
|
|
320
|
+
task_str = parameters.get(self.task_parameter_name, "")
|
|
321
|
+
task = UserMessage(content=task_str, source="user")
|
|
322
|
+
run_context = self._resolve_context(context, agent_context)
|
|
323
|
+
final_response: Optional[AgentResponse] = None
|
|
324
|
+
|
|
325
|
+
try:
|
|
326
|
+
async for item in self.agent.run_stream(
|
|
327
|
+
task=task,
|
|
328
|
+
context=run_context,
|
|
329
|
+
cancellation_token=cancellation_token,
|
|
330
|
+
verbose=True,
|
|
331
|
+
stream_tokens=False,
|
|
332
|
+
):
|
|
333
|
+
if isinstance(item, AgentResponse):
|
|
334
|
+
final_response = item
|
|
335
|
+
else:
|
|
336
|
+
yield item
|
|
337
|
+
|
|
338
|
+
result_content = ""
|
|
339
|
+
metadata: Dict[str, Any] = {"agent_name": self.agent.name}
|
|
340
|
+
|
|
341
|
+
if final_response is not None:
|
|
342
|
+
result_content = self._extract_result(final_response.messages)
|
|
343
|
+
metadata["message_count"] = len(final_response.messages)
|
|
344
|
+
metadata["usage"] = (
|
|
345
|
+
final_response.usage.model_dump() if final_response.usage else None
|
|
346
|
+
)
|
|
347
|
+
metadata["finish_reason"] = final_response.finish_reason
|
|
348
|
+
|
|
349
|
+
yield ToolResult(success=True, result=result_content, metadata=metadata)
|
|
350
|
+
except Exception as exc:
|
|
351
|
+
yield ToolResult(
|
|
352
|
+
success=False,
|
|
353
|
+
result="",
|
|
354
|
+
error=f"Agent execution failed: {exc}",
|
|
355
|
+
metadata={"agent_name": self.agent.name},
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
__all__ = [
|
|
360
|
+
"AgentAsTool",
|
|
361
|
+
"ResultStrategy",
|
|
362
|
+
"ContextStrategy",
|
|
363
|
+
"AgentToolContextPolicy",
|
|
364
|
+
"ContextPolicyInput",
|
|
365
|
+
"AgentToolCompatible",
|
|
366
|
+
]
|
|
@@ -6,7 +6,10 @@ import json
|
|
|
6
6
|
import warnings
|
|
7
7
|
from abc import ABC, abstractmethod
|
|
8
8
|
from collections.abc import AsyncGenerator, Callable
|
|
9
|
-
from typing import Any, Dict, List, Optional, Type, Union
|
|
9
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Type, Union
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from .agent_as_tool import ContextPolicyInput
|
|
10
13
|
|
|
11
14
|
from pydantic import BaseModel
|
|
12
15
|
|
|
@@ -309,14 +312,24 @@ class BaseAgent(ABC):
|
|
|
309
312
|
self,
|
|
310
313
|
task_parameter_name: str = "task",
|
|
311
314
|
result_strategy: Union[str, Callable[[List[Message]], str]] = "last",
|
|
315
|
+
context_policy: Optional["ContextPolicyInput"] = None,
|
|
312
316
|
) -> BaseTool:
|
|
313
|
-
"""Wrap this agent as a tool for hierarchical composition.
|
|
317
|
+
"""Wrap this agent as a tool for hierarchical composition.
|
|
318
|
+
|
|
319
|
+
``context_policy`` controls how much of the calling agent's conversation
|
|
320
|
+
the sub-agent inherits: an :class:`AgentToolContextPolicy` (default
|
|
321
|
+
``identity`` seeds no messages; ``last_task``, ``recent`` with
|
|
322
|
+
``message_limit``, and ``full`` seed more) or a callable for a custom
|
|
323
|
+
selection. ``session_id`` and ``user_id`` are always inherited so
|
|
324
|
+
sub-agent usage aggregates under the parent session/user.
|
|
325
|
+
"""
|
|
314
326
|
from .agent_as_tool import AgentAsTool
|
|
315
327
|
|
|
316
328
|
return AgentAsTool(
|
|
317
329
|
agent=self,
|
|
318
330
|
task_parameter_name=task_parameter_name,
|
|
319
331
|
result_strategy=result_strategy,
|
|
332
|
+
context_policy=context_policy,
|
|
320
333
|
)
|
|
321
334
|
|
|
322
335
|
@abstractmethod
|
|
@@ -119,3 +119,27 @@ def group_messages(messages: list[Any]) -> list[MessageGroup]:
|
|
|
119
119
|
index += 1
|
|
120
120
|
|
|
121
121
|
return groups
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def select_recent_messages(messages: list[Any], message_limit: int) -> list[Any]:
|
|
125
|
+
"""Return the last *message_limit* messages without splitting a tool exchange.
|
|
126
|
+
|
|
127
|
+
Groups the conversation with :func:`group_messages` and keeps whole groups
|
|
128
|
+
from the newest end until at least *message_limit* messages are covered. The
|
|
129
|
+
limit is a floor rather than an exact count: a tool exchange is kept whole
|
|
130
|
+
rather than cut between a tool-calling ``AssistantMessage`` and its results,
|
|
131
|
+
which would otherwise leave an orphaned tool result (spec 0064).
|
|
132
|
+
|
|
133
|
+
*messages* must already be a valid sequence (no pending or orphaned tool
|
|
134
|
+
exchanges); see :func:`group_messages` for the raised errors otherwise.
|
|
135
|
+
"""
|
|
136
|
+
groups = group_messages(messages)
|
|
137
|
+
kept: list[MessageGroup] = []
|
|
138
|
+
count = 0
|
|
139
|
+
for group in reversed(groups):
|
|
140
|
+
kept.append(group)
|
|
141
|
+
count += len(group.messages)
|
|
142
|
+
if count >= message_limit:
|
|
143
|
+
break
|
|
144
|
+
kept.reverse()
|
|
145
|
+
return [message for group in kept for message in group.messages]
|
|
@@ -94,7 +94,15 @@ class AnthropicConversionMixin:
|
|
|
94
94
|
|
|
95
95
|
system = self._extract_system(messages)
|
|
96
96
|
if system is not None:
|
|
97
|
-
|
|
97
|
+
# A single `cache_control` breakpoint on the system block marks it
|
|
98
|
+
# as a cache candidate for Anthropic's Messages API (no beta header
|
|
99
|
+
# needed as of anthropic==1.13.0's non-beta `TextBlockParam`). This
|
|
100
|
+
# is a no-op below the per-model minimum cacheable size and strictly
|
|
101
|
+
# beneficial above it, so there's no config flag for it -- shared
|
|
102
|
+
# here means both direct Anthropic and Bedrock transports get it.
|
|
103
|
+
api_kwargs["system"] = [
|
|
104
|
+
{"type": "text", "text": system, "cache_control": {"type": "ephemeral"}}
|
|
105
|
+
]
|
|
98
106
|
|
|
99
107
|
api_messages = self._convert_messages_to_api_format(messages)
|
|
100
108
|
api_tools = self._convert_tools(tools)
|
|
@@ -182,7 +190,15 @@ class AnthropicConversionMixin:
|
|
|
182
190
|
|
|
183
191
|
system = self._extract_system(messages)
|
|
184
192
|
if system is not None:
|
|
185
|
-
|
|
193
|
+
# A single `cache_control` breakpoint on the system block marks it
|
|
194
|
+
# as a cache candidate for Anthropic's Messages API (no beta header
|
|
195
|
+
# needed as of anthropic==1.13.0's non-beta `TextBlockParam`). This
|
|
196
|
+
# is a no-op below the per-model minimum cacheable size and strictly
|
|
197
|
+
# beneficial above it, so there's no config flag for it -- shared
|
|
198
|
+
# here means both direct Anthropic and Bedrock transports get it.
|
|
199
|
+
api_kwargs["system"] = [
|
|
200
|
+
{"type": "text", "text": system, "cache_control": {"type": "ephemeral"}}
|
|
201
|
+
]
|
|
186
202
|
|
|
187
203
|
api_messages = self._convert_messages_to_api_format(messages)
|
|
188
204
|
api_tools = self._convert_tools(tools)
|
|
@@ -456,6 +456,13 @@ class PricingRegistry:
|
|
|
456
456
|
"claude-opus-4-5": ModelPricing(input_per_1m=5.0, output_per_1m=25.0),
|
|
457
457
|
"claude-opus-4": ModelPricing(input_per_1m=15.0, output_per_1m=75.0),
|
|
458
458
|
"claude-sonnet-5": ModelPricing(input_per_1m=2.0, output_per_1m=10.0),
|
|
459
|
+
# claude-sonnet-4-6/-4-5 currently price identically to claude-sonnet-4 ($3/$15,
|
|
460
|
+
# verified against platform.claude.com/docs/en/about-claude/pricing), so the
|
|
461
|
+
# prefix fallback already resolved them correctly -- listed explicitly anyway so a
|
|
462
|
+
# future divergent repricing (as happened for claude-opus-4-5 vs. claude-opus-4)
|
|
463
|
+
# doesn't silently fall through to the wrong rate.
|
|
464
|
+
"claude-sonnet-4-6": ModelPricing(input_per_1m=3.0, output_per_1m=15.0),
|
|
465
|
+
"claude-sonnet-4-5": ModelPricing(input_per_1m=3.0, output_per_1m=15.0),
|
|
459
466
|
"claude-sonnet-4": ModelPricing(input_per_1m=3.0, output_per_1m=15.0),
|
|
460
467
|
"claude-haiku-5-5": ModelPricing(
|
|
461
468
|
input_per_1m=0.10,
|
|
@@ -16,7 +16,7 @@ from agentbyte.agents.types import AgentErrorDetail, AgentResponse, Usage
|
|
|
16
16
|
from agentbyte.execution_trace import SpanKind, 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
|
|
19
|
+
from agentbyte.compaction.grouping import select_recent_messages
|
|
20
20
|
from agentbyte.context import AgentContext
|
|
21
21
|
from agentbyte.messages import AssistantMessage, Message, UserMessage
|
|
22
22
|
from agentbyte.agents.types import BaseEvent
|
|
@@ -1323,25 +1323,11 @@ class BaseOrchestrator(ABC):
|
|
|
1323
1323
|
def _select_recent_messages(self, message_limit: int) -> list[Message]:
|
|
1324
1324
|
"""Last `message_limit` messages, never splitting a tool-call exchange.
|
|
1325
1325
|
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
orphaned tool result (spec 0064). ``group_messages`` (spec 0049) already
|
|
1330
|
-
groups each exchange into one indivisible unit; keep whole groups from the
|
|
1331
|
-
newest end until at least ``message_limit`` messages are covered, so the
|
|
1332
|
-
limit becomes a floor rather than an exact count when a tool exchange
|
|
1333
|
-
would otherwise be split.
|
|
1326
|
+
Delegates to :func:`agentbyte.compaction.grouping.select_recent_messages`
|
|
1327
|
+
so orchestrators and ``AgentAsTool`` share one recent-window
|
|
1328
|
+
implementation (floor semantics, whole tool exchanges; spec 0064).
|
|
1334
1329
|
"""
|
|
1335
|
-
|
|
1336
|
-
kept: list[MessageGroup] = []
|
|
1337
|
-
count = 0
|
|
1338
|
-
for group in reversed(groups):
|
|
1339
|
-
kept.append(group)
|
|
1340
|
-
count += len(group.messages)
|
|
1341
|
-
if count >= message_limit:
|
|
1342
|
-
break
|
|
1343
|
-
kept.reverse()
|
|
1344
|
-
return [message for group in kept for message in group.messages]
|
|
1330
|
+
return select_recent_messages(self.shared_messages, message_limit)
|
|
1345
1331
|
|
|
1346
1332
|
def _build_agent_context_from_history(
|
|
1347
1333
|
self, agent: BaseAgent
|