agentbyte 0.52.0__tar.gz → 0.53.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 (438) hide show
  1. {agentbyte-0.52.0 → agentbyte-0.53.0}/CHANGELOG.md +40 -0
  2. {agentbyte-0.52.0 → agentbyte-0.53.0}/PKG-INFO +4 -2
  3. {agentbyte-0.52.0 → agentbyte-0.53.0}/README.md +3 -1
  4. agentbyte-0.53.0/src/agentbyte/__about__.py +2 -0
  5. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/agents/__init__.py +0 -4
  6. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/agents/base.py +32 -0
  7. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/agents/types.py +0 -12
  8. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/__init__.py +4 -0
  9. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/anthropic/_conversion.py +6 -5
  10. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/anthropic/chat.py +6 -2
  11. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/azure/chat.py +17 -6
  12. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/azure/embedding.py +11 -1
  13. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/base.py +38 -3
  14. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/bedrock/anthropic_chat.py +6 -2
  15. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/bedrock/cohere_embedding.py +6 -4
  16. agentbyte-0.52.0/src/agentbyte/agents/embedding_agent.py → agentbyte-0.53.0/src/agentbyte/llm/embedding_batcher.py +18 -47
  17. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/embeddings_base.py +40 -2
  18. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/openai/chat.py +11 -6
  19. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/openai/embedding.py +5 -1
  20. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/types.py +14 -0
  21. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/middleware/__init__.py +2 -0
  22. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/middleware/base.py +16 -3
  23. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/middleware/otel.py +2 -2
  24. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/streaming.py +1 -1
  25. agentbyte-0.53.0/tests/agents/test_agent_client_middleware_overlap.py +83 -0
  26. agentbyte-0.53.0/tests/llm/test_client_middleware.py +185 -0
  27. agentbyte-0.52.0/tests/agents/test_embedding_agent.py → agentbyte-0.53.0/tests/llm/test_embedding_batcher.py +26 -90
  28. agentbyte-0.52.0/src/agentbyte/__about__.py +0 -2
  29. {agentbyte-0.52.0 → agentbyte-0.53.0}/.gitignore +0 -0
  30. {agentbyte-0.52.0 → agentbyte-0.53.0}/LICENSE +0 -0
  31. {agentbyte-0.52.0 → agentbyte-0.53.0}/pyproject.toml +0 -0
  32. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/__init__.py +0 -0
  33. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/_optional.py +0 -0
  34. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/a2a/__init__.py +0 -0
  35. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/a2a/app.py +0 -0
  36. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/a2a/distributed_context.py +0 -0
  37. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/a2a/executor.py +0 -0
  38. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/a2a/tool.py +0 -0
  39. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/agents/agent.py +0 -0
  40. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
  41. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cancellation_token.py +0 -0
  42. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/catalog.py +0 -0
  43. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/__init__.py +0 -0
  44. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/__main__.py +0 -0
  45. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/eval_commands.py +0 -0
  46. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/history_args.py +0 -0
  47. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/loading.py +0 -0
  48. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/main.py +0 -0
  49. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/optim_commands.py +0 -0
  50. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/report_output.py +0 -0
  51. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/cli/serve_commands.py +0 -0
  52. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/compaction/__init__.py +0 -0
  53. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/compaction/counters.py +0 -0
  54. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/compaction/errors.py +0 -0
  55. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/compaction/grouping.py +0 -0
  56. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/compaction/strategies.py +0 -0
  57. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/component.py +0 -0
  58. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/context.py +0 -0
  59. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/context_providers/__init__.py +0 -0
  60. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/context_providers/base.py +0 -0
  61. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
  62. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/context_providers/skills.py +0 -0
  63. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/__init__.py +0 -0
  64. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
  65. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/base.py +0 -0
  66. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/config.py +0 -0
  67. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/importer.py +0 -0
  68. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/json.py +0 -0
  69. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/loader.py +0 -0
  70. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/publish.py +0 -0
  71. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/publish_config.py +0 -0
  72. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/publishers.py +0 -0
  73. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/s3.py +0 -0
  74. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/sources.py +0 -0
  75. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/sqlite.py +0 -0
  76. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
  77. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/write_config.py +0 -0
  78. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/dataset/writers.py +0 -0
  79. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/entity.py +0 -0
  80. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/__init__.py +0 -0
  81. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/base.py +0 -0
  82. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/checks/__init__.py +0 -0
  83. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/checks/decorator.py +0 -0
  84. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/checks/keyword.py +0 -0
  85. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/checks/local.py +0 -0
  86. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/checks/process.py +0 -0
  87. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/checks/tool.py +0 -0
  88. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/checks/types.py +0 -0
  89. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/comparison.py +0 -0
  90. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/eval_dataset.py +0 -0
  91. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/__init__.py +0 -0
  92. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/_writer_lock.py +0 -0
  93. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/config.py +0 -0
  94. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/conformance.py +0 -0
  95. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/errors.py +0 -0
  96. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/models.py +0 -0
  97. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/recorder.py +0 -0
  98. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/sql.py +0 -0
  99. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/sqlite.py +0 -0
  100. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/store.py +0 -0
  101. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/history/transitions.py +0 -0
  102. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/judges/__init__.py +0 -0
  103. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/judges/base.py +0 -0
  104. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/judges/composite.py +0 -0
  105. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/judges/llm.py +0 -0
  106. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
  107. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/judges/reference.py +0 -0
  108. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
  109. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/judges/validation.py +0 -0
  110. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/pairwise.py +0 -0
  111. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/report.py +0 -0
  112. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/runner.py +0 -0
  113. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/splitting.py +0 -0
  114. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/targets/__init__.py +0 -0
  115. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/targets/agent.py +0 -0
  116. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/targets/model.py +0 -0
  117. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
  118. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
  119. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/targets/runtime.py +0 -0
  120. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/targets/workflow.py +0 -0
  121. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/types.py +0 -0
  122. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/__init__.py +0 -0
  123. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/benchmark.py +0 -0
  124. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/compare.py +0 -0
  125. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/coordinator.py +0 -0
  126. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/jobs.py +0 -0
  127. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
  128. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
  129. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/suite.py +0 -0
  130. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/eval/workbench/verdict.py +0 -0
  131. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/execution_trace/__init__.py +0 -0
  132. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/execution_trace/collector.py +0 -0
  133. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/execution_trace/models.py +0 -0
  134. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/_retry_observability.py +0 -0
  135. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/anthropic/__init__.py +0 -0
  136. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/anthropic/settings.py +0 -0
  137. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/auth.py +0 -0
  138. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/azure/__init__.py +0 -0
  139. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/azure/auth.py +0 -0
  140. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/azure/settings.py +0 -0
  141. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/azure_openai.py +0 -0
  142. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
  143. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/bedrock/__init__.py +0 -0
  144. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/bedrock/_client.py +0 -0
  145. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/bedrock/settings.py +0 -0
  146. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/openai/__init__.py +0 -0
  147. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/openai/settings.py +0 -0
  148. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/openai_embedding.py +0 -0
  149. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/pricing.py +0 -0
  150. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/retry_policy.py +0 -0
  151. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/llm/settings.py +0 -0
  152. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/logger.py +0 -0
  153. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/memory/__init__.py +0 -0
  154. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/memory/base.py +0 -0
  155. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/messages.py +0 -0
  156. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/middleware/retry.py +0 -0
  157. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/middleware/sql_usage.py +0 -0
  158. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/middleware/usage_logger.py +0 -0
  159. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/notebook.py +0 -0
  160. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/__init__.py +0 -0
  161. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/base.py +0 -0
  162. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/binding.py +0 -0
  163. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/config.py +0 -0
  164. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/gepa.py +0 -0
  165. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/job.py +0 -0
  166. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/mipro.py +0 -0
  167. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/pareto.py +0 -0
  168. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/reflective.py +0 -0
  169. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/report.py +0 -0
  170. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/spec.py +0 -0
  171. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/optim/trace.py +0 -0
  172. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/orchestration/__init__.py +0 -0
  173. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/orchestration/ai.py +0 -0
  174. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/orchestration/base.py +0 -0
  175. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/orchestration/handoff.py +0 -0
  176. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/orchestration/plan.py +0 -0
  177. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/orchestration/policies.py +0 -0
  178. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/orchestration/round_robin.py +0 -0
  179. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/__init__.py +0 -0
  180. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/agents.py +0 -0
  181. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/benchmark.py +0 -0
  182. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/capitals.py +0 -0
  183. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/clients.py +0 -0
  184. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/instruction_registry.py +0 -0
  185. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
  186. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
  187. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
  188. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
  189. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
  190. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/orchestration.py +0 -0
  191. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/skills/capitals-format/SKILL.md +0 -0
  192. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
  193. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
  194. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
  195. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
  196. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
  197. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/presets/workflow.py +0 -0
  198. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/session_store.py +0 -0
  199. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/skills/__init__.py +0 -0
  200. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/skills/base.py +0 -0
  201. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/skills/resources.py +0 -0
  202. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/skills/scripts.py +0 -0
  203. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/skills/sources.py +0 -0
  204. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/skills/validation.py +0 -0
  205. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/__init__.py +0 -0
  206. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/base.py +0 -0
  207. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/cancellation.py +0 -0
  208. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/composite.py +0 -0
  209. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
  210. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/external.py +0 -0
  211. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/function_call.py +0 -0
  212. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/handoff.py +0 -0
  213. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/max_message.py +0 -0
  214. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/predicate.py +0 -0
  215. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/source.py +0 -0
  216. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/text_mention.py +0 -0
  217. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/timeout.py +0 -0
  218. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/termination/token_usage.py +0 -0
  219. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/__init__.py +0 -0
  220. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/base.py +0 -0
  221. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/coding_tools.py +0 -0
  222. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/core_tools.py +0 -0
  223. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/decorator.py +0 -0
  224. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/mcp/__init__.py +0 -0
  225. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/mcp/client.py +0 -0
  226. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/mcp/config.py +0 -0
  227. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/mcp/errors.py +0 -0
  228. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/mcp/tool.py +0 -0
  229. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/mcp/transports.py +0 -0
  230. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/memory_tool.py +0 -0
  231. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/tools/research_tools.py +0 -0
  232. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/types.py +0 -0
  233. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/__init__.py +0 -0
  234. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/discovery.py +0 -0
  235. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/eval_routes.py +0 -0
  236. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/execution.py +0 -0
  237. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp/__init__.py +0 -0
  238. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp/servers/__init__.py +0 -0
  239. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp/servers/apps_server.py +0 -0
  240. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp/servers/auth_server.py +0 -0
  241. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp/servers/basic_server.py +0 -0
  242. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp/servers/mrtr_server.py +0 -0
  243. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp/servers/notify_server.py +0 -0
  244. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp_playground.py +0 -0
  245. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/mcp_routes.py +0 -0
  246. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/models.py +0 -0
  247. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/registry.py +0 -0
  248. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/server.py +0 -0
  249. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/session_store.py +0 -0
  250. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/sessions.py +0 -0
  251. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/ui/assets/index-BreogZut.js +0 -0
  252. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/ui/assets/index-ptxe7GHs.css +0 -0
  253. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/ui/index.html +0 -0
  254. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/webui/ui/vite.svg +0 -0
  255. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/__init__.py +0 -0
  256. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/agent.py +0 -0
  257. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/core/__init__.py +0 -0
  258. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
  259. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
  260. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/core/models.py +0 -0
  261. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/core/runner.py +0 -0
  262. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/core/workflow.py +0 -0
  263. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/defaults.py +0 -0
  264. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/errors.py +0 -0
  265. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/loader.py +0 -0
  266. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/schema.py +0 -0
  267. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/schema_utils.py +0 -0
  268. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/sqlite_checkpoint.py +0 -0
  269. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
  270. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/steps/agent.py +0 -0
  271. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/steps/echo.py +0 -0
  272. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/steps/function.py +0 -0
  273. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/steps/http.py +0 -0
  274. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/steps/step.py +0 -0
  275. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
  276. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/steps/transform.py +0 -0
  277. {agentbyte-0.52.0 → agentbyte-0.53.0}/src/agentbyte/workflow/visualizer.py +0 -0
  278. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/a2a/a2a_helpers.py +0 -0
  279. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/a2a/test_a2a_adapters.py +0 -0
  280. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/a2a/test_distributed_context.py +0 -0
  281. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_as_tool.py +0 -0
  282. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_basic.py +0 -0
  283. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_context_providers.py +0 -0
  284. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_error_response.py +0 -0
  285. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_event_types.py +0 -0
  286. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_memory_integration.py +0 -0
  287. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_middleware_integration.py +0 -0
  288. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_response_accessors.py +0 -0
  289. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_retry_middleware.py +0 -0
  290. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_stop_at_tools.py +0 -0
  291. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_agent_stream_events.py +0 -0
  292. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_tool_approval.py +0 -0
  293. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_tool_batch_resolution.py +0 -0
  294. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/agents/test_tool_metadata.py +0 -0
  295. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/cli/test_eval_benchmark_commands.py +0 -0
  296. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/cli/test_loading.py +0 -0
  297. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/cli/test_registry_check.py +0 -0
  298. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/cli/test_report_output.py +0 -0
  299. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/cli/test_serve_command.py +0 -0
  300. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/compaction/test_compaction.py +0 -0
  301. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/conftest.py +0 -0
  302. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/context_providers/__init__.py +0 -0
  303. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/context_providers/test_skill_tools.py +0 -0
  304. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/context_providers/test_skills_provider.py +0 -0
  305. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/dataset/fake_s3.py +0 -0
  306. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/dataset/test_dataset_exit.py +0 -0
  307. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/dataset/test_loader.py +0 -0
  308. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/dataset/test_multi_table.py +0 -0
  309. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/dataset/test_publish.py +0 -0
  310. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/dataset/test_sqlite_db.py +0 -0
  311. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_dimension_scores.py +0 -0
  312. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_eval_benchmarks.py +0 -0
  313. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_eval_dataset.py +0 -0
  314. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_eval_history.py +0 -0
  315. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_eval_history_backends.py +0 -0
  316. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_eval_jobs.py +0 -0
  317. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_eval_workbench.py +0 -0
  318. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_execution_trajectories.py +0 -0
  319. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_history_config.py +0 -0
  320. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_multi_turn.py +0 -0
  321. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_pairwise.py +0 -0
  322. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
  323. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
  324. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_run_comparison.py +0 -0
  325. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_score_integrity.py +0 -0
  326. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_splitting.py +0 -0
  327. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/eval/test_types_and_judges.py +0 -0
  328. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_anthropic_bedrock_client.py +0 -0
  329. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_anthropic_client.py +0 -0
  330. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_azure_client.py +0 -0
  331. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_azure_embedding_client.py +0 -0
  332. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_cohere_bedrock_embedding_client.py +0 -0
  333. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_llm_types.py +0 -0
  334. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_openai_client.py +0 -0
  335. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_openai_embedding_client.py +0 -0
  336. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_pricing.py +0 -0
  337. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_retry_observability.py +0 -0
  338. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_retry_policy_api.py +0 -0
  339. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/llm/test_retryable_error_substrings.py +0 -0
  340. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/memory/test_memory.py +0 -0
  341. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/middleware/test_context_compaction.py +0 -0
  342. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
  343. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/middleware/test_middleware_chain.py +0 -0
  344. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/middleware/test_otel.py +0 -0
  345. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/middleware/test_retry_middleware.py +0 -0
  346. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/middleware/test_sql_usage.py +0 -0
  347. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/middleware/test_usage_logger.py +0 -0
  348. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/__init__.py +0 -0
  349. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/fakes.py +0 -0
  350. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_base.py +0 -0
  351. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_base_integration.py +0 -0
  352. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_binding.py +0 -0
  353. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_config.py +0 -0
  354. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_description_tunable.py +0 -0
  355. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_gepa.py +0 -0
  356. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_mipro.py +0 -0
  357. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_orchestrator_optim.py +0 -0
  358. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_pareto.py +0 -0
  359. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_reflective.py +0 -0
  360. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_report.py +0 -0
  361. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_score_integrity.py +0 -0
  362. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_spec.py +0 -0
  363. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/optim/test_trace.py +0 -0
  364. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
  365. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_base_orchestrator.py +0 -0
  366. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
  367. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_history_tool_call_pairing.py +0 -0
  368. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_orchestration_usage_breakdown.py +0 -0
  369. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_orchestrator_agent_contract.py +0 -0
  370. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
  371. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_orchestrator_member_events.py +0 -0
  372. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_orchestrator_otel.py +0 -0
  373. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_orchestrator_synthesis.py +0 -0
  374. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
  375. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/orchestration/test_round_robin.py +0 -0
  376. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/presets/test_agents.py +0 -0
  377. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/presets/test_benchmark.py +0 -0
  378. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/presets/test_capitals.py +0 -0
  379. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/presets/test_clients.py +0 -0
  380. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/presets/test_instruction_registry.py +0 -0
  381. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/presets/test_orchestration.py +0 -0
  382. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/presets/test_streaming.py +0 -0
  383. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/presets/test_workflow.py +0 -0
  384. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/skills/__init__.py +0 -0
  385. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/skills/test_base.py +0 -0
  386. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/skills/test_resources.py +0 -0
  387. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/skills/test_scripts.py +0 -0
  388. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/skills/test_sources.py +0 -0
  389. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_base.py +0 -0
  390. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_cancellation.py +0 -0
  391. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_composite.py +0 -0
  392. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_consecutive_agent.py +0 -0
  393. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_external.py +0 -0
  394. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_function_call.py +0 -0
  395. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_handoff.py +0 -0
  396. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_max_message.py +0 -0
  397. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_predicate.py +0 -0
  398. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_source.py +0 -0
  399. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_text_mention.py +0 -0
  400. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_timeout.py +0 -0
  401. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/termination/test_token_usage.py +0 -0
  402. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_cancellation_token.py +0 -0
  403. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_context.py +0 -0
  404. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_logger.py +0 -0
  405. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_messages.py +0 -0
  406. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_option_enums.py +0 -0
  407. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_optional_extras.py +0 -0
  408. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_package_api.py +0 -0
  409. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_session_store.py +0 -0
  410. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/test_types.py +0 -0
  411. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/tools/fixtures/mcp_stdio_server.py +0 -0
  412. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/tools/test_coding_tools.py +0 -0
  413. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/tools/test_mcp_tools.py +0 -0
  414. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/tools/test_memory_tool.py +0 -0
  415. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/tools/test_research_tools.py +0 -0
  416. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/tools/test_tools.py +0 -0
  417. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/__init__.py +0 -0
  418. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/helpers.py +0 -0
  419. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/test_eval_routes.py +0 -0
  420. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/test_execution.py +0 -0
  421. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/test_mcp_routes.py +0 -0
  422. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/test_package_api.py +0 -0
  423. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/test_registry.py +0 -0
  424. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/test_server.py +0 -0
  425. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/test_sessions.py +0 -0
  426. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/webui/test_workflow_streaming.py +0 -0
  427. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/recovery_worker.py +0 -0
  428. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_agent_step_imports.py +0 -0
  429. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_checkpoint.py +0 -0
  430. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_subworkflow_step.py +0 -0
  431. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_workflow_agent.py +0 -0
  432. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_workflow_class.py +0 -0
  433. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_workflow_models.py +0 -0
  434. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_workflow_reliability.py +0 -0
  435. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_workflow_runner.py +0 -0
  436. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_workflow_schema.py +0 -0
  437. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_workflow_steps.py +0 -0
  438. {agentbyte-0.52.0 → agentbyte-0.53.0}/tests/workflow/test_workflow_visualizer.py +0 -0
