agentbyte 0.22.1__tar.gz → 0.22.3__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 (344) hide show
  1. {agentbyte-0.22.1 → agentbyte-0.22.3}/CHANGELOG.md +18 -0
  2. {agentbyte-0.22.1 → agentbyte-0.22.3}/PKG-INFO +2 -2
  3. {agentbyte-0.22.1 → agentbyte-0.22.3}/README.md +1 -1
  4. agentbyte-0.22.3/src/agentbyte/__about__.py +2 -0
  5. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/agents/types.py +19 -1
  6. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/middleware/sql_usage.py +8 -1
  7. agentbyte-0.22.3/tests/agents/test_agent_response_accessors.py +57 -0
  8. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/middleware/test_sql_usage.py +29 -0
  9. agentbyte-0.22.1/src/agentbyte/__about__.py +0 -2
  10. {agentbyte-0.22.1 → agentbyte-0.22.3}/.gitignore +0 -0
  11. {agentbyte-0.22.1 → agentbyte-0.22.3}/LICENSE +0 -0
  12. {agentbyte-0.22.1 → agentbyte-0.22.3}/pyproject.toml +0 -0
  13. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/__init__.py +0 -0
  14. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/agents/__init__.py +0 -0
  15. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/agents/agent.py +0 -0
  16. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/agents/agent_as_tool.py +0 -0
  17. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/agents/base.py +0 -0
  18. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/agents/embedding_agent.py +0 -0
  19. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/cancellation_token.py +0 -0
  20. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/catalog.py +0 -0
  21. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/cli/__init__.py +0 -0
  22. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/cli/main.py +0 -0
  23. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/component.py +0 -0
  24. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/context.py +0 -0
  25. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/context_providers/__init__.py +0 -0
  26. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/context_providers/base.py +0 -0
  27. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/context_providers/skill_tools.py +0 -0
  28. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/context_providers/skills.py +0 -0
  29. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/__init__.py +0 -0
  30. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/base.py +0 -0
  31. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/config.py +0 -0
  32. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/importer.py +0 -0
  33. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/json.py +0 -0
  34. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/loader.py +0 -0
  35. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/publish.py +0 -0
  36. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/publish_config.py +0 -0
  37. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/publishers.py +0 -0
  38. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/sources.py +0 -0
  39. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/sqlite.py +0 -0
  40. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/sqlite_db.py +0 -0
  41. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/write_config.py +0 -0
  42. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/dataset/writers.py +0 -0
  43. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/entity.py +0 -0
  44. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/__init__.py +0 -0
  45. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/base.py +0 -0
  46. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/checks/__init__.py +0 -0
  47. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/checks/decorator.py +0 -0
  48. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/checks/keyword.py +0 -0
  49. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/checks/local.py +0 -0
  50. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/checks/tool.py +0 -0
  51. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/checks/types.py +0 -0
  52. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/comparison.py +0 -0
  53. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/eval_dataset.py +0 -0
  54. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/judges/__init__.py +0 -0
  55. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/judges/base.py +0 -0
  56. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/judges/composite.py +0 -0
  57. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/judges/llm.py +0 -0
  58. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/judges/pairwise.py +0 -0
  59. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/judges/reference.py +0 -0
  60. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/pairwise.py +0 -0
  61. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/report.py +0 -0
  62. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/runner.py +0 -0
  63. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/targets/__init__.py +0 -0
  64. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/targets/agent.py +0 -0
  65. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/targets/model.py +0 -0
  66. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/targets/multi_turn.py +0 -0
  67. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/targets/orchestrator.py +0 -0
  68. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/eval/types.py +0 -0
  69. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/__init__.py +0 -0
  70. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/_retry_observability.py +0 -0
  71. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/auth.py +0 -0
  72. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/azure/__init__.py +0 -0
  73. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/azure/auth.py +0 -0
  74. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/azure/chat.py +0 -0
  75. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/azure/embedding.py +0 -0
  76. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/azure/settings.py +0 -0
  77. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/azure_openai.py +0 -0
  78. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
  79. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/base.py +0 -0
  80. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/embeddings_base.py +0 -0
  81. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/openai/__init__.py +0 -0
  82. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/openai/chat.py +0 -0
  83. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/openai/embedding.py +0 -0
  84. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/openai/settings.py +0 -0
  85. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/openai.py +0 -0
  86. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/openai_embedding.py +0 -0
  87. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/pricing.py +0 -0
  88. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/retry_policy.py +0 -0
  89. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/settings.py +0 -0
  90. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/llm/types.py +0 -0
  91. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/logger.py +0 -0
  92. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/memory/__init__.py +0 -0
  93. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/memory/base.py +0 -0
  94. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/messages.py +0 -0
  95. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/microwebui/__init__.py +0 -0
  96. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/microwebui/server.py +0 -0
  97. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/microwebui/ui/index.html +0 -0
  98. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/middleware/__init__.py +0 -0
  99. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/middleware/base.py +0 -0
  100. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/middleware/otel.py +0 -0
  101. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/middleware/retry.py +0 -0
  102. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/middleware/usage_logger.py +0 -0
  103. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/notebook.py +0 -0
  104. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/orchestration/__init__.py +0 -0
  105. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/orchestration/ai.py +0 -0
  106. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/orchestration/base.py +0 -0
  107. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/orchestration/handoff.py +0 -0
  108. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/orchestration/plan.py +0 -0
  109. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/orchestration/policies.py +0 -0
  110. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/orchestration/round_robin.py +0 -0
  111. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/__init__.py +0 -0
  112. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/agents.py +0 -0
  113. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/clients.py +0 -0
  114. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/instruction_registry.py +0 -0
  115. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
  116. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
  117. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
  118. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
  119. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/instructions/writer.yaml +0 -0
  120. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/orchestration.py +0 -0
  121. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
  122. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
  123. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
  124. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
  125. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
  126. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/streaming.py +0 -0
  127. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/presets/workflow.py +0 -0
  128. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/session_store.py +0 -0
  129. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/skills/__init__.py +0 -0
  130. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/skills/base.py +0 -0
  131. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/skills/resources.py +0 -0
  132. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/skills/scripts.py +0 -0
  133. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/skills/sources.py +0 -0
  134. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/__init__.py +0 -0
  135. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/base.py +0 -0
  136. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/cancellation.py +0 -0
  137. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/composite.py +0 -0
  138. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/consecutive_agent.py +0 -0
  139. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/external.py +0 -0
  140. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/function_call.py +0 -0
  141. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/handoff.py +0 -0
  142. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/max_message.py +0 -0
  143. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/predicate.py +0 -0
  144. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/source.py +0 -0
  145. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/text_mention.py +0 -0
  146. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/timeout.py +0 -0
  147. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/termination/token_usage.py +0 -0
  148. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/tools/__init__.py +0 -0
  149. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/tools/base.py +0 -0
  150. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/tools/coding_tools.py +0 -0
  151. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/tools/core_tools.py +0 -0
  152. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/tools/decorator.py +0 -0
  153. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/tools/memory_tool.py +0 -0
  154. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/tools/research_tools.py +0 -0
  155. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/types.py +0 -0
  156. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/__init__.py +0 -0
  157. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/discovery.py +0 -0
  158. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/execution.py +0 -0
  159. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/.gitignore +0 -0
  160. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/README.md +0 -0
  161. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/components.json +0 -0
  162. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/eslint.config.js +0 -0
  163. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/index.html +0 -0
  164. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/package-lock.json +0 -0
  165. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/package.json +0 -0
  166. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/plan.md +0 -0
  167. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/public/vite.svg +0 -0
  168. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/App.css +0 -0
  169. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/App.tsx +0 -0
  170. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/assets/react.svg +0 -0
  171. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/agent/agent-view.tsx +0 -0
  172. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/message_renderer/ContentRenderer.tsx +0 -0
  173. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/message_renderer/MessageRenderer.tsx +0 -0
  174. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/message_renderer/index.ts +0 -0
  175. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/message_renderer/types.ts +0 -0
  176. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/mode-toggle.tsx +0 -0
  177. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/orchestrator/orchestrator-view.tsx +0 -0
  178. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/shared/app-header.tsx +0 -0
  179. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/shared/chat-base.tsx +0 -0
  180. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/shared/context-inspector.tsx +0 -0
  181. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/shared/debug-panel.tsx +0 -0
  182. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/shared/entity-selector.tsx +0 -0
  183. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/shared/example-tasks-display.tsx +0 -0
  184. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/shared/session-switcher.tsx +0 -0
  185. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/shared/tool-approval-banner.tsx +0 -0
  186. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/theme-provider.tsx +0 -0
  187. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/attachment-gallery.tsx +0 -0
  188. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/badge.tsx +0 -0
  189. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/button.tsx +0 -0
  190. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/card.tsx +0 -0
  191. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/dialog.tsx +0 -0
  192. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/dropdown-menu.tsx +0 -0
  193. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/file-upload.tsx +0 -0
  194. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/input.tsx +0 -0
  195. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/label.tsx +0 -0
  196. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/loading-spinner.tsx +0 -0
  197. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/loading-state.tsx +0 -0
  198. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/message-input.tsx +0 -0
  199. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/scroll-area.tsx +0 -0
  200. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/slider.tsx +0 -0
  201. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/tabs.tsx +0 -0
  202. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/ui/textarea.tsx +0 -0
  203. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/workflow/workflow-result-renderer.tsx +0 -0
  204. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/components/workflow/workflow-view.tsx +0 -0
  205. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/hooks/messageHandlers.ts +0 -0
  206. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/hooks/useEntityExecution.ts +0 -0
  207. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/index.css +0 -0
  208. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/lib/format-utils.ts +0 -0
  209. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/lib/user-id.ts +0 -0
  210. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/lib/utils.ts +0 -0
  211. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/main.tsx +0 -0
  212. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/services/api.ts +0 -0
  213. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/types/index.ts +0 -0
  214. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/types/picoagents.ts +0 -0
  215. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/utils/message-utils.ts +0 -0
  216. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/src/vite-env.d.ts +0 -0
  217. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/tsconfig.app.json +0 -0
  218. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/tsconfig.json +0 -0
  219. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/tsconfig.node.json +0 -0
  220. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/vite.config.ts +0 -0
  221. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/frontend/yarn.lock +0 -0
  222. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/models.py +0 -0
  223. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/registry.py +0 -0
  224. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/server.py +0 -0
  225. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/session_store.py +0 -0
  226. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/sessions.py +0 -0
  227. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/ui/assets/index-DDp5MYFO.js +0 -0
  228. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/ui/assets/index-ar5tOeqt.css +0 -0
  229. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/ui/index.html +0 -0
  230. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/webui/ui/vite.svg +0 -0
  231. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/__init__.py +0 -0
  232. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/agent.py +0 -0
  233. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/core/__init__.py +0 -0
  234. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
  235. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/core/checkpoint.py +0 -0
  236. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/core/models.py +0 -0
  237. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/core/runner.py +0 -0
  238. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/core/workflow.py +0 -0
  239. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/defaults.py +0 -0
  240. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/loader.py +0 -0
  241. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/schema.py +0 -0
  242. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/schema_utils.py +0 -0
  243. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/steps/__init__.py +0 -0
  244. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/steps/agentbyte_agent.py +0 -0
  245. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/steps/echo.py +0 -0
  246. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/steps/function.py +0 -0
  247. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/steps/http.py +0 -0
  248. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/steps/step.py +0 -0
  249. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
  250. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/steps/transform.py +0 -0
  251. {agentbyte-0.22.1 → agentbyte-0.22.3}/src/agentbyte/workflow/visualizer.py +0 -0
  252. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_agent_as_tool.py +0 -0
  253. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_agent_basic.py +0 -0
  254. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_agent_context_providers.py +0 -0
  255. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_agent_event_types.py +0 -0
  256. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_agent_memory_integration.py +0 -0
  257. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_agent_middleware_integration.py +0 -0
  258. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_agent_retry_middleware.py +0 -0
  259. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_agent_stream_events.py +0 -0
  260. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_embedding_agent.py +0 -0
  261. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/agents/test_tool_approval.py +0 -0
  262. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/cli/test_registry_check.py +0 -0
  263. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/context_providers/__init__.py +0 -0
  264. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/context_providers/test_skill_tools.py +0 -0
  265. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/context_providers/test_skills_provider.py +0 -0
  266. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/dataset/test_loader.py +0 -0
  267. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/dataset/test_multi_table.py +0 -0
  268. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/dataset/test_publish.py +0 -0
  269. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/dataset/test_sqlite_db.py +0 -0
  270. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/eval/test_eval_dataset.py +0 -0
  271. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/eval/test_multi_turn.py +0 -0
  272. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/eval/test_pairwise.py +0 -0
  273. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/eval/test_phase1_runner_and_targets.py +0 -0
  274. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/eval/test_phase2_checks_and_reports.py +0 -0
  275. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/eval/test_types_and_judges.py +0 -0
  276. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/llm/test_azure_client.py +0 -0
  277. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/llm/test_azure_embedding_client.py +0 -0
  278. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/llm/test_llm_types.py +0 -0
  279. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/llm/test_openai_client.py +0 -0
  280. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/llm/test_openai_embedding_client.py +0 -0
  281. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/llm/test_retry_observability.py +0 -0
  282. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/llm/test_retry_policy_api.py +0 -0
  283. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/memory/test_memory.py +0 -0
  284. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/middleware/test_middleware_chain.py +0 -0
  285. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/middleware/test_otel.py +0 -0
  286. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/middleware/test_retry_middleware.py +0 -0
  287. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/middleware/test_usage_logger.py +0 -0
  288. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/orchestration/test_ai_orchestrator.py +0 -0
  289. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/orchestration/test_base_orchestrator.py +0 -0
  290. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/orchestration/test_handoff_orchestrator.py +0 -0
  291. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/orchestration/test_plan_orchestrator.py +0 -0
  292. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/orchestration/test_round_robin.py +0 -0
  293. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/presets/test_agents.py +0 -0
  294. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/presets/test_clients.py +0 -0
  295. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/presets/test_instruction_registry.py +0 -0
  296. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/presets/test_orchestration.py +0 -0
  297. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/presets/test_streaming.py +0 -0
  298. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/presets/test_workflow.py +0 -0
  299. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/skills/__init__.py +0 -0
  300. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/skills/test_base.py +0 -0
  301. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/skills/test_resources.py +0 -0
  302. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/skills/test_scripts.py +0 -0
  303. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/skills/test_sources.py +0 -0
  304. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_base.py +0 -0
  305. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_cancellation.py +0 -0
  306. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_composite.py +0 -0
  307. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_consecutive_agent.py +0 -0
  308. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_external.py +0 -0
  309. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_function_call.py +0 -0
  310. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_handoff.py +0 -0
  311. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_max_message.py +0 -0
  312. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_predicate.py +0 -0
  313. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_source.py +0 -0
  314. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_text_mention.py +0 -0
  315. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_timeout.py +0 -0
  316. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/termination/test_token_usage.py +0 -0
  317. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/test_cancellation_token.py +0 -0
  318. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/test_context.py +0 -0
  319. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/test_logger.py +0 -0
  320. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/test_messages.py +0 -0
  321. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/test_package_api.py +0 -0
  322. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/test_session_store.py +0 -0
  323. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/test_types.py +0 -0
  324. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/tools/test_coding_tools.py +0 -0
  325. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/tools/test_memory_tool.py +0 -0
  326. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/tools/test_research_tools.py +0 -0
  327. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/tools/test_tools.py +0 -0
  328. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/webui/__init__.py +0 -0
  329. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/webui/helpers.py +0 -0
  330. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/webui/test_execution.py +0 -0
  331. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/webui/test_microwebui_server.py +0 -0
  332. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/webui/test_package_api.py +0 -0
  333. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/webui/test_registry.py +0 -0
  334. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/webui/test_server.py +0 -0
  335. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/webui/test_sessions.py +0 -0
  336. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_checkpoint.py +0 -0
  337. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_subworkflow_step.py +0 -0
  338. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_workflow_agent.py +0 -0
  339. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_workflow_class.py +0 -0
  340. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_workflow_models.py +0 -0
  341. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_workflow_runner.py +0 -0
  342. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_workflow_schema.py +0 -0
  343. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_workflow_steps.py +0 -0
  344. {agentbyte-0.22.1 → agentbyte-0.22.3}/tests/workflow/test_workflow_visualizer.py +0 -0
