agentbyte 0.22.0__tar.gz → 0.22.2__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.0 → agentbyte-0.22.2}/.gitignore +12 -1
  2. {agentbyte-0.22.0 → agentbyte-0.22.2}/CHANGELOG.md +44 -0
  3. {agentbyte-0.22.0 → agentbyte-0.22.2}/PKG-INFO +4 -2
  4. {agentbyte-0.22.0 → agentbyte-0.22.2}/README.md +1 -1
  5. {agentbyte-0.22.0 → agentbyte-0.22.2}/pyproject.toml +7 -0
  6. agentbyte-0.22.2/src/agentbyte/__about__.py +2 -0
  7. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/agents/types.py +19 -1
  8. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/__init__.py +2 -0
  9. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/base.py +4 -0
  10. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/importer.py +69 -3
  11. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/loader.py +10 -0
  12. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/sources.py +35 -4
  13. agentbyte-0.22.2/src/agentbyte/dataset/sqlite_db.py +172 -0
  14. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/logger.py +39 -18
  15. agentbyte-0.22.2/tests/agents/test_agent_response_accessors.py +57 -0
  16. agentbyte-0.22.2/tests/dataset/test_sqlite_db.py +288 -0
  17. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/test_logger.py +9 -12
  18. agentbyte-0.22.0/src/agentbyte/__about__.py +0 -2
  19. {agentbyte-0.22.0 → agentbyte-0.22.2}/LICENSE +0 -0
  20. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/__init__.py +0 -0
  21. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/agents/__init__.py +0 -0
  22. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/agents/agent.py +0 -0
  23. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/agents/agent_as_tool.py +0 -0
  24. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/agents/base.py +0 -0
  25. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/agents/embedding_agent.py +0 -0
  26. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/cancellation_token.py +0 -0
  27. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/catalog.py +0 -0
  28. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/cli/__init__.py +0 -0
  29. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/cli/main.py +0 -0
  30. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/component.py +0 -0
  31. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/context.py +0 -0
  32. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/context_providers/__init__.py +0 -0
  33. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/context_providers/base.py +0 -0
  34. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/context_providers/skill_tools.py +0 -0
  35. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/context_providers/skills.py +0 -0
  36. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/config.py +0 -0
  37. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/json.py +0 -0
  38. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/publish.py +0 -0
  39. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/publish_config.py +0 -0
  40. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/publishers.py +0 -0
  41. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/sqlite.py +0 -0
  42. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/write_config.py +0 -0
  43. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/dataset/writers.py +0 -0
  44. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/entity.py +0 -0
  45. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/__init__.py +0 -0
  46. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/base.py +0 -0
  47. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/checks/__init__.py +0 -0
  48. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/checks/decorator.py +0 -0
  49. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/checks/keyword.py +0 -0
  50. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/checks/local.py +0 -0
  51. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/checks/tool.py +0 -0
  52. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/checks/types.py +0 -0
  53. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/comparison.py +0 -0
  54. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/eval_dataset.py +0 -0
  55. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/judges/__init__.py +0 -0
  56. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/judges/base.py +0 -0
  57. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/judges/composite.py +0 -0
  58. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/judges/llm.py +0 -0
  59. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/judges/pairwise.py +0 -0
  60. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/judges/reference.py +0 -0
  61. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/pairwise.py +0 -0
  62. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/report.py +0 -0
  63. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/runner.py +0 -0
  64. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/targets/__init__.py +0 -0
  65. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/targets/agent.py +0 -0
  66. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/targets/model.py +0 -0
  67. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/targets/multi_turn.py +0 -0
  68. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/targets/orchestrator.py +0 -0
  69. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/eval/types.py +0 -0
  70. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/__init__.py +0 -0
  71. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/_retry_observability.py +0 -0
  72. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/auth.py +0 -0
  73. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/azure/__init__.py +0 -0
  74. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/azure/auth.py +0 -0
  75. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/azure/chat.py +0 -0
  76. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/azure/embedding.py +0 -0
  77. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/azure/settings.py +0 -0
  78. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/azure_openai.py +0 -0
  79. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/azure_openai_embedding.py +0 -0
  80. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/base.py +0 -0
  81. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/embeddings_base.py +0 -0
  82. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/openai/__init__.py +0 -0
  83. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/openai/chat.py +0 -0
  84. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/openai/embedding.py +0 -0
  85. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/openai/settings.py +0 -0
  86. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/openai.py +0 -0
  87. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/openai_embedding.py +0 -0
  88. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/pricing.py +0 -0
  89. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/retry_policy.py +0 -0
  90. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/settings.py +0 -0
  91. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/llm/types.py +0 -0
  92. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/memory/__init__.py +0 -0
  93. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/memory/base.py +0 -0
  94. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/messages.py +0 -0
  95. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/microwebui/__init__.py +0 -0
  96. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/microwebui/server.py +0 -0
  97. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/microwebui/ui/index.html +0 -0
  98. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/middleware/__init__.py +0 -0
  99. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/middleware/base.py +0 -0
  100. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/middleware/otel.py +0 -0
  101. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/middleware/retry.py +0 -0
  102. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/middleware/sql_usage.py +0 -0
  103. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/middleware/usage_logger.py +0 -0
  104. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/notebook.py +0 -0
  105. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/orchestration/__init__.py +0 -0
  106. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/orchestration/ai.py +0 -0
  107. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/orchestration/base.py +0 -0
  108. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/orchestration/handoff.py +0 -0
  109. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/orchestration/plan.py +0 -0
  110. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/orchestration/policies.py +0 -0
  111. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/orchestration/round_robin.py +0 -0
  112. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/__init__.py +0 -0
  113. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/agents.py +0 -0
  114. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/clients.py +0 -0
  115. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/instruction_registry.py +0 -0
  116. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/instructions/orchestrator.yaml +0 -0
  117. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/instructions/query_rewriter.yaml +0 -0
  118. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/instructions/researcher.yaml +0 -0
  119. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/instructions/reviewer.yaml +0 -0
  120. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/instructions/writer.yaml +0 -0
  121. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/orchestration.py +0 -0
  122. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/skills/contracts-analyst/SKILL.md +0 -0
  123. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/skills/hr-analyst/SKILL.md +0 -0
  124. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/skills/hr-analyst/resources/departments.md +0 -0
  125. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/skills/hr-analyst/resources/employees.md +0 -0
  126. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/skills/hr-analyst/resources/payroll.md +0 -0
  127. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/streaming.py +0 -0
  128. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/presets/workflow.py +0 -0
  129. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/session_store.py +0 -0
  130. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/skills/__init__.py +0 -0
  131. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/skills/base.py +0 -0
  132. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/skills/resources.py +0 -0
  133. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/skills/scripts.py +0 -0
  134. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/skills/sources.py +0 -0
  135. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/__init__.py +0 -0
  136. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/base.py +0 -0
  137. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/cancellation.py +0 -0
  138. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/composite.py +0 -0
  139. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/consecutive_agent.py +0 -0
  140. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/external.py +0 -0
  141. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/function_call.py +0 -0
  142. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/handoff.py +0 -0
  143. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/max_message.py +0 -0
  144. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/predicate.py +0 -0
  145. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/source.py +0 -0
  146. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/text_mention.py +0 -0
  147. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/timeout.py +0 -0
  148. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/termination/token_usage.py +0 -0
  149. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/tools/__init__.py +0 -0
  150. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/tools/base.py +0 -0
  151. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/tools/coding_tools.py +0 -0
  152. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/tools/core_tools.py +0 -0
  153. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/tools/decorator.py +0 -0
  154. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/tools/memory_tool.py +0 -0
  155. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/tools/research_tools.py +0 -0
  156. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/types.py +0 -0
  157. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/__init__.py +0 -0
  158. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/discovery.py +0 -0
  159. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/execution.py +0 -0
  160. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/.gitignore +0 -0
  161. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/README.md +0 -0
  162. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/components.json +0 -0
  163. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/eslint.config.js +0 -0
  164. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/index.html +0 -0
  165. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/package-lock.json +0 -0
  166. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/package.json +0 -0
  167. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/plan.md +0 -0
  168. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/public/vite.svg +0 -0
  169. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/App.css +0 -0
  170. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/App.tsx +0 -0
  171. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/assets/react.svg +0 -0
  172. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/agent/agent-view.tsx +0 -0
  173. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/message_renderer/ContentRenderer.tsx +0 -0
  174. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/message_renderer/MessageRenderer.tsx +0 -0
  175. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/message_renderer/index.ts +0 -0
  176. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/message_renderer/types.ts +0 -0
  177. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/mode-toggle.tsx +0 -0
  178. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/orchestrator/orchestrator-view.tsx +0 -0
  179. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/shared/app-header.tsx +0 -0
  180. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/shared/chat-base.tsx +0 -0
  181. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/shared/context-inspector.tsx +0 -0
  182. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/shared/debug-panel.tsx +0 -0
  183. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/shared/entity-selector.tsx +0 -0
  184. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/shared/example-tasks-display.tsx +0 -0
  185. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/shared/session-switcher.tsx +0 -0
  186. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/shared/tool-approval-banner.tsx +0 -0
  187. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/theme-provider.tsx +0 -0
  188. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/attachment-gallery.tsx +0 -0
  189. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/badge.tsx +0 -0
  190. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/button.tsx +0 -0
  191. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/card.tsx +0 -0
  192. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/dialog.tsx +0 -0
  193. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/dropdown-menu.tsx +0 -0
  194. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/file-upload.tsx +0 -0
  195. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/input.tsx +0 -0
  196. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/label.tsx +0 -0
  197. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/loading-spinner.tsx +0 -0
  198. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/loading-state.tsx +0 -0
  199. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/message-input.tsx +0 -0
  200. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/scroll-area.tsx +0 -0
  201. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/slider.tsx +0 -0
  202. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/tabs.tsx +0 -0
  203. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/ui/textarea.tsx +0 -0
  204. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/workflow/workflow-result-renderer.tsx +0 -0
  205. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/components/workflow/workflow-view.tsx +0 -0
  206. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/hooks/messageHandlers.ts +0 -0
  207. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/hooks/useEntityExecution.ts +0 -0
  208. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/index.css +0 -0
  209. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/lib/format-utils.ts +0 -0
  210. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/lib/user-id.ts +0 -0
  211. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/lib/utils.ts +0 -0
  212. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/main.tsx +0 -0
  213. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/services/api.ts +0 -0
  214. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/types/index.ts +0 -0
  215. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/types/picoagents.ts +0 -0
  216. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/utils/message-utils.ts +0 -0
  217. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/src/vite-env.d.ts +0 -0
  218. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/tsconfig.app.json +0 -0
  219. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/tsconfig.json +0 -0
  220. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/tsconfig.node.json +0 -0
  221. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/vite.config.ts +0 -0
  222. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/frontend/yarn.lock +0 -0
  223. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/models.py +0 -0
  224. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/registry.py +0 -0
  225. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/server.py +0 -0
  226. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/session_store.py +0 -0
  227. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/sessions.py +0 -0
  228. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/ui/assets/index-DDp5MYFO.js +0 -0
  229. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/ui/assets/index-ar5tOeqt.css +0 -0
  230. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/ui/index.html +0 -0
  231. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/webui/ui/vite.svg +0 -0
  232. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/__init__.py +0 -0
  233. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/agent.py +0 -0
  234. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/core/__init__.py +0 -0
  235. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/core/_structure_hash.py +0 -0
  236. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/core/checkpoint.py +0 -0
  237. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/core/models.py +0 -0
  238. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/core/runner.py +0 -0
  239. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/core/workflow.py +0 -0
  240. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/defaults.py +0 -0
  241. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/loader.py +0 -0
  242. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/schema.py +0 -0
  243. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/schema_utils.py +0 -0
  244. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/steps/__init__.py +0 -0
  245. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/steps/agentbyte_agent.py +0 -0
  246. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/steps/echo.py +0 -0
  247. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/steps/function.py +0 -0
  248. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/steps/http.py +0 -0
  249. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/steps/step.py +0 -0
  250. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/steps/subworkflow.py +0 -0
  251. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/steps/transform.py +0 -0
  252. {agentbyte-0.22.0 → agentbyte-0.22.2}/src/agentbyte/workflow/visualizer.py +0 -0
  253. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_agent_as_tool.py +0 -0
  254. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_agent_basic.py +0 -0
  255. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_agent_context_providers.py +0 -0
  256. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_agent_event_types.py +0 -0
  257. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_agent_memory_integration.py +0 -0
  258. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_agent_middleware_integration.py +0 -0
  259. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_agent_retry_middleware.py +0 -0
  260. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_agent_stream_events.py +0 -0
  261. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_embedding_agent.py +0 -0
  262. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/agents/test_tool_approval.py +0 -0
  263. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/cli/test_registry_check.py +0 -0
  264. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/context_providers/__init__.py +0 -0
  265. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/context_providers/test_skill_tools.py +0 -0
  266. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/context_providers/test_skills_provider.py +0 -0
  267. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/dataset/test_loader.py +0 -0
  268. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/dataset/test_multi_table.py +0 -0
  269. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/dataset/test_publish.py +0 -0
  270. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/eval/test_eval_dataset.py +0 -0
  271. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/eval/test_multi_turn.py +0 -0
  272. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/eval/test_pairwise.py +0 -0
  273. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/eval/test_phase1_runner_and_targets.py +0 -0
  274. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/eval/test_phase2_checks_and_reports.py +0 -0
  275. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/eval/test_types_and_judges.py +0 -0
  276. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/llm/test_azure_client.py +0 -0
  277. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/llm/test_azure_embedding_client.py +0 -0
  278. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/llm/test_llm_types.py +0 -0
  279. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/llm/test_openai_client.py +0 -0
  280. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/llm/test_openai_embedding_client.py +0 -0
  281. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/llm/test_retry_observability.py +0 -0
  282. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/llm/test_retry_policy_api.py +0 -0
  283. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/memory/test_memory.py +0 -0
  284. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/middleware/test_middleware_chain.py +0 -0
  285. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/middleware/test_otel.py +0 -0
  286. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/middleware/test_retry_middleware.py +0 -0
  287. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/middleware/test_sql_usage.py +0 -0
  288. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/middleware/test_usage_logger.py +0 -0
  289. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/orchestration/test_ai_orchestrator.py +0 -0
  290. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/orchestration/test_base_orchestrator.py +0 -0
  291. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/orchestration/test_handoff_orchestrator.py +0 -0
  292. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/orchestration/test_plan_orchestrator.py +0 -0
  293. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/orchestration/test_round_robin.py +0 -0
  294. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/presets/test_agents.py +0 -0
  295. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/presets/test_clients.py +0 -0
  296. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/presets/test_instruction_registry.py +0 -0
  297. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/presets/test_orchestration.py +0 -0
  298. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/presets/test_streaming.py +0 -0
  299. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/presets/test_workflow.py +0 -0
  300. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/skills/__init__.py +0 -0
  301. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/skills/test_base.py +0 -0
  302. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/skills/test_resources.py +0 -0
  303. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/skills/test_scripts.py +0 -0
  304. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/skills/test_sources.py +0 -0
  305. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_base.py +0 -0
  306. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_cancellation.py +0 -0
  307. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_composite.py +0 -0
  308. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_consecutive_agent.py +0 -0
  309. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_external.py +0 -0
  310. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_function_call.py +0 -0
  311. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_handoff.py +0 -0
  312. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_max_message.py +0 -0
  313. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_predicate.py +0 -0
  314. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_source.py +0 -0
  315. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_text_mention.py +0 -0
  316. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_timeout.py +0 -0
  317. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/termination/test_token_usage.py +0 -0
  318. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/test_cancellation_token.py +0 -0
  319. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/test_context.py +0 -0
  320. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/test_messages.py +0 -0
  321. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/test_package_api.py +0 -0
  322. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/test_session_store.py +0 -0
  323. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/test_types.py +0 -0
  324. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/tools/test_coding_tools.py +0 -0
  325. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/tools/test_memory_tool.py +0 -0
  326. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/tools/test_research_tools.py +0 -0
  327. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/tools/test_tools.py +0 -0
  328. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/webui/__init__.py +0 -0
  329. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/webui/helpers.py +0 -0
  330. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/webui/test_execution.py +0 -0
  331. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/webui/test_microwebui_server.py +0 -0
  332. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/webui/test_package_api.py +0 -0
  333. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/webui/test_registry.py +0 -0
  334. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/webui/test_server.py +0 -0
  335. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/webui/test_sessions.py +0 -0
  336. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_checkpoint.py +0 -0
  337. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_subworkflow_step.py +0 -0
  338. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_workflow_agent.py +0 -0
  339. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_workflow_class.py +0 -0
  340. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_workflow_models.py +0 -0
  341. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_workflow_runner.py +0 -0
  342. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_workflow_schema.py +0 -0
  343. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_workflow_steps.py +0 -0
  344. {agentbyte-0.22.0 → agentbyte-0.22.2}/tests/workflow/test_workflow_visualizer.py +0 -0