@@ -6,6 +6,46 @@ The format follows Keep a Changelog principles and semantic versioning.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.53.0] - 2026-10-10
10
+
11
+ ### Added
12
+
13
+ - `ClientMiddleware`: a marker subclass of `BaseMiddleware` for middleware safe to attach
14
+ directly to a client — no `AgentContext` or conversational state required. `OTelMiddleware`,
15
+ `LoggingMiddleware`, `MetricsMiddleware`, and `RateLimitMiddleware` now qualify. Every
16
+ embedding client (`OpenAIEmbeddingClient`, `AzureOpenAIEmbeddingClient`,
17
+ `CohereBedrockEmbeddingClient`) and every chat client (`OpenAIChatCompletionClient`,
18
+ `AzureOpenAIChatCompletionClient`, `AnthropicChatCompletionClient`,
19
+ `AnthropicBedrockChatCompletionClient`) accepts a `middlewares=[...]` constructor argument,
20
+ getting OTel tracing/logging on direct calls with no `Agent` wrapper required. Passing a
21
+ plain `BaseMiddleware` that needs agent state (e.g. `ApprovalMiddleware`,
22
+ `ContextCompactionMiddleware`) raises `TypeError` immediately. Chat clients wrap only the
23
+ non-streaming `create()`; `create_stream()` remains unwrapped (documented gap for a future
24
+ spec — see `docs/specs/0075-client-level-middleware/`).
25
+ - `agentbyte.llm.EmbeddingBatcher`: batching/concurrency orchestration over any embedding
26
+ client (sequential or semaphore-bounded concurrent batches, `run()`/`run_stream()` with
27
+ `EmbeddingBatchProgressEvent` progress).
28
+ - `BaseEmbeddingClient.middleware_types` / `BaseChatCompletionClient.middleware_types`: a
29
+ public, read-only property exposing the concrete middleware types attached to a client.
30
+ `Agent` uses it to warn (`warnings.warn`, not an error) when it and its `model_client` both
31
+ configure the same middleware class — that call would otherwise run through two nested
32
+ `MiddlewareChain`s, double-emitting spans/logs/metrics for one real API call. See
33
+ `docs/design-guide/01-agent_topics/topic_middleware.md`'s "Client-Level Middleware" caveat.
34
+
35
+ ### Changed (breaking)
36
+
37
+ - Removed `agentbyte.agents.EmbeddingAgent`. It bundled two unrelated concerns — batching and
38
+ middleware/OTel access — under a misleading "agent" name (no reasoning, no tool calls, no
39
+ conversational state). Middleware now lives on the embedding client itself (see
40
+ `ClientMiddleware` above); batching moved to `agentbyte.llm.EmbeddingBatcher`, which drops the
41
+ `middlewares` and `context: AgentContext` parameters entirely since the client it wraps owns
42
+ that chain. No compatibility shim. Migration guide:
43
+ `docs/design-guide/01-agent_topics/topic_embedding_batcher.md`.
44
+ - `EmbeddingBatchProgressEvent` moved from `agentbyte.agents.types` to `agentbyte.llm.types` (now
45
+ a standalone `pydantic.BaseModel`, not an `agents.types.BaseEvent` subclass) — it was never an
46
+ agent event, and keeping it in `agents.types` would have made `agentbyte.llm` depend on
47
+ `agentbyte.agents`, inverting the package layering.
48
+
9
49
  ## [0.52.0] - 2026-10-10