@@ -4,6 +4,24 @@ All notable changes to Agentbyte are documented in this file.
4
4
 
5
5
  The format follows Keep a Changelog principles and semantic versioning.
6
6
 
7
+ ## [0.22.3] - 2026-07-07
8
+
9
+ ### Fixed
10
+
11
+ - Fixed `SqlUsageBackend` Postgres writes by normalizing timezone-aware `recorded_at` timestamps to naive UTC before persistence, avoiding asyncpg datetime binding errors that left `llm_usage_events` empty on PostgreSQL-backed runtimes while SQLite continued to work.
12
+
13
+ ## [0.22.2] - 2026-07-05
14
+
15
+ ### Added
16
+
17
+ - Added `AgentResponse.final_message` and `AgentResponse.structured_output` convenience accessors for consuming final assistant output without manually indexing `response.messages[-1]`.
18
+ - Added the FastAPI agent API frontend integration updates, including the API-loaded agent landing page, contracting workspace routing, feedback UI flow, tool-step rendering, and context inspector refinements.
19
+
20
+ ### Changed
21
+
22
+ - Updated the FastAPI agent API example to consume structured output through the new `AgentResponse.structured_output` accessor.
23
+ - Updated the FastAPI study docs and UI developer guide to match the integrated API, session history, feedback, citation, and frontend behavior.
24
+
7
25
  ## [0.22.1] - 2026-06-30
