agentbyte 0.32.2__tar.gz → 0.33.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.32.2 → agentbyte-0.33.0}/CHANGELOG.md +30 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/PKG-INFO +36 -65
- {agentbyte-0.32.2 → agentbyte-0.33.0}/README.md +31 -42
- agentbyte-0.33.0/pyproject.toml +112 -0
- agentbyte-0.33.0/src/agentbyte/__about__.py +2 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/__init__.py +2 -0
- agentbyte-0.33.0/src/agentbyte/_optional.py +39 -0
- agentbyte-0.33.0/src/agentbyte/cli/__main__.py +6 -0
- agentbyte-0.33.0/src/agentbyte/cli/eval_commands.py +245 -0
- agentbyte-0.33.0/src/agentbyte/cli/loading.py +49 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/cli/main.py +59 -28
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/compaction/counters.py +3 -3
- agentbyte-0.33.0/src/agentbyte/dataset/_aiosqlite.py +31 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/importer.py +5 -3
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/publish.py +2 -2
- agentbyte-0.33.0/src/agentbyte/dataset/publishers.py +84 -0
- agentbyte-0.33.0/src/agentbyte/dataset/s3.py +71 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/sources.py +22 -75
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/sqlite.py +2 -3
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/sqlite_db.py +6 -9
- agentbyte-0.33.0/src/agentbyte/dataset/writers.py +70 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/eval_dataset.py +3 -3
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/recorder.py +81 -18
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/sql.py +10 -3
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/sqlite.py +2 -1
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/transitions.py +5 -0
- agentbyte-0.33.0/src/agentbyte/eval/workbench/__init__.py +42 -0
- agentbyte-0.33.0/src/agentbyte/eval/workbench/coordinator.py +249 -0
- agentbyte-0.33.0/src/agentbyte/eval/workbench/jobs.py +291 -0
- agentbyte-0.33.0/src/agentbyte/eval/workbench/smoke.py +89 -0
- agentbyte-0.33.0/src/agentbyte/eval/workbench/smoke_tasks.json +11 -0
- agentbyte-0.33.0/src/agentbyte/eval/workbench/suite.py +151 -0
- agentbyte-0.33.0/src/agentbyte/eval/workbench/verdict.py +172 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/__init__.py +4 -8
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/azure/auth.py +5 -10
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/azure/chat.py +3 -3
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/azure/embedding.py +3 -3
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/middleware/otel.py +2 -2
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/middleware/sql_usage.py +10 -3
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/gepa.py +2 -5
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/tools/research_tools.py +4 -7
- agentbyte-0.33.0/src/agentbyte/webui/eval_routes.py +178 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/server.py +86 -14
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/sqlite_checkpoint.py +2 -1
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/visualizer.py +3 -4
- agentbyte-0.33.0/tests/cli/test_loading.py +65 -0
- agentbyte-0.33.0/tests/dataset/fake_s3.py +92 -0
- agentbyte-0.33.0/tests/dataset/test_dataset_exit.py +66 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/dataset/test_loader.py +11 -25
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/dataset/test_publish.py +81 -58
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/dataset/test_sqlite_db.py +5 -19
- agentbyte-0.33.0/tests/eval/test_eval_jobs.py +391 -0
- agentbyte-0.33.0/tests/eval/test_eval_workbench.py +455 -0
- agentbyte-0.33.0/tests/test_optional_extras.py +139 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/test_package_api.py +1 -2
- agentbyte-0.33.0/tests/webui/test_eval_routes.py +316 -0
- agentbyte-0.32.2/pyproject.toml +0 -224
- agentbyte-0.32.2/src/agentbyte/__about__.py +0 -2
- agentbyte-0.32.2/src/agentbyte/dataset/publishers.py +0 -131
- agentbyte-0.32.2/src/agentbyte/dataset/writers.py +0 -99
- {agentbyte-0.32.2 → agentbyte-0.33.0}/.gitignore +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/LICENSE +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/agents/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/agents/agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/agents/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/agents/embedding_agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/agents/types.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/cancellation_token.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/catalog.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/cli/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/compaction/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/compaction/errors.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/compaction/grouping.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/compaction/strategies.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/component.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/context.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/context_providers/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/context_providers/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/context_providers/skills.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/config.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/json.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/loader.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/publish_config.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/dataset/write_config.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/entity.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/checks/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/checks/decorator.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/checks/keyword.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/checks/local.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/checks/process.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/checks/tool.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/checks/types.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/comparison.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/conformance.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/errors.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/models.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/history/store.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/judges/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/judges/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/judges/composite.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/judges/llm.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/judges/reference.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/judges/validation.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/pairwise.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/report.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/runner.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/splitting.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/targets/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/targets/agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/targets/model.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/targets/runtime.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/targets/workflow.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/eval/types.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/execution_trace/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/execution_trace/collector.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/execution_trace/models.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/_retry_observability.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/auth.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/azure/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/azure/settings.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/azure_openai.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/embeddings_base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/openai/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/openai/chat.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/openai/embedding.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/openai/settings.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/openai_embedding.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/pricing.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/retry_policy.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/settings.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/llm/types.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/logger.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/memory/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/memory/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/messages.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/middleware/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/middleware/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/middleware/retry.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/middleware/usage_logger.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/notebook.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/config.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/mipro.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/pareto.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/reflective.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/spec.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/optim/trace.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/orchestration/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/orchestration/ai.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/orchestration/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/orchestration/handoff.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/orchestration/plan.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/orchestration/policies.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/orchestration/round_robin.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/agents.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/clients.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/instruction_registry.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/orchestration.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/streaming.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/presets/workflow.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/session_store.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/skills/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/skills/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/skills/resources.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/skills/scripts.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/skills/sources.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/skills/validation.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/cancellation.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/composite.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/external.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/function_call.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/handoff.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/max_message.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/predicate.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/source.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/text_mention.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/timeout.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/termination/token_usage.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/tools/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/tools/base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/tools/coding_tools.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/tools/core_tools.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/tools/decorator.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/tools/memory_tool.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/types.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/discovery.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/execution.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/models.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/registry.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/session_store.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/sessions.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/ui/assets/index-BF3DwXaF.js +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/ui/assets/index-ar5tOeqt.css +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/ui/index.html +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/webui/ui/vite.svg +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/core/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/core/models.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/core/runner.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/core/workflow.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/defaults.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/errors.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/loader.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/schema.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/schema_utils.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/steps/agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/steps/echo.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/steps/function.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/steps/http.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/steps/step.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/src/agentbyte/workflow/steps/transform.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_as_tool.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_basic.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_context_providers.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_error_response.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_event_types.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_memory_integration.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_middleware_integration.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_response_accessors.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_retry_middleware.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_agent_stream_events.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_embedding_agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_tool_approval.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_tool_batch_resolution.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/agents/test_tool_metadata.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/cli/test_registry_check.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/compaction/test_compaction.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/context_providers/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/context_providers/test_skill_tools.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/context_providers/test_skills_provider.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/dataset/test_multi_table.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_eval_dataset.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_eval_history.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_eval_history_backends.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_execution_trajectories.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_multi_turn.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_pairwise.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_score_integrity.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_splitting.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/eval/test_types_and_judges.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/examples/test_compaction_webapp.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_azure_client.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_azure_embedding_client.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_llm_types.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_openai_client.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_openai_embedding_client.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_pricing.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_retry_observability.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_retry_policy_api.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/llm/test_retryable_error_substrings.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/memory/test_memory.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/middleware/test_context_compaction.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/middleware/test_middleware_chain.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/middleware/test_otel.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/middleware/test_retry_middleware.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/middleware/test_sql_usage.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/middleware/test_usage_logger.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_base_integration.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_config.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_gepa.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_mipro.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_pareto.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_reflective.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_score_integrity.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_spec.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/optim/test_trace.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/orchestration/test_base_orchestrator.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/orchestration/test_round_robin.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/presets/test_agents.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/presets/test_clients.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/presets/test_instruction_registry.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/presets/test_orchestration.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/presets/test_streaming.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/presets/test_workflow.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/skills/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/skills/test_base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/skills/test_resources.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/skills/test_scripts.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/skills/test_sources.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_base.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_cancellation.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_composite.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_consecutive_agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_external.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_function_call.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_handoff.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_max_message.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_predicate.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_source.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_text_mention.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_timeout.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/termination/test_token_usage.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/test_cancellation_token.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/test_context.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/test_logger.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/test_messages.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/test_session_store.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/test_types.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/test_vanilla_chunker.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/tools/test_coding_tools.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/tools/test_memory_tool.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/tools/test_research_tools.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/tools/test_tools.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/webui/__init__.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/webui/helpers.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/webui/test_execution.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/webui/test_package_api.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/webui/test_registry.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/webui/test_server.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/webui/test_sessions.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/webui/test_workflow_streaming.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/recovery_worker.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_agent_step_imports.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_checkpoint.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_subworkflow_step.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_workflow_agent.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_workflow_class.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_workflow_models.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_workflow_reliability.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_workflow_runner.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_workflow_schema.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_workflow_steps.py +0 -0
- {agentbyte-0.32.2 → agentbyte-0.33.0}/tests/workflow/test_workflow_visualizer.py +0 -0
|
@@ -6,6 +6,36 @@ The format follows Keep a Changelog principles and semantic versioning.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.33.0] - 2026-10-01
|
|
10
|
+
|
|
11
|
+
Upgrade notes (breaking):
|
|
12
|
+
|
|
13
|
+
- Removed the `test`, `dev` and `coding` extras; they only held contributor tooling. Contributors use `uv sync --all-extras --all-groups`.
|
|
14
|
+
- S3 datasets use native async `aioboto3` (`aws` extra) instead of synchronous `boto3`. `DatasetWriter.write_files`/`dataset_exists`, `DatasetPublisher.publish_dataset` and `agentbyte.dataset.publish_dataset` are now coroutines: `await` them, and make custom writers/publishers `async def`. A `client=` passed to `S3DatasetSource`, `S3DatasetWriter` or `S3DatasetPublisher` must be an async S3 client; it is used as-is and never closed.
|
|
15
|
+
- A missing optional dependency now raises `agentbyte.MissingExtraError` (a `ModuleNotFoundError`) everywhere. The WebUI and `WorkflowVisualizer.to_dot()` previously raised `RuntimeError`.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- Evaluation workbench, step 1 (spec 0052): `agentbyte.eval.workbench` with `EvalSuite`, `EvalSuiteRegistry`, `EvalSuiteCoordinator` and pass/fail verdicts (`SuiteRunSummary`); an item passes only when execution completed, the judge scored it and `overall >= min_score`. New CLI `agentbyte eval list|run|results` (exit codes 0 passed, 1 failed/incomplete, 2 configuration/storage error, 130 interrupted) and a packaged, provider-free `smoke` suite. `EvalRunRecorder.evaluate`/`evaluate_stream` accept `on_start`. `python -m agentbyte.cli` works.
|
|
20
|
+
- Evaluation workbench, step 2 (spec 0052): HTTP job lifecycle. `EvalJobManager` runs suites in the background (one active, ten queued); admission is idempotent per owner and key and atomic in the store, a full queue is rejected without a record, cancel is idempotent, shutdown commits owned jobs as `cancelled` and startup marks leftovers `interrupted`. WebUI routes under `/api/eval` (suites, runs, items, SSE `snapshot` events keyed by run revision, cancel), enabled by `AgentbyteWebUIServer(eval_store=... | eval_history=..., eval_registry=...)` or `agentbyte webui --eval-history PATH [--eval-catalog module:registry]`. `EvalRunRecorder.admit()`/`execute_stream()` split admission from execution; `SuiteRunSummary.revision`.
|
|
21
|
+
- Evaluation workbench docs: study guide `docs/study/05-eval_topics/05_topic_eval_workbench.md`, offline example catalog `examples/eval/workbench_catalog.py` and notebook `notebooks/usecases/eval/05-eval-workbench.ipynb`.
|
|
22
|
+
- `tiktoken` extra for `TiktokenCounter`.
|
|
23
|
+
- `agentbyte.MissingExtraError`: one error type and message format ("<feature> needs the '<extra>' extra: pip install 'agentbyte[<extra>]'") for every optional dependency, via `agentbyte._optional.require`.
|
|
24
|
+
- `agentbyte.cli.loading.import_object(reference, expected_type)`: one loader for `module.path:object` CLI arguments.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- CLI `--catalog` / `registry check` references are imported like `python -m`: modules in the current working directory are found without installing them.
|
|
29
|
+
- Evaluation history idempotency: reusing a key now also requires the same capture, criteria, labels, judge and target fingerprint; otherwise `EvalHistoryConflictError`.
|
|
30
|
+
- README "Installation" is now one table of extras, what they install and which features need them.
|
|
31
|
+
- The S3 dataset importer no longer wraps writer calls in `asyncio.to_thread`.
|
|
32
|
+
- `all` (and `sql`) are composed from the other extras by reference, so they can no longer drift. Dependency groups now hold only local tooling (`test`, `dev`, `experiment`); groups that mirrored extras and the unused `extlib` group (Microsoft Agent Framework packages) were removed.
|
|
33
|
+
|
|
34
|
+
### Fixed
|
|
35
|
+
|
|
36
|
+
- SQLite datasets (`sqlite`, `sqlite_db` engines) no longer keep a script from exiting when they are not closed: their cached aiosqlite connection runs on a daemon thread. `aclose()` / `async with` remain the way to release them promptly.
|
|
37
|
+
- Use-case notebooks (eval 01–04, workflow 01–02) updated for the current async dataset, eval-dataset and judge-integrity APIs; the repository's `contracting/metadata26` eval dataset was re-saved with the current schema (`metadata` column). OTel install hints now say `uv sync --extra otel`.
|
|
38
|
+
|
|
9
39
|
## [0.32.2] - 2026-10-01
|
|
10
40
|
|
|
11
41
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agentbyte
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.33.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
|
|
@@ -27,22 +27,14 @@ Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.39.1; extra == 'all'
|
|
|
27
27
|
Requires-Dist: opentelemetry-sdk>=1.39.1; extra == 'all'
|
|
28
28
|
Requires-Dist: sqlalchemy[asyncio]>=2.0.43; extra == 'all'
|
|
29
29
|
Requires-Dist: sqlmodel>=0.0.38; extra == 'all'
|
|
30
|
-
Requires-Dist:
|
|
30
|
+
Requires-Dist: tiktoken>=0.9.0; extra == 'all'
|
|
31
|
+
Requires-Dist: uvicorn[standard]>=0.44.0; extra == 'all'
|
|
31
32
|
Requires-Dist: youtube-transcript-api>=0.6; extra == 'all'
|
|
32
33
|
Provides-Extra: aws
|
|
33
34
|
Requires-Dist: aioboto3>=15.5.0; extra == 'aws'
|
|
34
35
|
Provides-Extra: azureopenai
|
|
35
36
|
Requires-Dist: azure-identity>=1.25.1; extra == 'azureopenai'
|
|
36
37
|
Requires-Dist: openai>=1.107.1; extra == 'azureopenai'
|
|
37
|
-
Provides-Extra: coding
|
|
38
|
-
Provides-Extra: dev
|
|
39
|
-
Requires-Dist: ipykernel>=7.1.0; extra == 'dev'
|
|
40
|
-
Requires-Dist: nbclient>=0.10.4; extra == 'dev'
|
|
41
|
-
Requires-Dist: nbformat>=5.10.4; extra == 'dev'
|
|
42
|
-
Requires-Dist: picoagents>=0.4.0; extra == 'dev'
|
|
43
|
-
Requires-Dist: pydantic-settings>=2.13.0; extra == 'dev'
|
|
44
|
-
Requires-Dist: pymupdf-layout>=1.26.6; extra == 'dev'
|
|
45
|
-
Requires-Dist: pymupdf4llm>=0.2.9; extra == 'dev'
|
|
46
38
|
Provides-Extra: openai
|
|
47
39
|
Requires-Dist: openai>=1.107.1; extra == 'openai'
|
|
48
40
|
Provides-Extra: optim
|
|
@@ -67,18 +59,8 @@ Requires-Dist: sqlalchemy[asyncio]>=2.0.43; extra == 'sql'
|
|
|
67
59
|
Requires-Dist: sqlmodel>=0.0.38; extra == 'sql'
|
|
68
60
|
Provides-Extra: sqlite
|
|
69
61
|
Requires-Dist: aiosqlite>=0.22.1; extra == 'sqlite'
|
|
70
|
-
Provides-Extra:
|
|
71
|
-
Requires-Dist:
|
|
72
|
-
Requires-Dist: arxiv>=2.1; extra == 'test'
|
|
73
|
-
Requires-Dist: beautifulsoup4>=4.12; extra == 'test'
|
|
74
|
-
Requires-Dist: greenlet>=3.0.0; extra == 'test'
|
|
75
|
-
Requires-Dist: html2text>=2024.2; extra == 'test'
|
|
76
|
-
Requires-Dist: pytest-asyncio>=1.3.0; extra == 'test'
|
|
77
|
-
Requires-Dist: pytest-cov>=7.0.0; extra == 'test'
|
|
78
|
-
Requires-Dist: pytest>=9.0.1; extra == 'test'
|
|
79
|
-
Requires-Dist: ruff>=0.15.0; extra == 'test'
|
|
80
|
-
Requires-Dist: sqlmodel>=0.0.38; extra == 'test'
|
|
81
|
-
Requires-Dist: youtube-transcript-api>=0.6; extra == 'test'
|
|
62
|
+
Provides-Extra: tiktoken
|
|
63
|
+
Requires-Dist: tiktoken>=0.9.0; extra == 'tiktoken'
|
|
82
64
|
Provides-Extra: viz
|
|
83
65
|
Requires-Dist: graphviz>=0.21; extra == 'viz'
|
|
84
66
|
Provides-Extra: webui
|
|
@@ -90,12 +72,16 @@ Description-Content-Type: text/markdown
|
|
|
90
72
|
|
|
91
73
|
Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
|
|
92
74
|
|
|
93
|
-
Current release: **0.
|
|
75
|
+
Current release: **0.33.0**
|
|
94
76
|
|
|
95
77
|
## Building an Agent
|
|
96
78
|
|
|
97
79
|
Every example below builds on the same domain: a customer **support agent**. Start with a plain agent and a model client — no tools, no middleware:
|
|
98
80
|
|
|
81
|
+
```bash
|
|
82
|
+
pip install "agentbyte[openai]" # the model client lives in an extra; see Install below
|
|
83
|
+
```
|
|
84
|
+
|
|
99
85
|
```python
|
|
100
86
|
from agentbyte import Agent
|
|
101
87
|
from agentbyte.llm import OpenAIChatCompletionClient
|
|
@@ -302,56 +288,39 @@ Reading a trace: `chat gpt-4.1-mini` spans show **per-call** usage/cost/finish r
|
|
|
302
288
|
|
|
303
289
|
Python requirement: **3.11+**
|
|
304
290
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
Optional extras:
|
|
310
|
-
|
|
311
|
-
```bash
|
|
312
|
-
uv sync --extra openai # OpenAI client
|
|
313
|
-
uv sync --extra azureopenai # Azure OpenAI client + azure-identity
|
|
314
|
-
uv sync --extra aws # S3 datasets (aioboto3)
|
|
315
|
-
uv sync --extra otel # OpenTelemetry export
|
|
316
|
-
uv sync --extra webui # WebUI playground (FastAPI)
|
|
317
|
-
uv sync --extra sqlite # SQLite stores: datasets, workflow checkpoints, eval history
|
|
318
|
-
uv sync --extra postgres # PostgreSQL stores: usage logging, eval history
|
|
319
|
-
uv sync --extra sql # sqlite + postgres
|
|
320
|
-
uv sync --extra optim # prompt optimization (GEPA)
|
|
321
|
-
uv sync --extra viz # workflow diagrams (graphviz)
|
|
322
|
-
uv sync --extra research # research tools
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
### Install in another project (pip / uv add)
|
|
326
|
-
|
|
327
|
-
Use extras to enable provider + telemetry support:
|
|
328
|
-
|
|
329
|
-
```bash
|
|
330
|
-
pip install "agentbyte[azureopenai,otel]"
|
|
331
|
-
```
|
|
332
|
-
|
|
333
|
-
```bash
|
|
334
|
-
uv add "agentbyte[azureopenai,otel]"
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
For the browser WebUI:
|
|
291
|
+
The base package (`pip install agentbyte`) has no model provider or storage driver. Add the
|
|
292
|
+
extras for the features you use. Using a feature without its extra raises
|
|
293
|
+
`MissingExtraError` (an `ImportError`) that names the extra to install.
|
|
338
294
|
|
|
339
295
|
```bash
|
|
340
|
-
pip install "agentbyte[
|
|
296
|
+
pip install "agentbyte[openai,sqlite]"
|
|
341
297
|
# or
|
|
342
|
-
uv add "agentbyte[
|
|
298
|
+
uv add "agentbyte[openai,sqlite]"
|
|
343
299
|
```
|
|
344
300
|
|
|
345
|
-
|
|
301
|
+
| Extra | Installs | Needed for |
|
|
302
|
+
| --- | --- | --- |
|
|
303
|
+
| `openai` | `openai` | `OpenAIChatCompletionClient`, `OpenAIEmbeddingClient` |
|
|
304
|
+
| `azureopenai` | `openai`, `azure-identity` | Azure OpenAI clients and Entra ID credentials |
|
|
305
|
+
| `aws` | `aioboto3` | S3 dataset sources, writers and publishers |
|
|
306
|
+
| `otel` | OpenTelemetry API, SDK, OTLP exporter | OpenTelemetry tracing and metrics |
|
|
307
|
+
| `webui` | `fastapi`, `uvicorn` | `agentbyte webui` |
|
|
308
|
+
| `sqlite` | `aiosqlite` | SQLite datasets, workflow checkpoints, evaluation history |
|
|
309
|
+
| `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, `SqlEvalRunStore` |
|
|
310
|
+
| `sql` | `sqlite` + `postgres` | Both SQL backends |
|
|
311
|
+
| `tiktoken` | `tiktoken` | `TiktokenCounter` for exact compaction token counts |
|
|
312
|
+
| `optim` | `gepa` | `optimize_with_gepa()` |
|
|
313
|
+
| `viz` | `graphviz` | `WorkflowVisualizer.to_dot()` |
|
|
314
|
+
| `research` | `beautifulsoup4`, `html2text`, `arxiv`, `youtube-transcript-api` | `agentbyte.tools.research_tools` |
|
|
315
|
+
| `all` | every extra above | Everything |
|
|
316
|
+
|
|
317
|
+
Contributors working in this repository install every extra plus the local tooling groups
|
|
318
|
+
(`test`, `dev`, `experiment`):
|
|
346
319
|
|
|
347
320
|
```bash
|
|
348
|
-
|
|
349
|
-
# or
|
|
350
|
-
uv add "agentbyte[all]"
|
|
321
|
+
uv sync --all-extras --all-groups
|
|
351
322
|
```
|
|
352
323
|
|
|
353
|
-
Note: the Azure extra is `azureopenai`.
|
|
354
|
-
|
|
355
324
|
## Run The WebUI
|
|
356
325
|
|
|
357
326
|
### Option 1: Run the preset-backed app
|
|
@@ -410,6 +379,8 @@ Useful variants:
|
|
|
410
379
|
```bash
|
|
411
380
|
uv run agentbyte webui --dir . --port 8080 --host 127.0.0.1 --no-open
|
|
412
381
|
uv run agentbyte webui --dir examples --port 8090
|
|
382
|
+
# evaluation API under /api/eval (needs the sqlite extra; default suite: built-in smoke)
|
|
383
|
+
uv run agentbyte webui --eval-history ./eval.sqlite --eval-catalog myapp.evaluations:registry
|
|
413
384
|
```
|
|
414
385
|
|
|
415
386
|
For this repository, the most reliable first-run path is the preset-backed launcher:
|
|
@@ -2,12 +2,16 @@
|
|
|
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.33.0**
|
|
6
6
|
|
|
7
7
|
## Building an Agent
|
|
8
8
|
|
|
9
9
|
Every example below builds on the same domain: a customer **support agent**. Start with a plain agent and a model client — no tools, no middleware:
|
|
10
10
|
|
|
11
|
+
```bash
|
|
12
|
+
pip install "agentbyte[openai]" # the model client lives in an extra; see Install below
|
|
13
|
+
```
|
|
14
|
+
|
|
11
15
|
```python
|
|
12
16
|
from agentbyte import Agent
|
|
13
17
|
from agentbyte.llm import OpenAIChatCompletionClient
|
|
@@ -214,56 +218,39 @@ Reading a trace: `chat gpt-4.1-mini` spans show **per-call** usage/cost/finish r
|
|
|
214
218
|
|
|
215
219
|
Python requirement: **3.11+**
|
|
216
220
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
Optional extras:
|
|
222
|
-
|
|
223
|
-
```bash
|
|
224
|
-
uv sync --extra openai # OpenAI client
|
|
225
|
-
uv sync --extra azureopenai # Azure OpenAI client + azure-identity
|
|
226
|
-
uv sync --extra aws # S3 datasets (aioboto3)
|
|
227
|
-
uv sync --extra otel # OpenTelemetry export
|
|
228
|
-
uv sync --extra webui # WebUI playground (FastAPI)
|
|
229
|
-
uv sync --extra sqlite # SQLite stores: datasets, workflow checkpoints, eval history
|
|
230
|
-
uv sync --extra postgres # PostgreSQL stores: usage logging, eval history
|
|
231
|
-
uv sync --extra sql # sqlite + postgres
|
|
232
|
-
uv sync --extra optim # prompt optimization (GEPA)
|
|
233
|
-
uv sync --extra viz # workflow diagrams (graphviz)
|
|
234
|
-
uv sync --extra research # research tools
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Install in another project (pip / uv add)
|
|
238
|
-
|
|
239
|
-
Use extras to enable provider + telemetry support:
|
|
240
|
-
|
|
241
|
-
```bash
|
|
242
|
-
pip install "agentbyte[azureopenai,otel]"
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
```bash
|
|
246
|
-
uv add "agentbyte[azureopenai,otel]"
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
For the browser WebUI:
|
|
221
|
+
The base package (`pip install agentbyte`) has no model provider or storage driver. Add the
|
|
222
|
+
extras for the features you use. Using a feature without its extra raises
|
|
223
|
+
`MissingExtraError` (an `ImportError`) that names the extra to install.
|
|
250
224
|
|
|
251
225
|
```bash
|
|
252
|
-
pip install "agentbyte[
|
|
226
|
+
pip install "agentbyte[openai,sqlite]"
|
|
253
227
|
# or
|
|
254
|
-
uv add "agentbyte[
|
|
228
|
+
uv add "agentbyte[openai,sqlite]"
|
|
255
229
|
```
|
|
256
230
|
|
|
257
|
-
|
|
231
|
+
| Extra | Installs | Needed for |
|
|
232
|
+
| --- | --- | --- |
|
|
233
|
+
| `openai` | `openai` | `OpenAIChatCompletionClient`, `OpenAIEmbeddingClient` |
|
|
234
|
+
| `azureopenai` | `openai`, `azure-identity` | Azure OpenAI clients and Entra ID credentials |
|
|
235
|
+
| `aws` | `aioboto3` | S3 dataset sources, writers and publishers |
|
|
236
|
+
| `otel` | OpenTelemetry API, SDK, OTLP exporter | OpenTelemetry tracing and metrics |
|
|
237
|
+
| `webui` | `fastapi`, `uvicorn` | `agentbyte webui` |
|
|
238
|
+
| `sqlite` | `aiosqlite` | SQLite datasets, workflow checkpoints, evaluation history |
|
|
239
|
+
| `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, `SqlEvalRunStore` |
|
|
240
|
+
| `sql` | `sqlite` + `postgres` | Both SQL backends |
|
|
241
|
+
| `tiktoken` | `tiktoken` | `TiktokenCounter` for exact compaction token counts |
|
|
242
|
+
| `optim` | `gepa` | `optimize_with_gepa()` |
|
|
243
|
+
| `viz` | `graphviz` | `WorkflowVisualizer.to_dot()` |
|
|
244
|
+
| `research` | `beautifulsoup4`, `html2text`, `arxiv`, `youtube-transcript-api` | `agentbyte.tools.research_tools` |
|
|
245
|
+
| `all` | every extra above | Everything |
|
|
246
|
+
|
|
247
|
+
Contributors working in this repository install every extra plus the local tooling groups
|
|
248
|
+
(`test`, `dev`, `experiment`):
|
|
258
249
|
|
|
259
250
|
```bash
|
|
260
|
-
|
|
261
|
-
# or
|
|
262
|
-
uv add "agentbyte[all]"
|
|
251
|
+
uv sync --all-extras --all-groups
|
|
263
252
|
```
|
|
264
253
|
|
|
265
|
-
Note: the Azure extra is `azureopenai`.
|
|
266
|
-
|
|
267
254
|
## Run The WebUI
|
|
268
255
|
|
|
269
256
|
### Option 1: Run the preset-backed app
|
|
@@ -322,6 +309,8 @@ Useful variants:
|
|
|
322
309
|
```bash
|
|
323
310
|
uv run agentbyte webui --dir . --port 8080 --host 127.0.0.1 --no-open
|
|
324
311
|
uv run agentbyte webui --dir examples --port 8090
|
|
312
|
+
# evaluation API under /api/eval (needs the sqlite extra; default suite: built-in smoke)
|
|
313
|
+
uv run agentbyte webui --eval-history ./eval.sqlite --eval-catalog myapp.evaluations:registry
|
|
325
314
|
```
|
|
326
315
|
|
|
327
316
|
For this repository, the most reliable first-run path is the preset-backed launcher:
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "agentbyte"
|
|
3
|
+
dynamic = ["version"]
|
|
4
|
+
description = "A toolkit for designing multiagent systems"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "LicenseRef-Proprietary"
|
|
7
|
+
authors = [
|
|
8
|
+
{ name = "MrDataPsycho", email = "mr.data.psycho@gmail.com" }
|
|
9
|
+
]
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
dependencies = [
|
|
12
|
+
"httpx>=0.28.1",
|
|
13
|
+
"pydantic>=2.12.5",
|
|
14
|
+
"pydantic-settings>=2.13.0",
|
|
15
|
+
"pyyaml>=6.0.3",
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
[project.optional-dependencies]
|
|
19
|
+
# Published feature extras: `pip install "agentbyte[openai,sqlite]"`.
|
|
20
|
+
openai = [
|
|
21
|
+
"openai>=1.107.1",
|
|
22
|
+
]
|
|
23
|
+
azureopenai = [
|
|
24
|
+
"openai>=1.107.1",
|
|
25
|
+
"azure-identity>=1.25.1",
|
|
26
|
+
]
|
|
27
|
+
aws = [
|
|
28
|
+
"aioboto3>=15.5.0",
|
|
29
|
+
]
|
|
30
|
+
otel = [
|
|
31
|
+
"opentelemetry-api>=1.39.1",
|
|
32
|
+
"opentelemetry-exporter-otlp-proto-http>=1.39.1",
|
|
33
|
+
"opentelemetry-sdk>=1.39.1",
|
|
34
|
+
]
|
|
35
|
+
webui = [
|
|
36
|
+
"fastapi>=0.135.2",
|
|
37
|
+
"uvicorn[standard]>=0.44.0",
|
|
38
|
+
]
|
|
39
|
+
sqlite = [
|
|
40
|
+
"aiosqlite>=0.22.1",
|
|
41
|
+
]
|
|
42
|
+
postgres = [
|
|
43
|
+
"sqlalchemy[asyncio]>=2.0.43",
|
|
44
|
+
"sqlmodel>=0.0.38",
|
|
45
|
+
"asyncpg>=0.31.0",
|
|
46
|
+
]
|
|
47
|
+
sql = [
|
|
48
|
+
"agentbyte[sqlite,postgres]",
|
|
49
|
+
]
|
|
50
|
+
tiktoken = [
|
|
51
|
+
"tiktoken>=0.9.0",
|
|
52
|
+
]
|
|
53
|
+
optim = [
|
|
54
|
+
"gepa>=0.1",
|
|
55
|
+
]
|
|
56
|
+
viz = [
|
|
57
|
+
"graphviz>=0.21",
|
|
58
|
+
]
|
|
59
|
+
research = [
|
|
60
|
+
"beautifulsoup4>=4.12",
|
|
61
|
+
"html2text>=2024.2",
|
|
62
|
+
"arxiv>=2.1",
|
|
63
|
+
"youtube-transcript-api>=0.6",
|
|
64
|
+
]
|
|
65
|
+
all = [
|
|
66
|
+
"agentbyte[openai,azureopenai,aws,otel,webui,sql,tiktoken,optim,viz,research]",
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
[project.scripts]
|
|
71
|
+
agentbyte = "agentbyte.cli:main"
|
|
72
|
+
|
|
73
|
+
[build-system]
|
|
74
|
+
requires = ["hatchling"]
|
|
75
|
+
build-backend = "hatchling.build"
|
|
76
|
+
|
|
77
|
+
[tool.hatch.version]
|
|
78
|
+
path = "src/agentbyte/__about__.py"
|
|
79
|
+
|
|
80
|
+
[tool.hatch.build.targets.wheel]
|
|
81
|
+
packages = ["src/agentbyte"]
|
|
82
|
+
|
|
83
|
+
[tool.hatch.build.targets.sdist]
|
|
84
|
+
include = ["/src", "/tests", "/README.md", "/LICENSE", "/CHANGELOG.md", "/src/agentbyte/webui/ui"]
|
|
85
|
+
|
|
86
|
+
[dependency-groups]
|
|
87
|
+
# Local-only tooling, never published. Contributors: `uv sync --all-extras --all-groups`.
|
|
88
|
+
test = [
|
|
89
|
+
"pytest>=9.0.1",
|
|
90
|
+
"pytest-asyncio>=1.3.0",
|
|
91
|
+
"pytest-cov>=7.0.0",
|
|
92
|
+
"ruff>=0.15.0",
|
|
93
|
+
]
|
|
94
|
+
dev = [
|
|
95
|
+
"fastexcel>=0.19.0",
|
|
96
|
+
"ipykernel>=7.1.0",
|
|
97
|
+
"nbclient>=0.10.4",
|
|
98
|
+
"nbformat>=5.10.4",
|
|
99
|
+
"polars>=1.40.0",
|
|
100
|
+
"pymupdf-layout>=1.26.6",
|
|
101
|
+
"pymupdf4llm>=0.2.9",
|
|
102
|
+
]
|
|
103
|
+
experiment = [
|
|
104
|
+
"tiktoken>=0.9.0",
|
|
105
|
+
"yake>=0.4.8",
|
|
106
|
+
]
|
|
107
|
+
|
|
108
|
+
[tool.pytest.ini_options]
|
|
109
|
+
testpaths = ["tests"]
|
|
110
|
+
norecursedirs = ["external_lib"]
|
|
111
|
+
# Dump every thread's stack if a test stalls, instead of hanging silently.
|
|
112
|
+
faulthandler_timeout = 60
|
|
@@ -14,6 +14,7 @@ Architecture Layers:
|
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
16
|
from agentbyte.__about__ import VERSION
|
|
17
|
+
from agentbyte._optional import MissingExtraError
|
|
17
18
|
from agentbyte.agents import Agent
|
|
18
19
|
from agentbyte.context_providers import (
|
|
19
20
|
ContextProvider,
|
|
@@ -129,6 +130,7 @@ except Exception:
|
|
|
129
130
|
|
|
130
131
|
__all__ = [
|
|
131
132
|
"VERSION",
|
|
133
|
+
"MissingExtraError",
|
|
132
134
|
"Agent",
|
|
133
135
|
"Entity",
|
|
134
136
|
"configure_notebook_logging",
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"""One way to import optional dependencies and report the extra that provides them."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import importlib
|
|
6
|
+
from types import ModuleType
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class MissingExtraError(ModuleNotFoundError):
|
|
10
|
+
"""An optional dependency is not installed; the message names the extra to install."""
|
|
11
|
+
|
|
12
|
+
def __init__(self, feature: str, extra: str, *, name: str | None = None) -> None:
|
|
13
|
+
super().__init__(
|
|
14
|
+
f"{feature} needs the '{extra}' extra: pip install 'agentbyte[{extra}]' "
|
|
15
|
+
f"(in this repository: uv sync --extra {extra})",
|
|
16
|
+
name=name,
|
|
17
|
+
)
|
|
18
|
+
self.feature = feature
|
|
19
|
+
self.extra = extra
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def require(module: str, *, extra: str, feature: str) -> ModuleType:
|
|
23
|
+
"""Import ``module`` or raise ``MissingExtraError`` naming ``extra``.
|
|
24
|
+
|
|
25
|
+
Only a missing ``module`` (or one of its parent packages) is reported as a
|
|
26
|
+
missing extra; an installed package that fails on its own imports re-raises.
|
|
27
|
+
"""
|
|
28
|
+
try:
|
|
29
|
+
return importlib.import_module(module)
|
|
30
|
+
except ModuleNotFoundError as exc:
|
|
31
|
+
if not is_missing(exc, module):
|
|
32
|
+
raise
|
|
33
|
+
raise MissingExtraError(feature, extra, name=exc.name) from exc
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def is_missing(exc: ModuleNotFoundError, module: str) -> bool:
|
|
37
|
+
"""Whether ``exc`` means ``module`` itself (or a parent package) is not installed."""
|
|
38
|
+
missing = exc.name or ""
|
|
39
|
+
return bool(missing) and (module == missing or module.startswith(f"{missing}."))
|