@@ -7,8 +7,15 @@ wheels/
7
7
  *.egg-info
8
8
 
9
9
  # Virtual environments
10
- .venv
10
+ .venv/
11
+ venv/
12
+ env/
13
+
14
+ # Local environment files
11
15
  .env
16
+ .env.*
17
+ !.env.example
18
+ !.env.*.example
12
19
 
13
20
  # IDE
14
21
  .vscode/
@@ -49,3 +56,7 @@ artifacts/
49
56
 
50
57
  # Machine-local agent config (each machine maintains its own)
51
58
  AGENTS.LOCAL.md
59
+ data/datasets/
60
+
61
+ # lean-ctx context runtime cache
62
+ .lean-ctx/
@@ -4,6 +4,50 @@ 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.2] - 2026-07-05
8
+
9
+ ### Added
10
+
11
+ - Added `AgentResponse.final_message` and `AgentResponse.structured_output` convenience accessors for consuming final assistant output without manually indexing `response.messages[-1]`.
12
+ - 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.
13
+
14
+ ### Changed
15
+
16
+ - Updated the FastAPI agent API example to consume structured output through the new `AgentResponse.structured_output` accessor.
17
+ - Updated the FastAPI study docs and UI developer guide to match the integrated API, session history, feedback, citation, and frontend behavior.
18
+
19
+ ## [0.22.1] - 2026-06-30
20
+
21
+ ### Added
22
+
23
+ - Added `StreamEventLogger.log(event)` — a single dispatcher that routes any stream event to the correct log level, replacing the need for callers to invoke all five level methods per event.
24
+
25
+ ### Changed
26
+
27
+ - `StepProgressEvent` is now logged at `INFO` (moved from `DEBUG`) so that step progress messages emitted via `context.emit_progress()` appear in standard Lambda/application logs without enabling debug output.
28
+
29
+ ## [0.22.0] - 2026-05-30
30
+
31
+ ### Added
32
+
33
+ - Added async-first `SQLiteDataset` rewrite: `connect()` is now async, `__aenter__`/`__aexit__` context manager support added via `aiosqlite`.
34
+ - Added `DatasetImportConfig` and `create_dataset()` importer that converts `list[dict]`, CSV file, and raw CSV string into dataset artifacts on disk.
35
+ - Added `LocalDatasetWriteConfig` and `S3DatasetWriteConfig` as the write-side mirror of the existing source config pattern (`write_config.py`, `writers.py`).
36
+ - Added spec `0020-dataset-importer` registered in `docs/specs/README.md`.
37
+ - Added `hr-analyst` multifile skill demonstrating selective resource loading: agent loads only the schema file relevant to each question rather than injecting the full schema set into every prompt.
38
+ - Added notebook `12.2-agent-skills-multifile-skill` for the HR-analyst pattern.
39
+ - Added notebook `14.1-dataset-importer` covering 10 importer use cases (single/multi-table, all source types, overwrite protection, schema inspection, Pandas DataFrame path).
40
+ - Added `agentbyte-runtime-skills` agent skill (`SKILL.md`) for skill authoring guidance.
41
+ - Added study doc `03_topic_skills_provider.md` under `docs/study/08-skills_topics/`.
42
+
43
+ ### Changed
44
+
45
+ - Reorganised usecase notebooks from flat numbered files into topic subfolders mirroring `notebooks/concepts/`: `agents/`, `configuration/`, `workflows/`, `tools/`, `skills/`, `eval/`, `dataset/`, `rag/`; numbers reset to `01` within each group.
46
+ - Updated `docs/study` dataset topics and concept notebooks (`01-dataset-module-examples`, `02-loading-asmd-esmd-datasets`) for the async API.
47
+ - Removed old `skill-authoring/SKILL.md`; replaced by `agentbyte-runtime-skills/SKILL.md`.
48
+
49
+ ---
50
+
7
51
  ## [0.21.0] - 2026-05-22