8
26
 
9
27
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbyte
3
- Version: 0.22.1
3
+ Version: 0.22.3
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
@@ -78,7 +78,7 @@ Description-Content-Type: text/markdown
78
78
 
79
79
  Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
80
80
 
81
- Current release: **0.22.1**
81
+ Current release: **0.22.3**
82
82
 
83
83
  ## Current Capabilities
84
84
 
@@ -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.22.1**
5
+ Current release: **0.22.3**
6
6
 
7
7
  ## Current Capabilities
8
8
 
@@ -0,0 +1,2 @@
1
+ __version__ = "0.22.3"
2
+ VERSION = __version__
@@ -8,7 +8,7 @@ from typing import Any, Dict, List, Literal, Optional, Sequence, Union
8
8
  from pydantic import BaseModel, ConfigDict, Field
9
9
 
10
10
  from agentbyte.context import AgentContext, ToolApprovalRequest
11
- from agentbyte.messages import Message, Usage
11
+ from agentbyte.messages import AssistantMessage, Message, Usage
12
12
  from agentbyte.types import ToolResult
13
13
 
14
14
 
@@ -213,6 +213,24 @@ class AgentResponse(BaseModel):
213
213
  return ""
214
214
  return self.context.messages[-1].content
215
215
 
216
+ @property
217
+ def final_message(self) -> AssistantMessage | None:
218
+ """Final assistant message if the run ended with one."""
219
+ if not self.context.messages:
220
+ return None
221
+ message = self.context.messages[-1]
222
+ if isinstance(message, AssistantMessage):
223
+ return message
224
+ return None
225
+
226
+ @property
227
+ def structured_output(self) -> BaseModel | None:
228
+ """Structured output attached to the final assistant message, if any."""
229
+ final_message = self.final_message
230
+ if final_message is None:
231
+ return None
232
+ return final_message.structured_content
233
+
216
234
  def __str__(self) -> str:
