agno 1.7.4__tar.gz → 1.7.5__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 (555) hide show
  1. {agno-1.7.4 → agno-1.7.5}/PKG-INFO +4 -1
  2. {agno-1.7.4 → agno-1.7.5}/agno/agent/agent.py +28 -14
  3. {agno-1.7.4 → agno-1.7.5}/agno/app/fastapi/app.py +1 -1
  4. {agno-1.7.4 → agno-1.7.5}/agno/app/fastapi/async_router.py +67 -16
  5. {agno-1.7.4 → agno-1.7.5}/agno/app/fastapi/sync_router.py +80 -14
  6. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/agent.py +39 -2
  7. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/combined.py +1 -1
  8. {agno-1.7.4 → agno-1.7.5}/agno/team/team.py +20 -5
  9. {agno-1.7.4 → agno-1.7.5}/agno/tools/decorator.py +45 -2
  10. {agno-1.7.4 → agno-1.7.5}/agno/tools/function.py +16 -12
  11. {agno-1.7.4 → agno-1.7.5}/agno/utils/pprint.py +2 -0
  12. agno-1.7.5/agno/vectordb/surrealdb/__init__.py +3 -0
  13. agno-1.7.5/agno/vectordb/surrealdb/surrealdb.py +493 -0
  14. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/workflow.py +2 -4
  15. {agno-1.7.4 → agno-1.7.5}/agno.egg-info/PKG-INFO +4 -1
  16. {agno-1.7.4 → agno-1.7.5}/agno.egg-info/SOURCES.txt +2 -0
  17. {agno-1.7.4 → agno-1.7.5}/agno.egg-info/requires.txt +4 -0
  18. {agno-1.7.4 → agno-1.7.5}/pyproject.toml +6 -3
  19. {agno-1.7.4 → agno-1.7.5}/LICENSE +0 -0
  20. {agno-1.7.4 → agno-1.7.5}/README.md +0 -0
  21. {agno-1.7.4 → agno-1.7.5}/agno/__init__.py +0 -0
  22. {agno-1.7.4 → agno-1.7.5}/agno/agent/__init__.py +0 -0
  23. {agno-1.7.4 → agno-1.7.5}/agno/agent/metrics.py +0 -0
  24. {agno-1.7.4 → agno-1.7.5}/agno/api/__init__.py +0 -0
  25. {agno-1.7.4 → agno-1.7.5}/agno/api/agent.py +0 -0
  26. {agno-1.7.4 → agno-1.7.5}/agno/api/api.py +0 -0
  27. {agno-1.7.4 → agno-1.7.5}/agno/api/app.py +0 -0
  28. {agno-1.7.4 → agno-1.7.5}/agno/api/evals.py +0 -0
  29. {agno-1.7.4 → agno-1.7.5}/agno/api/playground.py +0 -0
  30. {agno-1.7.4 → agno-1.7.5}/agno/api/routes.py +0 -0
  31. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/__init__.py +0 -0
  32. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/agent.py +0 -0
  33. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/app.py +0 -0
  34. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/evals.py +0 -0
  35. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/playground.py +0 -0
  36. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/response.py +0 -0
  37. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/team.py +0 -0
  38. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/user.py +0 -0
  39. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/workflows.py +0 -0
  40. {agno-1.7.4 → agno-1.7.5}/agno/api/schemas/workspace.py +0 -0
  41. {agno-1.7.4 → agno-1.7.5}/agno/api/team.py +0 -0
  42. {agno-1.7.4 → agno-1.7.5}/agno/api/user.py +0 -0
  43. {agno-1.7.4 → agno-1.7.5}/agno/api/workflows.py +0 -0
  44. {agno-1.7.4 → agno-1.7.5}/agno/api/workspace.py +0 -0
  45. {agno-1.7.4 → agno-1.7.5}/agno/app/__init__.py +0 -0
  46. {agno-1.7.4 → agno-1.7.5}/agno/app/agui/__init__.py +0 -0
  47. {agno-1.7.4 → agno-1.7.5}/agno/app/agui/app.py +0 -0
  48. {agno-1.7.4 → agno-1.7.5}/agno/app/agui/async_router.py +0 -0
  49. {agno-1.7.4 → agno-1.7.5}/agno/app/agui/sync_router.py +0 -0
  50. {agno-1.7.4 → agno-1.7.5}/agno/app/agui/utils.py +0 -0
  51. {agno-1.7.4 → agno-1.7.5}/agno/app/base.py +0 -0
  52. {agno-1.7.4 → agno-1.7.5}/agno/app/discord/__init__.py +0 -0
  53. {agno-1.7.4 → agno-1.7.5}/agno/app/discord/client.py +0 -0
  54. {agno-1.7.4 → agno-1.7.5}/agno/app/fastapi/__init__.py +0 -0
  55. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/__init__.py +0 -0
  56. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/app.py +0 -0
  57. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/async_router.py +0 -0
  58. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/deploy.py +0 -0
  59. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/operator.py +0 -0
  60. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/schemas.py +0 -0
  61. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/serve.py +0 -0
  62. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/settings.py +0 -0
  63. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/sync_router.py +0 -0
  64. {agno-1.7.4 → agno-1.7.5}/agno/app/playground/utils.py +0 -0
  65. {agno-1.7.4 → agno-1.7.5}/agno/app/settings.py +0 -0
  66. {agno-1.7.4 → agno-1.7.5}/agno/app/slack/__init__.py +0 -0
  67. {agno-1.7.4 → agno-1.7.5}/agno/app/slack/app.py +0 -0
  68. {agno-1.7.4 → agno-1.7.5}/agno/app/slack/async_router.py +0 -0
  69. {agno-1.7.4 → agno-1.7.5}/agno/app/slack/security.py +0 -0
  70. {agno-1.7.4 → agno-1.7.5}/agno/app/slack/sync_router.py +0 -0
  71. {agno-1.7.4 → agno-1.7.5}/agno/app/utils.py +0 -0
  72. {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/__init__.py +0 -0
  73. {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/app.py +0 -0
  74. {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/async_router.py +0 -0
  75. {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/security.py +0 -0
  76. {agno-1.7.4 → agno-1.7.5}/agno/app/whatsapp/sync_router.py +0 -0
  77. {agno-1.7.4 → agno-1.7.5}/agno/cli/__init__.py +0 -0
  78. {agno-1.7.4 → agno-1.7.5}/agno/cli/auth_server.py +0 -0
  79. {agno-1.7.4 → agno-1.7.5}/agno/cli/config.py +0 -0
  80. {agno-1.7.4 → agno-1.7.5}/agno/cli/console.py +0 -0
  81. {agno-1.7.4 → agno-1.7.5}/agno/cli/credentials.py +0 -0
  82. {agno-1.7.4 → agno-1.7.5}/agno/cli/entrypoint.py +0 -0
  83. {agno-1.7.4 → agno-1.7.5}/agno/cli/operator.py +0 -0
  84. {agno-1.7.4 → agno-1.7.5}/agno/cli/settings.py +0 -0
  85. {agno-1.7.4 → agno-1.7.5}/agno/cli/ws/__init__.py +0 -0
  86. {agno-1.7.4 → agno-1.7.5}/agno/cli/ws/ws_cli.py +0 -0
  87. {agno-1.7.4 → agno-1.7.5}/agno/constants.py +0 -0
  88. {agno-1.7.4 → agno-1.7.5}/agno/debug.py +0 -0
  89. {agno-1.7.4 → agno-1.7.5}/agno/document/__init__.py +0 -0
  90. {agno-1.7.4 → agno-1.7.5}/agno/document/base.py +0 -0
  91. {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/__init__.py +0 -0
  92. {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/agentic.py +0 -0
  93. {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/document.py +0 -0
  94. {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/fixed.py +0 -0
  95. {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/markdown.py +0 -0
  96. {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/recursive.py +0 -0
  97. {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/semantic.py +0 -0
  98. {agno-1.7.4 → agno-1.7.5}/agno/document/chunking/strategy.py +0 -0
  99. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/__init__.py +0 -0
  100. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/arxiv_reader.py +0 -0
  101. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/base.py +0 -0
  102. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/csv_reader.py +0 -0
  103. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/docx_reader.py +0 -0
  104. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/firecrawl_reader.py +0 -0
  105. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/gcs/__init__.py +0 -0
  106. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/gcs/pdf_reader.py +0 -0
  107. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/json_reader.py +0 -0
  108. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/markdown_reader.py +0 -0
  109. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/pdf_reader.py +0 -0
  110. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/s3/__init__.py +0 -0
  111. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/s3/pdf_reader.py +0 -0
  112. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/s3/text_reader.py +0 -0
  113. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/text_reader.py +0 -0
  114. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/url_reader.py +0 -0
  115. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/website_reader.py +0 -0
  116. {agno-1.7.4 → agno-1.7.5}/agno/document/reader/youtube_reader.py +0 -0
  117. {agno-1.7.4 → agno-1.7.5}/agno/embedder/__init__.py +0 -0
  118. {agno-1.7.4 → agno-1.7.5}/agno/embedder/aws_bedrock.py +0 -0
  119. {agno-1.7.4 → agno-1.7.5}/agno/embedder/azure_openai.py +0 -0
  120. {agno-1.7.4 → agno-1.7.5}/agno/embedder/base.py +0 -0
  121. {agno-1.7.4 → agno-1.7.5}/agno/embedder/cohere.py +0 -0
  122. {agno-1.7.4 → agno-1.7.5}/agno/embedder/fastembed.py +0 -0
  123. {agno-1.7.4 → agno-1.7.5}/agno/embedder/fireworks.py +0 -0
  124. {agno-1.7.4 → agno-1.7.5}/agno/embedder/google.py +0 -0
  125. {agno-1.7.4 → agno-1.7.5}/agno/embedder/huggingface.py +0 -0
  126. {agno-1.7.4 → agno-1.7.5}/agno/embedder/langdb.py +0 -0
  127. {agno-1.7.4 → agno-1.7.5}/agno/embedder/mistral.py +0 -0
  128. {agno-1.7.4 → agno-1.7.5}/agno/embedder/nebius.py +0 -0
  129. {agno-1.7.4 → agno-1.7.5}/agno/embedder/ollama.py +0 -0
  130. {agno-1.7.4 → agno-1.7.5}/agno/embedder/openai.py +0 -0
  131. {agno-1.7.4 → agno-1.7.5}/agno/embedder/sentence_transformer.py +0 -0
  132. {agno-1.7.4 → agno-1.7.5}/agno/embedder/together.py +0 -0
  133. {agno-1.7.4 → agno-1.7.5}/agno/embedder/voyageai.py +0 -0
  134. {agno-1.7.4 → agno-1.7.5}/agno/eval/__init__.py +0 -0
  135. {agno-1.7.4 → agno-1.7.5}/agno/eval/accuracy.py +0 -0
  136. {agno-1.7.4 → agno-1.7.5}/agno/eval/performance.py +0 -0
  137. {agno-1.7.4 → agno-1.7.5}/agno/eval/reliability.py +0 -0
  138. {agno-1.7.4 → agno-1.7.5}/agno/eval/utils.py +0 -0
  139. {agno-1.7.4 → agno-1.7.5}/agno/exceptions.py +0 -0
  140. {agno-1.7.4 → agno-1.7.5}/agno/file/__init__.py +0 -0
  141. {agno-1.7.4 → agno-1.7.5}/agno/file/file.py +0 -0
  142. {agno-1.7.4 → agno-1.7.5}/agno/file/local/__init__.py +0 -0
  143. {agno-1.7.4 → agno-1.7.5}/agno/file/local/csv.py +0 -0
  144. {agno-1.7.4 → agno-1.7.5}/agno/file/local/txt.py +0 -0
  145. {agno-1.7.4 → agno-1.7.5}/agno/infra/__init__.py +0 -0
  146. {agno-1.7.4 → agno-1.7.5}/agno/infra/app.py +0 -0
  147. {agno-1.7.4 → agno-1.7.5}/agno/infra/base.py +0 -0
  148. {agno-1.7.4 → agno-1.7.5}/agno/infra/context.py +0 -0
  149. {agno-1.7.4 → agno-1.7.5}/agno/infra/db_app.py +0 -0
  150. {agno-1.7.4 → agno-1.7.5}/agno/infra/resource.py +0 -0
  151. {agno-1.7.4 → agno-1.7.5}/agno/infra/resources.py +0 -0
  152. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/__init__.py +0 -0
  153. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/arxiv.py +0 -0
  154. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/csv.py +0 -0
  155. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/csv_url.py +0 -0
  156. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/document.py +0 -0
  157. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/docx.py +0 -0
  158. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/firecrawl.py +0 -0
  159. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/gcs/__init__.py +0 -0
  160. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/gcs/base.py +0 -0
  161. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/gcs/pdf.py +0 -0
  162. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/json.py +0 -0
  163. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/langchain.py +0 -0
  164. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/light_rag.py +0 -0
  165. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/llamaindex.py +0 -0
  166. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/markdown.py +0 -0
  167. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/pdf.py +0 -0
  168. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/pdf_bytes.py +0 -0
  169. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/pdf_url.py +0 -0
  170. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/s3/__init__.py +0 -0
  171. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/s3/base.py +0 -0
  172. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/s3/pdf.py +0 -0
  173. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/s3/text.py +0 -0
  174. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/text.py +0 -0
  175. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/url.py +0 -0
  176. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/website.py +0 -0
  177. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/wikipedia.py +0 -0
  178. {agno-1.7.4 → agno-1.7.5}/agno/knowledge/youtube.py +0 -0
  179. {agno-1.7.4 → agno-1.7.5}/agno/media.py +0 -0
  180. {agno-1.7.4 → agno-1.7.5}/agno/memory/__init__.py +0 -0
  181. {agno-1.7.4 → agno-1.7.5}/agno/memory/agent.py +0 -0
  182. {agno-1.7.4 → agno-1.7.5}/agno/memory/classifier.py +0 -0
  183. {agno-1.7.4 → agno-1.7.5}/agno/memory/db/__init__.py +0 -0
  184. {agno-1.7.4 → agno-1.7.5}/agno/memory/db/base.py +0 -0
  185. {agno-1.7.4 → agno-1.7.5}/agno/memory/db/mongodb.py +0 -0
  186. {agno-1.7.4 → agno-1.7.5}/agno/memory/db/postgres.py +0 -0
  187. {agno-1.7.4 → agno-1.7.5}/agno/memory/db/sqlite.py +0 -0
  188. {agno-1.7.4 → agno-1.7.5}/agno/memory/manager.py +0 -0
  189. {agno-1.7.4 → agno-1.7.5}/agno/memory/memory.py +0 -0
  190. {agno-1.7.4 → agno-1.7.5}/agno/memory/row.py +0 -0
  191. {agno-1.7.4 → agno-1.7.5}/agno/memory/summarizer.py +0 -0
  192. {agno-1.7.4 → agno-1.7.5}/agno/memory/summary.py +0 -0
  193. {agno-1.7.4 → agno-1.7.5}/agno/memory/team.py +0 -0
  194. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/__init__.py +0 -0
  195. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/__init__.py +0 -0
  196. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/base.py +0 -0
  197. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/firestore.py +0 -0
  198. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/mongodb.py +0 -0
  199. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/postgres.py +0 -0
  200. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/redis.py +0 -0
  201. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/schema.py +0 -0
  202. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/db/sqlite.py +0 -0
  203. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/manager.py +0 -0
  204. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/memory.py +0 -0
  205. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/schema.py +0 -0
  206. {agno-1.7.4 → agno-1.7.5}/agno/memory/v2/summarizer.py +0 -0
  207. {agno-1.7.4 → agno-1.7.5}/agno/memory/workflow.py +0 -0
  208. {agno-1.7.4 → agno-1.7.5}/agno/models/__init__.py +0 -0
  209. {agno-1.7.4 → agno-1.7.5}/agno/models/aimlapi/__init__.py +0 -0
  210. {agno-1.7.4 → agno-1.7.5}/agno/models/aimlapi/aimlapi.py +0 -0
  211. {agno-1.7.4 → agno-1.7.5}/agno/models/anthropic/__init__.py +0 -0
  212. {agno-1.7.4 → agno-1.7.5}/agno/models/anthropic/claude.py +0 -0
  213. {agno-1.7.4 → agno-1.7.5}/agno/models/aws/__init__.py +0 -0
  214. {agno-1.7.4 → agno-1.7.5}/agno/models/aws/bedrock.py +0 -0
  215. {agno-1.7.4 → agno-1.7.5}/agno/models/aws/claude.py +0 -0
  216. {agno-1.7.4 → agno-1.7.5}/agno/models/azure/__init__.py +0 -0
  217. {agno-1.7.4 → agno-1.7.5}/agno/models/azure/ai_foundry.py +0 -0
  218. {agno-1.7.4 → agno-1.7.5}/agno/models/azure/openai_chat.py +0 -0
  219. {agno-1.7.4 → agno-1.7.5}/agno/models/base.py +0 -0
  220. {agno-1.7.4 → agno-1.7.5}/agno/models/cerebras/__init__.py +0 -0
  221. {agno-1.7.4 → agno-1.7.5}/agno/models/cerebras/cerebras.py +0 -0
  222. {agno-1.7.4 → agno-1.7.5}/agno/models/cerebras/cerebras_openai.py +0 -0
  223. {agno-1.7.4 → agno-1.7.5}/agno/models/cohere/__init__.py +0 -0
  224. {agno-1.7.4 → agno-1.7.5}/agno/models/cohere/chat.py +0 -0
  225. {agno-1.7.4 → agno-1.7.5}/agno/models/deepinfra/__init__.py +0 -0
  226. {agno-1.7.4 → agno-1.7.5}/agno/models/deepinfra/deepinfra.py +0 -0
  227. {agno-1.7.4 → agno-1.7.5}/agno/models/deepseek/__init__.py +0 -0
  228. {agno-1.7.4 → agno-1.7.5}/agno/models/deepseek/deepseek.py +0 -0
  229. {agno-1.7.4 → agno-1.7.5}/agno/models/defaults.py +0 -0
  230. {agno-1.7.4 → agno-1.7.5}/agno/models/fireworks/__init__.py +0 -0
  231. {agno-1.7.4 → agno-1.7.5}/agno/models/fireworks/fireworks.py +0 -0
  232. {agno-1.7.4 → agno-1.7.5}/agno/models/google/__init__.py +0 -0
  233. {agno-1.7.4 → agno-1.7.5}/agno/models/google/gemini.py +0 -0
  234. {agno-1.7.4 → agno-1.7.5}/agno/models/groq/__init__.py +0 -0
  235. {agno-1.7.4 → agno-1.7.5}/agno/models/groq/groq.py +0 -0
  236. {agno-1.7.4 → agno-1.7.5}/agno/models/huggingface/__init__.py +0 -0
  237. {agno-1.7.4 → agno-1.7.5}/agno/models/huggingface/huggingface.py +0 -0
  238. {agno-1.7.4 → agno-1.7.5}/agno/models/ibm/__init__.py +0 -0
  239. {agno-1.7.4 → agno-1.7.5}/agno/models/ibm/watsonx.py +0 -0
  240. {agno-1.7.4 → agno-1.7.5}/agno/models/internlm/__init__.py +0 -0
  241. {agno-1.7.4 → agno-1.7.5}/agno/models/internlm/internlm.py +0 -0
  242. {agno-1.7.4 → agno-1.7.5}/agno/models/langdb/__init__.py +0 -0
  243. {agno-1.7.4 → agno-1.7.5}/agno/models/langdb/langdb.py +0 -0
  244. {agno-1.7.4 → agno-1.7.5}/agno/models/litellm/__init__.py +0 -0
  245. {agno-1.7.4 → agno-1.7.5}/agno/models/litellm/chat.py +0 -0
  246. {agno-1.7.4 → agno-1.7.5}/agno/models/litellm/litellm_openai.py +0 -0
  247. {agno-1.7.4 → agno-1.7.5}/agno/models/lmstudio/__init__.py +0 -0
  248. {agno-1.7.4 → agno-1.7.5}/agno/models/lmstudio/lmstudio.py +0 -0
  249. {agno-1.7.4 → agno-1.7.5}/agno/models/message.py +0 -0
  250. {agno-1.7.4 → agno-1.7.5}/agno/models/meta/__init__.py +0 -0
  251. {agno-1.7.4 → agno-1.7.5}/agno/models/meta/llama.py +0 -0
  252. {agno-1.7.4 → agno-1.7.5}/agno/models/meta/llama_openai.py +0 -0
  253. {agno-1.7.4 → agno-1.7.5}/agno/models/mistral/__init__.py +0 -0
  254. {agno-1.7.4 → agno-1.7.5}/agno/models/mistral/mistral.py +0 -0
  255. {agno-1.7.4 → agno-1.7.5}/agno/models/nebius/__init__.py +0 -0
  256. {agno-1.7.4 → agno-1.7.5}/agno/models/nebius/nebius.py +0 -0
  257. {agno-1.7.4 → agno-1.7.5}/agno/models/nvidia/__init__.py +0 -0
  258. {agno-1.7.4 → agno-1.7.5}/agno/models/nvidia/nvidia.py +0 -0
  259. {agno-1.7.4 → agno-1.7.5}/agno/models/ollama/__init__.py +0 -0
  260. {agno-1.7.4 → agno-1.7.5}/agno/models/ollama/chat.py +0 -0
  261. {agno-1.7.4 → agno-1.7.5}/agno/models/ollama/tools.py +0 -0
  262. {agno-1.7.4 → agno-1.7.5}/agno/models/openai/__init__.py +0 -0
  263. {agno-1.7.4 → agno-1.7.5}/agno/models/openai/chat.py +0 -0
  264. {agno-1.7.4 → agno-1.7.5}/agno/models/openai/like.py +0 -0
  265. {agno-1.7.4 → agno-1.7.5}/agno/models/openai/responses.py +0 -0
  266. {agno-1.7.4 → agno-1.7.5}/agno/models/openrouter/__init__.py +0 -0
  267. {agno-1.7.4 → agno-1.7.5}/agno/models/openrouter/openrouter.py +0 -0
  268. {agno-1.7.4 → agno-1.7.5}/agno/models/perplexity/__init__.py +0 -0
  269. {agno-1.7.4 → agno-1.7.5}/agno/models/perplexity/perplexity.py +0 -0
  270. {agno-1.7.4 → agno-1.7.5}/agno/models/response.py +0 -0
  271. {agno-1.7.4 → agno-1.7.5}/agno/models/sambanova/__init__.py +0 -0
  272. {agno-1.7.4 → agno-1.7.5}/agno/models/sambanova/sambanova.py +0 -0
  273. {agno-1.7.4 → agno-1.7.5}/agno/models/together/__init__.py +0 -0
  274. {agno-1.7.4 → agno-1.7.5}/agno/models/together/together.py +0 -0
  275. {agno-1.7.4 → agno-1.7.5}/agno/models/vercel/__init__.py +0 -0
  276. {agno-1.7.4 → agno-1.7.5}/agno/models/vercel/v0.py +0 -0
  277. {agno-1.7.4 → agno-1.7.5}/agno/models/vllm/__init__.py +0 -0
  278. {agno-1.7.4 → agno-1.7.5}/agno/models/vllm/vllm.py +0 -0
  279. {agno-1.7.4 → agno-1.7.5}/agno/models/xai/__init__.py +0 -0
  280. {agno-1.7.4 → agno-1.7.5}/agno/models/xai/xai.py +0 -0
  281. {agno-1.7.4 → agno-1.7.5}/agno/playground/__init__.py +0 -0
  282. {agno-1.7.4 → agno-1.7.5}/agno/playground/deploy.py +0 -0
  283. {agno-1.7.4 → agno-1.7.5}/agno/playground/playground.py +0 -0
  284. {agno-1.7.4 → agno-1.7.5}/agno/playground/serve.py +0 -0
  285. {agno-1.7.4 → agno-1.7.5}/agno/playground/settings.py +0 -0
  286. {agno-1.7.4 → agno-1.7.5}/agno/py.typed +0 -0
  287. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/__init__.py +0 -0
  288. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/azure_ai_foundry.py +0 -0
  289. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/deepseek.py +0 -0
  290. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/default.py +0 -0
  291. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/groq.py +0 -0
  292. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/helpers.py +0 -0
  293. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/ollama.py +0 -0
  294. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/openai.py +0 -0
  295. {agno-1.7.4 → agno-1.7.5}/agno/reasoning/step.py +0 -0
  296. {agno-1.7.4 → agno-1.7.5}/agno/reranker/__init__.py +0 -0
  297. {agno-1.7.4 → agno-1.7.5}/agno/reranker/base.py +0 -0
  298. {agno-1.7.4 → agno-1.7.5}/agno/reranker/cohere.py +0 -0
  299. {agno-1.7.4 → agno-1.7.5}/agno/reranker/infinity.py +0 -0
  300. {agno-1.7.4 → agno-1.7.5}/agno/reranker/sentence_transformer.py +0 -0
  301. {agno-1.7.4 → agno-1.7.5}/agno/run/__init__.py +0 -0
  302. {agno-1.7.4 → agno-1.7.5}/agno/run/base.py +0 -0
  303. {agno-1.7.4 → agno-1.7.5}/agno/run/messages.py +0 -0
  304. {agno-1.7.4 → agno-1.7.5}/agno/run/response.py +0 -0
  305. {agno-1.7.4 → agno-1.7.5}/agno/run/team.py +0 -0
  306. {agno-1.7.4 → agno-1.7.5}/agno/run/v2/__init__.py +0 -0
  307. {agno-1.7.4 → agno-1.7.5}/agno/run/v2/workflow.py +0 -0
  308. {agno-1.7.4 → agno-1.7.5}/agno/run/workflow.py +0 -0
  309. {agno-1.7.4 → agno-1.7.5}/agno/storage/__init__.py +0 -0
  310. {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/__init__.py +0 -0
  311. {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/dynamodb.py +0 -0
  312. {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/json.py +0 -0
  313. {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/mongodb.py +0 -0
  314. {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/postgres.py +0 -0
  315. {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/singlestore.py +0 -0
  316. {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/sqlite.py +0 -0
  317. {agno-1.7.4 → agno-1.7.5}/agno/storage/agent/yaml.py +0 -0
  318. {agno-1.7.4 → agno-1.7.5}/agno/storage/base.py +0 -0
  319. {agno-1.7.4 → agno-1.7.5}/agno/storage/dynamodb.py +0 -0
  320. {agno-1.7.4 → agno-1.7.5}/agno/storage/firestore.py +0 -0
  321. {agno-1.7.4 → agno-1.7.5}/agno/storage/gcs_json.py +0 -0
  322. {agno-1.7.4 → agno-1.7.5}/agno/storage/json.py +0 -0
  323. {agno-1.7.4 → agno-1.7.5}/agno/storage/mongodb.py +0 -0
  324. {agno-1.7.4 → agno-1.7.5}/agno/storage/mysql.py +0 -0
  325. {agno-1.7.4 → agno-1.7.5}/agno/storage/postgres.py +0 -0
  326. {agno-1.7.4 → agno-1.7.5}/agno/storage/redis.py +0 -0
  327. {agno-1.7.4 → agno-1.7.5}/agno/storage/session/__init__.py +0 -0
  328. {agno-1.7.4 → agno-1.7.5}/agno/storage/session/agent.py +0 -0
  329. {agno-1.7.4 → agno-1.7.5}/agno/storage/session/team.py +0 -0
  330. {agno-1.7.4 → agno-1.7.5}/agno/storage/session/v2/__init__.py +0 -0
  331. {agno-1.7.4 → agno-1.7.5}/agno/storage/session/v2/workflow.py +0 -0
  332. {agno-1.7.4 → agno-1.7.5}/agno/storage/session/workflow.py +0 -0
  333. {agno-1.7.4 → agno-1.7.5}/agno/storage/singlestore.py +0 -0
  334. {agno-1.7.4 → agno-1.7.5}/agno/storage/sqlite.py +0 -0
  335. {agno-1.7.4 → agno-1.7.5}/agno/storage/workflow/__init__.py +0 -0
  336. {agno-1.7.4 → agno-1.7.5}/agno/storage/workflow/mongodb.py +0 -0
  337. {agno-1.7.4 → agno-1.7.5}/agno/storage/workflow/postgres.py +0 -0
  338. {agno-1.7.4 → agno-1.7.5}/agno/storage/workflow/sqlite.py +0 -0
  339. {agno-1.7.4 → agno-1.7.5}/agno/storage/yaml.py +0 -0
  340. {agno-1.7.4 → agno-1.7.5}/agno/team/__init__.py +0 -0
  341. {agno-1.7.4 → agno-1.7.5}/agno/tools/__init__.py +0 -0
  342. {agno-1.7.4 → agno-1.7.5}/agno/tools/agentql.py +0 -0
  343. {agno-1.7.4 → agno-1.7.5}/agno/tools/airflow.py +0 -0
  344. {agno-1.7.4 → agno-1.7.5}/agno/tools/api.py +0 -0
  345. {agno-1.7.4 → agno-1.7.5}/agno/tools/apify.py +0 -0
  346. {agno-1.7.4 → agno-1.7.5}/agno/tools/arxiv.py +0 -0
  347. {agno-1.7.4 → agno-1.7.5}/agno/tools/aws_lambda.py +0 -0
  348. {agno-1.7.4 → agno-1.7.5}/agno/tools/aws_ses.py +0 -0
  349. {agno-1.7.4 → agno-1.7.5}/agno/tools/baidusearch.py +0 -0
  350. {agno-1.7.4 → agno-1.7.5}/agno/tools/bravesearch.py +0 -0
  351. {agno-1.7.4 → agno-1.7.5}/agno/tools/brightdata.py +0 -0
  352. {agno-1.7.4 → agno-1.7.5}/agno/tools/browserbase.py +0 -0
  353. {agno-1.7.4 → agno-1.7.5}/agno/tools/calcom.py +0 -0
  354. {agno-1.7.4 → agno-1.7.5}/agno/tools/calculator.py +0 -0
  355. {agno-1.7.4 → agno-1.7.5}/agno/tools/cartesia.py +0 -0
  356. {agno-1.7.4 → agno-1.7.5}/agno/tools/clickup_tool.py +0 -0
  357. {agno-1.7.4 → agno-1.7.5}/agno/tools/confluence.py +0 -0
  358. {agno-1.7.4 → agno-1.7.5}/agno/tools/crawl4ai.py +0 -0
  359. {agno-1.7.4 → agno-1.7.5}/agno/tools/csv_toolkit.py +0 -0
  360. {agno-1.7.4 → agno-1.7.5}/agno/tools/dalle.py +0 -0
  361. {agno-1.7.4 → agno-1.7.5}/agno/tools/daytona.py +0 -0
  362. {agno-1.7.4 → agno-1.7.5}/agno/tools/desi_vocal.py +0 -0
  363. {agno-1.7.4 → agno-1.7.5}/agno/tools/discord.py +0 -0
  364. {agno-1.7.4 → agno-1.7.5}/agno/tools/docker.py +0 -0
  365. {agno-1.7.4 → agno-1.7.5}/agno/tools/duckdb.py +0 -0
  366. {agno-1.7.4 → agno-1.7.5}/agno/tools/duckduckgo.py +0 -0
  367. {agno-1.7.4 → agno-1.7.5}/agno/tools/e2b.py +0 -0
  368. {agno-1.7.4 → agno-1.7.5}/agno/tools/eleven_labs.py +0 -0
  369. {agno-1.7.4 → agno-1.7.5}/agno/tools/email.py +0 -0
  370. {agno-1.7.4 → agno-1.7.5}/agno/tools/exa.py +0 -0
  371. {agno-1.7.4 → agno-1.7.5}/agno/tools/fal.py +0 -0
  372. {agno-1.7.4 → agno-1.7.5}/agno/tools/file.py +0 -0
  373. {agno-1.7.4 → agno-1.7.5}/agno/tools/financial_datasets.py +0 -0
  374. {agno-1.7.4 → agno-1.7.5}/agno/tools/firecrawl.py +0 -0
  375. {agno-1.7.4 → agno-1.7.5}/agno/tools/giphy.py +0 -0
  376. {agno-1.7.4 → agno-1.7.5}/agno/tools/github.py +0 -0
  377. {agno-1.7.4 → agno-1.7.5}/agno/tools/gmail.py +0 -0
  378. {agno-1.7.4 → agno-1.7.5}/agno/tools/google_bigquery.py +0 -0
  379. {agno-1.7.4 → agno-1.7.5}/agno/tools/google_maps.py +0 -0
  380. {agno-1.7.4 → agno-1.7.5}/agno/tools/googlecalendar.py +0 -0
  381. {agno-1.7.4 → agno-1.7.5}/agno/tools/googlesearch.py +0 -0
  382. {agno-1.7.4 → agno-1.7.5}/agno/tools/googlesheets.py +0 -0
  383. {agno-1.7.4 → agno-1.7.5}/agno/tools/hackernews.py +0 -0
  384. {agno-1.7.4 → agno-1.7.5}/agno/tools/jina.py +0 -0
  385. {agno-1.7.4 → agno-1.7.5}/agno/tools/jira.py +0 -0
  386. {agno-1.7.4 → agno-1.7.5}/agno/tools/knowledge.py +0 -0
  387. {agno-1.7.4 → agno-1.7.5}/agno/tools/linear.py +0 -0
  388. {agno-1.7.4 → agno-1.7.5}/agno/tools/local_file_system.py +0 -0
  389. {agno-1.7.4 → agno-1.7.5}/agno/tools/lumalab.py +0 -0
  390. {agno-1.7.4 → agno-1.7.5}/agno/tools/mcp.py +0 -0
  391. {agno-1.7.4 → agno-1.7.5}/agno/tools/mem0.py +0 -0
  392. {agno-1.7.4 → agno-1.7.5}/agno/tools/mlx_transcribe.py +0 -0
  393. {agno-1.7.4 → agno-1.7.5}/agno/tools/models/__init__.py +0 -0
  394. {agno-1.7.4 → agno-1.7.5}/agno/tools/models/azure_openai.py +0 -0
  395. {agno-1.7.4 → agno-1.7.5}/agno/tools/models/gemini.py +0 -0
  396. {agno-1.7.4 → agno-1.7.5}/agno/tools/models/groq.py +0 -0
  397. {agno-1.7.4 → agno-1.7.5}/agno/tools/models/nebius.py +0 -0
  398. {agno-1.7.4 → agno-1.7.5}/agno/tools/models_labs.py +0 -0
  399. {agno-1.7.4 → agno-1.7.5}/agno/tools/moviepy_video.py +0 -0
  400. {agno-1.7.4 → agno-1.7.5}/agno/tools/newspaper.py +0 -0
  401. {agno-1.7.4 → agno-1.7.5}/agno/tools/newspaper4k.py +0 -0
  402. {agno-1.7.4 → agno-1.7.5}/agno/tools/openai.py +0 -0
  403. {agno-1.7.4 → agno-1.7.5}/agno/tools/openbb.py +0 -0
  404. {agno-1.7.4 → agno-1.7.5}/agno/tools/opencv.py +0 -0
  405. {agno-1.7.4 → agno-1.7.5}/agno/tools/openweather.py +0 -0
  406. {agno-1.7.4 → agno-1.7.5}/agno/tools/oxylabs.py +0 -0
  407. {agno-1.7.4 → agno-1.7.5}/agno/tools/pandas.py +0 -0
  408. {agno-1.7.4 → agno-1.7.5}/agno/tools/postgres.py +0 -0
  409. {agno-1.7.4 → agno-1.7.5}/agno/tools/pubmed.py +0 -0
  410. {agno-1.7.4 → agno-1.7.5}/agno/tools/python.py +0 -0
  411. {agno-1.7.4 → agno-1.7.5}/agno/tools/reasoning.py +0 -0
  412. {agno-1.7.4 → agno-1.7.5}/agno/tools/reddit.py +0 -0
  413. {agno-1.7.4 → agno-1.7.5}/agno/tools/replicate.py +0 -0
  414. {agno-1.7.4 → agno-1.7.5}/agno/tools/resend.py +0 -0
  415. {agno-1.7.4 → agno-1.7.5}/agno/tools/scrapegraph.py +0 -0
  416. {agno-1.7.4 → agno-1.7.5}/agno/tools/searxng.py +0 -0
  417. {agno-1.7.4 → agno-1.7.5}/agno/tools/serpapi.py +0 -0
  418. {agno-1.7.4 → agno-1.7.5}/agno/tools/serper.py +0 -0
  419. {agno-1.7.4 → agno-1.7.5}/agno/tools/shell.py +0 -0
  420. {agno-1.7.4 → agno-1.7.5}/agno/tools/slack.py +0 -0
  421. {agno-1.7.4 → agno-1.7.5}/agno/tools/sleep.py +0 -0
  422. {agno-1.7.4 → agno-1.7.5}/agno/tools/spider.py +0 -0
  423. {agno-1.7.4 → agno-1.7.5}/agno/tools/sql.py +0 -0
  424. {agno-1.7.4 → agno-1.7.5}/agno/tools/streamlit/__init__.py +0 -0
  425. {agno-1.7.4 → agno-1.7.5}/agno/tools/streamlit/components.py +0 -0
  426. {agno-1.7.4 → agno-1.7.5}/agno/tools/tavily.py +0 -0
  427. {agno-1.7.4 → agno-1.7.5}/agno/tools/telegram.py +0 -0
  428. {agno-1.7.4 → agno-1.7.5}/agno/tools/thinking.py +0 -0
  429. {agno-1.7.4 → agno-1.7.5}/agno/tools/todoist.py +0 -0
  430. {agno-1.7.4 → agno-1.7.5}/agno/tools/tool_registry.py +0 -0
  431. {agno-1.7.4 → agno-1.7.5}/agno/tools/toolkit.py +0 -0
  432. {agno-1.7.4 → agno-1.7.5}/agno/tools/trello.py +0 -0
  433. {agno-1.7.4 → agno-1.7.5}/agno/tools/twilio.py +0 -0
  434. {agno-1.7.4 → agno-1.7.5}/agno/tools/user_control_flow.py +0 -0
  435. {agno-1.7.4 → agno-1.7.5}/agno/tools/valyu.py +0 -0
  436. {agno-1.7.4 → agno-1.7.5}/agno/tools/visualization.py +0 -0
  437. {agno-1.7.4 → agno-1.7.5}/agno/tools/webbrowser.py +0 -0
  438. {agno-1.7.4 → agno-1.7.5}/agno/tools/webex.py +0 -0
  439. {agno-1.7.4 → agno-1.7.5}/agno/tools/website.py +0 -0
  440. {agno-1.7.4 → agno-1.7.5}/agno/tools/webtools.py +0 -0
  441. {agno-1.7.4 → agno-1.7.5}/agno/tools/whatsapp.py +0 -0
  442. {agno-1.7.4 → agno-1.7.5}/agno/tools/wikipedia.py +0 -0
  443. {agno-1.7.4 → agno-1.7.5}/agno/tools/x.py +0 -0
  444. {agno-1.7.4 → agno-1.7.5}/agno/tools/yfinance.py +0 -0
  445. {agno-1.7.4 → agno-1.7.5}/agno/tools/youtube.py +0 -0
  446. {agno-1.7.4 → agno-1.7.5}/agno/tools/zendesk.py +0 -0
  447. {agno-1.7.4 → agno-1.7.5}/agno/tools/zep.py +0 -0
  448. {agno-1.7.4 → agno-1.7.5}/agno/tools/zoom.py +0 -0
  449. {agno-1.7.4 → agno-1.7.5}/agno/utils/__init__.py +0 -0
  450. {agno-1.7.4 → agno-1.7.5}/agno/utils/audio.py +0 -0
  451. {agno-1.7.4 → agno-1.7.5}/agno/utils/certs.py +0 -0
  452. {agno-1.7.4 → agno-1.7.5}/agno/utils/code_execution.py +0 -0
  453. {agno-1.7.4 → agno-1.7.5}/agno/utils/common.py +0 -0
  454. {agno-1.7.4 → agno-1.7.5}/agno/utils/defaults.py +0 -0
  455. {agno-1.7.4 → agno-1.7.5}/agno/utils/dttm.py +0 -0
  456. {agno-1.7.4 → agno-1.7.5}/agno/utils/enum.py +0 -0
  457. {agno-1.7.4 → agno-1.7.5}/agno/utils/env.py +0 -0
  458. {agno-1.7.4 → agno-1.7.5}/agno/utils/events.py +0 -0
  459. {agno-1.7.4 → agno-1.7.5}/agno/utils/filesystem.py +0 -0
  460. {agno-1.7.4 → agno-1.7.5}/agno/utils/format_str.py +0 -0
  461. {agno-1.7.4 → agno-1.7.5}/agno/utils/functions.py +0 -0
  462. {agno-1.7.4 → agno-1.7.5}/agno/utils/gemini.py +0 -0
  463. {agno-1.7.4 → agno-1.7.5}/agno/utils/git.py +0 -0
  464. {agno-1.7.4 → agno-1.7.5}/agno/utils/http.py +0 -0
  465. {agno-1.7.4 → agno-1.7.5}/agno/utils/json_io.py +0 -0
  466. {agno-1.7.4 → agno-1.7.5}/agno/utils/json_schema.py +0 -0
  467. {agno-1.7.4 → agno-1.7.5}/agno/utils/load_env.py +0 -0
  468. {agno-1.7.4 → agno-1.7.5}/agno/utils/location.py +0 -0
  469. {agno-1.7.4 → agno-1.7.5}/agno/utils/log.py +0 -0
  470. {agno-1.7.4 → agno-1.7.5}/agno/utils/mcp.py +0 -0
  471. {agno-1.7.4 → agno-1.7.5}/agno/utils/media.py +0 -0
  472. {agno-1.7.4 → agno-1.7.5}/agno/utils/merge_dict.py +0 -0
  473. {agno-1.7.4 → agno-1.7.5}/agno/utils/message.py +0 -0
  474. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/__init__.py +0 -0
  475. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/ai_foundry.py +0 -0
  476. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/aws_claude.py +0 -0
  477. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/claude.py +0 -0
  478. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/cohere.py +0 -0
  479. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/llama.py +0 -0
  480. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/mistral.py +0 -0
  481. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/openai_responses.py +0 -0
  482. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/schema_utils.py +0 -0
  483. {agno-1.7.4 → agno-1.7.5}/agno/utils/models/watsonx.py +0 -0
  484. {agno-1.7.4 → agno-1.7.5}/agno/utils/openai.py +0 -0
  485. {agno-1.7.4 → agno-1.7.5}/agno/utils/pickle.py +0 -0
  486. {agno-1.7.4 → agno-1.7.5}/agno/utils/prompts.py +0 -0
  487. {agno-1.7.4 → agno-1.7.5}/agno/utils/py_io.py +0 -0
  488. {agno-1.7.4 → agno-1.7.5}/agno/utils/pyproject.py +0 -0
  489. {agno-1.7.4 → agno-1.7.5}/agno/utils/resource_filter.py +0 -0
  490. {agno-1.7.4 → agno-1.7.5}/agno/utils/response.py +0 -0
  491. {agno-1.7.4 → agno-1.7.5}/agno/utils/response_iterator.py +0 -0
  492. {agno-1.7.4 → agno-1.7.5}/agno/utils/safe_formatter.py +0 -0
  493. {agno-1.7.4 → agno-1.7.5}/agno/utils/shell.py +0 -0
  494. {agno-1.7.4 → agno-1.7.5}/agno/utils/string.py +0 -0
  495. {agno-1.7.4 → agno-1.7.5}/agno/utils/timer.py +0 -0
  496. {agno-1.7.4 → agno-1.7.5}/agno/utils/tools.py +0 -0
  497. {agno-1.7.4 → agno-1.7.5}/agno/utils/web.py +0 -0
  498. {agno-1.7.4 → agno-1.7.5}/agno/utils/whatsapp.py +0 -0
  499. {agno-1.7.4 → agno-1.7.5}/agno/utils/yaml_io.py +0 -0
  500. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/__init__.py +0 -0
  501. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/base.py +0 -0
  502. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/cassandra/__init__.py +0 -0
  503. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/cassandra/cassandra.py +0 -0
  504. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  505. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/cassandra/index.py +0 -0
  506. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/chroma/__init__.py +0 -0
  507. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/chroma/chromadb.py +0 -0
  508. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/clickhouse/__init__.py +0 -0
  509. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  510. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/clickhouse/index.py +0 -0
  511. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/couchbase/__init__.py +0 -0
  512. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/couchbase/couchbase.py +0 -0
  513. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/distance.py +0 -0
  514. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/lancedb/__init__.py +0 -0
  515. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/lancedb/lance_db.py +0 -0
  516. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/milvus/__init__.py +0 -0
  517. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/milvus/milvus.py +0 -0
  518. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/mongodb/__init__.py +0 -0
  519. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/mongodb/mongodb.py +0 -0
  520. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pgvector/__init__.py +0 -0
  521. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pgvector/index.py +0 -0
  522. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pgvector/pgvector.py +0 -0
  523. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pineconedb/__init__.py +0 -0
  524. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  525. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/qdrant/__init__.py +0 -0
  526. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/qdrant/qdrant.py +0 -0
  527. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/search.py +0 -0
  528. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/singlestore/__init__.py +0 -0
  529. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/singlestore/index.py +0 -0
  530. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/singlestore/singlestore.py +0 -0
  531. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/upstashdb/__init__.py +0 -0
  532. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  533. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/weaviate/__init__.py +0 -0
  534. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/weaviate/index.py +0 -0
  535. {agno-1.7.4 → agno-1.7.5}/agno/vectordb/weaviate/weaviate.py +0 -0
  536. {agno-1.7.4 → agno-1.7.5}/agno/workflow/__init__.py +0 -0
  537. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/__init__.py +0 -0
  538. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/condition.py +0 -0
  539. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/loop.py +0 -0
  540. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/parallel.py +0 -0
  541. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/router.py +0 -0
  542. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/step.py +0 -0
  543. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/steps.py +0 -0
  544. {agno-1.7.4 → agno-1.7.5}/agno/workflow/v2/types.py +0 -0
  545. {agno-1.7.4 → agno-1.7.5}/agno/workflow/workflow.py +0 -0
  546. {agno-1.7.4 → agno-1.7.5}/agno/workspace/__init__.py +0 -0
  547. {agno-1.7.4 → agno-1.7.5}/agno/workspace/config.py +0 -0
  548. {agno-1.7.4 → agno-1.7.5}/agno/workspace/enums.py +0 -0
  549. {agno-1.7.4 → agno-1.7.5}/agno/workspace/helpers.py +0 -0
  550. {agno-1.7.4 → agno-1.7.5}/agno/workspace/operator.py +0 -0
  551. {agno-1.7.4 → agno-1.7.5}/agno/workspace/settings.py +0 -0
  552. {agno-1.7.4 → agno-1.7.5}/agno.egg-info/dependency_links.txt +0 -0
  553. {agno-1.7.4 → agno-1.7.5}/agno.egg-info/entry_points.txt +0 -0
  554. {agno-1.7.4 → agno-1.7.5}/agno.egg-info/top_level.txt +0 -0
  555. {agno-1.7.4 → agno-1.7.5}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 1.7.4
3
+ Version: 1.7.5
4
4
  Summary: Agno: a lightweight library for building Multi-Agent Systems
5
5
  Author-email: Ashpreet Bedi <ashpreet@agno.com>
6
6
  License: Copyright (c) Agno, Inc.
@@ -573,6 +573,8 @@ Provides-Extra: clickhouse
573
573
  Requires-Dist: clickhouse-connect; extra == "clickhouse"
574
574
  Provides-Extra: pinecone
575
575
  Requires-Dist: pinecone==5.4.2; extra == "pinecone"
576
+ Provides-Extra: surrealdb
577
+ Requires-Dist: surrealdb>=1.0.4; extra == "surrealdb"
576
578
  Provides-Extra: pdf
577
579
  Requires-Dist: pypdf; extra == "pdf"
578
580
  Requires-Dist: rapidocr_onnxruntime; extra == "pdf"
@@ -664,6 +666,7 @@ Requires-Dist: agno[weaviate]; extra == "vectordbs"
664
666
  Requires-Dist: agno[milvusdb]; extra == "vectordbs"
665
667
  Requires-Dist: agno[clickhouse]; extra == "vectordbs"
666
668
  Requires-Dist: agno[pinecone]; extra == "vectordbs"
669
+ Requires-Dist: agno[surrealdb]; extra == "vectordbs"
667
670
  Provides-Extra: knowledge
668
671
  Requires-Dist: agno[pdf]; extra == "knowledge"
669
672
  Requires-Dist: agno[docx]; extra == "knowledge"
@@ -119,6 +119,8 @@ class Agent:
119
119
  session_state: Optional[Dict[str, Any]] = None
120
120
  search_previous_sessions_history: Optional[bool] = False
121
121
  num_history_sessions: Optional[int] = None
122
+ # If True, cache the session in memory
123
+ cache_session: bool = True
122
124
 
123
125
  # --- Agent Context ---
124
126
  # Context available for tools and prompt functions
@@ -351,6 +353,7 @@ class Agent:
351
353
  session_state: Optional[Dict[str, Any]] = None,
352
354
  search_previous_sessions_history: Optional[bool] = False,
353
355
  num_history_sessions: Optional[int] = None,
356
+ cache_session: bool = True,
354
357
  context: Optional[Dict[str, Any]] = None,
355
358
  add_context: bool = False,
356
359
  resolve_context: bool = True,
@@ -441,6 +444,8 @@ class Agent:
441
444
  self.search_previous_sessions_history = search_previous_sessions_history
442
445
  self.num_history_sessions = num_history_sessions
443
446
 
447
+ self.cache_session = cache_session
448
+
444
449
  self.context = context
445
450
  self.add_context = add_context
446
451
  self.resolve_context = resolve_context
@@ -754,9 +759,6 @@ class Agent:
754
759
 
755
760
  self._initialize_session_state(user_id=user_id, session_id=session_id)
756
761
 
757
- # Read existing session from storage
758
- self.read_from_storage(session_id=session_id)
759
-
760
762
  return session_id, user_id
761
763
 
762
764
  def _run(
@@ -996,16 +998,18 @@ class Agent:
996
998
  **kwargs: Any,
997
999
  ) -> Union[RunResponse, Iterator[RunResponseEvent]]:
998
1000
  """Run the Agent and return the response."""
999
-
1000
1001
  session_id, user_id = self._initialize_session(
1001
1002
  session_id=session_id, user_id=user_id, session_state=session_state
1002
1003
  )
1003
1004
 
1004
- log_debug(f"Session ID: {session_id}", center=True)
1005
-
1006
1005
  # Initialize the Agent
1007
1006
  self.initialize_agent()
1008
1007
 
1008
+ # Read existing session from storage
1009
+ self.read_from_storage(session_id=session_id)
1010
+
1011
+ log_debug(f"Session ID: {session_id}", center=True)
1012
+
1009
1013
  # Initialize Knowledge Filters
1010
1014
  effective_filters = knowledge_filters
1011
1015
 
@@ -1382,6 +1386,9 @@ class Agent:
1382
1386
  # Initialize the Agent
1383
1387
  self.initialize_agent()
1384
1388
 
1389
+ # Read existing session from storage
1390
+ self.read_from_storage(session_id=session_id)
1391
+
1385
1392
  effective_filters = knowledge_filters
1386
1393
  # When filters are passed manually
1387
1394
  if self.knowledge_filters or knowledge_filters:
@@ -1606,6 +1613,9 @@ class Agent:
1606
1613
  retries: The number of retries to continue the run for.
1607
1614
  knowledge_filters: The knowledge filters to use for the run.
1608
1615
  """
1616
+ # Initialize the Agent
1617
+ self.initialize_agent()
1618
+
1609
1619
  if session_id is not None:
1610
1620
  self.reset_run_state()
1611
1621
  # Reset session state if a session_id is provided. Session name and session state will be loaded from storage.
@@ -1614,9 +1624,6 @@ class Agent:
1614
1624
  if self.session_id is not None and session_id != self.session_id:
1615
1625
  self.session_state = None
1616
1626
 
1617
- # Initialize the Agent
1618
- self.initialize_agent()
1619
-
1620
1627
  # Initialize Session
1621
1628
  # Use the default user_id and session_id when necessary
1622
1629
  user_id = user_id if user_id is not None else self.user_id
@@ -1996,6 +2003,9 @@ class Agent:
1996
2003
  retries: The number of retries to continue the run for.
1997
2004
  knowledge_filters: The knowledge filters to use for the run.
1998
2005
  """
2006
+ # Initialize the Agent
2007
+ self.initialize_agent()
2008
+
1999
2009
  if session_id is not None:
2000
2010
  self.reset_run_state()
2001
2011
  # Reset session state if a session_id is provided. Session name and session state will be loaded from storage.
@@ -2004,9 +2014,6 @@ class Agent:
2004
2014
  if self.session_id is not None and session_id != self.session_id:
2005
2015
  self.session_state = None
2006
2016
 
2007
- # Initialize the Agent
2008
- self.initialize_agent()
2009
-
2010
2017
  # Initialize Session
2011
2018
  # Use the default user_id and session_id when necessary
2012
2019
  user_id = user_id if user_id is not None else self.user_id
@@ -4056,6 +4063,7 @@ class Agent:
4056
4063
  # Convert dict to Memory
4057
4064
  elif isinstance(self.memory, dict):
4058
4065
  memory_dict = self.memory
4066
+
4059
4067
  memory_dict.pop("runs")
4060
4068
  self.memory = Memory(**memory_dict)
4061
4069
  else:
@@ -4111,6 +4119,7 @@ class Agent:
4111
4119
  self.memory.runs[session.session_id] = []
4112
4120
  for run in session.memory["runs"]:
4113
4121
  run_session_id = run["session_id"]
4122
+
4114
4123
  if "team_id" in run:
4115
4124
  self.memory.runs[run_session_id].append(TeamRunResponse.from_dict(run))
4116
4125
  else:
@@ -4179,10 +4188,10 @@ class Agent:
4179
4188
  if not self.storage:
4180
4189
  return
4181
4190
 
4182
- agent_session_from_db = self.storage.read(session_id=session_id) # type: ignore
4191
+ agent_session_from_db = self.storage.read(session_id=session_id) # type: ignore
4183
4192
  if (
4184
4193
  agent_session_from_db is not None
4185
- and agent_session_from_db.memory is not None # type: ignore
4194
+ and agent_session_from_db.memory is not None # type: ignore
4186
4195
  and "runs" in agent_session_from_db.memory # type: ignore
4187
4196
  ):
4188
4197
  if isinstance(self.memory, AgentMemory):
@@ -4224,6 +4233,11 @@ class Agent:
4224
4233
  AgentSession,
4225
4234
  self.storage.upsert(session=self.get_agent_session(session_id=session_id, user_id=user_id)),
4226
4235
  )
4236
+
4237
+ if not self.cache_session:
4238
+ if self.memory is not None and self.memory.runs is not None and session_id in self.memory.runs:
4239
+ self.memory.runs.pop(session_id) # type: ignore
4240
+
4227
4241
  return self.agent_session
4228
4242
 
4229
4243
  def add_introduction(self, introduction: str) -> None:
@@ -77,7 +77,7 @@ class FastAPIApp(BaseAPIApp):
77
77
 
78
78
  if self.workflows:
79
79
  for workflow in self.workflows:
80
- if not workflow.app_id:
80
+ if hasattr(workflow, "app_id") and not workflow.app_id:
81
81
  workflow.app_id = self.app_id
82
82
  if not workflow.workflow_id:
83
83
  workflow.workflow_id = generate_id(workflow.name)
@@ -1,7 +1,7 @@
1
1
  import json
2
2
  from dataclasses import asdict
3
3
  from io import BytesIO
4
- from typing import AsyncGenerator, List, Optional, cast
4
+ from typing import Any, AsyncGenerator, Dict, List, Optional, Union, cast
5
5
  from uuid import uuid4
6
6
 
7
7
  from fastapi import APIRouter, File, Form, HTTPException, Query, UploadFile
@@ -14,8 +14,10 @@ from agno.media import File as FileMedia
14
14
  from agno.run.response import RunResponseErrorEvent
15
15
  from agno.run.team import RunResponseErrorEvent as TeamRunResponseErrorEvent
16
16
  from agno.run.team import TeamRunResponseEvent
17
+ from agno.run.v2.workflow import WorkflowErrorEvent
17
18
  from agno.team.team import Team
18
19
  from agno.utils.log import logger
20
+ from agno.workflow.v2.workflow import Workflow as WorkflowV2
19
21
  from agno.workflow.workflow import Workflow
20
22
 
21
23
 
@@ -83,6 +85,42 @@ async def team_chat_response_streamer(
83
85
  return
84
86
 
85
87
 
88
+ async def workflow_response_streamer(
89
+ workflow: WorkflowV2,
90
+ body: Union[Dict[str, Any], str],
91
+ session_id: Optional[str] = None,
92
+ user_id: Optional[str] = None,
93
+ ) -> AsyncGenerator:
94
+ try:
95
+ if isinstance(body, dict):
96
+ run_response = await workflow.arun( # type: ignore
97
+ **body,
98
+ user_id=user_id,
99
+ session_id=session_id,
100
+ stream=True,
101
+ stream_intermediate_steps=True,
102
+ )
103
+ else:
104
+ run_response = await workflow.arun( # type: ignore
105
+ body,
106
+ user_id=user_id,
107
+ session_id=session_id,
108
+ stream=True,
109
+ stream_intermediate_steps=True,
110
+ )
111
+ async for run_response_chunk in run_response:
112
+ yield run_response_chunk.to_json()
113
+ except Exception as e:
114
+ import traceback
115
+
116
+ traceback.print_exc(limit=3)
117
+ error_response = WorkflowErrorEvent(
118
+ error=str(e),
119
+ )
120
+ yield error_response.to_json()
121
+ return
122
+
123
+
86
124
  def get_async_router(
87
125
  agents: Optional[List[Agent]] = None, teams: Optional[List[Team]] = None, workflows: Optional[List[Workflow]] = None
88
126
  ) -> APIRouter:
@@ -351,17 +389,24 @@ def get_async_router(
351
389
  media_type="text/event-stream",
352
390
  )
353
391
  elif workflow:
354
- workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
355
- workflow_instance.user_id = user_id
356
- workflow_instance.session_name = None
357
- if isinstance(workflow_input, dict):
358
- return StreamingResponse(
359
- (json.dumps(asdict(result)) for result in await workflow_instance.arun(**workflow_input)),
360
- media_type="text/event-stream",
361
- )
392
+ if isinstance(workflow, Workflow):
393
+ workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
394
+ workflow_instance.user_id = user_id
395
+ workflow_instance.session_name = None
396
+
397
+ if isinstance(workflow_input, dict):
398
+ return StreamingResponse(
399
+ (json.dumps(asdict(result)) for result in await workflow_instance.arun(**workflow_input)),
400
+ media_type="text/event-stream",
401
+ )
402
+ else:
403
+ return StreamingResponse(
404
+ (json.dumps(asdict(result)) for result in await workflow_instance.arun(workflow_input)), # type: ignore
405
+ media_type="text/event-stream",
406
+ )
362
407
  else:
363
408
  return StreamingResponse(
364
- (json.dumps(asdict(result)) for result in await workflow_instance.arun(workflow_input)), # type: ignore
409
+ workflow_response_streamer(workflow, workflow_input, session_id=session_id, user_id=user_id), # type: ignore
365
410
  media_type="text/event-stream",
366
411
  )
367
412
  else:
@@ -392,12 +437,18 @@ def get_async_router(
392
437
  )
393
438
  return team_run_response.to_dict()
394
439
  elif workflow:
395
- workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
396
- workflow_instance.user_id = user_id
397
- workflow_instance.session_name = None
398
- if isinstance(workflow_input, dict):
399
- return (await workflow_instance.arun(**workflow_input)).to_dict()
440
+ if isinstance(workflow, Workflow):
441
+ workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
442
+ workflow_instance.user_id = user_id
443
+ workflow_instance.session_name = None
444
+ if isinstance(workflow_input, dict):
445
+ return (await workflow_instance.arun(**workflow_input)).to_dict()
446
+ else:
447
+ return (await workflow_instance.arun(workflow_input)).to_dict() # type: ignore
400
448
  else:
401
- return (await workflow_instance.arun(workflow_input)).to_dict() # type: ignore
449
+ if isinstance(workflow_input, dict):
450
+ return (await workflow.arun(**workflow_input, session_id=session_id, user_id=user_id)).to_dict()
451
+ else:
452
+ return (await workflow.arun(workflow_input, session_id=session_id, user_id=user_id)).to_dict() # type: ignore
402
453
 
403
454
  return router
@@ -1,7 +1,7 @@
1
1
  import json
2
2
  from dataclasses import asdict
3
3
  from io import BytesIO
4
- from typing import Any, Dict, Generator, List, Optional, cast
4
+ from typing import Any, Dict, Generator, List, Optional, Union, cast
5
5
  from uuid import uuid4
6
6
 
7
7
  from fastapi import APIRouter, File, Form, HTTPException, Query, UploadFile
@@ -15,8 +15,10 @@ from agno.run.base import RunStatus
15
15
  from agno.run.response import RunResponseEvent
16
16
  from agno.run.team import RunResponseErrorEvent as TeamRunResponseErrorEvent
17
17
  from agno.run.team import TeamRunResponseEvent
18
+ from agno.run.v2.workflow import WorkflowErrorEvent
18
19
  from agno.team.team import Team
19
20
  from agno.utils.log import logger
21
+ from agno.workflow.v2.workflow import Workflow as WorkflowV2
20
22
  from agno.workflow.workflow import Workflow
21
23
 
22
24
 
@@ -82,6 +84,42 @@ def team_chat_response_streamer(
82
84
  return
83
85
 
84
86
 
87
+ def workflow_response_streamer(
88
+ workflow: WorkflowV2,
89
+ body: Union[Dict[str, Any], str],
90
+ session_id: Optional[str] = None,
91
+ user_id: Optional[str] = None,
92
+ ) -> Generator:
93
+ try:
94
+ if isinstance(body, dict):
95
+ run_response = workflow.run(
96
+ **body,
97
+ user_id=user_id,
98
+ session_id=session_id,
99
+ stream=True,
100
+ stream_intermediate_steps=True,
101
+ )
102
+ else:
103
+ run_response = workflow.run(
104
+ body,
105
+ user_id=user_id,
106
+ session_id=session_id,
107
+ stream=True,
108
+ stream_intermediate_steps=True,
109
+ )
110
+ for run_response_chunk in run_response:
111
+ yield run_response_chunk.to_json()
112
+ except Exception as e:
113
+ import traceback
114
+
115
+ traceback.print_exc(limit=3)
116
+ error_response = WorkflowErrorEvent(
117
+ error=str(e),
118
+ )
119
+ yield error_response.to_json()
120
+ return
121
+
122
+
85
123
  def get_sync_router(
86
124
  agents: Optional[List[Agent]] = None, teams: Optional[List[Team]] = None, workflows: Optional[List[Workflow]] = None
87
125
  ) -> APIRouter:
@@ -251,12 +289,12 @@ def get_sync_router(
251
289
  @router.post("/runs")
252
290
  def run_agent_or_team_or_workflow(
253
291
  message: str = Form(None),
254
- stream: bool = Form(True),
292
+ stream: bool = Form(False),
255
293
  monitor: bool = Form(False),
256
294
  agent_id: Optional[str] = Query(None),
257
295
  team_id: Optional[str] = Query(None),
258
296
  workflow_id: Optional[str] = Query(None),
259
- workflow_input: Optional[Dict[str, Any]] = Form(None),
297
+ workflow_input: Optional[str] = Form(None),
260
298
  session_id: Optional[str] = Form(None),
261
299
  user_id: Optional[str] = Form(None),
262
300
  files: Optional[List[UploadFile]] = File(None),
@@ -297,6 +335,13 @@ def get_sync_router(
297
335
  if not workflow_input:
298
336
  raise HTTPException(status_code=400, detail="Workflow input is required")
299
337
 
338
+ # Parse workflow_input into a dict if it is a valid JSON
339
+ try:
340
+ parsed_workflow_input = json.loads(workflow_input)
341
+ workflow_input = parsed_workflow_input
342
+ except json.JSONDecodeError:
343
+ pass
344
+
300
345
  if agent:
301
346
  agent.monitoring = bool(monitor)
302
347
  elif team:
@@ -339,13 +384,25 @@ def get_sync_router(
339
384
  media_type="text/event-stream",
340
385
  )
341
386
  elif workflow:
342
- workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
343
- workflow_instance.user_id = user_id
344
- workflow_instance.session_name = None
345
- return StreamingResponse(
346
- (json.dumps(asdict(result)) for result in workflow_instance.run(**(workflow_input or {}))),
347
- media_type="text/event-stream",
348
- )
387
+ if isinstance(workflow, Workflow):
388
+ workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
389
+ workflow_instance.user_id = user_id
390
+ workflow_instance.session_name = None
391
+ if isinstance(workflow_input, dict):
392
+ return StreamingResponse(
393
+ (json.dumps(asdict(result)) for result in workflow_instance.run(**workflow_input)),
394
+ media_type="text/event-stream",
395
+ )
396
+ else:
397
+ return StreamingResponse(
398
+ (json.dumps(asdict(result)) for result in workflow_instance.run(workflow_input)), # type: ignore
399
+ media_type="text/event-stream",
400
+ )
401
+ else:
402
+ return StreamingResponse(
403
+ workflow_response_streamer(workflow, workflow_input, session_id=session_id, user_id=user_id),
404
+ media_type="text/event-stream",
405
+ )
349
406
  else:
350
407
  if agent:
351
408
  run_response = cast(
@@ -374,9 +431,18 @@ def get_sync_router(
374
431
  )
375
432
  return team_run_response.to_dict()
376
433
  elif workflow:
377
- workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
378
- workflow_instance.user_id = user_id
379
- workflow_instance.session_name = None
380
- return workflow_instance.run(**(workflow_input or {})).to_dict()
434
+ if isinstance(workflow, Workflow):
435
+ workflow_instance = workflow.deep_copy(update={"workflow_id": workflow_id})
436
+ workflow_instance.user_id = user_id
437
+ workflow_instance.session_name = None
438
+ if isinstance(workflow_input, dict):
439
+ return workflow_instance.run(**workflow_input).to_dict()
440
+ else:
441
+ return workflow_instance.run(workflow_input).to_dict() # type: ignore
442
+ else:
443
+ if isinstance(workflow_input, dict):
444
+ return workflow.run(**workflow_input, session_id=session_id, user_id=user_id).to_dict()
445
+ else:
446
+ return workflow.run(workflow_input, session_id=session_id, user_id=user_id).to_dict()
381
447
 
382
448
  return router
@@ -184,7 +184,7 @@ class AgentKnowledge(BaseModel):
184
184
  # Filter out documents which already exist in the vector db
185
185
  if skip_existing:
186
186
  log_debug("Filtering out existing documents before insertion.")
187
- documents_to_load = self.filter_existing_documents(document_list)
187
+ documents_to_load = await self.async_filter_existing_documents(document_list)
188
188
 
189
189
  if documents_to_load:
190
190
  for doc in documents_to_load:
@@ -439,6 +439,43 @@ class AgentKnowledge(BaseModel):
439
439
 
440
440
  return filtered_documents
441
441
 
442
+ async def async_filter_existing_documents(self, documents: List[Document]) -> List[Document]:
443
+ """Filter out documents that already exist in the vector database.
444
+
445
+ This helper method is used across various knowledge base implementations
446
+ to avoid inserting duplicate documents.
447
+
448
+ Args:
449
+ documents (List[Document]): List of documents to filter
450
+
451
+ Returns:
452
+ List[Document]: Filtered list of documents that don't exist in the database
453
+ """
454
+ from agno.utils.log import log_debug, log_info
455
+
456
+ if not self.vector_db:
457
+ log_debug("No vector database configured, skipping document filtering")
458
+ return documents
459
+
460
+ # Use set for O(1) lookups
461
+ seen_content = set()
462
+ original_count = len(documents)
463
+ filtered_documents = []
464
+
465
+ for doc in documents:
466
+ # Check hash and existence in DB
467
+ content_hash = doc.content # Assuming doc.content is reliable hash key
468
+ if content_hash not in seen_content and not await self.vector_db.async_doc_exists(doc):
469
+ seen_content.add(content_hash)
470
+ filtered_documents.append(doc)
471
+ else:
472
+ log_debug(f"Skipping existing document: {doc.name} (or duplicate content)")
473
+
474
+ if len(filtered_documents) < original_count:
475
+ log_info(f"Skipped {original_count - len(filtered_documents)} existing/duplicate documents.")
476
+
477
+ return filtered_documents
478
+
442
479
  def _track_metadata_structure(self, metadata: Optional[Dict[str, Any]]) -> None:
443
480
  """Track metadata structure to enable filter extraction from queries
444
481
 
@@ -655,7 +692,7 @@ class AgentKnowledge(BaseModel):
655
692
  documents_to_insert = documents
656
693
  if skip_existing:
657
694
  log_debug("Filtering out existing documents before insertion.")
658
- documents_to_insert = self.filter_existing_documents(documents)
695
+ documents_to_insert = await self.async_filter_existing_documents(documents)
659
696
 
660
697
  if documents_to_insert: # type: ignore
661
698
  log_debug(f"Inserting {len(documents_to_insert)} new documents.")
@@ -32,5 +32,5 @@ class CombinedKnowledgeBase(AgentKnowledge):
32
32
 
33
33
  for kb in self.sources:
34
34
  log_debug(f"Loading documents from {kb.__class__.__name__}")
35
- async for document in await kb.async_document_lists:
35
+ async for document in kb.async_document_lists: # type: ignore
36
36
  yield document
@@ -130,6 +130,8 @@ class Team:
130
130
  session_name: Optional[str] = None
131
131
  # Session state (stored in the database to persist across runs)
132
132
  session_state: Optional[Dict[str, Any]] = None
133
+ # If True, cache the session in memory
134
+ cache_session: bool = True
133
135
 
134
136
  # Team session state (shared between team leaders and team members)
135
137
  team_session_state: Optional[Dict[str, Any]] = None
@@ -311,6 +313,7 @@ class Team:
311
313
  team_session_state: Optional[Dict[str, Any]] = None,
312
314
  workflow_session_state: Optional[Dict[str, Any]] = None,
313
315
  add_state_in_messages: bool = False,
316
+ cache_session: bool = True,
314
317
  description: Optional[str] = None,
315
318
  instructions: Optional[Union[str, List[str], Callable]] = None,
316
319
  expected_output: Optional[str] = None,
@@ -390,6 +393,8 @@ class Team:
390
393
  self.workflow_session_state = workflow_session_state
391
394
  self.add_state_in_messages = add_state_in_messages
392
395
 
396
+ self.cache_session = cache_session
397
+
393
398
  self.description = description
394
399
  self.instructions = instructions
395
400
  self.expected_output = expected_output
@@ -729,9 +734,6 @@ class Team:
729
734
 
730
735
  self._initialize_session_state(user_id=user_id, session_id=session_id)
731
736
 
732
- # Read existing session from storage
733
- self.read_from_storage(session_id=session_id)
734
-
735
737
  return session_id, user_id
736
738
 
737
739
  @overload
@@ -799,6 +801,9 @@ class Team:
799
801
  # Initialize Team
800
802
  self.initialize_team(session_id=session_id)
801
803
 
804
+ # Read existing session from storage
805
+ self.read_from_storage(session_id=session_id)
806
+
802
807
  # Initialize Knowledge Filters
803
808
  effective_filters = knowledge_filters
804
809
 
@@ -1191,14 +1196,17 @@ class Team:
1191
1196
  **kwargs: Any,
1192
1197
  ) -> Union[TeamRunResponse, AsyncIterator[Union[RunResponseEvent, TeamRunResponseEvent]]]:
1193
1198
  """Run the Team asynchronously and return the response."""
1194
-
1195
1199
  session_id, user_id = self._initialize_session(
1196
1200
  session_id=session_id, user_id=user_id, session_state=session_state
1197
1201
  )
1198
1202
  log_debug(f"Session ID: {session_id}", center=True)
1199
1203
 
1204
+ # Initialize Team
1200
1205
  self.initialize_team(session_id=session_id)
1201
1206
 
1207
+ # Read existing session from storage
1208
+ self.read_from_storage(session_id=session_id)
1209
+
1202
1210
  effective_filters = knowledge_filters
1203
1211
 
1204
1212
  # When filters are passed manually
@@ -1630,7 +1638,7 @@ class Team:
1630
1638
  self.memory.add_team_run(team_run) # type: ignore
1631
1639
 
1632
1640
  elif isinstance(self.memory, Memory):
1633
- # Add AgentRun to memory
1641
+ # Add run to memory
1634
1642
  self.memory.add_run(session_id=session_id, run=run_response)
1635
1643
 
1636
1644
  def _update_memory(
@@ -6848,6 +6856,11 @@ class Team:
6848
6856
  self.team_session = cast(
6849
6857
  TeamSession, self.storage.upsert(session=self._get_team_session(session_id=session_id, user_id=user_id))
6850
6858
  )
6859
+
6860
+ # Remove session from memory
6861
+ if not self.cache_session:
6862
+ if self.memory is not None and self.memory.runs is not None and session_id in self.memory.runs:
6863
+ self.memory.runs.pop(session_id) # type: ignore
6851
6864
  return self.team_session
6852
6865
 
6853
6866
  def rename_session(self, session_name: str, session_id: Optional[str] = None) -> None:
@@ -7025,6 +7038,7 @@ class Team:
7025
7038
  self.memory.runs[session.session_id] = []
7026
7039
  for run in session.memory["runs"]:
7027
7040
  run_session_id = run["session_id"]
7041
+
7028
7042
  if "team_id" in run:
7029
7043
  self.memory.runs[run_session_id].append(TeamRunResponse.from_dict(run))
7030
7044
  else:
@@ -7739,6 +7753,7 @@ class Team:
7739
7753
  run_responses = self.memory.runs.get(session_id)
7740
7754
  if run_responses is not None:
7741
7755
  memory_dict["runs"] = [rr.to_dict() for rr in run_responses]
7756
+
7742
7757
  return TeamSession(
7743
7758
  session_id=session_id,
7744
7759
  team_id=self.team_id,