agentbyte 0.46.0__tar.gz → 0.48.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 (410) hide show
  1. {agentbyte-0.46.0 → agentbyte-0.48.0}/.gitignore +3 -0
  2. {agentbyte-0.46.0 → agentbyte-0.48.0}/CHANGELOG.md +59 -0
  3. {agentbyte-0.46.0 → agentbyte-0.48.0}/PKG-INFO +24 -10
  4. {agentbyte-0.46.0 → agentbyte-0.48.0}/README.md +16 -9
  5. {agentbyte-0.46.0 → agentbyte-0.48.0}/pyproject.toml +9 -0
  6. agentbyte-0.48.0/src/agentbyte/__about__.py +2 -0
  7. agentbyte-0.48.0/src/agentbyte/a2a/__init__.py +47 -0
  8. agentbyte-0.48.0/src/agentbyte/a2a/app.py +98 -0
  9. agentbyte-0.48.0/src/agentbyte/a2a/distributed_context.py +180 -0
  10. agentbyte-0.48.0/src/agentbyte/a2a/executor.py +231 -0
  11. agentbyte-0.48.0/src/agentbyte/a2a/tool.py +221 -0
  12. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/eval_commands.py +1 -1
  13. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/main.py +5 -1
  14. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/optim_commands.py +1 -1
  15. agentbyte-0.48.0/src/agentbyte/cli/serve_commands.py +55 -0
  16. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/component.py +0 -1
  17. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/importer.py +56 -38
  18. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/base.py +5 -1
  19. agentbyte-0.48.0/src/agentbyte/eval/history/_writer_lock.py +46 -0
  20. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/conformance.py +41 -0
  21. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/models.py +73 -8
  22. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/recorder.py +12 -4
  23. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/sql.py +219 -13
  24. agentbyte-0.48.0/src/agentbyte/eval/history/sqlite.py +48 -0
  25. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/store.py +13 -4
  26. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/agent.py +11 -2
  27. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/__init__.py +4 -0
  28. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/coordinator.py +13 -3
  29. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/jobs.py +18 -2
  30. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/suite.py +77 -2
  31. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/verdict.py +4 -0
  32. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/__init__.py +4 -0
  33. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/base.py +8 -0
  34. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/report.py +133 -7
  35. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/trace.py +12 -1
  36. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/__init__.py +12 -0
  37. agentbyte-0.48.0/src/agentbyte/presets/capitals.py +87 -0
  38. agentbyte-0.48.0/src/agentbyte/tools/mcp/__init__.py +56 -0
  39. agentbyte-0.48.0/src/agentbyte/tools/mcp/client.py +250 -0
  40. agentbyte-0.48.0/src/agentbyte/tools/mcp/config.py +45 -0
  41. agentbyte-0.48.0/src/agentbyte/tools/mcp/errors.py +12 -0
  42. agentbyte-0.48.0/src/agentbyte/tools/mcp/tool.py +101 -0
  43. agentbyte-0.48.0/src/agentbyte/tools/mcp/transports.py +56 -0
  44. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/research_tools.py +8 -128
  45. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/eval_routes.py +27 -4
  46. agentbyte-0.48.0/src/agentbyte/webui/mcp/__init__.py +5 -0
  47. agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/__init__.py +8 -0
  48. agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/apps_server.py +119 -0
  49. agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/auth_server.py +85 -0
  50. agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/basic_server.py +67 -0
  51. agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/mrtr_server.py +52 -0
  52. agentbyte-0.48.0/src/agentbyte/webui/mcp/servers/notify_server.py +54 -0
  53. agentbyte-0.48.0/src/agentbyte/webui/mcp_playground.py +393 -0
  54. agentbyte-0.48.0/src/agentbyte/webui/mcp_routes.py +312 -0
  55. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/models.py +4 -0
  56. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/server.py +31 -0
  57. agentbyte-0.48.0/src/agentbyte/webui/ui/assets/index-DGIjPh4H.css +1 -0
  58. agentbyte-0.48.0/src/agentbyte/webui/ui/assets/index-XUXdsPv4.js +82 -0
  59. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/ui/index.html +2 -2
  60. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/sqlite_checkpoint.py +2 -0
  61. agentbyte-0.48.0/tests/a2a/a2a_helpers.py +104 -0
  62. agentbyte-0.48.0/tests/a2a/test_a2a_adapters.py +369 -0
  63. agentbyte-0.48.0/tests/a2a/test_distributed_context.py +185 -0
  64. agentbyte-0.48.0/tests/cli/test_serve_command.py +65 -0
  65. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_sqlite_db.py +159 -0
  66. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_history.py +32 -7
  67. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_history_backends.py +1 -1
  68. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_jobs.py +5 -0
  69. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_workbench.py +33 -1
  70. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_report.py +165 -0
  71. agentbyte-0.48.0/tests/presets/test_capitals.py +63 -0
  72. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_optional_extras.py +14 -0
  73. agentbyte-0.48.0/tests/tools/fixtures/mcp_stdio_server.py +27 -0
  74. agentbyte-0.48.0/tests/tools/test_mcp_tools.py +544 -0
  75. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/tools/test_research_tools.py +4 -32
  76. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_eval_routes.py +31 -1
  77. agentbyte-0.48.0/tests/webui/test_mcp_routes.py +478 -0
  78. agentbyte-0.46.0/src/agentbyte/__about__.py +0 -2
  79. agentbyte-0.46.0/src/agentbyte/eval/history/sqlite.py +0 -496
  80. agentbyte-0.46.0/src/agentbyte/webui/ui/assets/index-CrAxIGFr.js +0 -82
  81. agentbyte-0.46.0/src/agentbyte/webui/ui/assets/index-m9IRI-Jx.css +0 -1
  82. {agentbyte-0.46.0 → agentbyte-0.48.0}/LICENSE +0 -0
  83. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/__init__.py +0 -0
  84. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/_optional.py +0 -0
  85. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/__init__.py +0 -0
  86. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/agent.py +0 -0
  87. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
  88. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/base.py +0 -0
  89. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/embedding_agent.py +0 -0
  90. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/agents/types.py +0 -0
  91. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cancellation_token.py +0 -0
  92. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/catalog.py +0 -0
  93. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/__init__.py +0 -0
  94. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/__main__.py +0 -0
  95. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/cli/loading.py +0 -0
  96. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/__init__.py +0 -0
  97. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/counters.py +0 -0
  98. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/errors.py +0 -0
  99. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/grouping.py +0 -0
  100. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/compaction/strategies.py +0 -0
  101. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context.py +0 -0
  102. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context_providers/__init__.py +0 -0
  103. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context_providers/base.py +0 -0
  104. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
  105. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/context_providers/skills.py +0 -0
  106. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/__init__.py +0 -0
  107. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
  108. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/base.py +0 -0
  109. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/config.py +0 -0
  110. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/json.py +0 -0
  111. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/loader.py +0 -0
  112. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/publish.py +0 -0
  113. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/publish_config.py +0 -0
  114. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/publishers.py +0 -0
  115. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/s3.py +0 -0
  116. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/sources.py +0 -0
  117. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/sqlite.py +0 -0
  118. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
  119. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/write_config.py +0 -0
  120. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/dataset/writers.py +0 -0
  121. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/entity.py +0 -0
  122. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/__init__.py +0 -0
  123. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/__init__.py +0 -0
  124. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/decorator.py +0 -0
  125. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/keyword.py +0 -0
  126. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/local.py +0 -0
  127. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/process.py +0 -0
  128. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/tool.py +0 -0
  129. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/checks/types.py +0 -0
  130. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/comparison.py +0 -0
  131. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/eval_dataset.py +0 -0
  132. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/__init__.py +0 -0
  133. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/errors.py +0 -0
  134. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/history/transitions.py +0 -0
  135. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/__init__.py +0 -0
  136. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/base.py +0 -0
  137. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/composite.py +0 -0
  138. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/llm.py +0 -0
  139. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
  140. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/reference.py +0 -0
  141. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
  142. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/judges/validation.py +0 -0
  143. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/pairwise.py +0 -0
  144. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/report.py +0 -0
  145. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/runner.py +0 -0
  146. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/splitting.py +0 -0
  147. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/__init__.py +0 -0
  148. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/model.py +0 -0
  149. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
  150. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
  151. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/runtime.py +0 -0
  152. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/targets/workflow.py +0 -0
  153. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/types.py +0 -0
  154. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
  155. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
  156. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/execution_trace/__init__.py +0 -0
  157. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/execution_trace/collector.py +0 -0
  158. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/execution_trace/models.py +0 -0
  159. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/__init__.py +0 -0
  160. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/_retry_observability.py +0 -0
  161. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/auth.py +0 -0
  162. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/__init__.py +0 -0
  163. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/auth.py +0 -0
  164. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/chat.py +0 -0
  165. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/embedding.py +0 -0
  166. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure/settings.py +0 -0
  167. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure_openai.py +0 -0
  168. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
  169. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/base.py +0 -0
  170. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/embeddings_base.py +0 -0
  171. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai/__init__.py +0 -0
  172. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai/chat.py +0 -0
  173. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai/embedding.py +0 -0
  174. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai/settings.py +0 -0
  175. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/openai_embedding.py +0 -0
  176. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/pricing.py +0 -0
  177. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/retry_policy.py +0 -0
  178. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/settings.py +0 -0
  179. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/llm/types.py +0 -0
  180. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/logger.py +0 -0
  181. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/memory/__init__.py +0 -0
  182. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/memory/base.py +0 -0
  183. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/messages.py +0 -0
  184. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/__init__.py +0 -0
  185. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/base.py +0 -0
  186. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/otel.py +0 -0
  187. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/retry.py +0 -0
  188. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/sql_usage.py +0 -0
  189. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/middleware/usage_logger.py +0 -0
  190. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/notebook.py +0 -0
  191. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/config.py +0 -0
  192. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/gepa.py +0 -0
  193. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/mipro.py +0 -0
  194. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/pareto.py +0 -0
  195. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/reflective.py +0 -0
  196. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/optim/spec.py +0 -0
  197. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/__init__.py +0 -0
  198. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/ai.py +0 -0
  199. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/base.py +0 -0
  200. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/handoff.py +0 -0
  201. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/plan.py +0 -0
  202. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/policies.py +0 -0
  203. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/orchestration/round_robin.py +0 -0
  204. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/agents.py +0 -0
  205. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/clients.py +0 -0
  206. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instruction_registry.py +0 -0
  207. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
  208. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
  209. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
  210. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
  211. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
  212. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/orchestration.py +0 -0
  213. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
  214. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
  215. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
  216. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
  217. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
  218. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/streaming.py +0 -0
  219. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/presets/workflow.py +0 -0
  220. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/session_store.py +0 -0
  221. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/__init__.py +0 -0
  222. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/base.py +0 -0
  223. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/resources.py +0 -0
  224. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/scripts.py +0 -0
  225. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/sources.py +0 -0
  226. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/skills/validation.py +0 -0
  227. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/__init__.py +0 -0
  228. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/base.py +0 -0
  229. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/cancellation.py +0 -0
  230. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/composite.py +0 -0
  231. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
  232. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/external.py +0 -0
  233. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/function_call.py +0 -0
  234. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/handoff.py +0 -0
  235. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/max_message.py +0 -0
  236. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/predicate.py +0 -0
  237. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/source.py +0 -0
  238. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/text_mention.py +0 -0
  239. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/timeout.py +0 -0
  240. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/termination/token_usage.py +0 -0
  241. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/__init__.py +0 -0
  242. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/base.py +0 -0
  243. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/coding_tools.py +0 -0
  244. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/core_tools.py +0 -0
  245. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/decorator.py +0 -0
  246. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/tools/memory_tool.py +0 -0
  247. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/types.py +0 -0
  248. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/__init__.py +0 -0
  249. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/discovery.py +0 -0
  250. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/execution.py +0 -0
  251. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/registry.py +0 -0
  252. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/session_store.py +0 -0
  253. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/sessions.py +0 -0
  254. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/webui/ui/vite.svg +0 -0
  255. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/__init__.py +0 -0
  256. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/agent.py +0 -0
  257. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/__init__.py +0 -0
  258. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
  259. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
  260. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/models.py +0 -0
  261. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/runner.py +0 -0
  262. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/core/workflow.py +0 -0
  263. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/defaults.py +0 -0
  264. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/errors.py +0 -0
  265. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/loader.py +0 -0
  266. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/schema.py +0 -0
  267. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/schema_utils.py +0 -0
  268. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
  269. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/agent.py +0 -0
  270. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/echo.py +0 -0
  271. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/function.py +0 -0
  272. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/http.py +0 -0
  273. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/step.py +0 -0
  274. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
  275. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/steps/transform.py +0 -0
  276. {agentbyte-0.46.0 → agentbyte-0.48.0}/src/agentbyte/workflow/visualizer.py +0 -0
  277. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_as_tool.py +0 -0
  278. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_basic.py +0 -0
  279. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_context_providers.py +0 -0
  280. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_error_response.py +0 -0
  281. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_event_types.py +0 -0
  282. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_memory_integration.py +0 -0
  283. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_middleware_integration.py +0 -0
  284. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_response_accessors.py +0 -0
  285. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_retry_middleware.py +0 -0
  286. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_stop_at_tools.py +0 -0
  287. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_agent_stream_events.py +0 -0
  288. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_embedding_agent.py +0 -0
  289. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_tool_approval.py +0 -0
  290. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_tool_batch_resolution.py +0 -0
  291. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/agents/test_tool_metadata.py +0 -0
  292. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/cli/test_loading.py +0 -0
  293. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/cli/test_registry_check.py +0 -0
  294. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/compaction/test_compaction.py +0 -0
  295. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/context_providers/__init__.py +0 -0
  296. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/context_providers/test_skill_tools.py +0 -0
  297. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/context_providers/test_skills_provider.py +0 -0
  298. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/fake_s3.py +0 -0
  299. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_dataset_exit.py +0 -0
  300. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_loader.py +0 -0
  301. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_multi_table.py +0 -0
  302. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/dataset/test_publish.py +0 -0
  303. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_eval_dataset.py +0 -0
  304. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_execution_trajectories.py +0 -0
  305. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_multi_turn.py +0 -0
  306. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_pairwise.py +0 -0
  307. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
  308. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
  309. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_score_integrity.py +0 -0
  310. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_splitting.py +0 -0
  311. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/eval/test_types_and_judges.py +0 -0
  312. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/examples/test_compaction_webapp.py +0 -0
  313. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_azure_client.py +0 -0
  314. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_azure_embedding_client.py +0 -0
  315. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_llm_types.py +0 -0
  316. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_openai_client.py +0 -0
  317. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_openai_embedding_client.py +0 -0
  318. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_pricing.py +0 -0
  319. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_retry_observability.py +0 -0
  320. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_retry_policy_api.py +0 -0
  321. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/llm/test_retryable_error_substrings.py +0 -0
  322. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/memory/test_memory.py +0 -0
  323. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_context_compaction.py +0 -0
  324. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
  325. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_middleware_chain.py +0 -0
  326. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_otel.py +0 -0
  327. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_retry_middleware.py +0 -0
  328. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_sql_usage.py +0 -0
  329. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/middleware/test_usage_logger.py +0 -0
  330. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/__init__.py +0 -0
  331. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_base.py +0 -0
  332. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_base_integration.py +0 -0
  333. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_config.py +0 -0
  334. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_description_tunable.py +0 -0
  335. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_gepa.py +0 -0
  336. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_mipro.py +0 -0
  337. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_orchestrator_optim.py +0 -0
  338. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_pareto.py +0 -0
  339. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_reflective.py +0 -0
  340. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_score_integrity.py +0 -0
  341. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_spec.py +0 -0
  342. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/optim/test_trace.py +0 -0
  343. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
  344. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_base_orchestrator.py +0 -0
  345. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
  346. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_history_tool_call_pairing.py +0 -0
  347. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestration_usage_breakdown.py +0 -0
  348. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_agent_contract.py +0 -0
  349. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
  350. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_member_events.py +0 -0
  351. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_otel.py +0 -0
  352. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_orchestrator_synthesis.py +0 -0
  353. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
  354. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/orchestration/test_round_robin.py +0 -0
  355. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_agents.py +0 -0
  356. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_clients.py +0 -0
  357. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_instruction_registry.py +0 -0
  358. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_orchestration.py +0 -0
  359. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_streaming.py +0 -0
  360. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/presets/test_workflow.py +0 -0
  361. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/__init__.py +0 -0
  362. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/test_base.py +0 -0
  363. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/test_resources.py +0 -0
  364. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/test_scripts.py +0 -0
  365. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/skills/test_sources.py +0 -0
  366. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_base.py +0 -0
  367. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_cancellation.py +0 -0
  368. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_composite.py +0 -0
  369. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_consecutive_agent.py +0 -0
  370. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_external.py +0 -0
  371. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_function_call.py +0 -0
  372. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_handoff.py +0 -0
  373. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_max_message.py +0 -0
  374. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_predicate.py +0 -0
  375. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_source.py +0 -0
  376. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_text_mention.py +0 -0
  377. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_timeout.py +0 -0
  378. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/termination/test_token_usage.py +0 -0
  379. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_cancellation_token.py +0 -0
  380. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_context.py +0 -0
  381. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_logger.py +0 -0
  382. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_messages.py +0 -0
  383. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_option_enums.py +0 -0
  384. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_package_api.py +0 -0
  385. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_session_store.py +0 -0
  386. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_types.py +0 -0
  387. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/test_vanilla_chunker.py +0 -0
  388. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/tools/test_coding_tools.py +0 -0
  389. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/tools/test_memory_tool.py +0 -0
  390. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/tools/test_tools.py +0 -0
  391. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/__init__.py +0 -0
  392. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/helpers.py +0 -0
  393. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_execution.py +0 -0
  394. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_package_api.py +0 -0
  395. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_registry.py +0 -0
  396. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_server.py +0 -0
  397. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_sessions.py +0 -0
  398. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/webui/test_workflow_streaming.py +0 -0
  399. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/recovery_worker.py +0 -0
  400. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_agent_step_imports.py +0 -0
  401. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_checkpoint.py +0 -0
  402. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_subworkflow_step.py +0 -0
  403. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_agent.py +0 -0
  404. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_class.py +0 -0
  405. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_models.py +0 -0
  406. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_reliability.py +0 -0
  407. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_runner.py +0 -0
  408. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_schema.py +0 -0
  409. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_steps.py +0 -0
  410. {agentbyte-0.46.0 → agentbyte-0.48.0}/tests/workflow/test_workflow_visualizer.py +0 -0