10
50
 
11
51
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentbyte
3
- Version: 0.52.0
3
+ Version: 0.53.0
4
4
  Summary: A toolkit for designing multiagent systems
5
5
  Author-email: MrDataPsycho <mr.data.psycho@gmail.com>
6
6
  License-Expression: LicenseRef-Proprietary
@@ -90,7 +90,7 @@ Description-Content-Type: text/markdown
90
90
 
91
91
  Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
92
92
 
93
- Current release: **0.51.0**
93
+ Current release: **0.53.0**
94
94
 
95
95
  ## Building an Agent
96
96
 
@@ -258,6 +258,8 @@ Other orchestrators follow the same `run()`/`run_stream()` shape: `AIOrchestrato
258
258
 
259
259
  ## Middleware
260
260
 
261
+ Chat and embedding clients also accept `middlewares=[...]` directly for client-safe middleware.
262
+
261
263
  Built in: `LoggingMiddleware`, `PIIRedactionMiddleware`, `GuardrailMiddleware`, `MetricsMiddleware`, `RateLimitMiddleware`, `ApprovalMiddleware`, `ContextCompactionMiddleware`, `RetryMiddleware`, `OTelMiddleware`. Attach any combination to the same support agent via `middlewares=[...]`:
262
264
 
263
265
  ```python
