agentbyte 0.40.0__tar.gz → 0.41.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 (365) hide show
  1. {agentbyte-0.40.0 → agentbyte-0.41.0}/CHANGELOG.md +24 -0
  2. {agentbyte-0.40.0 → agentbyte-0.41.0}/PKG-INFO +1 -1
  3. agentbyte-0.41.0/src/agentbyte/__about__.py +2 -0
  4. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/base.py +25 -1
  5. agentbyte-0.41.0/tests/orchestration/test_history_tool_call_pairing.py +162 -0
  6. agentbyte-0.40.0/src/agentbyte/__about__.py +0 -2
  7. {agentbyte-0.40.0 → agentbyte-0.41.0}/.gitignore +0 -0
  8. {agentbyte-0.40.0 → agentbyte-0.41.0}/LICENSE +0 -0
  9. {agentbyte-0.40.0 → agentbyte-0.41.0}/README.md +0 -0
  10. {agentbyte-0.40.0 → agentbyte-0.41.0}/pyproject.toml +0 -0
  11. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/__init__.py +0 -0
  12. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/_optional.py +0 -0
  13. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/__init__.py +0 -0
  14. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/agent.py +0 -0
  15. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/agent_as_tool.py +0 -0
  16. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/base.py +0 -0
  17. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/embedding_agent.py +0 -0
  18. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/agents/types.py +0 -0
  19. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cancellation_token.py +0 -0
  20. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/catalog.py +0 -0
  21. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/__init__.py +0 -0
  22. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/__main__.py +0 -0
  23. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/eval_commands.py +0 -0
  24. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/loading.py +0 -0
  25. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/cli/main.py +0 -0
  26. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/__init__.py +0 -0
  27. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/counters.py +0 -0
  28. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/errors.py +0 -0
  29. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/grouping.py +0 -0
  30. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/compaction/strategies.py +0 -0
  31. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/component.py +0 -0
  32. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context.py +0 -0
  33. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context_providers/__init__.py +0 -0
  34. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context_providers/base.py +0 -0
  35. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context_providers/skill_tools.py +0 -0
  36. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/context_providers/skills.py +0 -0
  37. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/__init__.py +0 -0
  38. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/_aiosqlite.py +0 -0
  39. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/base.py +0 -0
  40. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/config.py +0 -0
  41. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/importer.py +0 -0
  42. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/json.py +0 -0
  43. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/loader.py +0 -0
  44. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/publish.py +0 -0
  45. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/publish_config.py +0 -0
  46. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/publishers.py +0 -0
  47. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/s3.py +0 -0
  48. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/sources.py +0 -0
  49. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/sqlite.py +0 -0
  50. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/sqlite_db.py +0 -0
  51. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/write_config.py +0 -0
  52. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/dataset/writers.py +0 -0
  53. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/entity.py +0 -0
  54. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/__init__.py +0 -0
  55. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/base.py +0 -0
  56. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/__init__.py +0 -0
  57. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/decorator.py +0 -0
  58. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/keyword.py +0 -0
  59. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/local.py +0 -0
  60. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/process.py +0 -0
  61. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/tool.py +0 -0
  62. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/checks/types.py +0 -0
  63. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/comparison.py +0 -0
  64. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/eval_dataset.py +0 -0
  65. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/__init__.py +0 -0
  66. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/conformance.py +0 -0
  67. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/errors.py +0 -0
  68. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/models.py +0 -0
  69. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/recorder.py +0 -0
  70. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/sql.py +0 -0
  71. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/sqlite.py +0 -0
  72. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/store.py +0 -0
  73. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/history/transitions.py +0 -0
  74. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/__init__.py +0 -0
  75. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/base.py +0 -0
  76. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/composite.py +0 -0
  77. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/llm.py +0 -0
  78. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/pairwise.py +0 -0
  79. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/reference.py +0 -0
  80. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/trajectory.py +0 -0
  81. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/judges/validation.py +0 -0
  82. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/pairwise.py +0 -0
  83. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/report.py +0 -0
  84. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/runner.py +0 -0
  85. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/splitting.py +0 -0
  86. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/__init__.py +0 -0
  87. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/agent.py +0 -0
  88. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/model.py +0 -0
  89. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/multi_turn.py +0 -0
  90. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/orchestrator.py +0 -0
  91. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/runtime.py +0 -0
  92. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/targets/workflow.py +0 -0
  93. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/types.py +0 -0
  94. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/__init__.py +0 -0
  95. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/coordinator.py +0 -0
  96. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/jobs.py +0 -0
  97. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/smoke.py +0 -0
  98. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/smoke_tasks.json +0 -0
  99. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/suite.py +0 -0
  100. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/eval/workbench/verdict.py +0 -0
  101. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/execution_trace/__init__.py +0 -0
  102. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/execution_trace/collector.py +0 -0
  103. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/execution_trace/models.py +0 -0
  104. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/__init__.py +0 -0
  105. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/_retry_observability.py +0 -0
  106. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/auth.py +0 -0
  107. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/__init__.py +0 -0
  108. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/auth.py +0 -0
  109. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/chat.py +0 -0
  110. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/embedding.py +0 -0
  111. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure/settings.py +0 -0
  112. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure_openai.py +0 -0
  113. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
  114. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/base.py +0 -0
  115. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/embeddings_base.py +0 -0
  116. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai/__init__.py +0 -0
  117. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai/chat.py +0 -0
  118. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai/embedding.py +0 -0
  119. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai/settings.py +0 -0
  120. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/openai_embedding.py +0 -0
  121. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/pricing.py +0 -0
  122. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/retry_policy.py +0 -0
  123. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/settings.py +0 -0
  124. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/llm/types.py +0 -0
  125. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/logger.py +0 -0
  126. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/memory/__init__.py +0 -0
  127. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/memory/base.py +0 -0
  128. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/messages.py +0 -0
  129. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/__init__.py +0 -0
  130. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/base.py +0 -0
  131. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/otel.py +0 -0
  132. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/retry.py +0 -0
  133. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/sql_usage.py +0 -0
  134. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/middleware/usage_logger.py +0 -0
  135. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/notebook.py +0 -0
  136. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/__init__.py +0 -0
  137. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/base.py +0 -0
  138. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/config.py +0 -0
  139. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/gepa.py +0 -0
  140. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/mipro.py +0 -0
  141. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/pareto.py +0 -0
  142. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/reflective.py +0 -0
  143. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/spec.py +0 -0
  144. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/optim/trace.py +0 -0
  145. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/__init__.py +0 -0
  146. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/ai.py +0 -0
  147. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/handoff.py +0 -0
  148. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/plan.py +0 -0
  149. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/policies.py +0 -0
  150. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/orchestration/round_robin.py +0 -0
  151. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/__init__.py +0 -0
  152. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/agents.py +0 -0
  153. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/clients.py +0 -0
  154. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instruction_registry.py +0 -0
  155. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
  156. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
  157. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
  158. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
  159. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/instructions/writer.yaml +0 -0
  160. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/orchestration.py +0 -0
  161. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
  162. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
  163. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
  164. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
  165. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
  166. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/streaming.py +0 -0
  167. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/presets/workflow.py +0 -0
  168. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/session_store.py +0 -0
  169. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/__init__.py +0 -0
  170. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/base.py +0 -0
  171. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/resources.py +0 -0
  172. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/scripts.py +0 -0
  173. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/sources.py +0 -0
  174. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/skills/validation.py +0 -0
  175. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/__init__.py +0 -0
  176. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/base.py +0 -0
  177. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/cancellation.py +0 -0
  178. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/composite.py +0 -0
  179. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/consecutive_agent.py +0 -0
  180. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/external.py +0 -0
  181. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/function_call.py +0 -0
  182. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/handoff.py +0 -0
  183. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/max_message.py +0 -0
  184. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/predicate.py +0 -0
  185. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/source.py +0 -0
  186. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/text_mention.py +0 -0
  187. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/timeout.py +0 -0
  188. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/termination/token_usage.py +0 -0
  189. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/__init__.py +0 -0
  190. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/base.py +0 -0
  191. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/coding_tools.py +0 -0
  192. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/core_tools.py +0 -0
  193. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/decorator.py +0 -0
  194. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/memory_tool.py +0 -0
  195. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/tools/research_tools.py +0 -0
  196. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/types.py +0 -0
  197. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/__init__.py +0 -0
  198. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/discovery.py +0 -0
  199. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/eval_routes.py +0 -0
  200. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/execution.py +0 -0
  201. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/models.py +0 -0
  202. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/registry.py +0 -0
  203. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/server.py +0 -0
  204. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/session_store.py +0 -0
  205. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/sessions.py +0 -0
  206. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/ui/assets/index-C-wj-OzO.js +0 -0
  207. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/ui/assets/index-DW8IDODJ.css +0 -0
  208. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/ui/index.html +0 -0
  209. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/webui/ui/vite.svg +0 -0
  210. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/__init__.py +0 -0
  211. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/agent.py +0 -0
  212. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/__init__.py +0 -0
  213. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
  214. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/checkpoint.py +0 -0
  215. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/models.py +0 -0
  216. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/runner.py +0 -0
  217. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/core/workflow.py +0 -0
  218. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/defaults.py +0 -0
  219. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/errors.py +0 -0
  220. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/loader.py +0 -0
  221. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/schema.py +0 -0
  222. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/schema_utils.py +0 -0
  223. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/sqlite_checkpoint.py +0 -0
  224. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/__init__.py +0 -0
  225. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/agent.py +0 -0
  226. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/echo.py +0 -0
  227. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/function.py +0 -0
  228. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/http.py +0 -0
  229. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/step.py +0 -0
  230. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
  231. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/steps/transform.py +0 -0
  232. {agentbyte-0.40.0 → agentbyte-0.41.0}/src/agentbyte/workflow/visualizer.py +0 -0
  233. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_as_tool.py +0 -0
  234. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_basic.py +0 -0
  235. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_context_providers.py +0 -0
  236. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_error_response.py +0 -0
  237. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_event_types.py +0 -0
  238. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_memory_integration.py +0 -0
  239. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_middleware_integration.py +0 -0
  240. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_response_accessors.py +0 -0
  241. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_retry_middleware.py +0 -0
  242. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_agent_stream_events.py +0 -0
  243. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_embedding_agent.py +0 -0
  244. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_tool_approval.py +0 -0
  245. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_tool_batch_resolution.py +0 -0
  246. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/agents/test_tool_metadata.py +0 -0
  247. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/cli/test_loading.py +0 -0
  248. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/cli/test_registry_check.py +0 -0
  249. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/compaction/test_compaction.py +0 -0
  250. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/context_providers/__init__.py +0 -0
  251. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/context_providers/test_skill_tools.py +0 -0
  252. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/context_providers/test_skills_provider.py +0 -0
  253. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/fake_s3.py +0 -0
  254. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_dataset_exit.py +0 -0
  255. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_loader.py +0 -0
  256. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_multi_table.py +0 -0
  257. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_publish.py +0 -0
  258. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/dataset/test_sqlite_db.py +0 -0
  259. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_dataset.py +0 -0
  260. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_history.py +0 -0
  261. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_history_backends.py +0 -0
  262. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_jobs.py +0 -0
  263. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_eval_workbench.py +0 -0
  264. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_execution_trajectories.py +0 -0
  265. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_multi_turn.py +0 -0
  266. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_pairwise.py +0 -0
  267. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_phase1_runner_and_targets.py +0 -0
  268. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_phase2_checks_and_reports.py +0 -0
  269. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_score_integrity.py +0 -0
  270. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_splitting.py +0 -0
  271. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/eval/test_types_and_judges.py +0 -0
  272. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/examples/test_compaction_webapp.py +0 -0
  273. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_azure_client.py +0 -0
  274. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_azure_embedding_client.py +0 -0
  275. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_llm_types.py +0 -0
  276. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_openai_client.py +0 -0
  277. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_openai_embedding_client.py +0 -0
  278. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_pricing.py +0 -0
  279. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_retry_observability.py +0 -0
  280. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_retry_policy_api.py +0 -0
  281. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/llm/test_retryable_error_substrings.py +0 -0
  282. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/memory/test_memory.py +0 -0
  283. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_context_compaction.py +0 -0
  284. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_deduplicate_tool_result.py +0 -0
  285. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_middleware_chain.py +0 -0
  286. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_otel.py +0 -0
  287. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_retry_middleware.py +0 -0
  288. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_sql_usage.py +0 -0
  289. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/middleware/test_usage_logger.py +0 -0
  290. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/__init__.py +0 -0
  291. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_base.py +0 -0
  292. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_base_integration.py +0 -0
  293. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_config.py +0 -0
  294. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_gepa.py +0 -0
  295. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_mipro.py +0 -0
  296. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_orchestrator_optim.py +0 -0
  297. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_pareto.py +0 -0
  298. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_reflective.py +0 -0
  299. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_score_integrity.py +0 -0
  300. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_spec.py +0 -0
  301. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/optim/test_trace.py +0 -0
  302. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_ai_orchestrator.py +0 -0
  303. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_base_orchestrator.py +0 -0
  304. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_handoff_orchestrator.py +0 -0
  305. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_orchestrator_finalization.py +0 -0
  306. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_plan_orchestrator.py +0 -0
  307. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/orchestration/test_round_robin.py +0 -0
  308. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_agents.py +0 -0
  309. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_clients.py +0 -0
  310. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_instruction_registry.py +0 -0
  311. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_orchestration.py +0 -0
  312. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_streaming.py +0 -0
  313. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/presets/test_workflow.py +0 -0
  314. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/__init__.py +0 -0
  315. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/test_base.py +0 -0
  316. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/test_resources.py +0 -0
  317. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/test_scripts.py +0 -0
  318. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/skills/test_sources.py +0 -0
  319. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_base.py +0 -0
  320. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_cancellation.py +0 -0
  321. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_composite.py +0 -0
  322. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_consecutive_agent.py +0 -0
  323. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_external.py +0 -0
  324. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_function_call.py +0 -0
  325. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_handoff.py +0 -0
  326. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_max_message.py +0 -0
  327. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_predicate.py +0 -0
  328. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_source.py +0 -0
  329. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_text_mention.py +0 -0
  330. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_timeout.py +0 -0
  331. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/termination/test_token_usage.py +0 -0
  332. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_cancellation_token.py +0 -0
  333. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_context.py +0 -0
  334. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_logger.py +0 -0
  335. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_messages.py +0 -0
  336. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_optional_extras.py +0 -0
  337. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_package_api.py +0 -0
  338. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_session_store.py +0 -0
  339. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_types.py +0 -0
  340. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/test_vanilla_chunker.py +0 -0
  341. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/tools/test_coding_tools.py +0 -0
  342. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/tools/test_memory_tool.py +0 -0
  343. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/tools/test_research_tools.py +0 -0
  344. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/tools/test_tools.py +0 -0
  345. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/__init__.py +0 -0
  346. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/helpers.py +0 -0
  347. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_eval_routes.py +0 -0
  348. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_execution.py +0 -0
  349. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_package_api.py +0 -0
  350. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_registry.py +0 -0
  351. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_server.py +0 -0
  352. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_sessions.py +0 -0
  353. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/webui/test_workflow_streaming.py +0 -0
  354. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/recovery_worker.py +0 -0
  355. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_agent_step_imports.py +0 -0
  356. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_checkpoint.py +0 -0
  357. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_subworkflow_step.py +0 -0
  358. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_agent.py +0 -0
  359. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_class.py +0 -0
  360. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_models.py +0 -0
  361. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_reliability.py +0 -0
  362. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_runner.py +0 -0
  363. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_schema.py +0 -0
  364. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_steps.py +0 -0
  365. {agentbyte-0.40.0 → agentbyte-0.41.0}/tests/workflow/test_workflow_visualizer.py +0 -0