@@ -72,6 +72,9 @@ data/flatfiles/*
72
72
  *.sqlite-shm
73
73
  *.writer.lock
74
74
 
75
+ # Per-project runtime state (eval history, checkpoints) written by agentbyte
76
+ .agentbyte/
77
+
75
78
  # Optimization reports written by notebooks (report.md, report.json, trace.json)
76
79
  optim-reports/
77
80
 
@@ -6,6 +6,65 @@ The format follows Keep a Changelog principles and semantic versioning.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.48.0] - 2026-10-06
10
+
11
+ ### Added
12
+
13
+ - Evaluation suite workspace and score-aware optimization outcome (spec 0069): `suite` is a
14
+ first-class, indexed column on eval runs (`list_runs(suite=)`, `GET /api/eval/runs?suite=`), and
15
+ `OptimizationReport`/`OptimizationRunRecord` expose a shared `OptimizationOutcome`
16
+ (`improved` / `seed_kept` / `best_candidate_changed`) via `classify_outcome`.
17
+ - Agent as a first-class history dimension (spec 0070): `agent_id`/`agent_name` on `EvalRunRecord`
18
+ and `OptimizationRunRecord` (indexed `agent_id`, defaulted from `target_id`), `list_runs(agent=)`
19
+ / `list_optimizations(agent=)`, `GET /api/eval/agents` and `?agent=` filters. `EvalSuite` declares
20
+ `agent_id`/`agent_name`/`agent_description`; `EvalSuiteRegistry` builds agent cards and raises
21
+ `DuplicateAgentError` when one `agent_id` maps to two names. The WebUI Evaluations tab is now an
22
+ agent-card gallery with per-agent pages (suites + Run, grouped history, server-side pagination).
23
+ - `SqlEvalRunStore.from_sqlite_path` / `from_url` convenience constructors that own the engine
24
+ (spec 0071).
25
+
26
+ ### Changed
27
+
28
+ - One storage backend for evaluation history (spec 0071): `SqlEvalRunStore` (SQLAlchemy Core) now
29
+ serves both SQLite and PostgreSQL. The hand-written raw-SQL SQLite store was retired;
30
+ `SQLiteEvalRunStore` is kept as a thin backward-compatible alias. SQLite gets a single-writer file
31
+ lock, `PRAGMA synchronous=FULL` and schema auto-migration; the row format is unchanged, so existing
32
+ `.sqlite` files open with no data migration. History store schema migrates forward to layout 4.
33
+ - The `sqlite` extra now also provides `sqlalchemy[asyncio]` (needed by the unified store); `import
34
+ agentbyte` with core dependencies only is unchanged.
35
+
36
+ ## [0.47.0] - 2026-10-06
37
+
38
+ ### Added
39
+
40
+ - MCP tool bridge (spec 0013, `mcp` extra): `agentbyte.tools.mcp` with `MCPClientManager`, `MCPTool`
41
+ and `create_mcp_tools()` over the official MCP SDK (v2).
42
+ - WebUI MCP Playground: connect to MCP servers, browse capabilities and tools, call tools, read app
43
+ resources, and answer pending inputs from the Playground. It is off by default
44
+ (`AgentbyteWebUIServer(mcp_playground=True)`) because it can launch subprocesses and make outbound
45
+ connections on request.
46
+ - A2A 1.0 adapters (spec 0013, `a2a` extra): `AgentByteExecutor`, `create_a2a_app`,
47
+ `agent_card_from_agent` to serve an agent, and `A2ATool` to call one, as thin adapters over the
48
+ official `a2a-sdk` 1.x. Human approval maps to `input-required` and resumes on the same task.
49
+ - `agentbyte serve`: a localhost-only development command for serving an agent over A2A.
50
+ - `DistributedContextManager` and two `examples/distributed/` patterns.
51
+
52
+ ### Changed
53
+
54
+ - Local SQLite state now lives under `.agentbyte/` instead of the working-directory root. The default
55
+ evaluation history is `.agentbyte/eval/default/eval.sqlite` (was `./eval.sqlite`) for
56
+ `agentbyte eval`, `agentbyte optim` and `agentbyte webui --eval-catalog`, and examples and notebooks use
57
+ one folder per project (`.agentbyte/eval/<project>/eval.sqlite` with its `.writer.lock` beside it).
58
+ `SQLiteEvalRunStore` (writers) and `SQLiteCheckpointStore` create the parent directories on open.
59
+ Explicit paths, `--history PATH` and `:memory:` behave as before. Existing history files are not moved
60
+ automatically: pass `--history` or move them into the new folder.
61
+
62
+ ### Removed
63
+
64
+ - **Breaking:** the hand-written A2A 0.3 client, server, models and errors (`agentbyte.a2a` from the
65
+ unreleased 0.6.0/0.7.0 development phases) are gone, with no 0.3 compatibility. Use the A2A 1.0
66
+ adapters above; authentication is left to host Starlette middleware or SDK interceptors.
67
+
9
68
  ## [0.46.0] - 2026-10-05
10
69
 
11
70
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentbyte
3
- Version: 0.46.0
3
+ Version: 0.48.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
@@ -10,6 +10,10 @@ Requires-Dist: httpx>=0.28.1
10
10
  Requires-Dist: pydantic-settings>=2.13.0
11
11
  Requires-Dist: pydantic>=2.12.5
12
12
  Requires-Dist: pyyaml>=6.0.3
13
+ Provides-Extra: a2a
14
+ Requires-Dist: a2a-sdk[http-server]<2,>=1.2; extra == 'a2a'
15
+ Requires-Dist: fastapi>=0.135.2; extra == 'a2a'
16
+ Requires-Dist: uvicorn[standard]>=0.44.0; extra == 'a2a'
13
17
  Provides-Extra: all
14
18
  Requires-Dist: aioboto3>=15.5.0; extra == 'all'
15
19
  Requires-Dist: aiosqlite>=0.22.1; extra == 'all'
@@ -40,6 +44,8 @@ Provides-Extra: gunicorn
40
44
  Requires-Dist: fastapi>=0.135.2; extra == 'gunicorn'
41
45
  Requires-Dist: gunicorn>=23.0.0; extra == 'gunicorn'
42
46
  Requires-Dist: uvicorn[standard]>=0.44.0; extra == 'gunicorn'
47
+ Provides-Extra: mcp
48
+ Requires-Dist: mcp<3,>=2.0.0; extra == 'mcp'
43
49
  Provides-Extra: openai
44
50
  Requires-Dist: openai>=1.107.1; extra == 'openai'
45
51
  Provides-Extra: optim
@@ -64,6 +70,7 @@ Requires-Dist: sqlalchemy[asyncio]>=2.0.43; extra == 'sql'
64
70
  Requires-Dist: sqlmodel>=0.0.38; extra == 'sql'
65
71
  Provides-Extra: sqlite
66
72
  Requires-Dist: aiosqlite>=0.22.1; extra == 'sqlite'
73
+ Requires-Dist: sqlalchemy[asyncio]>=2.0.43; extra == 'sqlite'
67
74
  Provides-Extra: tiktoken
68
75
  Requires-Dist: tiktoken>=0.9.0; extra == 'tiktoken'
69
76
  Provides-Extra: viz
@@ -77,7 +84,7 @@ Description-Content-Type: text/markdown
77
84
 
78
85
  Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
79
86
 
80
- Current release: **0.46.0**
87
+ Current release: **0.48.0**
81
88
 
82
89
  ## Building an Agent
83
90
 
@@ -311,17 +318,24 @@ uv add "agentbyte[openai,sqlite]"
311
318
  | `otel` | OpenTelemetry API, SDK, OTLP exporter | OpenTelemetry tracing and metrics |
312
319
  | `webui` | `fastapi`, `uvicorn` | `agentbyte webui` |
313
320
  | `gunicorn` | `webui` + `gunicorn` | Production single-worker serving (`gunicorn -k uvicorn.workers.UvicornWorker -w 1`) |
314
- | `sqlite` | `aiosqlite` | SQLite datasets, workflow checkpoints, evaluation history |
315
- | `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, `SqlEvalRunStore` |
321
+ | `sqlite` | `aiosqlite`, `sqlalchemy[asyncio]` | SQLite datasets, workflow checkpoints, evaluation history (`SqlEvalRunStore` over `sqlite+aiosqlite`) |
322
+ | `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, PostgreSQL `SqlEvalRunStore` |
316
323
  | `sql` | `sqlite` + `postgres` | Both SQL backends |
317
324
  | `tiktoken` | `tiktoken` | `TiktokenCounter` for exact compaction token counts |
318
325
  | `optim` | `gepa` | `optimize_with_gepa()` |
319
326
  | `viz` | `graphviz` | `WorkflowVisualizer.to_dot()` |
320
327
  | `research` | `beautifulsoup4`, `html2text`, `arxiv`, `youtube-transcript-api` | `agentbyte.tools.research_tools` |
321
- | `all` | every extra above | Everything |
328
+ | `mcp` | `mcp` (SDK v2) | `agentbyte.tools.mcp`: MCP tool bridge (`MCPClientManager`, `MCPTool`, `create_mcp_tools()`); also enables the WebUI MCP Playground routes |
329
+ | `a2a` | `a2a-sdk[http-server]` 1.x, `agentbyte[webui]` | `agentbyte.a2a`: A2A 1.0 adapters on the official SDK — `create_a2a_app` / `AgentByteExecutor` to serve an agent, `A2ATool` to call one, `agentbyte serve` for local dev |
330
+ | `all` | every extra above except `mcp`/`a2a`* | Everything except the MCP/A2A protocol bridges |
331
+
332
+ *`mcp` and `a2a` are deliberately excluded from `all`: both let an agent reach outside the
333
+ process (subprocess tools, outbound HTTP to arbitrary agents) and are opt-in rather than
334
+ bundled by default. Install them explicitly: `pip install "agentbyte[mcp,a2a]"`.
322
335
 
323
336
  Contributors working in this repository install every extra plus the local tooling groups
324
- (`test`, `dev`, `experiment`):
337
+ (`test`, `dev`, `experiment`) — this always includes `mcp`/`a2a` regardless of the `all`
338
+ composite above, since `--all-extras` syncs every defined extra individually:
325
339
 
326
340
  ```bash
327
341
  uv sync --all-extras --all-groups
@@ -342,7 +356,7 @@ No API key needed: three demo agents, a team and a workflow on a fake model clie
342
356
 
343
357
  ```bash
344
358
  uv run python examples/webui/in_memory.py # http://127.0.0.1:8070
345
- uv run python examples/webui/in_memory.py --eval-history eval.sqlite # plus Evaluations
359
+ uv run python examples/webui/in_memory.py --eval-history .agentbyte/eval/default/eval.sqlite # plus Evaluations
346
360
  ```
347
361
 
348
362
  With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workflow:
@@ -350,7 +364,7 @@ With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workf
350
364
  ```bash
351
365
  uv sync --extra webui --extra openai # or --extra azureopenai
352
366
  uv run python examples/webui/presets_webui.py # http://127.0.0.1:8080
353
- uv run python examples/webui/presets_webui.py --eval-history eval.sqlite
367
+ uv run python examples/webui/presets_webui.py --eval-history .agentbyte/eval/default/eval.sqlite
354
368
  ```
355
369
 
356
370
  Both launchers accept `--port`, `--no-open`, `--eval-history PATH` and `--eval-catalog CATALOG`
@@ -368,7 +382,7 @@ uv run agentbyte eval ui --catalog examples/eval/workbench_catalog.py # htt
368
382
 
369
383
  - `--catalog` takes a `.py` file or a module path (`myapp.evaluations`); add `:name` only when the
370
384
  file defines more than one registry. Without `--catalog` it serves the built-in smoke suite.
371
- - Runs are stored in `./eval.sqlite` unless you pass `--history PATH`. Only one process can write
385
+ - Runs are stored in `./.agentbyte/eval/default/eval.sqlite` unless you pass `--history PATH`. Only one process can write
372
386
  a history file: stop the UI before `agentbyte eval run` on the same file, or use another file.
373
387
  - The same catalog works in the terminal: `uv run agentbyte eval run capitals --catalog examples/eval/workbench_catalog.py`.
374
388
  - To serve agents and Evaluations together: `agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py`.
@@ -399,7 +413,7 @@ uv run agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py #
399
413
  from agentbyte.webui import serve
400
414
 
401
415
  serve(entities=[agent], port=8080)
402
- serve(entities=[agent], eval_registry=registry, eval_history="eval.sqlite") # with Evaluations
416
+ serve(entities=[agent], eval_registry=registry, eval_history=".agentbyte/eval/default/eval.sqlite") # with Evaluations
403
417
  ```
404
418
 
405
419
  ### Quick Troubleshooting
@@ -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.46.0**
5
+ Current release: **0.48.0**
6
6
 
7
7
  ## Building an Agent
8
8
 
@@ -236,17 +236,24 @@ uv add "agentbyte[openai,sqlite]"
236
236
  | `otel` | OpenTelemetry API, SDK, OTLP exporter | OpenTelemetry tracing and metrics |
237
237
  | `webui` | `fastapi`, `uvicorn` | `agentbyte webui` |
238
238
  | `gunicorn` | `webui` + `gunicorn` | Production single-worker serving (`gunicorn -k uvicorn.workers.UvicornWorker -w 1`) |
239
- | `sqlite` | `aiosqlite` | SQLite datasets, workflow checkpoints, evaluation history |
240
- | `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, `SqlEvalRunStore` |
239
+ | `sqlite` | `aiosqlite`, `sqlalchemy[asyncio]` | SQLite datasets, workflow checkpoints, evaluation history (`SqlEvalRunStore` over `sqlite+aiosqlite`) |
240
+ | `postgres` | `sqlalchemy[asyncio]`, `sqlmodel`, `asyncpg` | `SqlUsageBackend`, PostgreSQL `SqlEvalRunStore` |
241
241
  | `sql` | `sqlite` + `postgres` | Both SQL backends |
242
242
  | `tiktoken` | `tiktoken` | `TiktokenCounter` for exact compaction token counts |
243
243
  | `optim` | `gepa` | `optimize_with_gepa()` |
244
244
  | `viz` | `graphviz` | `WorkflowVisualizer.to_dot()` |
245
245
  | `research` | `beautifulsoup4`, `html2text`, `arxiv`, `youtube-transcript-api` | `agentbyte.tools.research_tools` |
246
- | `all` | every extra above | Everything |
246
+ | `mcp` | `mcp` (SDK v2) | `agentbyte.tools.mcp`: MCP tool bridge (`MCPClientManager`, `MCPTool`, `create_mcp_tools()`); also enables the WebUI MCP Playground routes |
247
+ | `a2a` | `a2a-sdk[http-server]` 1.x, `agentbyte[webui]` | `agentbyte.a2a`: A2A 1.0 adapters on the official SDK — `create_a2a_app` / `AgentByteExecutor` to serve an agent, `A2ATool` to call one, `agentbyte serve` for local dev |
248
+ | `all` | every extra above except `mcp`/`a2a`* | Everything except the MCP/A2A protocol bridges |
249
+
250
+ *`mcp` and `a2a` are deliberately excluded from `all`: both let an agent reach outside the
251
+ process (subprocess tools, outbound HTTP to arbitrary agents) and are opt-in rather than
252
+ bundled by default. Install them explicitly: `pip install "agentbyte[mcp,a2a]"`.
247
253
 
248
254
  Contributors working in this repository install every extra plus the local tooling groups
249
- (`test`, `dev`, `experiment`):
255
+ (`test`, `dev`, `experiment`) — this always includes `mcp`/`a2a` regardless of the `all`
256
+ composite above, since `--all-extras` syncs every defined extra individually:
250
257
 
251
258
  ```bash
252
259
  uv sync --all-extras --all-groups
@@ -267,7 +274,7 @@ No API key needed: three demo agents, a team and a workflow on a fake model clie
267
274
 
268
275
  ```bash
269
276
  uv run python examples/webui/in_memory.py # http://127.0.0.1:8070
270
- uv run python examples/webui/in_memory.py --eval-history eval.sqlite # plus Evaluations
277
+ uv run python examples/webui/in_memory.py --eval-history .agentbyte/eval/default/eval.sqlite # plus Evaluations
271
278
  ```
272
279
 
273
280
  With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workflow:
@@ -275,7 +282,7 @@ With your OpenAI or Azure OpenAI credentials, the preset agents, teams and workf
275
282
  ```bash
276
283
  uv sync --extra webui --extra openai # or --extra azureopenai
277
284
  uv run python examples/webui/presets_webui.py # http://127.0.0.1:8080
278
- uv run python examples/webui/presets_webui.py --eval-history eval.sqlite
285
+ uv run python examples/webui/presets_webui.py --eval-history .agentbyte/eval/default/eval.sqlite
279
286
  ```
280
287
 
281
288
  Both launchers accept `--port`, `--no-open`, `--eval-history PATH` and `--eval-catalog CATALOG`
@@ -293,7 +300,7 @@ uv run agentbyte eval ui --catalog examples/eval/workbench_catalog.py # htt
293
300
 
294
301
  - `--catalog` takes a `.py` file or a module path (`myapp.evaluations`); add `:name` only when the
295
302
  file defines more than one registry. Without `--catalog` it serves the built-in smoke suite.
296
- - Runs are stored in `./eval.sqlite` unless you pass `--history PATH`. Only one process can write
303
+ - Runs are stored in `./.agentbyte/eval/default/eval.sqlite` unless you pass `--history PATH`. Only one process can write
297
304
  a history file: stop the UI before `agentbyte eval run` on the same file, or use another file.
298
305
  - The same catalog works in the terminal: `uv run agentbyte eval run capitals --catalog examples/eval/workbench_catalog.py`.
299
306
  - To serve agents and Evaluations together: `agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py`.
@@ -324,7 +331,7 @@ uv run agentbyte webui --dir my_entities --eval-catalog myapp/evaluations.py #
324
331
  from agentbyte.webui import serve
325
332
 
326
333
  serve(entities=[agent], port=8080)
327
- serve(entities=[agent], eval_registry=registry, eval_history="eval.sqlite") # with Evaluations
334
+ serve(entities=[agent], eval_registry=registry, eval_history=".agentbyte/eval/default/eval.sqlite") # with Evaluations
328
335
  ```
329
336
 
330
337
  ### Quick Troubleshooting
@@ -42,6 +42,7 @@ gunicorn = [
42
42
  ]
43
43
  sqlite = [
44
44
  "aiosqlite>=0.22.1",
45
+ "sqlalchemy[asyncio]>=2.0.43",
45
46
  ]
46
47
  postgres = [
47
48
  "sqlalchemy[asyncio]>=2.0.43",
@@ -66,6 +67,14 @@ research = [
66
67
  "arxiv>=2.1",
67
68
  "youtube-transcript-api>=0.6",
68
69
  ]
70
+ mcp = [
71
+ "mcp>=2.0.0,<3",
72
+ ]
73
+ # A2A 1.0 via the official SDK; uvicorn (webui) runs `agentbyte serve`.
74
+ a2a = [
75
+ "a2a-sdk[http-server]>=1.2,<2",
76
+ "agentbyte[webui]",
77
+ ]
69
78
  all = [
70
79
  "agentbyte[openai,azureopenai,aws,otel,webui,gunicorn,sql,tiktoken,optim,viz,research]",
71
80
  ]
@@ -0,0 +1,2 @@
1
+ __version__ = "0.48.0"
2
+ VERSION = __version__
@@ -0,0 +1,47 @@
1
+ """A2A 1.0 adapters on the official SDK (`a2a-sdk`), plus distributed-context helpers.
2
+
3
+ Import from this package explicitly; no parent package re-exports it. The SDK owns
4
+ the protocol (wire format, transports, task store, streaming); AgentByte adds only:
5
+
6
+ - `AgentByteExecutor` — serve an AgentByte agent as an SDK `AgentExecutor`
7
+ - `create_a2a_app` / `agent_card_from_agent` — a ready Starlette app and default card
8
+ - `A2ATool` — call a remote A2A agent as a native tool, over an SDK `Client`
9
+
10
+ No authentication is built in: hosts add Starlette middleware on the server and SDK
11
+ interceptors on the client. SDK-backed names need the ``a2a`` extra and are imported
12
+ lazily, so `DistributedContextManager` works with the base install.
13
+ """
14
+
15
+ from __future__ import annotations
16
+
17
+ import importlib
18
+ from typing import TYPE_CHECKING, Any
19
+
20
+ if TYPE_CHECKING:
21
+ from agentbyte.a2a.app import agent_card_from_agent, create_a2a_app
22
+ from agentbyte.a2a.distributed_context import DistributedContextManager
23
+ from agentbyte.a2a.executor import AgentByteExecutor
24
+ from agentbyte.a2a.tool import A2ATool
25
+
26
+ _EXPORTS = {
27
+ "A2ATool": "agentbyte.a2a.tool",
28
+ "AgentByteExecutor": "agentbyte.a2a.executor",
29
+ "DistributedContextManager": "agentbyte.a2a.distributed_context",
30
+ "agent_card_from_agent": "agentbyte.a2a.app",
31
+ "create_a2a_app": "agentbyte.a2a.app",
32
+ }
33
+
34
+ __all__ = [
35
+ "A2ATool",
36
+ "AgentByteExecutor",
37
+ "DistributedContextManager",
38
+ "agent_card_from_agent",
39
+ "create_a2a_app",
40
+ ]
41
+
42
+
43
+ def __getattr__(name: str) -> Any:
44
+ module = _EXPORTS.get(name)
45
+ if module is None:
46
+ raise AttributeError(f"module 'agentbyte.a2a' has no attribute {name!r}")
47
+ return getattr(importlib.import_module(module), name)
@@ -0,0 +1,98 @@
1
+ """Agent Card and ASGI app helpers around the official A2A 1.0 SDK.
2
+
3
+ `create_a2a_app()` adds no authentication: pass the host's own Starlette
4
+ middleware (e.g. `AuthenticationMiddleware`). The SDK scopes tasks to the
5
+ authenticated user name; without auth every caller shares one anonymous owner,
6
+ which is only acceptable on localhost.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from collections.abc import AsyncIterator, Sequence
12
+ from contextlib import asynccontextmanager
13
+ from typing import Any
14
+ from urllib.parse import urlsplit
15
+
16
+ from agentbyte._optional import MissingExtraError
17
+ from agentbyte.a2a.executor import AgentByteExecutor
18
+
19
+ try:
20
+ from a2a.server.request_handlers import DefaultRequestHandler
21
+ from a2a.server.routes import create_agent_card_routes, create_jsonrpc_routes
22
+ from a2a.server.tasks import InMemoryTaskStore, TaskStore
23
+ from a2a.types import (
24
+ AgentCapabilities,
25
+ AgentCard,
26
+ AgentInterface,
27
+ AgentSkill,
28
+ )
29
+ from a2a.utils.constants import PROTOCOL_VERSION_1_0, TransportProtocol
30
+ from starlette.applications import Starlette
31
+ from starlette.middleware import Middleware
32
+ except ImportError as exc:
33
+ raise MissingExtraError("agentbyte.a2a (missing a2a-sdk)", "a2a", name="a2a") from exc
34
+
35
+ TEXT_AND_JSON = ["text/plain", "application/json"]
36
+
37
+
38
+ def agent_card_from_agent(agent: Any, *, url: str, version: str = "1.0.0") -> AgentCard:
39
+ """Build a default A2A 1.0 card: one JSON-RPC interface at `url`, one skill.
40
+
41
+ The card advertises no security scheme. To advertise one, set
42
+ `card.security_schemes` / `card.security_requirements` on the returned
43
+ protobuf, and enforce it with the host's middleware.
44
+ """
45
+ description = agent.description or agent.name
46
+ return AgentCard(
47
+ name=agent.name,
48
+ description=description,
49
+ version=version,
50
+ supported_interfaces=[AgentInterface(
51
+ url=url,
52
+ protocol_binding=TransportProtocol.JSONRPC.value,
53
+ protocol_version=PROTOCOL_VERSION_1_0,
54
+ )],
55
+ capabilities=AgentCapabilities(streaming=True, push_notifications=False),
56
+ default_input_modes=TEXT_AND_JSON,
57
+ default_output_modes=TEXT_AND_JSON,
58
+ skills=[AgentSkill(
59
+ id=agent.name, name=agent.name, description=description, tags=[],
60
+ examples=list(getattr(agent, "example_tasks", None) or []),
61
+ )],
62
+ )
63
+
64
+
65
+ def create_a2a_app(
66
+ agent: Any,
67
+ *,
68
+ url: str,
69
+ agent_card: AgentCard | None = None,
70
+ task_store: TaskStore | None = None,
71
+ middleware: Sequence[Middleware] = (),
72
+ max_contexts: int = 1024,
73
+ ) -> Starlette:
74
+ """Serve `agent` over A2A 1.0 JSON-RPC as a Starlette app.
75
+
76
+ Routes: `/.well-known/agent-card.json` and the JSON-RPC endpoint at `url`'s
77
+ path. `task_store` defaults to the SDK's in-memory store; native agent
78
+ conversation state is always process-local (see `AgentByteExecutor`).
79
+ """
80
+ card = agent_card or agent_card_from_agent(agent, url=url)
81
+ handler = DefaultRequestHandler(
82
+ agent_executor=AgentByteExecutor(agent, max_contexts=max_contexts),
83
+ task_store=task_store or InMemoryTaskStore(),
84
+ agent_card=card,
85
+ )
86
+
87
+ @asynccontextmanager
88
+ async def lifespan(app: Starlette) -> AsyncIterator[None]:
89
+ try:
90
+ yield
91
+ finally:
92
+ await handler.aclose()
93
+
94
+ routes = [
95
+ *create_agent_card_routes(card),
96
+ *create_jsonrpc_routes(handler, rpc_url=urlsplit(url).path or "/"),
97
+ ]
98
+ return Starlette(routes=routes, middleware=list(middleware), lifespan=lifespan)
@@ -0,0 +1,180 @@
1
+ """Owner-scoped, process-local artifact references with host-controlled resolution."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import math
7
+ import time
8
+ from collections import OrderedDict
9
+ from collections.abc import Awaitable, Callable
10
+ from dataclasses import dataclass, replace
11
+
12
+
13
+ @dataclass(frozen=True)
14
+ class _Reference:
15
+ uri: str
16
+ expires_at: float
17
+
18
+
19
+ class DistributedContextManager:
20
+ """Track references for one authenticated owner on one event loop.
21
+
22
+ The host supplies ``resolver(owner_id, uri)`` and is responsible for URI
23
+ allowlisting, authorization, transport limits and external storage lifecycle.
24
+ No URI is fetched implicitly. Use a separate manager per owner; never derive
25
+ owner_id from untrusted task input. Cached reads bypass the resolver until
26
+ cache expiry, so authorization revocation must call invalidate or unregister.
27
+
28
+ Registrations expire after ``artifact_ttl``; cached UTF-8 text has a separate
29
+ TTL and LRU byte/entry limits. Oversized text is rejected. Failures and
30
+ cancellations are not cached or retried. Concurrent misses resolve separately.
31
+ Invalidation during a resolve rejects its result with KeyError. All state is
32
+ lost on restart; clear/unregister never delete external artifacts.
33
+ """
34
+
35
+ def __init__(
36
+ self,
37
+ *,
38
+ owner_id: str,
39
+ resolver: Callable[[str, str], Awaitable[str]],
40
+ max_artifacts: int = 1024,
41
+ max_cache_entries: int = 128,
42
+ max_cache_bytes: int = 8 * 1024 * 1024,
43
+ max_content_bytes: int = 1024 * 1024,
44
+ artifact_ttl: float = 3600,
45
+ cache_ttl: float = 60,
46
+ resolve_timeout: float = 30,
47
+ clock: Callable[[], float] = time.monotonic,
48
+ ) -> None:
49
+ """Configure finite positive limits; clock must be monotonic."""
50
+ self._validate_text(owner_id, "owner_id")
51
+ for name, value in (
52
+ ("max_artifacts", max_artifacts),
53
+ ("max_cache_entries", max_cache_entries),
54
+ ("max_cache_bytes", max_cache_bytes),
55
+ ("max_content_bytes", max_content_bytes),
56
+ ):
57
+ if isinstance(value, bool) or not isinstance(value, int) or value <= 0:
58
+ raise ValueError(f"{name} must be a positive integer")
59
+ for value in (artifact_ttl, cache_ttl, resolve_timeout):
60
+ self._validate_ttl(value)
61
+ if not callable(resolver):
62
+ raise TypeError("resolver must be an async callable")
63
+ self._owner_id = owner_id
64
+ self._resolver = resolver
65
+ self._max_artifacts = max_artifacts
66
+ self._max_cache_entries = max_cache_entries
67
+ self._max_cache_bytes = max_cache_bytes
68
+ self._max_content_bytes = max_content_bytes
69
+ self._artifact_ttl = artifact_ttl
70
+ self._cache_ttl = cache_ttl
71
+ self._resolve_timeout = resolve_timeout
72
+ self._clock = clock
73
+ self._references: dict[str, _Reference] = {}
74
+ self._cache: OrderedDict[str, tuple[str, float, int]] = OrderedDict()
75
+ self._cache_bytes = 0
76
+
77
+ @property
78
+ def owner_id(self) -> str:
79
+ """The host-authenticated scope of this manager (read-only)."""
80
+ return self._owner_id
81
+
82
+ @staticmethod
83
+ def _validate_text(value: str, name: str) -> None:
84
+ if not isinstance(value, str) or not value.strip():
85
+ raise ValueError(f"{name} must be nonempty text")
86
+
87
+ @staticmethod
88
+ def _validate_ttl(value: float) -> None:
89
+ if isinstance(value, bool) or not math.isfinite(value) or value <= 0:
90
+ raise ValueError("TTL and timeout must be finite and positive")
91
+
92
+ def _drop_cache(self, key: str) -> None:
93
+ cached = self._cache.pop(key, None)
94
+ if cached is not None:
95
+ self._cache_bytes -= cached[2]
96
+
97
+ def _prune(self) -> None:
98
+ now = self._clock()
99
+ for key, reference in list(self._references.items()):
100
+ if reference.expires_at <= now:
101
+ del self._references[key]
102
+ self._drop_cache(key)
103
+ for key, (_, expires_at, _) in list(self._cache.items()):
104
+ if expires_at <= now:
105
+ self._drop_cache(key)
106
+
107
+ def register_artifact(self, key: str, uri: str, *, ttl: float | None = None) -> None:
108
+ """Register/replace an opaque URI; replacement invalidates cached reads.
109
+
110
+ At registration capacity, raise ValueError instead of evicting references.
111
+ ``ttl`` overrides the default lifetime starting at registration time.
112
+ """
113
+ self._validate_text(key, "key")
114
+ self._validate_text(uri, "uri")
115
+ lifetime = self._artifact_ttl if ttl is None else ttl
116
+ self._validate_ttl(lifetime)
117
+ self._prune()
118
+ if key not in self._references and len(self._references) >= self._max_artifacts:
119
+ raise ValueError("Artifact registration capacity reached")
120
+ self._drop_cache(key)
121
+ self._references[key] = _Reference(uri, self._clock() + lifetime)
122
+
123
+ async def resolve(self, key: str) -> str:
124
+ """Resolve registered text, raising KeyError for absent/stale references.
125
+
126
+ Resolver exceptions propagate unchanged; TimeoutError bounds each fetch.
127
+ A resolved payload exceeding max_content_bytes raises ValueError. Payloads
128
+ larger than the cache byte budget are returned without caching.
129
+ """
130
+ self._prune()
131
+ reference = self._references[key]
132
+ if key in self._cache:
133
+ self._cache.move_to_end(key)
134
+ return self._cache[key][0]
135
+ async with asyncio.timeout(self._resolve_timeout):
136
+ content = await self._resolver(self._owner_id, reference.uri)
137
+ self._prune()
138
+ if self._references.get(key) is not reference:
139
+ raise KeyError(key)
140
+ if not isinstance(content, str):
141
+ raise TypeError("Artifact resolver must return str")
142
+ size = len(content.encode("utf-8"))
143
+ if size > self._max_content_bytes:
144
+ raise ValueError("Resolved artifact exceeds max_content_bytes")
145
+ if size <= self._max_cache_bytes:
146
+ self._drop_cache(key)
147
+ while self._cache and (
148
+ len(self._cache) >= self._max_cache_entries
149
+ or self._cache_bytes + size > self._max_cache_bytes
150
+ ):
151
+ self._drop_cache(next(iter(self._cache)))
152
+ self._cache[key] = (
153
+ content,
154
+ min(reference.expires_at, self._clock() + self._cache_ttl),
155
+ size,
156
+ )
157
+ self._cache_bytes += size
158
+ return content
159
+
160
+ def invalidate(self, key: str) -> bool:
161
+ """Forget fetched content and reject in-flight reads, retaining the URI."""
162
+ self._prune()
163
+ self._drop_cache(key)
164
+ reference = self._references.get(key)
165
+ if reference is None:
166
+ return False
167
+ self._references[key] = replace(reference)
168
+ return True
169
+
170
+ def unregister(self, key: str) -> bool:
171
+ """Remove a reference/cache entry and reject its in-flight reads."""
172
+ self._prune()
173
+ self._drop_cache(key)
174
+ return self._references.pop(key, None) is not None
175
+
176
+ def clear(self) -> None:
177
+ """Forget all local references/content and reject all in-flight reads."""
178
+ self._references.clear()
179
+ self._cache.clear()
180
+ self._cache_bytes = 0