@@ -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.51.0**
5
+ Current release: **0.53.0**
6
6
 
7
7
  ## Building an Agent
8
8
 
@@ -170,6 +170,8 @@ Other orchestrators follow the same `run()`/`run_stream()` shape: `AIOrchestrato
170
170
 
171
171
  ## Middleware
172
172
 
173
+ Chat and embedding clients also accept `middlewares=[...]` directly for client-safe middleware.
174
+
173
175
  Built in: `LoggingMiddleware`, `PIIRedactionMiddleware`, `GuardrailMiddleware`, `MetricsMiddleware`, `RateLimitMiddleware`, `ApprovalMiddleware`, `ContextCompactionMiddleware`, `RetryMiddleware`, `OTelMiddleware`. Attach any combination to the same support agent via `middlewares=[...]`:
174
176
 
175
177
  ```python
@@ -0,0 +1,2 @@
1
+ __version__ = "0.53.0"
2
+ VERSION = __version__
@@ -11,13 +11,11 @@ from .base import (
11
11
  AgentToolError,
12
12
  BaseAgent,
13
13
  )
14
- from .embedding_agent import EmbeddingAgent
15
14
  from .types import (
16
15
  AgentErrorDetail,
17
16
  AgentEvent,
18
17
  AgentResponse,
19
18
  BaseEvent,
20
- EmbeddingBatchProgressEvent,
21
19
  ErrorEvent,
22
20
  FatalErrorEvent,
23
21
  MemoryRetrievalEvent,
@@ -37,7 +35,6 @@ __all__ = [
37
35
  "BaseAgent",
38
36
  "Agent",
39
37
  "AgentAsTool",
40
- "EmbeddingAgent",
41
38
  "AgentError",
42
39
  "AgentConfigurationError",
43
40
  "AgentExecutionError",
@@ -57,7 +54,6 @@ __all__ = [
57
54
  "MemoryRetrievalEvent",
58
55
  "ErrorEvent",
59
56
  "FatalErrorEvent",
60
- "EmbeddingBatchProgressEvent",
61
57
  "AgentResponse",
62
58
  "AgentErrorDetail",
63
59
  ]
@@ -3,6 +3,7 @@ Base agent abstraction and shared helper behavior.
3
3
  """
4
4
 
5
5
  import json
6
+ import warnings
6
7
  from abc import ABC, abstractmethod
7
8
  from collections.abc import AsyncGenerator, Callable
8
9
  from typing import Any, Dict, List, Optional, Type, Union
@@ -98,6 +99,37 @@ class BaseAgent(ABC):
98
99
  self.extra_config = kwargs
99
100
 
100
101
  self._validate_configuration()
102
+ self._warn_on_duplicate_client_middleware()
103
+
104
+ def _warn_on_duplicate_client_middleware(self) -> None:
105
+ """Warn when this agent and its model_client both configure the same
106
+ middleware type.
107
+
108
+ A client's own ``middlewares`` already wraps its provider call in a
109
+ ``MiddlewareChain``; this agent wraps that same call in a second chain.
110
+ Attaching the same middleware class at both layers runs it twice per
111
+ logical call — e.g. two nested OTel spans and the token/duration
112
+ histograms recorded twice for one real API call. This is sometimes
113
+ intentional (e.g. two differently configured rate limiters), so it is
114
+ a warning, not an error — see ``topic_middleware.md``'s "Client-Level
115
+ Middleware" section for the full caveat.
116
+ """
117
+ client_types = getattr(self.model_client, "middleware_types", None)
118
+ if not client_types:
119
+ return
120
+ agent_types = {type(m) for m in self.middleware_chain.middlewares}
121
+ overlap = agent_types & client_types
122
+ if not overlap:
123
+ return
124
+ names = ", ".join(sorted(t.__name__ for t in overlap))
125
+ warnings.warn(
126
+ f"Agent '{self.name}' and its model_client "
127
+ f"({type(self.model_client).__name__}) both configure: {names}. "
128
+ "Each model call will run through both middleware chains, "
129
+ "double-emitting spans/logs/metrics for one real API call. "
130
+ "Configure each middleware at one layer only.",
131
+ stacklevel=3,
132
+ )
101
133
 
102
134
  def _validate_configuration(self) -> None:
103
135
  """Validate required configuration fields."""
@@ -164,16 +164,6 @@ class FatalErrorEvent(BaseEvent):
164
164
  )
165
165
 
166
166
 
167
- class EmbeddingBatchProgressEvent(BaseEvent):
168
- """Event emitted after each batch completes during an EmbeddingAgent run."""
169
-
170
- event_type: Literal["embedding_batch_progress"] = "embedding_batch_progress"
171
- batch_index: int = Field(..., description="Zero-based index of the completed batch")
172
- total_batches: int = Field(..., description="Total number of batches for this run")
173
- completed_texts: int = Field(..., description="Cumulative number of texts embedded so far")
174
- total_texts: int = Field(..., description="Total number of texts in this run")
175
-
176
-
177
167
  class AgentErrorDetail(BaseModel):
178
168
  """Structured detail for a run that ended with ``finish_reason="error"``.
179
169
 
@@ -350,7 +340,6 @@ AgentEvent = Union[
350
340
  MemoryRetrievalEvent,
351
341
  ErrorEvent,
352
342
  FatalErrorEvent,
353
- EmbeddingBatchProgressEvent,
354
343
  ]
355
344
 
356
345
 
@@ -370,7 +359,6 @@ __all__ = [
370
359
  "ModelStreamChunkEvent",
371
360
  "ErrorEvent",
372
361
  "FatalErrorEvent",
373
- "EmbeddingBatchProgressEvent",
374
362
  "AgentResponse",
375
363
  "AgentErrorDetail",
376
364
  ]
@@ -33,6 +33,7 @@ from .base import (
33
33
  )
34
34
  from .retry_policy import RetryPolicy
35
35
  from .embeddings_base import BaseEmbeddingClient, BaseEmbeddingClientConfig
36
+ from .embedding_batcher import EmbeddingBatcher
36
37
  # Import message types and usage from root module (picoagents-aligned)
37
38
  from agentbyte.messages import (
38
39
  BaseMessage,
@@ -49,6 +50,7 @@ from agentbyte.messages import (
49
50
  from .types import (
50
51
  ChatCompletionChunk,
51
52
  ChatCompletionResult,
53
+ EmbeddingBatchProgressEvent,
52
54
  EmbeddingResult,
53
55
  ModelClientError,
54
56
  ModelPricing,
@@ -60,6 +62,8 @@ __all__ = [
60
62
  "BaseChatCompletionClientConfig",
61
63
  "BaseEmbeddingClient",
62
64
  "BaseEmbeddingClientConfig",
65
+ "EmbeddingBatcher",
66
+ "EmbeddingBatchProgressEvent",
63
67
  # Provider implementations
64
68
  "OpenAIChatCompletionClient",
65
69
  "OpenAIChatCompletionClientConfig",
@@ -47,14 +47,15 @@ DEFAULT_MAX_TOKENS = 4096
47
47
  class AnthropicConversionMixin:
48
48
  """Messages API request/response conversion shared by both Claude transports."""
49
49
 
50
- async def create(
50
+ async def _execute_chat_operation(
51
51
  self,
52
- messages: List[Message],
53
- tools: Optional[List[Dict[str, Any]]] = None,
54
- output_format: Optional[type] = None,
55
- **kwargs: Any,
52
+ payload: Dict[str, Any],
56
53
  ) -> ChatCompletionResult:
57
54
  """Make a single Anthropic Messages API call."""
55
+ messages = payload["messages"]
56
+ tools = payload["tools"]
57
+ output_format = payload["output_format"]
58
+ kwargs = payload["kwargs"]
58
59
  retry_history: List = []
59
60
  try:
60
61
  result = await self._retry_with_backoff(
@@ -2,11 +2,12 @@
2
2
  Anthropic Claude chat completion client implementation (direct API).
3
3
  """
4
4
 
5
- from typing import Any, Dict, Optional
5
+ from typing import Any, Dict, List, Optional
6
6
 
7
7
  from anthropic import AsyncAnthropic
8
8
 
9
9
  from agentbyte.component import Component
10
+ from agentbyte.middleware.base import ClientMiddleware
10
11
 
11
12
  from ..base import BaseChatCompletionClient, BaseChatCompletionClientConfig
12
13
  from ..pricing import PricingRegistry
@@ -44,8 +45,9 @@ class AnthropicChatCompletionClient(
44
45
  initial_retry_delay: float = 1.0,
45
46
  max_retry_delay: float = 60.0,
46
47
  retry_policy: Optional[RetryPolicy] = None,
48
+ middlewares: Optional[List[ClientMiddleware]] = None,
47
49
  ):
48
- super().__init__(model, client, config)
50
+ super().__init__(model, client, config, middlewares=middlewares)
49
51
  self.model_pricing = model_pricing
50
52
  if retry_policy is not None:
51
53
  self.retry_policy = retry_policy
@@ -80,6 +82,7 @@ class AnthropicChatCompletionClient(
80
82
  initial_retry_delay: float = 1.0,
81
83
  max_retry_delay: float = 60.0,
82
84
  retry_policy: Optional[RetryPolicy] = None,
85
+ middlewares: Optional[List[ClientMiddleware]] = None,
83
86
  ) -> "AnthropicChatCompletionClient":
84
87
  """Create a client from an explicit or env-backed API key."""
85
88
  from pydantic import ValidationError
@@ -110,6 +113,7 @@ class AnthropicChatCompletionClient(
110
113
  initial_retry_delay=initial_retry_delay,
111
114
  max_retry_delay=max_retry_delay,
112
115
  retry_policy=retry_policy,
116
+ middlewares=middlewares,
113
117
  )
114
118
 
115
119
  def _estimate_cost(
@@ -14,6 +14,7 @@ from agentbyte._optional import MissingExtraError
14
14
  from agentbyte.messages import AssistantMessage, Message, ToolCallRequest
15
15
 
16
16
  from agentbyte.component import Component
17
+ from agentbyte.middleware.base import ClientMiddleware
17
18
 
18
19
  from .._retry_observability import build_retry_summary
19
20
  from ..base import (
@@ -70,8 +71,9 @@ class AzureOpenAIChatCompletionClient(
70
71
  initial_retry_delay: float = 1.0,
71
72
  max_retry_delay: float = 60.0,
72
73
  retry_policy: Optional[RetryPolicy] = None,
74
+ middlewares: Optional[List[ClientMiddleware]] = None,
73
75
  ):
74
- super().__init__(model, client, config)
76
+ super().__init__(model, client, config, middlewares=middlewares)
75
77
  self.model_pricing = model_pricing
76
78
  self.pricing_model = pricing_model
77
79
  if retry_policy is not None:
@@ -109,6 +111,7 @@ class AzureOpenAIChatCompletionClient(
109
111
  initial_retry_delay: float = 1.0,
110
112
  max_retry_delay: float = 60.0,
111
113
  retry_policy: Optional[RetryPolicy] = None,
114
+ middlewares: Optional[List[ClientMiddleware]] = None,
112
115
  ) -> "AzureOpenAIChatCompletionClient":
113
116
  """Create a client using an Azure OpenAI API key."""
114
117
  from pydantic import ValidationError
@@ -159,6 +162,7 @@ class AzureOpenAIChatCompletionClient(
159
162
  initial_retry_delay=initial_retry_delay,
160
163
  max_retry_delay=max_retry_delay,
161
164
  retry_policy=retry_policy,
165
+ middlewares=middlewares,
162
166
  )
163
167
 
164
168
  @classmethod
@@ -175,6 +179,7 @@ class AzureOpenAIChatCompletionClient(
175
179
  initial_retry_delay: float = 1.0,
176
180
  max_retry_delay: float = 60.0,
177
181
  retry_policy: Optional[RetryPolicy] = None,
182
+ middlewares: Optional[List[ClientMiddleware]] = None,
178
183
  ) -> "AzureOpenAIChatCompletionClient":
179
184
  """Create a client using DefaultAzureCredential."""
180
185
  try:
@@ -226,6 +231,7 @@ class AzureOpenAIChatCompletionClient(
226
231
  initial_retry_delay=initial_retry_delay,
227
232
  max_retry_delay=max_retry_delay,
228
233
  retry_policy=retry_policy,
234
+ middlewares=middlewares,
229
235
  )
230
236
 
231
237
  @classmethod
@@ -243,6 +249,7 @@ class AzureOpenAIChatCompletionClient(
243
249
  initial_retry_delay: float = 1.0,
244
250
  max_retry_delay: float = 60.0,
245
251
  retry_policy: Optional[RetryPolicy] = None,
252
+ middlewares: Optional[List[ClientMiddleware]] = None,
246
253
  ) -> "AzureOpenAIChatCompletionClient":
247
254
  """Create a client using certificate-based Azure AD service principal auth."""
248
255
  from pydantic import ValidationError
@@ -303,6 +310,7 @@ class AzureOpenAIChatCompletionClient(
303
310
  initial_retry_delay=initial_retry_delay,
304
311
  max_retry_delay=max_retry_delay,
305
312
  retry_policy=retry_policy,
313
+ middlewares=middlewares,
306
314
  )
307
315
 
308
316
  @classmethod
@@ -319,6 +327,7 @@ class AzureOpenAIChatCompletionClient(
319
327
  initial_retry_delay: float = 1.0,
320
328
  max_retry_delay: float = 60.0,
321
329
  retry_policy: Optional[RetryPolicy] = None,
330
+ middlewares: Optional[List[ClientMiddleware]] = None,
322
331
  ) -> "AzureOpenAIChatCompletionClient":
323
332
  """Create a client using a pre-fetched Azure AD bearer token."""
324
333
  from pydantic import ValidationError
@@ -362,16 +371,18 @@ class AzureOpenAIChatCompletionClient(
362
371
  initial_retry_delay=initial_retry_delay,
363
372
  max_retry_delay=max_retry_delay,
364
373
  retry_policy=retry_policy,
374
+ middlewares=middlewares,
365
375
  )
366
376
 
367
- async def create(
377
+ async def _execute_chat_operation(
368
378
  self,
369
- messages: List[Message],
370
- tools: Optional[List[Dict[str, Any]]] = None,
371
- output_format: Optional[type] = None,
372
- **kwargs: Any,
379
+ payload: Dict[str, Any],
373
380
  ) -> ChatCompletionResult:
374
381
  """Make a single Azure OpenAI API call."""
382
+ messages = payload["messages"]
383
+ tools = payload["tools"]
384
+ output_format = payload["output_format"]
385
+ kwargs = payload["kwargs"]
375
386
  retry_history: List = []
376
387
  try:
377
388
  result = await self._retry_with_backoff(
@@ -10,6 +10,7 @@ from openai import AsyncAzureOpenAI
10
10
 
11
11
  from agentbyte._optional import MissingExtraError
12
12
  from agentbyte.component import Component
13
+ from agentbyte.middleware.base import ClientMiddleware
13
14
 
14
15
  from .._retry_observability import build_retry_summary
15
16
  from ..base import AuthenticationError, InvalidRequestError, RateLimitError
@@ -53,8 +54,9 @@ class AzureOpenAIEmbeddingClient(
53
54
  initial_retry_delay: float = 1.0,
54
55
  max_retry_delay: float = 60.0,
55
56
  retry_policy: Optional[RetryPolicy] = None,
57
+ middlewares: Optional[List[ClientMiddleware]] = None,
56
58
  ):
57
- super().__init__(model, client, config)
59
+ super().__init__(model, client, config, middlewares=middlewares)
58
60
  self.model_pricing = model_pricing
59
61
  self.pricing_model = pricing_model
60
62
  if retry_policy is not None:
@@ -93,6 +95,7 @@ class AzureOpenAIEmbeddingClient(
93
95
  initial_retry_delay: float = 1.0,
94
96
  max_retry_delay: float = 60.0,
95
97
  retry_policy: Optional[RetryPolicy] = None,
98
+ middlewares: Optional[List[ClientMiddleware]] = None,
96
99
  ) -> "AzureOpenAIEmbeddingClient":
97
100
  """Create client using Azure OpenAI API key authentication."""
98
101
  from pydantic import ValidationError
@@ -143,6 +146,7 @@ class AzureOpenAIEmbeddingClient(
143
146
  initial_retry_delay=initial_retry_delay,
144
147
  max_retry_delay=max_retry_delay,
145
148
  retry_policy=retry_policy,
149
+ middlewares=middlewares,
146
150
  )
147
151
 
148
152
  @classmethod
@@ -160,6 +164,7 @@ class AzureOpenAIEmbeddingClient(
160
164
  initial_retry_delay: float = 1.0,
161
165
  max_retry_delay: float = 60.0,
162
166
  retry_policy: Optional[RetryPolicy] = None,
167
+ middlewares: Optional[List[ClientMiddleware]] = None,
163
168
  ) -> "AzureOpenAIEmbeddingClient":
164
169
  """Create client using DefaultAzureCredential token provider."""
165
170
  try:
@@ -211,6 +216,7 @@ class AzureOpenAIEmbeddingClient(
211
216
  initial_retry_delay=initial_retry_delay,
212
217
  max_retry_delay=max_retry_delay,
213
218
  retry_policy=retry_policy,
219
+ middlewares=middlewares,
214
220
  )
215
221
 
216
222
  @classmethod
@@ -229,6 +235,7 @@ class AzureOpenAIEmbeddingClient(
229
235
  initial_retry_delay: float = 1.0,
230
236
  max_retry_delay: float = 60.0,
231
237
  retry_policy: Optional[RetryPolicy] = None,
238
+ middlewares: Optional[List[ClientMiddleware]] = None,
232
239
  ) -> "AzureOpenAIEmbeddingClient":
233
240
  """Create client using certificate-based Azure AD authentication."""
234
241
  from pydantic import ValidationError
@@ -289,6 +296,7 @@ class AzureOpenAIEmbeddingClient(
289
296
  initial_retry_delay=initial_retry_delay,
290
297
  max_retry_delay=max_retry_delay,
291
298
  retry_policy=retry_policy,
299
+ middlewares=middlewares,
292
300
  )
293
301
 
294
302
  @classmethod
@@ -306,6 +314,7 @@ class AzureOpenAIEmbeddingClient(
306
314
  initial_retry_delay: float = 1.0,
307
315
  max_retry_delay: float = 60.0,
308
316
  retry_policy: Optional[RetryPolicy] = None,
317
+ middlewares: Optional[List[ClientMiddleware]] = None,
309
318
  ) -> "AzureOpenAIEmbeddingClient":
310
319
  """Create client using a pre-fetched Azure AD bearer token."""
311
320
  from pydantic import ValidationError
@@ -349,6 +358,7 @@ class AzureOpenAIEmbeddingClient(
349
358
  initial_retry_delay=initial_retry_delay,
350
359
  max_retry_delay=max_retry_delay,
351
360
  retry_policy=retry_policy,
361
+ middlewares=middlewares,
352
362
  )
353
363
 
354
364
  async def create(self, input_text: str, **kwargs: Any) -> EmbeddingResult:
@@ -21,6 +21,7 @@ from pydantic import BaseModel
21
21
 
22
22
  from agentbyte.component import ComponentLoader
23
23
  from agentbyte.messages import AssistantMessage, Message, MultiModalMessage, ToolMessage
24
+ from agentbyte.middleware.base import ClientMiddleware, MiddlewareChain, OperationType
24
25
 
25
26
  from .types import (
26
27
  ChatCompletionChunk,
@@ -171,6 +172,7 @@ class BaseChatCompletionClient(ABC, ComponentLoader):
171
172
  model: str,
172
173
  client: Any,
173
174
  config: Optional[Dict[str, Any]] = None,
175
+ middlewares: Optional[List[ClientMiddleware]] = None,
174
176
  **kwargs: Any,
175
177
  ):
176
178
  """
@@ -226,8 +228,26 @@ class BaseChatCompletionClient(ABC, ComponentLoader):
226
228
  self.config = config or {}
227
229
  # Additional kwargs override config
228
230
  self.config.update(kwargs)
231
+ for middleware in middlewares or []:
232
+ if not isinstance(middleware, ClientMiddleware):
233
+ raise TypeError(
234
+ f"{type(middleware).__name__} is not a ClientMiddleware — only "
235
+ "middleware that does not require AgentContext or conversational "
236
+ "state (e.g. OTelMiddleware, LoggingMiddleware) can attach "
237
+ "directly to a client."
238
+ )
239
+ self._middleware_chain = MiddlewareChain(list(middlewares or []))
240
+
241
+ @property
242
+ def middleware_types(self) -> frozenset:
243
+ """Concrete types of middleware attached to this client.
244
+
245
+ Public introspection surface for callers that need to check this
246
+ client's middleware without reaching into ``_middleware_chain``
247
+ directly (e.g. a wrapping ``Agent`` detecting duplicate instrumentation).
248
+ """
249
+ return frozenset(type(m) for m in self._middleware_chain.middlewares)
229
250
 
230
- @abstractmethod
231
251
  async def create(
232
252
  self,
233
253
  messages: List[Message],
@@ -338,7 +358,23 @@ class BaseChatCompletionClient(ABC, ComponentLoader):
338
358
  print(f"Tokens: {result.usage.total_tokens}")
339
359
  ```
340
360
  """
341
- pass
361
+ return await self._middleware_chain.execute(
362
+ operation=OperationType.MODEL_CALL.value,
363
+ agent_name=type(self).__name__,
364
+ agent_context=None,
365
+ data={
366
+ "messages": messages,
367
+ "tools": tools,
368
+ "output_format": output_format,
369
+ "kwargs": kwargs,
370
+ },
371
+ func=self._execute_chat_operation,
372
+ metadata={"model": self.model},
373
+ )
374
+
375
+ async def _execute_chat_operation(self, payload: Dict[str, Any]) -> ChatCompletionResult:
376
+ """Execute a non-streaming provider call after middleware processing."""
377
+ raise NotImplementedError
342
378
 
343
379
  @abstractmethod
344
380
  async def create_stream(
@@ -636,4 +672,3 @@ __all__ = [
636
672
  "AuthenticationError",
637
673
  "InvalidRequestError",
638
674
  ]
639
-
@@ -1,11 +1,12 @@
1
1
  """Anthropic Claude chat client transported through AWS Bedrock."""
2
2
 
3
3
  import re
4
- from typing import Any, Dict, Optional
4
+ from typing import Any, Dict, List, Optional
5
5
 
6
6
  from anthropic import AsyncAnthropicBedrock
7
7
 
8
8
  from agentbyte.component import Component
9
+ from agentbyte.middleware.base import ClientMiddleware
9
10
  from agentbyte.llm.anthropic._conversion import AnthropicConversionMixin
10
11
  from agentbyte.llm.base import BaseChatCompletionClient, BaseChatCompletionClientConfig
11
12
  from agentbyte.llm.pricing import PricingRegistry
@@ -67,8 +68,9 @@ class AnthropicBedrockChatCompletionClient(
67
68
  initial_retry_delay: float = 1.0,
68
69
  max_retry_delay: float = 60.0,
69
70
  retry_policy: Optional[RetryPolicy] = None,
71
+ middlewares: Optional[List[ClientMiddleware]] = None,
70
72
  ):
71
- super().__init__(model, client, config)
73
+ super().__init__(model, client, config, middlewares=middlewares)
72
74
  self.model_pricing = model_pricing
73
75
  if retry_policy is not None:
74
76
  self.retry_policy = retry_policy
@@ -103,6 +105,7 @@ class AnthropicBedrockChatCompletionClient(
103
105
  initial_retry_delay: float = 1.0,
104
106
  max_retry_delay: float = 60.0,
105
107
  retry_policy: Optional[RetryPolicy] = None,
108
+ middlewares: Optional[List[ClientMiddleware]] = None,
106
109
  ) -> "AnthropicBedrockChatCompletionClient":
107
110
  """Create a client from an explicit or env-backed AWS region/profile.
108
111
 
@@ -128,6 +131,7 @@ class AnthropicBedrockChatCompletionClient(
128
131
  initial_retry_delay=initial_retry_delay,
129
132
  max_retry_delay=max_retry_delay,
130
133
  retry_policy=retry_policy,
134
+ middlewares=middlewares,
131
135
  )
132
136
 
133
137
  def _estimate_cost(
@@ -7,6 +7,7 @@ from typing import Any, Dict, List, Optional
7
7
 
8
8
  from agentbyte.component import Component
9
9
  from agentbyte.llm._retry_observability import build_retry_summary
10
+ from agentbyte.middleware.base import ClientMiddleware
10
11
  from agentbyte.llm.base import AuthenticationError, InvalidRequestError, RateLimitError
11
12
  from agentbyte.llm.embeddings_base import BaseEmbeddingClient, BaseEmbeddingClientConfig
12
13
  from agentbyte.llm.pricing import PricingRegistry
@@ -49,8 +50,8 @@ class CohereBedrockEmbeddingClient(
49
50
  model_pricing: Optional[ModelPricing] = None, max_retries: int = 3,
50
51
  initial_retry_delay: float = 1.0, max_retry_delay: float = 60.0,
51
52
  retry_policy: Optional[RetryPolicy] = None, region: str | None = None,
52
- profile: str | None = None):
53
- super().__init__(model, client, config)
53
+ profile: str | None = None, middlewares: Optional[List[ClientMiddleware]] = None):
54
+ super().__init__(model, client, config, middlewares=middlewares)
54
55
  self.model_pricing, self.region, self.profile = model_pricing, region, profile
55
56
  self.retry_policy = retry_policy or RetryPolicy(max_retries=max_retries, initial_retry_delay=initial_retry_delay, max_retry_delay=max_retry_delay)
56
57
 
@@ -58,11 +59,12 @@ class CohereBedrockEmbeddingClient(
58
59
  def from_region(cls, model: str, region: str | None = None, profile: str | None = None,
59
60
  config: Optional[Dict[str, Any]] = None, model_pricing: Optional[ModelPricing] = None,
60
61
  max_retries: int = 3, initial_retry_delay: float = 1.0, max_retry_delay: float = 60.0,
61
- retry_policy: Optional[RetryPolicy] = None) -> "CohereBedrockEmbeddingClient":
62
+ retry_policy: Optional[RetryPolicy] = None,
63
+ middlewares: Optional[List[ClientMiddleware]] = None) -> "CohereBedrockEmbeddingClient":
62
64
  settings = BedrockSettings()
63
65
  return cls(model, config=config, model_pricing=model_pricing, max_retries=max_retries,
64
66
  initial_retry_delay=initial_retry_delay, max_retry_delay=max_retry_delay, retry_policy=retry_policy,
65
- region=region or settings.region, profile=profile or settings.profile)
67
+ region=region or settings.region, profile=profile or settings.profile, middlewares=middlewares)
66
68
 
67
69
  async def create(self, input_text: str, **kwargs: Any) -> EmbeddingResult:
68
70
  return await self.create_batch([input_text], **kwargs)