8
52
 
9
53
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agentbyte
3
- Version: 0.22.0
3
+ Version: 0.22.2
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
@@ -30,6 +30,8 @@ Provides-Extra: azureopenai
30
30
  Requires-Dist: azure-identity>=1.25.1; extra == 'azureopenai'
31
31
  Requires-Dist: openai>=1.107.1; extra == 'azureopenai'
32
32
  Provides-Extra: coding
33
+ Provides-Extra: dataset
34
+ Requires-Dist: aiosqlite>=0.22.1; extra == 'dataset'
33
35
  Provides-Extra: dev
34
36
  Requires-Dist: ipykernel>=7.1.0; extra == 'dev'
35
37
  Requires-Dist: nbclient>=0.10.4; extra == 'dev'
@@ -76,7 +78,7 @@ Description-Content-Type: text/markdown
76
78
 
77
79
  Agentbyte is an observability-first agentic AI framework for building and studying multiagent systems with a learning-first, implementation-oriented workflow.
78
80
 
79
- Current release: **0.21.0**
81
+ Current release: **0.22.2**
80
82
 
81
83
  ## Current Capabilities
82
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.21.0**
5
+ Current release: **0.22.2**
6
6
 
7
7
  ## Current Capabilities
8
8
 
@@ -38,6 +38,9 @@ webui = [
38
38
  "fastapi>=0.135.2",
39
39
  "uvicorn[standard]>=0.44.0",
40
40
  ]
