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.
Files changed (364) hide show
  1. {agentbyte-0.38.0 → agentbyte-0.40.0}/CHANGELOG.md +45 -0
  2. {agentbyte-0.38.0 → agentbyte-0.40.0}/PKG-INFO +8 -2
  3. {agentbyte-0.38.0 → agentbyte-0.40.0}/README.md +2 -1
  4. {agentbyte-0.38.0 → agentbyte-0.40.0}/pyproject.toml +5 -1
  5. agentbyte-0.40.0/src/agentbyte/__about__.py +2 -0
  6. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/jobs.py +47 -8
  7. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/server.py +20 -1
  8. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_jobs.py +65 -0
  9. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_server.py +32 -1
  10. agentbyte-0.38.0/src/agentbyte/__about__.py +0 -2
  11. {agentbyte-0.38.0 → agentbyte-0.40.0}/.gitignore +0 -0
  12. {agentbyte-0.38.0 → agentbyte-0.40.0}/LICENSE +0 -0
  13. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/__init__.py +0 -0
  14. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/_optional.py +0 -0
  15. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/__init__.py +0 -0
  16. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/agent.py +0 -0
  17. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
  18. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/base.py +0 -0
  19. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/embedding_agent.py +0 -0
  20. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/agents/types.py +0 -0
  21. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cancellation_token.py +0 -0
  22. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/catalog.py +0 -0
  23. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/__init__.py +0 -0
  24. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/__main__.py +0 -0
  25. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/eval_commands.py +0 -0
  26. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/loading.py +0 -0
  27. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/cli/main.py +0 -0
  28. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/__init__.py +0 -0
  29. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/counters.py +0 -0
  30. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/errors.py +0 -0
  31. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/grouping.py +0 -0
  32. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/compaction/strategies.py +0 -0
  33. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/component.py +0 -0
  34. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context.py +0 -0
  35. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context_providers/__init__.py +0 -0
  36. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context_providers/base.py +0 -0
  37. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
  38. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/context_providers/skills.py +0 -0
  39. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/__init__.py +0 -0
  40. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
  41. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/base.py +0 -0
  42. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/config.py +0 -0
  43. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/importer.py +0 -0
  44. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/json.py +0 -0
  45. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/loader.py +0 -0
  46. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/publish.py +0 -0
  47. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/publish_config.py +0 -0
  48. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/publishers.py +0 -0
  49. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/s3.py +0 -0
  50. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/sources.py +0 -0
  51. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/sqlite.py +0 -0
  52. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
  53. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/write_config.py +0 -0
  54. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/dataset/writers.py +0 -0
  55. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/entity.py +0 -0
  56. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/__init__.py +0 -0
  57. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/base.py +0 -0
  58. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/__init__.py +0 -0
  59. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/decorator.py +0 -0
  60. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/keyword.py +0 -0
  61. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/local.py +0 -0
  62. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/process.py +0 -0
  63. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/tool.py +0 -0
  64. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/checks/types.py +0 -0
  65. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/comparison.py +0 -0
  66. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/eval_dataset.py +0 -0
  67. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/__init__.py +0 -0
  68. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/conformance.py +0 -0
  69. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/errors.py +0 -0
  70. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/models.py +0 -0
  71. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/recorder.py +0 -0
  72. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/sql.py +0 -0
  73. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/sqlite.py +0 -0
  74. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/store.py +0 -0
  75. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/history/transitions.py +0 -0
  76. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/__init__.py +0 -0
  77. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/base.py +0 -0
  78. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/composite.py +0 -0
  79. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/llm.py +0 -0
  80. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
  81. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/reference.py +0 -0
  82. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
  83. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/judges/validation.py +0 -0
  84. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/pairwise.py +0 -0
  85. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/report.py +0 -0
  86. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/runner.py +0 -0
  87. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/splitting.py +0 -0
  88. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/__init__.py +0 -0
  89. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/agent.py +0 -0
  90. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/model.py +0 -0
  91. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
  92. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
  93. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/runtime.py +0 -0
  94. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/targets/workflow.py +0 -0
  95. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/types.py +0 -0
  96. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/__init__.py +0 -0
  97. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/coordinator.py +0 -0
  98. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
  99. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
  100. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/suite.py +0 -0
  101. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/eval/workbench/verdict.py +0 -0
  102. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/execution_trace/__init__.py +0 -0
  103. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/execution_trace/collector.py +0 -0
  104. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/execution_trace/models.py +0 -0
  105. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/__init__.py +0 -0
  106. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/_retry_observability.py +0 -0
  107. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/auth.py +0 -0
  108. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/__init__.py +0 -0
  109. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/auth.py +0 -0
  110. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/chat.py +0 -0
  111. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/embedding.py +0 -0
  112. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure/settings.py +0 -0
  113. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure_openai.py +0 -0
  114. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
  115. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/base.py +0 -0
  116. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/embeddings_base.py +0 -0
  117. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai/__init__.py +0 -0
  118. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai/chat.py +0 -0
  119. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai/embedding.py +0 -0
  120. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai/settings.py +0 -0
  121. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/openai_embedding.py +0 -0
  122. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/pricing.py +0 -0
  123. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/retry_policy.py +0 -0
  124. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/settings.py +0 -0
  125. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/llm/types.py +0 -0
  126. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/logger.py +0 -0
  127. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/memory/__init__.py +0 -0
  128. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/memory/base.py +0 -0
  129. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/messages.py +0 -0
  130. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/__init__.py +0 -0
  131. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/base.py +0 -0
  132. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/otel.py +0 -0
  133. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/retry.py +0 -0
  134. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/sql_usage.py +0 -0
  135. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/middleware/usage_logger.py +0 -0
  136. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/notebook.py +0 -0
  137. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/__init__.py +0 -0
  138. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/base.py +0 -0
  139. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/config.py +0 -0
  140. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/gepa.py +0 -0
  141. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/mipro.py +0 -0
  142. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/pareto.py +0 -0
  143. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/reflective.py +0 -0
  144. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/spec.py +0 -0
  145. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/optim/trace.py +0 -0
  146. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/__init__.py +0 -0
  147. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/ai.py +0 -0
  148. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/base.py +0 -0
  149. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/handoff.py +0 -0
  150. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/plan.py +0 -0
  151. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/policies.py +0 -0
  152. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/orchestration/round_robin.py +0 -0
  153. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/__init__.py +0 -0
  154. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/agents.py +0 -0
  155. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/clients.py +0 -0
  156. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instruction_registry.py +0 -0
  157. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
  158. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
  159. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
  160. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
  161. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
  162. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/orchestration.py +0 -0
  163. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
  164. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
  165. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
  166. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
  167. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
  168. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/streaming.py +0 -0
  169. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/presets/workflow.py +0 -0
  170. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/session_store.py +0 -0
  171. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/__init__.py +0 -0
  172. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/base.py +0 -0
  173. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/resources.py +0 -0
  174. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/scripts.py +0 -0
  175. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/sources.py +0 -0
  176. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/skills/validation.py +0 -0
  177. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/__init__.py +0 -0
  178. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/base.py +0 -0
  179. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/cancellation.py +0 -0
  180. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/composite.py +0 -0
  181. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
  182. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/external.py +0 -0
  183. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/function_call.py +0 -0
  184. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/handoff.py +0 -0
  185. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/max_message.py +0 -0
  186. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/predicate.py +0 -0
  187. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/source.py +0 -0
  188. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/text_mention.py +0 -0
  189. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/timeout.py +0 -0
  190. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/termination/token_usage.py +0 -0
  191. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/__init__.py +0 -0
  192. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/base.py +0 -0
  193. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/coding_tools.py +0 -0
  194. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/core_tools.py +0 -0
  195. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/decorator.py +0 -0
  196. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/memory_tool.py +0 -0
  197. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/tools/research_tools.py +0 -0
  198. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/types.py +0 -0
  199. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/__init__.py +0 -0
  200. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/discovery.py +0 -0
  201. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/eval_routes.py +0 -0
  202. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/execution.py +0 -0
  203. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/models.py +0 -0
  204. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/registry.py +0 -0
  205. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/session_store.py +0 -0
  206. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/sessions.py +0 -0
  207. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/ui/assets/index-C-wj-OzO.js +0 -0
  208. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/ui/assets/index-DW8IDODJ.css +0 -0
  209. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/ui/index.html +0 -0
  210. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/webui/ui/vite.svg +0 -0
  211. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/__init__.py +0 -0
  212. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/agent.py +0 -0
  213. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/__init__.py +0 -0
  214. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
  215. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
  216. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/models.py +0 -0
  217. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/runner.py +0 -0
  218. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/core/workflow.py +0 -0
  219. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/defaults.py +0 -0
  220. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/errors.py +0 -0
  221. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/loader.py +0 -0
  222. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/schema.py +0 -0
  223. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/schema_utils.py +0 -0
  224. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/sqlite_checkpoint.py +0 -0
  225. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
  226. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/agent.py +0 -0
  227. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/echo.py +0 -0
  228. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/function.py +0 -0
  229. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/http.py +0 -0
  230. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/step.py +0 -0
  231. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
  232. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/steps/transform.py +0 -0
  233. {agentbyte-0.38.0 → agentbyte-0.40.0}/src/agentbyte/workflow/visualizer.py +0 -0
  234. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_as_tool.py +0 -0
  235. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_basic.py +0 -0
  236. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_context_providers.py +0 -0
  237. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_error_response.py +0 -0
  238. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_event_types.py +0 -0
  239. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_memory_integration.py +0 -0
  240. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_middleware_integration.py +0 -0
  241. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_response_accessors.py +0 -0
  242. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_retry_middleware.py +0 -0
  243. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_agent_stream_events.py +0 -0
  244. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_embedding_agent.py +0 -0
  245. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_tool_approval.py +0 -0
  246. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_tool_batch_resolution.py +0 -0
  247. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/agents/test_tool_metadata.py +0 -0
  248. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/cli/test_loading.py +0 -0
  249. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/cli/test_registry_check.py +0 -0
  250. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/compaction/test_compaction.py +0 -0
  251. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/context_providers/__init__.py +0 -0
  252. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/context_providers/test_skill_tools.py +0 -0
  253. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/context_providers/test_skills_provider.py +0 -0
  254. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/fake_s3.py +0 -0
  255. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_dataset_exit.py +0 -0
  256. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_loader.py +0 -0
  257. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_multi_table.py +0 -0
  258. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_publish.py +0 -0
  259. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/dataset/test_sqlite_db.py +0 -0
  260. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_dataset.py +0 -0
  261. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_history.py +0 -0
  262. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_history_backends.py +0 -0
  263. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_eval_workbench.py +0 -0
  264. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_execution_trajectories.py +0 -0
  265. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_multi_turn.py +0 -0
  266. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_pairwise.py +0 -0
  267. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
  268. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
  269. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_score_integrity.py +0 -0
  270. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_splitting.py +0 -0
  271. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/eval/test_types_and_judges.py +0 -0
  272. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/examples/test_compaction_webapp.py +0 -0
  273. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_azure_client.py +0 -0
  274. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_azure_embedding_client.py +0 -0
  275. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_llm_types.py +0 -0
  276. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_openai_client.py +0 -0
  277. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_openai_embedding_client.py +0 -0
  278. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_pricing.py +0 -0
  279. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_retry_observability.py +0 -0
  280. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_retry_policy_api.py +0 -0
  281. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/llm/test_retryable_error_substrings.py +0 -0
  282. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/memory/test_memory.py +0 -0
  283. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_context_compaction.py +0 -0
  284. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
  285. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_middleware_chain.py +0 -0
  286. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_otel.py +0 -0
  287. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_retry_middleware.py +0 -0
  288. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_sql_usage.py +0 -0
  289. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/middleware/test_usage_logger.py +0 -0
  290. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/__init__.py +0 -0
  291. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_base.py +0 -0
  292. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_base_integration.py +0 -0
  293. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_config.py +0 -0
  294. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_gepa.py +0 -0
  295. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_mipro.py +0 -0
  296. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_orchestrator_optim.py +0 -0
  297. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_pareto.py +0 -0
  298. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_reflective.py +0 -0
  299. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_score_integrity.py +0 -0
  300. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_spec.py +0 -0
  301. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/optim/test_trace.py +0 -0
  302. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
  303. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_base_orchestrator.py +0 -0
  304. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
  305. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
  306. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
  307. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/orchestration/test_round_robin.py +0 -0
  308. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_agents.py +0 -0
  309. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_clients.py +0 -0
  310. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_instruction_registry.py +0 -0
  311. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_orchestration.py +0 -0
  312. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_streaming.py +0 -0
  313. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/presets/test_workflow.py +0 -0
  314. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/__init__.py +0 -0
  315. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/test_base.py +0 -0
  316. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/test_resources.py +0 -0
  317. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/test_scripts.py +0 -0
  318. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/skills/test_sources.py +0 -0
  319. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_base.py +0 -0
  320. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_cancellation.py +0 -0
  321. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_composite.py +0 -0
  322. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_consecutive_agent.py +0 -0
  323. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_external.py +0 -0
  324. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_function_call.py +0 -0
  325. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_handoff.py +0 -0
  326. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_max_message.py +0 -0
  327. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_predicate.py +0 -0
  328. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_source.py +0 -0
  329. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_text_mention.py +0 -0
  330. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_timeout.py +0 -0
  331. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/termination/test_token_usage.py +0 -0
  332. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_cancellation_token.py +0 -0
  333. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_context.py +0 -0
  334. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_logger.py +0 -0
  335. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_messages.py +0 -0
  336. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_optional_extras.py +0 -0
  337. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_package_api.py +0 -0
  338. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_session_store.py +0 -0
  339. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_types.py +0 -0
  340. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/test_vanilla_chunker.py +0 -0
  341. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/tools/test_coding_tools.py +0 -0
  342. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/tools/test_memory_tool.py +0 -0
  343. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/tools/test_research_tools.py +0 -0
  344. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/tools/test_tools.py +0 -0
  345. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/__init__.py +0 -0
  346. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/helpers.py +0 -0
  347. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_eval_routes.py +0 -0
  348. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_execution.py +0 -0
  349. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_package_api.py +0 -0
  350. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_registry.py +0 -0
  351. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_sessions.py +0 -0
  352. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/webui/test_workflow_streaming.py +0 -0
  353. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/recovery_worker.py +0 -0
  354. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_agent_step_imports.py +0 -0
  355. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_checkpoint.py +0 -0
  356. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_subworkflow_step.py +0 -0
  357. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_agent.py +0 -0
  358. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_class.py +0 -0
  359. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_models.py +0 -0
  360. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_reliability.py +0 -0
  361. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_runner.py +0 -0
  362. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_schema.py +0 -0
  363. {agentbyte-0.38.0 → agentbyte-0.40.0}/tests/workflow/test_workflow_steps.py +0 -0
  364. {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.38.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.38.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.38.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
 
@@ -0,0 +1,2 @@
1
+ __version__ = "0.40.0"
2
+ VERSION = __version__
@@ -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
- admitted = await self.coordinator.admit(
171
- suite_name,
172
- capture=capture,
173
- idempotency_key=idempotency_key,
174
- max_active_runs=self.capacity,
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
- pass
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())
@@ -1,2 +0,0 @@
1
- __version__ = "0.38.0"
2
- VERSION = __version__
File without changes
File without changes