@@ -6,6 +6,30 @@ The format follows Keep a Changelog principles and semantic versioning.
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.41.0] - 2026-10-04
10
+
11
+ ### Fixed
12
+
13
+ - Tool-call-pair-safe recent history window (spec 0064). `BaseOrchestrator._select_history_messages`
14
+ implemented `AgentHistoryPolicy(window="recent")` as a blind `shared_messages[-message_limit:]`
15
+ slice, which could cut between a tool-calling `AssistantMessage` and its `ToolMessage` reply once
16
+ enough turns accumulated (a multi-step plan, or a step-retry loop), handing the next agent a
17
+ transcript that opens on an orphaned tool result and gets rejected by the provider. The `"recent"`
18
+ branch now reuses `agentbyte.compaction.grouping.group_messages` (spec 0049) to keep each tool
19
+ exchange whole, growing the window left by the few messages needed rather than splitting it.
20
+ `message_limit` is therefore a floor, not an exact count, only when a tool exchange would
21
+ otherwise be split; histories with no tool calls are unaffected. Lives in `BaseOrchestrator`, so
22
+ every pattern (`PlanBasedOrchestrator`, `AIOrchestrator`, `RoundRobinOrchestrator`,
23
+ `HandoffOrchestrator`) is covered by the one change.
24
+
25
+ ### Added
26
+
27
+ - New optim usecase notebook `notebooks/usecases/optim/02-optim-it-helpdesk-triage.ipynb`: a
28
+ `PlanBasedOrchestrator` supervisor over three structured-output specialists (`hardware`,
29
+ `software`, `access-control`, each with a `lookup_asset` tool) plus a `synthesizer`, optimized
30
+ with `ReflectiveOptimizer` against a routing-correctness judge. Introduces a `DescriptionTunable`
31
+ (the planner routes off each member's `description`, which the built-in tunables did not expose).
32
+
9
33
  ## [0.40.0] - 2026-10-02
10
34
 
11
35
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: agentbyte
3
- Version: 0.40.0
3
+ Version: 0.41.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
@@ -0,0 +1,2 @@
1
+ __version__ = "0.41.0"
2
+ VERSION = __version__
@@ -16,6 +16,7 @@ from agentbyte.agents.types import AgentResponse, Usage
16
16
  from agentbyte.execution_trace import trace_stream
17
17
  from agentbyte.execution_trace.collector import capture_agent_stream, normalize_status
18
18
  from agentbyte.cancellation_token import CancellationToken
19
+ from agentbyte.compaction.grouping import MessageGroup, group_messages
19
20
  from agentbyte.context import AgentContext
20
21
  from agentbyte.messages import Message, UserMessage
21
22
  from agentbyte.termination import BaseTermination
@@ -827,9 +828,32 @@ class BaseOrchestrator(ABC):
827
828
  def _select_history_messages(self, policy: AgentHistoryPolicy) -> list[Message]:
828
829
  """Return the relevant shared-message slice for a history policy."""
829
830
  if policy.window == "recent" and policy.message_limit is not None:
830
- return list(self.shared_messages[-policy.message_limit :])
831
+ return self._select_recent_messages(policy.message_limit)
831
832
  return list(self.shared_messages)
832
833
 
834
+ def _select_recent_messages(self, message_limit: int) -> list[Message]:
835
+ """Last `message_limit` messages, never splitting a tool-call exchange.
836
+
837
+ A plain ``shared_messages[-message_limit:]`` slice can cut between a
838
+ tool-calling ``AssistantMessage`` and its ``ToolMessage`` reply once enough
839
+ turns accumulate, leaving the next agent a transcript that opens on an
840
+ orphaned tool result (spec 0064). ``group_messages`` (spec 0049) already
841
+ groups each exchange into one indivisible unit; keep whole groups from the
842
+ newest end until at least ``message_limit`` messages are covered, so the
843
+ limit becomes a floor rather than an exact count when a tool exchange
844
+ would otherwise be split.
845
+ """
846
+ groups = group_messages(self.shared_messages)
847
+ kept: list[MessageGroup] = []
848
+ count = 0
849
+ for group in reversed(groups):
850
+ kept.append(group)
851
+ count += len(group.messages)
852
+ if count >= message_limit:
853
+ break
854
+ kept.reverse()
855
+ return [message for group in kept for message in group.messages]
856
+
833
857
  def _build_agent_context_from_history(
834
858
  self, agent: BaseAgent
835
859
  ) -> UserMessage | list[Message]:
@@ -0,0 +1,162 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import AsyncGenerator
4
+ from typing import Any, Optional, Union
5
+
6
+ import pytest
7
+
8
+ from agentbyte.agents.base import BaseAgent
9
+ from agentbyte.agents.types import AgentResponse, Usage
10
+ from agentbyte.cancellation_token import CancellationToken
11
+ from agentbyte.context import AgentContext
12
+ from agentbyte.messages import (
13
+ AssistantMessage,
14
+ Message,
15
+ ToolCallRequest,
16
+ ToolMessage,
17
+ UserMessage,
18
+ )
19
+ from agentbyte.orchestration import AgentHistoryPolicy, HistoryContextPolicy
20
+ from agentbyte.orchestration.round_robin import RoundRobinOrchestrator
21
+ from agentbyte.termination.max_message import MaxMessageTermination
22
+
23
+
24
+ class MockAgent(BaseAgent):
25
+ """Minimal BaseAgent stub -- these tests only exercise history selection,
26
+ never the orchestration run loop, so responses are fixed and unused."""
27
+
28
+ def __init__(self, name: str):
29
+ self.name = name
30
+ self.description = f"Description of {name}"
31
+ self.tools = []
32
+
33
+ async def run(
34
+ self,
35
+ task: Optional[Union[UserMessage, list[Message]]] = None,
36
+ context: Optional[AgentContext] = None,
37
+ cancellation_token: Optional[CancellationToken] = None,
38
+ ) -> AgentResponse:
39
+ del cancellation_token
40
+ ctx = context or AgentContext()
41
+ if task and not ctx.messages:
42
+ if isinstance(task, UserMessage):
43
+ ctx.messages.append(task)
44
+ else:
45
+ ctx.messages.extend(task)
46
+ msg = AssistantMessage(content="ok", source=self.name)
47
+ ctx.messages.append(msg)
48
+ return AgentResponse(source=self.name, context=ctx, finish_reason="stop")
49
+
50
+ async def run_stream(
51
+ self,
52
+ task: Optional[Union[UserMessage, list[Message]]] = None,
53
+ context: Optional[AgentContext] = None,
54
+ cancellation_token: Optional[CancellationToken] = None,
55
+ verbose: bool = False,
56
+ stream_tokens: bool = False,
57
+ ) -> AsyncGenerator[Union[Message, Any, AgentResponse], None]:
58
+ del cancellation_token, verbose, stream_tokens
59
+ ctx = context or AgentContext()
60
+ if task:
61
+ if isinstance(task, UserMessage):
62
+ yield task
63
+ if not ctx.messages:
64
+ ctx.messages.append(task)
65
+ else:
66
+ for message in task:
67
+ yield message
68
+ if not ctx.messages:
69
+ ctx.messages.append(message)
70
+ msg = AssistantMessage(content="ok", source=self.name)
71
+ yield msg
72
+ ctx.messages.append(msg)
73
+ yield AgentResponse(
74
+ source=self.name, context=ctx, usage=Usage(), finish_reason="stop"
75
+ )
76
+
77
+
78
+ def _recent(limit: int) -> HistoryContextPolicy:
79
+ return HistoryContextPolicy(
80
+ default=AgentHistoryPolicy(window="recent", message_limit=limit, format="messages")
81
+ )
82
+
83
+
84
+ @pytest.mark.asyncio
85
+ class TestToolCallPairSafety:
86
+ async def test_naive_cut_between_pair_grows_window_left(self):
87
+ a1 = MockAgent("a1")
88
+ orchestrator = RoundRobinOrchestrator(
89
+ [a1], MaxMessageTermination(2), history_policy=_recent(2)
90
+ )
91
+ orchestrator.shared_messages = [
92
+ UserMessage(content="task", source="user"),
93
+ AssistantMessage(
94
+ content="",
95
+ source="a1",
96
+ tool_calls=[ToolCallRequest(tool_name="lookup", parameters={}, call_id="c1")],
97
+ ),
98
+ ToolMessage(
99
+ content="result", tool_call_id="c1", tool_name="lookup", source="a1", success=True
100
+ ),
101
+ ]
102
+
103
+ # A naive shared_messages[-2:] would return [AssistantMessage(tool_calls), ToolMessage] --
104
+ # that one is actually still paired. Force the cut one message later so the naive slice
105
+ # would be [ToolMessage] alone, with its issuing AssistantMessage left out.
106
+ orchestrator.shared_messages.append(AssistantMessage(content="final", source="a1"))
107
+
108
+ context = await orchestrator.prepare_context_for_agent(a1)
109
+
110
+ assert isinstance(context, list)
111
+ # The orphaned ToolMessage's issuing AssistantMessage must be present, and it must come
112
+ # immediately before the ToolMessage -- never open on a bare 'tool' message.
113
+ roles = [type(m).__name__ for m in context]
114
+ tool_index = roles.index("ToolMessage")
115
+ assert roles[tool_index - 1] == "AssistantMessage"
116
+ assert context[tool_index - 1].tool_calls is not None
117
+
118
+ async def test_cut_on_group_boundary_is_unchanged(self):
119
+ """No tool calls: behavior is byte-identical to the pre-fix raw slice."""
120
+ a1 = MockAgent("a1")
121
+ orchestrator = RoundRobinOrchestrator(
122
+ [a1], MaxMessageTermination(2), history_policy=_recent(2)
123
+ )
124
+ orchestrator.shared_messages = [
125
+ UserMessage(content="one", source="user"),
126
+ AssistantMessage(content="two", source="a1"),
127
+ AssistantMessage(content="three", source="a1"),
128
+ ]
129
+
130
+ context = await orchestrator.prepare_context_for_agent(a1)
131
+
132
+ assert isinstance(context, list)
133
+ assert [message.content for message in context] == ["two", "three"]
134
+
135
+ async def test_multi_call_batch_is_kept_whole(self):
136
+ a1 = MockAgent("a1")
137
+ orchestrator = RoundRobinOrchestrator(
138
+ [a1], MaxMessageTermination(2), history_policy=_recent(1)
139
+ )
140
+ orchestrator.shared_messages = [
141
+ UserMessage(content="task", source="user"),
142
+ AssistantMessage(
143
+ content="",
144
+ source="a1",
145
+ tool_calls=[
146
+ ToolCallRequest(tool_name="lookup", parameters={}, call_id="c1"),
147
+ ToolCallRequest(tool_name="lookup", parameters={}, call_id="c2"),
148
+ ],
149
+ ),
150
+ ToolMessage(
151
+ content="r1", tool_call_id="c1", tool_name="lookup", source="a1", success=True
152
+ ),
153
+ ToolMessage(
154
+ content="r2", tool_call_id="c2", tool_name="lookup", source="a1", success=True
155
+ ),
156
+ ]
157
+
158
+ context = await orchestrator.prepare_context_for_agent(a1)
159
+
160
+ assert isinstance(context, list)
161
+ roles = [type(m).__name__ for m in context]
162
+ assert roles == ["AssistantMessage", "ToolMessage", "ToolMessage"]
@@ -1,2 +0,0 @@
1
- __version__ = "0.40.0"
2
- VERSION = __version__
File without changes
File without changes
File without changes
File without changes