41
+ dataset = [
42
+ "aiosqlite>=0.22.1",
43
+ ]
41
44
  sql = [
42
45
  "sqlmodel>=0.0.38",
43
46
  "asyncpg>=0.31.0",
@@ -139,6 +142,9 @@ otel = [
139
142
  "opentelemetry-exporter-otlp-proto-http>=1.39.1",
140
143
  "opentelemetry-sdk>=1.39.1",
141
144
  ]
145
+ dataset = [
146
+ "aiosqlite>=0.22.1",
147
+ ]
142
148
  sql = [
143
149
  "sqlmodel>=0.0.38",
144
150
  "asyncpg>=0.31.0",
@@ -175,6 +181,7 @@ all = [
175
181
  "openai>=1.107.1",
176
182
  "azure-identity>=1.25.1",
177
183
  "aioboto3>=15.5.0",
184
+ "aiosqlite>=0.22.1",
178
185
  "opentelemetry-api>=1.39.1",
179
186
  "opentelemetry-exporter-otlp-proto-http>=1.39.1",
180
187
  "opentelemetry-sdk>=1.39.1",
@@ -0,0 +1,2 @@
1
+ __version__ = "0.22.2"
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
@@ -113,6 +113,7 @@ from agentbyte.dataset.sqlite import (
113
113
  SqliteColumn,
114
114
  SqliteSchema,
115
115
  )
116
+ from agentbyte.dataset.sqlite_db import SQLiteDbDataset
116
117
 
117
118
  __all__ = [
118
119
  # Source configuration
@@ -134,6 +135,7 @@ __all__ = [
134
135
  "BaseDataset",
135
136
  # Implementations
136
137
  "SQLiteDataset",
138
+ "SQLiteDbDataset",
137
139
  "JSONDataset",
138
140
  "DatasetPublisher",
139
141
  "S3DatasetPublisher",
@@ -87,11 +87,15 @@ class DatasetConfig(BaseModel):
87
87
  engine: str = Field(default="sqlite", description="Database engine")
88
88
  table_name: str = Field(default="", description="Table name for single-table datasets")
89
89
  tables: list[TableDef] = Field(default_factory=list, description="Table definitions for multi-table datasets")
90
+ table_names: list[str] = Field(default_factory=list, description="Table names for sqlite_db engine")
90
91
  in_memory: bool = Field(default=True, description="Use in-memory storage")
91
92
  description: str = Field(default="", description="Dataset description")
92
93
 
93
94
  @model_validator(mode="after")
94
95
  def _validate_table_mode(self) -> "DatasetConfig":
96
+ # sqlite_db uses table_names instead of table_name/tables
97
+ if self.engine == "sqlite_db":
98
+ return self
95
99
  has_single = bool(self.table_name)
96
100
  has_multi = bool(self.tables)
97
101
  if has_single and has_multi:
@@ -286,6 +286,69 @@ def _assemble_all_files(
286
286
  return files
287
287
 
288
288
 
289
+ # ---------------------------------------------------------------------------
290
+ # sqlite_db binary file assembly — pure sqlite3 + thread, no aiosqlite
291
+ # ---------------------------------------------------------------------------
292
+
293
+
294
+ def _build_db_files(
295
+ config: "DatasetImportConfig",
296
+ sources: list[DataSource],
297
+ ) -> dict[str, bytes]:
298
+ """Build config.json + dataset.db bytes for the sqlite_db engine.
299
+
300
+ Runs in a thread (called via asyncio.to_thread). Uses only stdlib sqlite3
301
+ and sqlite3.Connection.backup() which is available since Python 3.7.
302
+ """
303
+ import os
304
+ import sqlite3
305
+ import tempfile
306
+ from pathlib import Path as _Path
307
+
308
+ table_names: list[str] = []
309
+ mem = sqlite3.connect(":memory:")
310
+ try:
311
+ for source in sources:
312
+ records = source.load()
313
+ schema = _infer_schema(records)
314
+ serialized = _serialize_for_sqlite(records, schema)
315
+ mem.execute(_build_create_table_sql(source.name, schema))
316
+ if serialized:
317
+ col_names = [col["name"] for col in schema]
318
+ placeholders = ", ".join(["?"] * len(col_names))
319
+ insert_sql = (
320
+ f"INSERT INTO {source.name} ({', '.join(col_names)}) "
321
+ f"VALUES ({placeholders})"
322
+ )
323
+ mem.executemany(
324
+ insert_sql,
325
+ [tuple(r.get(c) for c in col_names) for r in serialized],
326
+ )
327
+ table_names.append(source.name)
328
+ mem.commit()
329
+
330
+ with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
331
+ tmp = f.name
332
+ try:
333
+ with sqlite3.connect(tmp) as dst:
334
+ mem.backup(dst)
335
+ db_bytes = _Path(tmp).read_bytes()
336
+ finally:
337
+ os.unlink(tmp)
338
+ finally:
339
+ mem.close()
340
+
341
+ cfg_dict = {
342
+ "engine": "sqlite_db",
343
+ "table_names": table_names,
344
+ "description": config.description,
345
+ }
346
+ return {
347
+ "config.json": json.dumps(cfg_dict, indent=2).encode(),
348
+ "dataset.db": db_bytes,
349
+ }
350
+
351
+
289
352
  # ---------------------------------------------------------------------------
290
353
  # aiosqlite validation — runs before writing any files
291
354
  # ---------------------------------------------------------------------------
@@ -361,10 +424,13 @@ class DatasetImporter:
361
424
  "Set overwrite=True to replace it."
362
425
  )
363
426
 
364
- if self._config.engine == "sqlite":
365
- await _validate_with_aiosqlite(self._config, sources)
427
+ if self._config.engine == "sqlite_db":
428
+ files = await asyncio.to_thread(_build_db_files, self._config, sources)
429
+ else:
430
+ if self._config.engine == "sqlite":
431
+ await _validate_with_aiosqlite(self._config, sources)
432
+ files = await asyncio.to_thread(_assemble_all_files, self._config, sources)
366
433
 
367
- files = await asyncio.to_thread(_assemble_all_files, self._config, sources)
368
434
  return await asyncio.to_thread(writer.write_files, self._config.dataset_id, files)
369
435
 
370
436
 
@@ -5,6 +5,7 @@ from agentbyte.dataset.config import DatasetSourceConfig
5
5
  from agentbyte.dataset.json import JSONDataset
6
6
  from agentbyte.dataset.sources import DatasetFiles
7
7
  from agentbyte.dataset.sqlite import SQLiteDataset
8
+ from agentbyte.dataset.sqlite_db import SQLiteDbDataset
8
9
 
9
10
  # Engine registry: maps engine name → BaseDataset subclass.
10
11
  # Third-party engines can register themselves via register_engine().
@@ -35,6 +36,7 @@ def register_engine(name: str, cls: type[BaseDataset]) -> None:
35
36
  # Pre-register built-in engines
36
37
  register_engine("sqlite", SQLiteDataset)
37
38
  register_engine("json", JSONDataset)
39
+ register_engine("sqlite_db", SQLiteDbDataset)
38
40
 
39
41
 
40
42
  async def load_dataset(dataset_id: str, config: DatasetSourceConfig) -> BaseDataset:
@@ -94,6 +96,14 @@ def _build_dataset(dataset_id: str, dataset_files: DatasetFiles) -> BaseDataset:
94
96
  f"Registered engines: {registered}. "
95
97
  f"Use register_engine() to add a new engine."
96
98
  )
99
+ if config.engine == "sqlite_db":
100
+ return cls(
101
+ dataset_id=dataset_id,
102
+ config=config,
103
+ source_uri=dataset_files.source_uri,
104
+ db_path=dataset_files.db_path,
105
+ db_bytes=dataset_files.db_bytes,
106
+ )
97
107
  return cls(
98
108
  dataset_id=dataset_id,
99
109
  config=config,
@@ -46,6 +46,7 @@ class DatasetFiles:
46
46
 
47
47
  For single-table datasets: ``data_text`` and ``schema_text`` are populated.
48
48
  For multi-table datasets: ``table_files`` is populated; ``data_text`` is empty.
49
+ For sqlite_db datasets: ``db_path`` (local) or ``db_bytes`` (S3) is populated.
49
50
  """
50
51
 
51
52
  dataset_id: str
@@ -54,6 +55,8 @@ class DatasetFiles:
54
55
  data_text: str = ""
55
56
  schema_text: str | None = None
56
57
  table_files: list[TableFiles] = field(default_factory=list)
58
+ db_path: "Path | None" = None
59
+ db_bytes: bytes | None = None
57
60
 
58
61
 
59
62
  def validate_dataset_id(dataset_id: str) -> None:
@@ -99,6 +102,17 @@ class LocalDatasetSource(DatasetSource):
99
102
  config_text = self._read_required_text(config_path, "Config file not found")
100
103
  config = DatasetConfig(**json.loads(config_text))
101
104
 
105
+ if config.engine == "sqlite_db":
106
+ db_path = dataset_dir / "dataset.db"
107
+ if not db_path.exists():
108
+ raise FileNotFoundError(f"dataset.db not found: {db_path}")
109
+ return DatasetFiles(
110
+ dataset_id=dataset_id,
111
+ config=config,
112
+ source_uri=str(dataset_dir),
113
+ db_path=db_path,
114
+ )
115
+
102
116
  if config.is_multi_table:
103
117
  table_files = []
104
118
  for td in config.tables:
@@ -167,6 +181,16 @@ class S3DatasetSource(DatasetSource):
167
181
 
168
182
  source_uri = f"s3://{self.config.s3_bucket}/{self._dataset_prefix(dataset_id)}"
169
183
 
184
+ if config.engine == "sqlite_db":
185
+ db_key = self._build_key(dataset_id, "dataset.db")
186
+ db_bytes = self._read_required_bytes(db_key)
187
+ return DatasetFiles(
188
+ dataset_id=dataset_id,
189
+ config=config,
190
+ source_uri=source_uri,
191
+ db_bytes=db_bytes,
192
+ )
193
+
170
194
  if config.is_multi_table:
171
195
  table_files = []
172
196
  for td in config.tables:
@@ -209,6 +233,12 @@ class S3DatasetSource(DatasetSource):
209
233
  except FileNotFoundError as exc:
210
234
  raise FileNotFoundError(f"Dataset object not found: s3://{self.config.s3_bucket}/{key}") from exc
211
235
 
236
+ def _read_required_bytes(self, key: str) -> bytes:
237
+ try:
238
+ return self._read_raw_bytes(key)
239
+ except FileNotFoundError as exc:
240
+ raise FileNotFoundError(f"Dataset object not found: s3://{self.config.s3_bucket}/{key}") from exc
241
+
212
242
  def _read_optional_text(self, key: str) -> str | None:
213
243
  try:
214
244
  return self._read_text(key)
@@ -216,6 +246,10 @@ class S3DatasetSource(DatasetSource):
216
246
  return None
217
247
 
218
248
  def _read_text(self, key: str) -> str:
249
+ body = self._read_raw_bytes(key)
250
+ return body.decode("utf-8")
251
+
252
+ def _read_raw_bytes(self, key: str) -> bytes:
219
253
  client = self._get_client()
220
254
  try:
221
255
  response = client.get_object(Bucket=self.config.s3_bucket, Key=key)
@@ -223,11 +257,8 @@ class S3DatasetSource(DatasetSource):
223
257
  if self._is_not_found_error(exc):
224
258
  raise FileNotFoundError(f"s3://{self.config.s3_bucket}/{key}") from exc
225
259
  raise
226
-
227
260
  body = response["Body"].read()
228
- if isinstance(body, bytes):
229
- return body.decode("utf-8")
230
- return body
261
+ return body if isinstance(body, bytes) else body.encode("utf-8")
231
262
 
232
263
  @staticmethod
233
264
  def _is_not_found_error(exc: Exception) -> bool:
@@ -0,0 +1,172 @@
1
+ """SQLite .db binary dataset backed by a native SQLite file via aiosqlite."""
2
+
3
+ import os
4
+ import tempfile
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ import aiosqlite
9
+
10
+ from agentbyte.dataset.base import BaseDataset, DatasetConfig
11
+ from agentbyte.dataset.sqlite import SqliteColumn, SqliteSchema, validate_sqlite_identifier
12
+
13
+
14
+ class SQLiteDbDataset(BaseDataset):
15
+ """Async SQLite dataset backed by a native .db binary file.
16
+
17
+ For local sources the .db file is opened directly. For S3 sources the
18
+ binary bytes are written to a temp file which is deleted on ``aclose()``.
19
+
20
+ Use as an async context manager:
21
+
22
+ async with load_dataset("hr/employees", LocalDatasetConfig(...)) as ds:
23
+ rows = await ds.fetch_all()
24
+
25
+ Or call ``aclose()`` explicitly when done.
26
+
27
+ Attributes:
28
+ dataset_id: Canonical ``category/name`` identifier.
29
+ config: Dataset configuration (engine, table_names, description).
30
+ source_uri: Human-readable dataset location.
31
+ """
32
+
33
+ def __init__(
34
+ self,
35
+ dataset_id: str,
36
+ config: DatasetConfig,
37
+ source_uri: str,
38
+ db_path: Path | None = None,
39
+ db_bytes: bytes | None = None,
40
+ # Accept and ignore these for compatibility with _build_dataset()
41
+ data_text: str = "",
42
+ schema_text: str | None = None,
43
+ table_files: list | None = None,
44
+ ) -> None:
45
+ if config.engine != "sqlite_db":
46
+ raise ValueError(
47
+ f"SQLiteDbDataset requires engine='sqlite_db', got {config.engine!r}."
48
+ )
49
+ if db_path is None and db_bytes is None:
50
+ raise ValueError("Either db_path or db_bytes must be provided.")
51
+ self.dataset_id = dataset_id
52
+ self.config = config
53
+ self.source_uri = source_uri
54
+ self._db_path = db_path
55
+ self._db_bytes = db_bytes
56
+ self._connection: aiosqlite.Connection | None = None
57
+ self._tmp_path: str | None = None
58
+ self._schema: SqliteSchema | None = None
59
+
60
+ @property
61
+ def engine(self) -> str:
62
+ return "sqlite_db"
63
+
64
+ @property
65
+ def table_name(self) -> str:
66
+ """First table name, or empty string for multi-table datasets."""
67
+ names = self.config.table_names
68
+ return names[0] if names else ""
69
+
70
+ @property
71
+ def table_names(self) -> list[str]:
72
+ return self.config.table_names
73
+
74
+ @property
75
+ def schema(self) -> SqliteSchema | None:
76
+ """Schema for single-table datasets (populated on first connect())."""
77
+ return self._schema
78
+
79
+ async def _open_connection(self) -> aiosqlite.Connection:
80
+ if self._db_path is not None:
81
+ conn = await aiosqlite.connect(str(self._db_path))
82
+ else:
83
+ with tempfile.NamedTemporaryFile(suffix=".db", delete=False) as f:
84
+ f.write(self._db_bytes) # type: ignore[arg-type]
85
+ self._tmp_path = f.name
86
+ conn = await aiosqlite.connect(self._tmp_path)
87
+ conn.row_factory = aiosqlite.Row
88
+ return conn
89
+
90
+ async def _load_schema(self, conn: aiosqlite.Connection, table_name: str) -> SqliteSchema:
91
+ """Derive SqliteSchema from PRAGMA table_info + index_list."""
92
+ unique_cols: set[str] = set()
93
+ async with conn.execute(f"PRAGMA index_list({table_name})") as cur:
94
+ indexes = await cur.fetchall()
95
+ for idx in indexes:
96
+ if idx["unique"]:
97
+ async with conn.execute(f"PRAGMA index_info({idx['name']})") as cur:
98
+ for info in await cur.fetchall():
99
+ unique_cols.add(info["name"])
100
+
101
+ async with conn.execute(f"PRAGMA table_info({table_name})") as cur:
102
+ rows = await cur.fetchall()
103
+
104
+ columns = [
105
+ SqliteColumn(
106
+ name=row["name"],
107
+ type=row["type"] or "TEXT",
108
+ primary_key=bool(row["pk"]),
109
+ not_null=bool(row["notnull"]),
110
+ unique=row["name"] in unique_cols,
111
+ )
112
+ for row in rows
113
+ ]
114
+ return SqliteSchema(columns=columns)
115
+
116
+ async def connect(self) -> aiosqlite.Connection:
117
+ """Open (or return cached) aiosqlite connection to the .db file.
118
+
119
+ Populates ``schema`` for single-table datasets on first call.
120
+
121
+ Returns:
122
+ aiosqlite.Connection ready to query.
123
+ """
124
+ if self._connection is not None:
125
+ return self._connection
126
+ conn = await self._open_connection()
127
+ if len(self.config.table_names) == 1:
128
+ self._schema = await self._load_schema(conn, self.config.table_names[0])
129
+ self._connection = conn
130
+ return conn
131
+
132
+ async def fetch_all(self) -> list[dict[str, Any]] | dict[str, list[dict[str, Any]]]:
133
+ """Return all rows as a list (single-table) or dict of lists (multi-table).
134
+
135
+ - Single-table: returns ``list[dict[str, Any]]`` — one dict per row.
136
+ - Multi-table: returns ``dict[str, list[dict[str, Any]]]`` — one key per table.
137
+
138
+ Use ``connect()`` directly for SQL JOINs across tables.
139
+ """
140
+ conn = await self.connect()
141
+ if len(self.config.table_names) <= 1:
142
+ table = validate_sqlite_identifier(self.table_name, field_name="table_name")
143
+ async with conn.execute(f"SELECT * FROM {table}") as cursor: # noqa: S608
144
+ return [dict(row) for row in await cursor.fetchall()]
145
+ result: dict[str, list[dict[str, Any]]] = {}
146
+ for name in self.config.table_names:
147
+ table = validate_sqlite_identifier(name, field_name="table_name")
148
+ async with conn.execute(f"SELECT * FROM {table}") as cursor: # noqa: S608
149
+ result[name] = [dict(row) for row in await cursor.fetchall()]
150
+ return result
151
+
152
+ async def aclose(self) -> None:
153
+ """Close the connection and delete any S3-sourced temp file."""
154
+ if self._connection is not None:
155
+ await self._connection.close()
156
+ self._connection = None
157
+ if self._tmp_path is not None:
158
+ try:
159
+ os.unlink(self._tmp_path)
160
+ except OSError:
161
+ pass
162
+ self._tmp_path = None
163
+
164
+ async def __aenter__(self) -> "SQLiteDbDataset":
165
+ return self
166
+
167
+ async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
168
+ await self.aclose()
169
+
170
+ def __repr__(self) -> str:
171
+ tables = ", ".join(self.config.table_names)
172
+ return f"SQLiteDbDataset(id='{self.dataset_id}', tables=[{tables}])"