217
235
  """Returns a user-friendly string representation with messages and usage."""
218
236
  # Concat all message str representations
@@ -39,6 +39,13 @@ from sqlmodel import Field, SQLModel
39
39
  from .usage_logger import UsageEvent, UsagePersistenceBackend
40
40
 
41
41
 
42
+ def _normalize_recorded_at(value: datetime) -> datetime:
43
+ """Store usage timestamps as naive UTC for cross-database compatibility."""
44
+ if value.tzinfo is None:
45
+ return value
46
+ return value.astimezone(timezone.utc).replace(tzinfo=None)
47
+
48
+
42
49
  class LlmUsageEvent(SQLModel, table=True):
43
50
  """SQLModel table that stores one row per LLM call.
44
51
 
@@ -132,7 +139,7 @@ class SqlUsageBackend(UsagePersistenceBackend):
132
139
  tool_calls=event.tool_calls,
133
140
  memory_operations=event.memory_operations,
134
141
  cost_estimate=event.cost_estimate,
135
- recorded_at=event.recorded_at,
142
+ recorded_at=_normalize_recorded_at(event.recorded_at),
136
143
  )
137
144
  session.add(row)
138
145
  await session.commit()
@@ -0,0 +1,57 @@
1
+ """AgentResponse convenience accessor tests."""
2
+
3
+ from pydantic import BaseModel
4
+
5
+ from agentbyte.agents.types import AgentResponse
6
+ from agentbyte.context import AgentContext
7
+ from agentbyte.messages import AssistantMessage, Message, UserMessage
8
+
9
+
10
+ class ExampleOutput(BaseModel):
11
+ value: str
12
+
13
+
14
+ def _response_with(*messages: Message) -> AgentResponse:
15
+ context = AgentContext()
16
+ for message in messages:
17
+ context.add_message(message)
18
+ return AgentResponse(context=context, source="test-agent", finish_reason="stop")
19
+
20
+
21
+ def test_agent_response_accessors_empty_context() -> None:
22
+ response = _response_with()
23
+
24
+ assert response.final_message is None
25
+ assert response.structured_output is None
26
+ assert response.final_content == ""
27
+
28
+
29
+ def test_agent_response_accessors_non_assistant_final_message() -> None:
30
+ response = _response_with(UserMessage(content="question", source="user"))
31
+
32
+ assert response.final_message is None
33
+ assert response.structured_output is None
34
+ assert response.final_content == "question"
35
+
36
+
37
+ def test_agent_response_accessors_plain_assistant_final_message() -> None:
38
+ assistant = AssistantMessage(content="answer", source="assistant")
39
+ response = _response_with(UserMessage(content="question", source="user"), assistant)
40
+
41
+ assert response.final_message is assistant
42
+ assert response.structured_output is None
43
+ assert response.final_content == "answer"
44
+
45
+
46
+ def test_agent_response_accessors_structured_assistant_final_message() -> None:
47
+ structured = ExampleOutput(value="answer")
48
+ assistant = AssistantMessage(
49
+ content="",
50
+ source="assistant",
51
+ structured_content=structured,
52
+ )
53
+ response = _response_with(UserMessage(content="question", source="user"), assistant)
54
+
55
+ assert response.final_message is assistant
56
+ assert response.structured_output is structured
57
+ assert response.final_content == ""
@@ -9,6 +9,7 @@ from __future__ import annotations
9
9
 
10
10
  import asyncio
11
11
  from collections.abc import AsyncGenerator
12
+ from datetime import datetime, timezone
12
13
  from typing import Any
13
14
 
14
15
  import pytest
@@ -188,6 +189,34 @@ async def test_multiple_calls_write_multiple_rows(middleware, model_ctx, engine)
188
189
  assert len(await _rows(engine)) == 3
189
190
 
190
191
 
192
+ @pytest.mark.asyncio
193
+ async def test_timezone_aware_recorded_at_is_normalized_for_storage(backend, engine) -> None:
194
+ from agentbyte.middleware.usage_logger import UsageEvent
195
+
196
+ await backend.write(
197
+ UsageEvent(
198
+ session_id="sess-aware",
199
+ user_id="user-aware",
200
+ identifier="test-app",
201
+ agent_name="test-agent",
202
+ model="gpt-4o",
203
+ duration_ms=1,
204
+ llm_calls=1,
205
+ tokens_input=1,
206
+ tokens_output=1,
207
+ tool_calls=0,
208
+ memory_operations=0,
209
+ cost_estimate=0.001,
210
+ recorded_at=datetime(2026, 7, 7, 12, 0, tzinfo=timezone.utc),
211
+ )
212
+ )
213
+
214
+ rows = await _rows(engine)
215
+ assert len(rows) == 1
216
+ assert rows[0].recorded_at.tzinfo is None
217
+ assert rows[0].recorded_at == datetime(2026, 7, 7, 12, 0)
218
+
219
+
191
220
  @pytest.mark.asyncio
192
221
  async def test_run_id_injected_by_agent_run() -> None:
193
222
  """agent.run() must stamp run_id when not already present."""
@@ -1,2 +0,0 @@
1
- __version__ = "0.22.1"
2
- VERSION = __version__
File without changes
File without changes
File without changes