agentbyte 0.38.0__tar.gz → 0.40.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.38.0 → agentbyte-0.40.0}/CHANGELOG.md +45 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/PKG-INFO +8 -2
- {agentbyte-0.38.0 → agentbyte-0.40.0}/README.md +2 -1
- {agentbyte-0.38.0 → agentbyte-0.40.0}/pyproject.toml +5 -1
- agentbyte-0.40.0/src/agentbyte/__about__.py +2 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/jobs.py +47 -8
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/server.py +20 -1
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_jobs.py +65 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_server.py +32 -1
- agentbyte-0.38.0/src/agentbyte/__about__.py +0 -2
- {agentbyte-0.38.0 → agentbyte-0.40.0}/.gitignore +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/LICENSE +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/_optional.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/embedding_agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/types.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/catalog.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/__main__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/eval_commands.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/loading.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/main.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/counters.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/errors.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/grouping.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/strategies.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/component.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context_providers/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context_providers/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context_providers/skills.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/importer.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/loader.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/publish.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/publish_config.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/publishers.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/s3.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/sources.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/sqlite.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/write_config.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/writers.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/decorator.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/keyword.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/local.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/process.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/tool.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/types.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/comparison.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/eval_dataset.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/conformance.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/errors.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/models.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/recorder.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/sql.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/sqlite.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/store.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/transitions.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/composite.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/llm.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/reference.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/validation.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/pairwise.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/report.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/runner.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/splitting.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/model.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/runtime.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/workflow.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/types.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/coordinator.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/suite.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/verdict.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/execution_trace/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/execution_trace/collector.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/execution_trace/models.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/auth.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/chat.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/embedding.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/pricing.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/logger.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/otel.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/sql_usage.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/usage_logger.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/config.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/gepa.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/mipro.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/pareto.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/reflective.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/spec.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/trace.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/ai.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/handoff.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/plan.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/policies.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/round_robin.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instruction_registry.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/streaming.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/resources.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/scripts.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/sources.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/validation.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/coding_tools.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/research_tools.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/types.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/eval_routes.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/execution.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/models.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/ui/assets/index-C-wj-OzO.js +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/ui/assets/index-DW8IDODJ.css +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/ui/index.html +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/errors.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/sqlite_checkpoint.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/visualizer.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_as_tool.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_context_providers.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_error_response.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_response_accessors.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_embedding_agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_tool_batch_resolution.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_tool_metadata.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/cli/test_loading.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/cli/test_registry_check.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/compaction/test_compaction.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/context_providers/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/context_providers/test_skill_tools.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/context_providers/test_skills_provider.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/fake_s3.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_dataset_exit.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_loader.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_multi_table.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_publish.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_sqlite_db.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_dataset.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_history.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_history_backends.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_workbench.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_execution_trajectories.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_multi_turn.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_pairwise.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_score_integrity.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_splitting.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_types_and_judges.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/examples/test_compaction_webapp.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_pricing.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_retryable_error_substrings.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_context_compaction.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_sql_usage.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_usage_logger.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_base_integration.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_config.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_gepa.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_mipro.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_orchestrator_optim.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_pareto.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_reflective.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_score_integrity.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_spec.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_trace.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_base_orchestrator.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_round_robin.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_instruction_registry.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_streaming.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/test_base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/test_resources.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/test_scripts.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/test_sources.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_base.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_external.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_source.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_context.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_logger.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_messages.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_optional_extras.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_package_api.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_session_store.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_types.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_vanilla_chunker.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/tools/test_coding_tools.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/tools/test_research_tools.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/__init__.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/helpers.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_eval_routes.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_workflow_streaming.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/recovery_worker.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_agent_step_imports.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_reliability.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -6,6 +6,51 @@ The format follows Keep a Changelog principles and semantic versioning.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.40.0] - 2026-10-02
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Evaluation job backend now logs its lifecycle through the `agentbyte.eval.workbench.jobs`
|
|
14
|
+
logger: INFO on manager start, run admitted/started/finished/cancelled, reused idempotency key
|
|
15
|
+
and shutdown; WARNING on a full queue and on recovering interrupted runs at start-up; ERROR
|
|
16
|
+
(with traceback) on a failed run. Previously only failures were logged.
|
|
17
|
+
- New `gunicorn` optional extra (`pip install "agentbyte[gunicorn]"`, composed from `webui`) for
|
|
18
|
+
single-worker production serving (`gunicorn -k uvicorn.workers.UvicornWorker -w 1`); added to
|
|
19
|
+
the `all` extra.
|
|
20
|
+
- Self-contained, uv-based deployment example `examples/webui/eval_app/` (`app.py`,
|
|
21
|
+
`pyproject.toml`, `gunicorn.conf.py`, `Dockerfile`, `docker-compose.yml`, `README.md`) that
|
|
22
|
+
serves one evaluation suite (Evaluations only) and builds as an OCI image under Docker or Podman.
|
|
23
|
+
- Deployment design-guide topic `docs/design-guide/04-web_topics/03_topic_deployment.md`
|
|
24
|
+
documenting the single-writer / one-worker model, the correct container shape (one worker, DB on
|
|
25
|
+
a volume, graceful SIGTERM) and the Postgres + lease scaling path.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- `examples/webui/eval_webui.py` now loads `.env` defensively, so the suite imports as a catalog
|
|
30
|
+
(and runs in a container) even when `python-dotenv` is not installed.
|
|
31
|
+
|
|
32
|
+
## [0.39.0] - 2026-10-02
|
|
33
|
+
|
|
34
|
+
### Added
|
|
35
|
+
|
|
36
|
+
- WebUI `serve()` and `WebUIServer` now take a `playground: bool = True` flag, so a
|
|
37
|
+
single entrypoint selects what one server exposes:
|
|
38
|
+
- `serve(entities=[agent])` — Playground only.
|
|
39
|
+
- `serve(entities=[agent], eval_registry=r, eval_history=h)` — Playground + Evaluations.
|
|
40
|
+
- `serve(eval_registry=r, eval_history=h, playground=False)` — Evaluations only (no
|
|
41
|
+
Playground tab). The flag is threaded through to `AgentbyteWebUIServer(playground=...)`,
|
|
42
|
+
which already gated the tabs; `agentbyte eval ui` uses the same eval-only mode.
|
|
43
|
+
- `playground=False` requires an eval registry + history and rejects `entities`/
|
|
44
|
+
`entities_dir` with a `ValueError` (there is no Playground to register them into).
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
|
|
48
|
+
- `examples/webui/eval_webui.py` now serves Evaluations only via
|
|
49
|
+
`serve(..., playground=False)` and defaults its history to `acme-eval.sqlite`.
|
|
50
|
+
- Documented the Playground/Evaluations/both serving matrix (Python and CLI) in
|
|
51
|
+
`docs/guides/evaluation-end-to-end.md`, the Playground design topic, and notebook
|
|
52
|
+
`06-eval-end-to-end`.
|
|
53
|
+
|
|
9
54
|
## [0.38.0] - 2026-10-02
|
|
10
55
|
|
|
11
56
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agentbyte
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.40.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
|
|
@@ -20,6 +20,7 @@ Requires-Dist: beautifulsoup4>=4.12; extra == 'all'
|
|
|
20
20
|
Requires-Dist: fastapi>=0.135.2; extra == 'all'
|
|
21
21
|
Requires-Dist: gepa>=0.1; extra == 'all'
|
|
22
22
|
Requires-Dist: graphviz>=0.21; extra == 'all'
|
|
23
|
+
Requires-Dist: gunicorn>=23.0.0; extra == 'all'
|
|
23
24
|
Requires-Dist: html2text>=2024.2; extra == 'all'
|
|
24
25
|
Requires-Dist: openai>=1.107.1; extra == 'all'
|
|
25
26
|
Requires-Dist: opentelemetry-api>=1.39.1; extra == 'all'
|
|
@@ -35,6 +36,10 @@ Requires-Dist: aioboto3>=15.5.0; extra == 'aws'
|
|
|
35
36
|
Provides-Extra: azureopenai
|
|
36
37
|
Requires-Dist: azure-identity>=1.25.1; extra == 'azureopenai'
|
|
37
38
|
Requires-Dist: openai>=1.107.1; extra == 'azureopenai'
|
|
39
|
+
Provides-Extra: gunicorn
|
|
40
|
+
Requires-Dist: fastapi>=0.135.2; extra == 'gunicorn'
|
|
41
|
+
Requires-Dist: gunicorn>=23.0.0; extra == 'gunicorn'
|
|
42
|
+
Requires-Dist: uvicorn[standard]>=0.44.0; extra == 'gunicorn'
|
|
38
43
|
Provides-Extra: openai
|
|
39
44
|
Requires-Dist: openai>=1.107.1; extra == 'openai'
|
|
40
45
|
Provides-Extra: optim
|
|
@@ -72,7 +77,7 @@ Description-Content-Type: text/markdown
|
|
|
72
77
|
|
|
73
78
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
74
79
|
|
|
75
|
-
Current release: **0.
|
|
80
|
+
Current release: **0.40.0**
|
|
76
81
|
|
|
77
82
|
## Building an Agent
|
|
78
83
|
|
|
@@ -305,6 +310,7 @@ uv add "agentbyte[openai,sqlite]"
|
|
|
305
310
|
| `aws` | `aioboto3` | S3 dataset sources, writers and publishers |
|
|
306
311
|
| `otel` | OpenTelemetry API, SDK, OTLP exporter | OpenTelemetry tracing and metrics |
|
|
307
312
|
| `webui` | `fastapi`, `uvicorn` | `agentbyte webui` |
|
|
313
|
+
| `gunicorn` | `webui` + `gunicorn` | Production single-worker serving (`gunicorn -k uvicorn.workers.UvicornWorker -w 1`) |
|
|
308
314
|
| `sqlite` | `aiosqlite` | SQLite datasets, workflow checkpoints, evaluation history |
|
|
309
315
|
| `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, `SqlEvalRunStore` |
|
|
310
316
|
| `sql` | `sqlite` + `postgres` | Both SQL backends |
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
4
4
|
|
|
5
|
-
Current release: **0.
|
|
5
|
+
Current release: **0.40.0**
|
|
6
6
|
|
|
7
7
|
## Building an Agent
|
|
8
8
|
|
|
@@ -235,6 +235,7 @@ uv add "agentbyte[openai,sqlite]"
|
|
|
235
235
|
| `aws` | `aioboto3` | S3 dataset sources, writers and publishers |
|
|
236
236
|
| `otel` | OpenTelemetry API, SDK, OTLP exporter | OpenTelemetry tracing and metrics |
|
|
237
237
|
| `webui` | `fastapi`, `uvicorn` | `agentbyte webui` |
|
|
238
|
+
| `gunicorn` | `webui` + `gunicorn` | Production single-worker serving (`gunicorn -k uvicorn.workers.UvicornWorker -w 1`) |
|
|
238
239
|
| `sqlite` | `aiosqlite` | SQLite datasets, workflow checkpoints, evaluation history |
|
|
239
240
|
| `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, `SqlEvalRunStore` |
|
|
240
241
|
| `sql` | `sqlite` + `postgres` | Both SQL backends |
|
|
@@ -36,6 +36,10 @@ webui = [
|
|
|
36
36
|
"fastapi>=0.135.2",
|
|
37
37
|
"uvicorn[standard]>=0.44.0",
|
|
38
38
|
]
|
|
39
|
+
gunicorn = [
|
|
40
|
+
"agentbyte[webui]",
|
|
41
|
+
"gunicorn>=23.0.0",
|
|
42
|
+
]
|
|
39
43
|
sqlite = [
|
|
40
44
|
"aiosqlite>=0.22.1",
|
|
41
45
|
]
|
|
@@ -63,7 +67,7 @@ research = [
|
|
|
63
67
|
"youtube-transcript-api>=0.6",
|
|
64
68
|
]
|
|
65
69
|
all = [
|
|
66
|
-
"agentbyte[openai,azureopenai,aws,otel,webui,sql,tiktoken,optim,viz,research]",
|
|
70
|
+
"agentbyte[openai,azureopenai,aws,otel,webui,gunicorn,sql,tiktoken,optim,viz,research]",
|
|
67
71
|
]
|
|
68
72
|
|
|
69
73
|
|
|
@@ -14,7 +14,7 @@ from collections.abc import AsyncIterator
|
|
|
14
14
|
from dataclasses import dataclass, field
|
|
15
15
|
|
|
16
16
|
from agentbyte.cancellation_token import CancellationToken
|
|
17
|
-
from agentbyte.eval.history import CaptureMode, EvalRunRecord
|
|
17
|
+
from agentbyte.eval.history import CaptureMode, EvalQueueFullError, EvalRunRecord
|
|
18
18
|
from agentbyte.eval.history.models import ACTIVE_RUN_STATUSES
|
|
19
19
|
from agentbyte.eval.history.store import _uninterrupted
|
|
20
20
|
|
|
@@ -112,6 +112,17 @@ class EvalJobManager:
|
|
|
112
112
|
recovered = await self.coordinator.store.recover_interrupted()
|
|
113
113
|
self._workers = [asyncio.create_task(self._work()) for _ in range(self.max_active)]
|
|
114
114
|
self._accepting = True
|
|
115
|
+
if recovered:
|
|
116
|
+
logger.warning(
|
|
117
|
+
"Recovered %d interrupted evaluation run(s) left active by a previous process: %s",
|
|
118
|
+
len(recovered),
|
|
119
|
+
", ".join(run.id for run in recovered),
|
|
120
|
+
)
|
|
121
|
+
logger.info(
|
|
122
|
+
"Evaluation job manager started (max_active=%d, max_queued=%d)",
|
|
123
|
+
self.max_active,
|
|
124
|
+
self.max_queued,
|
|
125
|
+
)
|
|
115
126
|
return recovered
|
|
116
127
|
|
|
117
128
|
async def close(self) -> None:
|
|
@@ -119,6 +130,11 @@ class EvalJobManager:
|
|
|
119
130
|
self._accepting = False
|
|
120
131
|
self._closed = True
|
|
121
132
|
jobs = list(self._jobs.values())
|
|
133
|
+
if jobs:
|
|
134
|
+
logger.info(
|
|
135
|
+
"Evaluation job manager shutting down; cancelling %d active/queued run(s)",
|
|
136
|
+
len(jobs),
|
|
137
|
+
)
|
|
122
138
|
for job in jobs:
|
|
123
139
|
job.cancel_requested = True
|
|
124
140
|
job.token.cancel()
|
|
@@ -167,13 +183,26 @@ class EvalJobManager:
|
|
|
167
183
|
if not idempotency_key:
|
|
168
184
|
raise ValueError("idempotency_key must be a non-empty string")
|
|
169
185
|
self._check_accepting()
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
186
|
+
try:
|
|
187
|
+
admitted = await self.coordinator.admit(
|
|
188
|
+
suite_name,
|
|
189
|
+
capture=capture,
|
|
190
|
+
idempotency_key=idempotency_key,
|
|
191
|
+
max_active_runs=self.capacity,
|
|
192
|
+
)
|
|
193
|
+
except EvalQueueFullError:
|
|
194
|
+
logger.warning(
|
|
195
|
+
"Evaluation queue is full (capacity=%d); rejected suite %r",
|
|
196
|
+
self.capacity,
|
|
197
|
+
suite_name,
|
|
198
|
+
)
|
|
199
|
+
raise
|
|
176
200
|
if not admitted.created:
|
|
201
|
+
logger.info(
|
|
202
|
+
"Reused evaluation run %s for suite %r (idempotency key matched an earlier submission)",
|
|
203
|
+
admitted.run.id,
|
|
204
|
+
suite_name,
|
|
205
|
+
)
|
|
177
206
|
return SubmittedRun(run=admitted.run, created=False)
|
|
178
207
|
job = _Job(admitted)
|
|
179
208
|
if not self._accepting:
|
|
@@ -183,6 +212,12 @@ class EvalJobManager:
|
|
|
183
212
|
self._jobs[job.run_id] = job
|
|
184
213
|
self._queue.put_nowait(job.run_id)
|
|
185
214
|
self._notify(job.run_id)
|
|
215
|
+
logger.info(
|
|
216
|
+
"Admitted evaluation run %s for suite %r (capture=%s); queued",
|
|
217
|
+
job.run_id,
|
|
218
|
+
suite_name,
|
|
219
|
+
admitted.run.capture,
|
|
220
|
+
)
|
|
186
221
|
return SubmittedRun(run=admitted.run, created=True)
|
|
187
222
|
|
|
188
223
|
async def cancel(self, run_id: str) -> EvalRunRecord:
|
|
@@ -194,6 +229,7 @@ class EvalJobManager:
|
|
|
194
229
|
job = self._jobs.get(run.id)
|
|
195
230
|
if job is None:
|
|
196
231
|
return run
|
|
232
|
+
logger.info("Cancelling evaluation run %s", run.id)
|
|
197
233
|
job.cancel_requested = True
|
|
198
234
|
job.token.cancel()
|
|
199
235
|
if job.task is not None:
|
|
@@ -271,6 +307,8 @@ class EvalJobManager:
|
|
|
271
307
|
await asyncio.wait([job.task])
|
|
272
308
|
|
|
273
309
|
async def _execute(self, job: _Job) -> None:
|
|
310
|
+
suite_name = job.admitted.suite.name
|
|
311
|
+
logger.info("Starting evaluation run %s for suite %r", job.run_id, suite_name)
|
|
274
312
|
try:
|
|
275
313
|
async for _ in self.coordinator.execute_stream(
|
|
276
314
|
job.admitted,
|
|
@@ -278,8 +316,9 @@ class EvalJobManager:
|
|
|
278
316
|
on_start=lambda run: self._notify(run.id),
|
|
279
317
|
):
|
|
280
318
|
self._notify(job.run_id)
|
|
319
|
+
logger.info("Evaluation run %s finished", job.run_id)
|
|
281
320
|
except asyncio.CancelledError:
|
|
282
|
-
|
|
321
|
+
logger.info("Evaluation run %s cancelled", job.run_id)
|
|
283
322
|
except Exception:
|
|
284
323
|
# The recorder has already closed the run as failed; keep the worker alive.
|
|
285
324
|
logger.exception("Evaluation run %s failed", job.run_id)
|
|
@@ -458,6 +458,7 @@ class WebUIServer:
|
|
|
458
458
|
eval_registry: EvalSuiteRegistry | None = None,
|
|
459
459
|
eval_store: EvalRunStore | None = None,
|
|
460
460
|
eval_history: str | Path | None = None,
|
|
461
|
+
playground: bool = True,
|
|
461
462
|
) -> None:
|
|
462
463
|
self._server = AgentbyteWebUIServer(
|
|
463
464
|
entities_dir=entities_dir,
|
|
@@ -467,6 +468,7 @@ class WebUIServer:
|
|
|
467
468
|
eval_registry=eval_registry,
|
|
468
469
|
eval_store=eval_store,
|
|
469
470
|
eval_history=eval_history,
|
|
471
|
+
playground=playground,
|
|
470
472
|
)
|
|
471
473
|
self.port = port
|
|
472
474
|
self.host = host
|
|
@@ -572,8 +574,24 @@ def serve(
|
|
|
572
574
|
session_store: SessionStore | None = None,
|
|
573
575
|
eval_registry: EvalSuiteRegistry | None = None,
|
|
574
576
|
eval_history: str | Path | None = None,
|
|
577
|
+
playground: bool = True,
|
|
575
578
|
) -> None:
|
|
576
|
-
"""Serve in-memory and/or discovered entities in the WebUI.
|
|
579
|
+
"""Serve in-memory and/or discovered entities in the WebUI.
|
|
580
|
+
|
|
581
|
+
One flag selects the mode:
|
|
582
|
+
|
|
583
|
+
- Playground only: ``serve(entities=[agent])``
|
|
584
|
+
- Playground + Evaluations: ``serve(entities=[agent], eval_registry=r, eval_history=h)``
|
|
585
|
+
- Evaluations only: ``serve(eval_registry=r, eval_history=h, playground=False)``
|
|
586
|
+
|
|
587
|
+
``playground=False`` serves the Evaluations pages only (no Playground tab); it needs an
|
|
588
|
+
``eval_registry`` with ``eval_history`` and rejects ``entities``/``entities_dir``, since
|
|
589
|
+
there is no Playground to register them into.
|
|
590
|
+
"""
|
|
591
|
+
if not playground and (entities or entities_dir is not None):
|
|
592
|
+
raise ValueError(
|
|
593
|
+
"playground=False serves evaluations only; do not pass entities or entities_dir"
|
|
594
|
+
)
|
|
577
595
|
server = WebUIServer(
|
|
578
596
|
entities_dir=entities_dir,
|
|
579
597
|
port=port,
|
|
@@ -581,6 +599,7 @@ def serve(
|
|
|
581
599
|
session_store=session_store,
|
|
582
600
|
eval_registry=eval_registry,
|
|
583
601
|
eval_history=eval_history,
|
|
602
|
+
playground=playground,
|
|
584
603
|
)
|
|
585
604
|
for index, entity in enumerate(entities or []):
|
|
586
605
|
entity_id = _infer_entity_id(entity, index)
|
|
@@ -4,6 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
6
|
import contextlib
|
|
7
|
+
import logging
|
|
7
8
|
|
|
8
9
|
import pytest
|
|
9
10
|
|
|
@@ -389,3 +390,67 @@ async def test_admitted_duplicate_cannot_be_executed_twice() -> None:
|
|
|
389
390
|
async for _ in coordinator.execute_stream(duplicate):
|
|
390
391
|
pass
|
|
391
392
|
|
|
393
|
+
|
|
394
|
+
# -- logging --------------------------------------------------------------------------
|
|
395
|
+
|
|
396
|
+
_LOGGER = "agentbyte.eval.workbench.jobs"
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
@pytest.mark.asyncio
|
|
400
|
+
async def test_run_lifecycle_is_logged_from_admission_to_finish(caplog) -> None:
|
|
401
|
+
with caplog.at_level(logging.INFO, logger=_LOGGER):
|
|
402
|
+
async with jobs(registry=smoke_registry) as manager:
|
|
403
|
+
submitted = await manager.submit("smoke", idempotency_key="k1")
|
|
404
|
+
await final_summary(manager, submitted.run.id)
|
|
405
|
+
messages = [record.getMessage() for record in caplog.records if record.name == _LOGGER]
|
|
406
|
+
joined = "\n".join(messages)
|
|
407
|
+
assert "Evaluation job manager started" in joined
|
|
408
|
+
assert f"Admitted evaluation run {submitted.run.id}" in joined
|
|
409
|
+
assert f"Starting evaluation run {submitted.run.id}" in joined
|
|
410
|
+
assert f"Evaluation run {submitted.run.id} finished" in joined
|
|
411
|
+
|
|
412
|
+
|
|
413
|
+
@pytest.mark.asyncio
|
|
414
|
+
async def test_reused_idempotency_key_is_logged(caplog) -> None:
|
|
415
|
+
with caplog.at_level(logging.INFO, logger=_LOGGER):
|
|
416
|
+
async with jobs() as manager:
|
|
417
|
+
first = await manager.submit("quick", idempotency_key="dup")
|
|
418
|
+
await final_summary(manager, first.run.id)
|
|
419
|
+
caplog.clear()
|
|
420
|
+
reused = await manager.submit("quick", idempotency_key="dup")
|
|
421
|
+
assert not reused.created
|
|
422
|
+
assert any(
|
|
423
|
+
f"Reused evaluation run {reused.run.id}" in record.getMessage()
|
|
424
|
+
for record in caplog.records
|
|
425
|
+
if record.name == _LOGGER
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
|
|
429
|
+
@pytest.mark.asyncio
|
|
430
|
+
async def test_full_queue_is_logged_as_a_warning(caplog) -> None:
|
|
431
|
+
with caplog.at_level(logging.WARNING, logger=_LOGGER):
|
|
432
|
+
async with jobs(max_active=1, max_queued=0) as manager:
|
|
433
|
+
await manager.submit("gated", idempotency_key="busy")
|
|
434
|
+
with pytest.raises(EvalQueueFullError):
|
|
435
|
+
await manager.submit("quick", idempotency_key="overflow")
|
|
436
|
+
GatedTarget.gate.set()
|
|
437
|
+
assert any(
|
|
438
|
+
record.levelno == logging.WARNING and "queue is full" in record.getMessage()
|
|
439
|
+
for record in caplog.records
|
|
440
|
+
if record.name == _LOGGER
|
|
441
|
+
)
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
@pytest.mark.asyncio
|
|
445
|
+
async def test_cancellation_is_logged(caplog) -> None:
|
|
446
|
+
with caplog.at_level(logging.INFO, logger=_LOGGER):
|
|
447
|
+
async with jobs() as manager:
|
|
448
|
+
submitted = await manager.submit("gated", idempotency_key="c")
|
|
449
|
+
await wait_until(lambda: _is(manager, submitted.run.id, "running"))
|
|
450
|
+
await manager.cancel(submitted.run.id)
|
|
451
|
+
GatedTarget.gate.set()
|
|
452
|
+
messages = "\n".join(
|
|
453
|
+
record.getMessage() for record in caplog.records if record.name == _LOGGER
|
|
454
|
+
)
|
|
455
|
+
assert f"Cancelling evaluation run {submitted.run.id}" in messages
|
|
456
|
+
|
|
@@ -13,13 +13,44 @@ except ImportError: # pragma: no cover - optional dependency path
|
|
|
13
13
|
|
|
14
14
|
from agentbyte.session_store import FileSessionStore
|
|
15
15
|
from agentbyte.workflow import FunctionStep, StepMetadata, Workflow, WorkflowConfig
|
|
16
|
-
from agentbyte.webui.server import AgentbyteWebUIServer, _infer_entity_id
|
|
16
|
+
from agentbyte.webui.server import AgentbyteWebUIServer, WebUIServer, _infer_entity_id, serve
|
|
17
17
|
|
|
18
18
|
from .helpers import DummyAgent, DummyOrchestrator
|
|
19
19
|
|
|
20
20
|
pytestmark = pytest.mark.skipif(TestClient is None, reason="fastapi not installed")
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
# -- playground / eval-only mode selection (serve + WebUIServer) ---------------
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_webui_server_forwards_playground_false_for_eval_only(tmp_path) -> None:
|
|
27
|
+
"""WebUIServer(playground=False) threads the flag to the backing server: the
|
|
28
|
+
health endpoint reports Playground disabled while evaluations stay enabled."""
|
|
29
|
+
server = WebUIServer(playground=False, eval_history=str(tmp_path / "eval.sqlite"))
|
|
30
|
+
client = TestClient(server.get_app())
|
|
31
|
+
|
|
32
|
+
health = client.get("/api/health").json()
|
|
33
|
+
assert health["playground_enabled"] is False
|
|
34
|
+
assert health["eval_enabled"] is True
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_webui_server_defaults_to_playground_enabled() -> None:
|
|
38
|
+
server = WebUIServer()
|
|
39
|
+
assert server._server.playground is True
|
|
40
|
+
assert TestClient(server.get_app()).get("/api/health").json()["playground_enabled"] is True
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_serve_rejects_entities_in_eval_only_mode() -> None:
|
|
44
|
+
"""playground=False has no Playground to register in-memory entities into."""
|
|
45
|
+
with pytest.raises(ValueError, match="evaluations only"):
|
|
46
|
+
serve(entities=[DummyAgent()], playground=False, eval_history="eval.sqlite")
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_serve_rejects_entities_dir_in_eval_only_mode() -> None:
|
|
50
|
+
with pytest.raises(ValueError, match="evaluations only"):
|
|
51
|
+
serve(entities_dir="some/dir", playground=False, eval_history="eval.sqlite")
|
|
52
|
+
|
|
53
|
+
|
|
23
54
|
def test_health_endpoint() -> None:
|
|
24
55
|
server = AgentbyteWebUIServer()
|
|
25
56
|
client = TestClient(server.create_app())
|
|
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
|