agno 2.0.1__tar.gz → 2.0.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. {agno-2.0.1 → agno-2.0.3}/PKG-INFO +1 -1
  2. {agno-2.0.1 → agno-2.0.3}/agno/agent/agent.py +2 -1
  3. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/fixed.py +1 -1
  4. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/base.py +3 -0
  5. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/csv_reader.py +1 -1
  6. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/json_reader.py +1 -1
  7. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/markdown_reader.py +5 -5
  8. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/s3_reader.py +0 -12
  9. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/text_reader.py +5 -5
  10. agno-2.0.3/agno/knowledge/reranker/__init__.py +3 -0
  11. {agno-2.0.1 → agno-2.0.3}/agno/models/cerebras/cerebras.py +5 -3
  12. {agno-2.0.1 → agno-2.0.3}/agno/models/cerebras/cerebras_openai.py +5 -3
  13. {agno-2.0.1 → agno-2.0.3}/agno/models/google/gemini.py +33 -11
  14. {agno-2.0.1 → agno-2.0.3}/agno/models/litellm/chat.py +1 -1
  15. {agno-2.0.1 → agno-2.0.3}/agno/models/openai/responses.py +75 -40
  16. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/slack/router.py +1 -1
  17. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/whatsapp/router.py +2 -0
  18. {agno-2.0.1 → agno-2.0.3}/agno/os/router.py +60 -22
  19. {agno-2.0.1 → agno-2.0.3}/agno/run/agent.py +5 -2
  20. {agno-2.0.1 → agno-2.0.3}/agno/run/base.py +6 -3
  21. {agno-2.0.1 → agno-2.0.3}/agno/run/team.py +11 -3
  22. {agno-2.0.1 → agno-2.0.3}/agno/run/workflow.py +5 -2
  23. {agno-2.0.1 → agno-2.0.3}/agno/team/team.py +4 -1
  24. {agno-2.0.1 → agno-2.0.3}/agno/tools/mcp.py +1 -0
  25. agno-2.0.3/agno/tools/memory.py +391 -0
  26. agno-2.0.3/agno/tools/workflow.py +279 -0
  27. agno-2.0.3/agno/utils/audio.py +49 -0
  28. {agno-2.0.1 → agno-2.0.3}/agno/utils/print_response/agent.py +6 -2
  29. {agno-2.0.1 → agno-2.0.3}/agno.egg-info/PKG-INFO +1 -1
  30. {agno-2.0.1 → agno-2.0.3}/agno.egg-info/SOURCES.txt +2 -0
  31. {agno-2.0.1 → agno-2.0.3}/pyproject.toml +1 -1
  32. agno-2.0.1/agno/knowledge/reranker/__init__.py +0 -9
  33. agno-2.0.1/agno/utils/audio.py +0 -22
  34. {agno-2.0.1 → agno-2.0.3}/LICENSE +0 -0
  35. {agno-2.0.1 → agno-2.0.3}/README.md +0 -0
  36. {agno-2.0.1 → agno-2.0.3}/agno/__init__.py +0 -0
  37. {agno-2.0.1 → agno-2.0.3}/agno/agent/__init__.py +0 -0
  38. {agno-2.0.1 → agno-2.0.3}/agno/api/__init__.py +0 -0
  39. {agno-2.0.1 → agno-2.0.3}/agno/api/agent.py +0 -0
  40. {agno-2.0.1 → agno-2.0.3}/agno/api/api.py +0 -0
  41. {agno-2.0.1 → agno-2.0.3}/agno/api/evals.py +0 -0
  42. {agno-2.0.1 → agno-2.0.3}/agno/api/os.py +0 -0
  43. {agno-2.0.1 → agno-2.0.3}/agno/api/routes.py +0 -0
  44. {agno-2.0.1 → agno-2.0.3}/agno/api/schemas/__init__.py +0 -0
  45. {agno-2.0.1 → agno-2.0.3}/agno/api/schemas/agent.py +0 -0
  46. {agno-2.0.1 → agno-2.0.3}/agno/api/schemas/evals.py +0 -0
  47. {agno-2.0.1 → agno-2.0.3}/agno/api/schemas/os.py +0 -0
  48. {agno-2.0.1 → agno-2.0.3}/agno/api/schemas/response.py +0 -0
  49. {agno-2.0.1 → agno-2.0.3}/agno/api/schemas/team.py +0 -0
  50. {agno-2.0.1 → agno-2.0.3}/agno/api/schemas/utils.py +0 -0
  51. {agno-2.0.1 → agno-2.0.3}/agno/api/schemas/workflows.py +0 -0
  52. {agno-2.0.1 → agno-2.0.3}/agno/api/settings.py +0 -0
  53. {agno-2.0.1 → agno-2.0.3}/agno/api/team.py +0 -0
  54. {agno-2.0.1 → agno-2.0.3}/agno/api/workflow.py +0 -0
  55. {agno-2.0.1 → agno-2.0.3}/agno/cloud/aws/base.py +0 -0
  56. {agno-2.0.1 → agno-2.0.3}/agno/cloud/aws/s3/__init__.py +0 -0
  57. {agno-2.0.1 → agno-2.0.3}/agno/cloud/aws/s3/api_client.py +0 -0
  58. {agno-2.0.1 → agno-2.0.3}/agno/cloud/aws/s3/bucket.py +0 -0
  59. {agno-2.0.1 → agno-2.0.3}/agno/cloud/aws/s3/object.py +0 -0
  60. {agno-2.0.1 → agno-2.0.3}/agno/db/__init__.py +0 -0
  61. {agno-2.0.1 → agno-2.0.3}/agno/db/base.py +0 -0
  62. {agno-2.0.1 → agno-2.0.3}/agno/db/dynamo/__init__.py +0 -0
  63. {agno-2.0.1 → agno-2.0.3}/agno/db/dynamo/dynamo.py +0 -0
  64. {agno-2.0.1 → agno-2.0.3}/agno/db/dynamo/schemas.py +0 -0
  65. {agno-2.0.1 → agno-2.0.3}/agno/db/dynamo/utils.py +0 -0
  66. {agno-2.0.1 → agno-2.0.3}/agno/db/firestore/__init__.py +0 -0
  67. {agno-2.0.1 → agno-2.0.3}/agno/db/firestore/firestore.py +0 -0
  68. {agno-2.0.1 → agno-2.0.3}/agno/db/firestore/schemas.py +0 -0
  69. {agno-2.0.1 → agno-2.0.3}/agno/db/firestore/utils.py +0 -0
  70. {agno-2.0.1 → agno-2.0.3}/agno/db/gcs_json/__init__.py +0 -0
  71. {agno-2.0.1 → agno-2.0.3}/agno/db/gcs_json/gcs_json_db.py +0 -0
  72. {agno-2.0.1 → agno-2.0.3}/agno/db/gcs_json/utils.py +0 -0
  73. {agno-2.0.1 → agno-2.0.3}/agno/db/in_memory/__init__.py +0 -0
  74. {agno-2.0.1 → agno-2.0.3}/agno/db/in_memory/in_memory_db.py +0 -0
  75. {agno-2.0.1 → agno-2.0.3}/agno/db/in_memory/utils.py +0 -0
  76. {agno-2.0.1 → agno-2.0.3}/agno/db/json/__init__.py +0 -0
  77. {agno-2.0.1 → agno-2.0.3}/agno/db/json/json_db.py +0 -0
  78. {agno-2.0.1 → agno-2.0.3}/agno/db/json/utils.py +0 -0
  79. {agno-2.0.1 → agno-2.0.3}/agno/db/migrations/__init__.py +0 -0
  80. {agno-2.0.1 → agno-2.0.3}/agno/db/migrations/v1_to_v2.py +0 -0
  81. {agno-2.0.1 → agno-2.0.3}/agno/db/mongo/__init__.py +0 -0
  82. {agno-2.0.1 → agno-2.0.3}/agno/db/mongo/mongo.py +0 -0
  83. {agno-2.0.1 → agno-2.0.3}/agno/db/mongo/schemas.py +0 -0
  84. {agno-2.0.1 → agno-2.0.3}/agno/db/mongo/utils.py +0 -0
  85. {agno-2.0.1 → agno-2.0.3}/agno/db/mysql/__init__.py +0 -0
  86. {agno-2.0.1 → agno-2.0.3}/agno/db/mysql/mysql.py +0 -0
  87. {agno-2.0.1 → agno-2.0.3}/agno/db/mysql/schemas.py +0 -0
  88. {agno-2.0.1 → agno-2.0.3}/agno/db/mysql/utils.py +0 -0
  89. {agno-2.0.1 → agno-2.0.3}/agno/db/postgres/__init__.py +0 -0
  90. {agno-2.0.1 → agno-2.0.3}/agno/db/postgres/postgres.py +0 -0
  91. {agno-2.0.1 → agno-2.0.3}/agno/db/postgres/schemas.py +0 -0
  92. {agno-2.0.1 → agno-2.0.3}/agno/db/postgres/utils.py +0 -0
  93. {agno-2.0.1 → agno-2.0.3}/agno/db/redis/__init__.py +0 -0
  94. {agno-2.0.1 → agno-2.0.3}/agno/db/redis/redis.py +0 -0
  95. {agno-2.0.1 → agno-2.0.3}/agno/db/redis/schemas.py +0 -0
  96. {agno-2.0.1 → agno-2.0.3}/agno/db/redis/utils.py +0 -0
  97. {agno-2.0.1 → agno-2.0.3}/agno/db/schemas/__init__.py +0 -0
  98. {agno-2.0.1 → agno-2.0.3}/agno/db/schemas/evals.py +0 -0
  99. {agno-2.0.1 → agno-2.0.3}/agno/db/schemas/knowledge.py +0 -0
  100. {agno-2.0.1 → agno-2.0.3}/agno/db/schemas/memory.py +0 -0
  101. {agno-2.0.1 → agno-2.0.3}/agno/db/schemas/metrics.py +0 -0
  102. {agno-2.0.1 → agno-2.0.3}/agno/db/singlestore/__init__.py +0 -0
  103. {agno-2.0.1 → agno-2.0.3}/agno/db/singlestore/schemas.py +0 -0
  104. {agno-2.0.1 → agno-2.0.3}/agno/db/singlestore/singlestore.py +0 -0
  105. {agno-2.0.1 → agno-2.0.3}/agno/db/singlestore/utils.py +0 -0
  106. {agno-2.0.1 → agno-2.0.3}/agno/db/sqlite/__init__.py +0 -0
  107. {agno-2.0.1 → agno-2.0.3}/agno/db/sqlite/schemas.py +0 -0
  108. {agno-2.0.1 → agno-2.0.3}/agno/db/sqlite/sqlite.py +0 -0
  109. {agno-2.0.1 → agno-2.0.3}/agno/db/sqlite/utils.py +0 -0
  110. {agno-2.0.1 → agno-2.0.3}/agno/db/utils.py +0 -0
  111. {agno-2.0.1 → agno-2.0.3}/agno/debug.py +0 -0
  112. {agno-2.0.1 → agno-2.0.3}/agno/eval/__init__.py +0 -0
  113. {agno-2.0.1 → agno-2.0.3}/agno/eval/accuracy.py +0 -0
  114. {agno-2.0.1 → agno-2.0.3}/agno/eval/performance.py +0 -0
  115. {agno-2.0.1 → agno-2.0.3}/agno/eval/reliability.py +0 -0
  116. {agno-2.0.1 → agno-2.0.3}/agno/eval/utils.py +0 -0
  117. {agno-2.0.1 → agno-2.0.3}/agno/exceptions.py +0 -0
  118. {agno-2.0.1 → agno-2.0.3}/agno/integrations/__init__.py +0 -0
  119. {agno-2.0.1 → agno-2.0.3}/agno/integrations/discord/__init__.py +0 -0
  120. {agno-2.0.1 → agno-2.0.3}/agno/integrations/discord/client.py +0 -0
  121. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/__init__.py +0 -0
  122. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/__init__.py +0 -0
  123. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/agentic.py +0 -0
  124. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/document.py +0 -0
  125. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/markdown.py +0 -0
  126. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/recursive.py +0 -0
  127. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/row.py +0 -0
  128. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/semantic.py +0 -0
  129. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/chunking/strategy.py +0 -0
  130. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/content.py +0 -0
  131. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/document/__init__.py +0 -0
  132. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/document/base.py +0 -0
  133. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/__init__.py +0 -0
  134. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/aws_bedrock.py +0 -0
  135. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/azure_openai.py +0 -0
  136. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/base.py +0 -0
  137. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/cohere.py +0 -0
  138. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/fastembed.py +0 -0
  139. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/fireworks.py +0 -0
  140. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/google.py +0 -0
  141. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/huggingface.py +0 -0
  142. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/jina.py +0 -0
  143. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/langdb.py +0 -0
  144. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/mistral.py +0 -0
  145. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/nebius.py +0 -0
  146. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/ollama.py +0 -0
  147. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/openai.py +0 -0
  148. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/sentence_transformer.py +0 -0
  149. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/together.py +0 -0
  150. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/embedder/voyageai.py +0 -0
  151. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/knowledge.py +0 -0
  152. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/__init__.py +0 -0
  153. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/arxiv_reader.py +0 -0
  154. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/docx_reader.py +0 -0
  155. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/firecrawl_reader.py +0 -0
  156. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/pdf_reader.py +0 -0
  157. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/reader_factory.py +0 -0
  158. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/url_reader.py +0 -0
  159. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/web_search_reader.py +0 -0
  160. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/website_reader.py +0 -0
  161. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/wikipedia_reader.py +0 -0
  162. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reader/youtube_reader.py +0 -0
  163. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/remote_content/__init__.py +0 -0
  164. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/remote_content/remote_content.py +0 -0
  165. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reranker/base.py +0 -0
  166. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reranker/cohere.py +0 -0
  167. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reranker/infinity.py +0 -0
  168. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  169. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/types.py +0 -0
  170. {agno-2.0.1 → agno-2.0.3}/agno/knowledge/utils.py +0 -0
  171. {agno-2.0.1 → agno-2.0.3}/agno/media.py +0 -0
  172. {agno-2.0.1 → agno-2.0.3}/agno/memory/__init__.py +0 -0
  173. {agno-2.0.1 → agno-2.0.3}/agno/memory/manager.py +0 -0
  174. {agno-2.0.1 → agno-2.0.3}/agno/models/__init__.py +0 -0
  175. {agno-2.0.1 → agno-2.0.3}/agno/models/aimlapi/__init__.py +0 -0
  176. {agno-2.0.1 → agno-2.0.3}/agno/models/aimlapi/aimlapi.py +0 -0
  177. {agno-2.0.1 → agno-2.0.3}/agno/models/anthropic/__init__.py +0 -0
  178. {agno-2.0.1 → agno-2.0.3}/agno/models/anthropic/claude.py +0 -0
  179. {agno-2.0.1 → agno-2.0.3}/agno/models/aws/__init__.py +0 -0
  180. {agno-2.0.1 → agno-2.0.3}/agno/models/aws/bedrock.py +0 -0
  181. {agno-2.0.1 → agno-2.0.3}/agno/models/aws/claude.py +0 -0
  182. {agno-2.0.1 → agno-2.0.3}/agno/models/azure/__init__.py +0 -0
  183. {agno-2.0.1 → agno-2.0.3}/agno/models/azure/ai_foundry.py +0 -0
  184. {agno-2.0.1 → agno-2.0.3}/agno/models/azure/openai_chat.py +0 -0
  185. {agno-2.0.1 → agno-2.0.3}/agno/models/base.py +0 -0
  186. {agno-2.0.1 → agno-2.0.3}/agno/models/cerebras/__init__.py +0 -0
  187. {agno-2.0.1 → agno-2.0.3}/agno/models/cohere/__init__.py +0 -0
  188. {agno-2.0.1 → agno-2.0.3}/agno/models/cohere/chat.py +0 -0
  189. {agno-2.0.1 → agno-2.0.3}/agno/models/dashscope/__init__.py +0 -0
  190. {agno-2.0.1 → agno-2.0.3}/agno/models/dashscope/dashscope.py +0 -0
  191. {agno-2.0.1 → agno-2.0.3}/agno/models/deepinfra/__init__.py +0 -0
  192. {agno-2.0.1 → agno-2.0.3}/agno/models/deepinfra/deepinfra.py +0 -0
  193. {agno-2.0.1 → agno-2.0.3}/agno/models/deepseek/__init__.py +0 -0
  194. {agno-2.0.1 → agno-2.0.3}/agno/models/deepseek/deepseek.py +0 -0
  195. {agno-2.0.1 → agno-2.0.3}/agno/models/defaults.py +0 -0
  196. {agno-2.0.1 → agno-2.0.3}/agno/models/fireworks/__init__.py +0 -0
  197. {agno-2.0.1 → agno-2.0.3}/agno/models/fireworks/fireworks.py +0 -0
  198. {agno-2.0.1 → agno-2.0.3}/agno/models/google/__init__.py +0 -0
  199. {agno-2.0.1 → agno-2.0.3}/agno/models/groq/__init__.py +0 -0
  200. {agno-2.0.1 → agno-2.0.3}/agno/models/groq/groq.py +0 -0
  201. {agno-2.0.1 → agno-2.0.3}/agno/models/huggingface/__init__.py +0 -0
  202. {agno-2.0.1 → agno-2.0.3}/agno/models/huggingface/huggingface.py +0 -0
  203. {agno-2.0.1 → agno-2.0.3}/agno/models/ibm/__init__.py +0 -0
  204. {agno-2.0.1 → agno-2.0.3}/agno/models/ibm/watsonx.py +0 -0
  205. {agno-2.0.1 → agno-2.0.3}/agno/models/internlm/__init__.py +0 -0
  206. {agno-2.0.1 → agno-2.0.3}/agno/models/internlm/internlm.py +0 -0
  207. {agno-2.0.1 → agno-2.0.3}/agno/models/langdb/__init__.py +0 -0
  208. {agno-2.0.1 → agno-2.0.3}/agno/models/langdb/langdb.py +0 -0
  209. {agno-2.0.1 → agno-2.0.3}/agno/models/litellm/__init__.py +0 -0
  210. {agno-2.0.1 → agno-2.0.3}/agno/models/litellm/litellm_openai.py +0 -0
  211. {agno-2.0.1 → agno-2.0.3}/agno/models/lmstudio/__init__.py +0 -0
  212. {agno-2.0.1 → agno-2.0.3}/agno/models/lmstudio/lmstudio.py +0 -0
  213. {agno-2.0.1 → agno-2.0.3}/agno/models/message.py +0 -0
  214. {agno-2.0.1 → agno-2.0.3}/agno/models/meta/__init__.py +0 -0
  215. {agno-2.0.1 → agno-2.0.3}/agno/models/meta/llama.py +0 -0
  216. {agno-2.0.1 → agno-2.0.3}/agno/models/meta/llama_openai.py +0 -0
  217. {agno-2.0.1 → agno-2.0.3}/agno/models/metrics.py +0 -0
  218. {agno-2.0.1 → agno-2.0.3}/agno/models/mistral/__init__.py +0 -0
  219. {agno-2.0.1 → agno-2.0.3}/agno/models/mistral/mistral.py +0 -0
  220. {agno-2.0.1 → agno-2.0.3}/agno/models/nebius/__init__.py +0 -0
  221. {agno-2.0.1 → agno-2.0.3}/agno/models/nebius/nebius.py +0 -0
  222. {agno-2.0.1 → agno-2.0.3}/agno/models/nvidia/__init__.py +0 -0
  223. {agno-2.0.1 → agno-2.0.3}/agno/models/nvidia/nvidia.py +0 -0
  224. {agno-2.0.1 → agno-2.0.3}/agno/models/ollama/__init__.py +0 -0
  225. {agno-2.0.1 → agno-2.0.3}/agno/models/ollama/chat.py +0 -0
  226. {agno-2.0.1 → agno-2.0.3}/agno/models/openai/__init__.py +0 -0
  227. {agno-2.0.1 → agno-2.0.3}/agno/models/openai/chat.py +0 -0
  228. {agno-2.0.1 → agno-2.0.3}/agno/models/openai/like.py +0 -0
  229. {agno-2.0.1 → agno-2.0.3}/agno/models/openrouter/__init__.py +0 -0
  230. {agno-2.0.1 → agno-2.0.3}/agno/models/openrouter/openrouter.py +0 -0
  231. {agno-2.0.1 → agno-2.0.3}/agno/models/perplexity/__init__.py +0 -0
  232. {agno-2.0.1 → agno-2.0.3}/agno/models/perplexity/perplexity.py +0 -0
  233. {agno-2.0.1 → agno-2.0.3}/agno/models/portkey/__init__.py +0 -0
  234. {agno-2.0.1 → agno-2.0.3}/agno/models/portkey/portkey.py +0 -0
  235. {agno-2.0.1 → agno-2.0.3}/agno/models/response.py +0 -0
  236. {agno-2.0.1 → agno-2.0.3}/agno/models/sambanova/__init__.py +0 -0
  237. {agno-2.0.1 → agno-2.0.3}/agno/models/sambanova/sambanova.py +0 -0
  238. {agno-2.0.1 → agno-2.0.3}/agno/models/together/__init__.py +0 -0
  239. {agno-2.0.1 → agno-2.0.3}/agno/models/together/together.py +0 -0
  240. {agno-2.0.1 → agno-2.0.3}/agno/models/utils.py +0 -0
  241. {agno-2.0.1 → agno-2.0.3}/agno/models/vercel/__init__.py +0 -0
  242. {agno-2.0.1 → agno-2.0.3}/agno/models/vercel/v0.py +0 -0
  243. {agno-2.0.1 → agno-2.0.3}/agno/models/vllm/__init__.py +0 -0
  244. {agno-2.0.1 → agno-2.0.3}/agno/models/vllm/vllm.py +0 -0
  245. {agno-2.0.1 → agno-2.0.3}/agno/models/xai/__init__.py +0 -0
  246. {agno-2.0.1 → agno-2.0.3}/agno/models/xai/xai.py +0 -0
  247. {agno-2.0.1 → agno-2.0.3}/agno/os/__init__.py +0 -0
  248. {agno-2.0.1 → agno-2.0.3}/agno/os/app.py +0 -0
  249. {agno-2.0.1 → agno-2.0.3}/agno/os/auth.py +0 -0
  250. {agno-2.0.1 → agno-2.0.3}/agno/os/config.py +0 -0
  251. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/__init__.py +0 -0
  252. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/agui/__init__.py +0 -0
  253. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/agui/agui.py +0 -0
  254. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/agui/router.py +0 -0
  255. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/agui/utils.py +0 -0
  256. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/base.py +0 -0
  257. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/slack/__init__.py +0 -0
  258. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/slack/security.py +0 -0
  259. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/slack/slack.py +0 -0
  260. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  261. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/whatsapp/security.py +0 -0
  262. {agno-2.0.1 → agno-2.0.3}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
  263. {agno-2.0.1 → agno-2.0.3}/agno/os/mcp.py +0 -0
  264. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/__init__.py +0 -0
  265. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/evals/__init__.py +0 -0
  266. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/evals/evals.py +0 -0
  267. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/evals/schemas.py +0 -0
  268. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/evals/utils.py +0 -0
  269. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/knowledge/__init__.py +0 -0
  270. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/knowledge/knowledge.py +0 -0
  271. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/knowledge/schemas.py +0 -0
  272. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/memory/__init__.py +0 -0
  273. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/memory/memory.py +0 -0
  274. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/memory/schemas.py +0 -0
  275. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/metrics/__init__.py +0 -0
  276. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/metrics/metrics.py +0 -0
  277. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/metrics/schemas.py +0 -0
  278. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/session/__init__.py +0 -0
  279. {agno-2.0.1 → agno-2.0.3}/agno/os/routers/session/session.py +0 -0
  280. {agno-2.0.1 → agno-2.0.3}/agno/os/schema.py +0 -0
  281. {agno-2.0.1 → agno-2.0.3}/agno/os/settings.py +0 -0
  282. {agno-2.0.1 → agno-2.0.3}/agno/os/utils.py +0 -0
  283. {agno-2.0.1 → agno-2.0.3}/agno/py.typed +0 -0
  284. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/__init__.py +0 -0
  285. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/azure_ai_foundry.py +0 -0
  286. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/deepseek.py +0 -0
  287. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/default.py +0 -0
  288. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/groq.py +0 -0
  289. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/helpers.py +0 -0
  290. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/ollama.py +0 -0
  291. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/openai.py +0 -0
  292. {agno-2.0.1 → agno-2.0.3}/agno/reasoning/step.py +0 -0
  293. {agno-2.0.1 → agno-2.0.3}/agno/run/__init__.py +0 -0
  294. {agno-2.0.1 → agno-2.0.3}/agno/run/cancel.py +0 -0
  295. {agno-2.0.1 → agno-2.0.3}/agno/run/messages.py +0 -0
  296. {agno-2.0.1 → agno-2.0.3}/agno/session/__init__.py +0 -0
  297. {agno-2.0.1 → agno-2.0.3}/agno/session/agent.py +0 -0
  298. {agno-2.0.1 → agno-2.0.3}/agno/session/summary.py +0 -0
  299. {agno-2.0.1 → agno-2.0.3}/agno/session/team.py +0 -0
  300. {agno-2.0.1 → agno-2.0.3}/agno/session/workflow.py +0 -0
  301. {agno-2.0.1 → agno-2.0.3}/agno/team/__init__.py +0 -0
  302. {agno-2.0.1 → agno-2.0.3}/agno/tools/__init__.py +0 -0
  303. {agno-2.0.1 → agno-2.0.3}/agno/tools/agentql.py +0 -0
  304. {agno-2.0.1 → agno-2.0.3}/agno/tools/airflow.py +0 -0
  305. {agno-2.0.1 → agno-2.0.3}/agno/tools/api.py +0 -0
  306. {agno-2.0.1 → agno-2.0.3}/agno/tools/apify.py +0 -0
  307. {agno-2.0.1 → agno-2.0.3}/agno/tools/arxiv.py +0 -0
  308. {agno-2.0.1 → agno-2.0.3}/agno/tools/aws_lambda.py +0 -0
  309. {agno-2.0.1 → agno-2.0.3}/agno/tools/aws_ses.py +0 -0
  310. {agno-2.0.1 → agno-2.0.3}/agno/tools/baidusearch.py +0 -0
  311. {agno-2.0.1 → agno-2.0.3}/agno/tools/bitbucket.py +0 -0
  312. {agno-2.0.1 → agno-2.0.3}/agno/tools/brandfetch.py +0 -0
  313. {agno-2.0.1 → agno-2.0.3}/agno/tools/bravesearch.py +0 -0
  314. {agno-2.0.1 → agno-2.0.3}/agno/tools/brightdata.py +0 -0
  315. {agno-2.0.1 → agno-2.0.3}/agno/tools/browserbase.py +0 -0
  316. {agno-2.0.1 → agno-2.0.3}/agno/tools/calcom.py +0 -0
  317. {agno-2.0.1 → agno-2.0.3}/agno/tools/calculator.py +0 -0
  318. {agno-2.0.1 → agno-2.0.3}/agno/tools/cartesia.py +0 -0
  319. {agno-2.0.1 → agno-2.0.3}/agno/tools/clickup.py +0 -0
  320. {agno-2.0.1 → agno-2.0.3}/agno/tools/confluence.py +0 -0
  321. {agno-2.0.1 → agno-2.0.3}/agno/tools/crawl4ai.py +0 -0
  322. {agno-2.0.1 → agno-2.0.3}/agno/tools/csv_toolkit.py +0 -0
  323. {agno-2.0.1 → agno-2.0.3}/agno/tools/dalle.py +0 -0
  324. {agno-2.0.1 → agno-2.0.3}/agno/tools/daytona.py +0 -0
  325. {agno-2.0.1 → agno-2.0.3}/agno/tools/decorator.py +0 -0
  326. {agno-2.0.1 → agno-2.0.3}/agno/tools/desi_vocal.py +0 -0
  327. {agno-2.0.1 → agno-2.0.3}/agno/tools/discord.py +0 -0
  328. {agno-2.0.1 → agno-2.0.3}/agno/tools/docker.py +0 -0
  329. {agno-2.0.1 → agno-2.0.3}/agno/tools/duckdb.py +0 -0
  330. {agno-2.0.1 → agno-2.0.3}/agno/tools/duckduckgo.py +0 -0
  331. {agno-2.0.1 → agno-2.0.3}/agno/tools/e2b.py +0 -0
  332. {agno-2.0.1 → agno-2.0.3}/agno/tools/eleven_labs.py +0 -0
  333. {agno-2.0.1 → agno-2.0.3}/agno/tools/email.py +0 -0
  334. {agno-2.0.1 → agno-2.0.3}/agno/tools/evm.py +0 -0
  335. {agno-2.0.1 → agno-2.0.3}/agno/tools/exa.py +0 -0
  336. {agno-2.0.1 → agno-2.0.3}/agno/tools/fal.py +0 -0
  337. {agno-2.0.1 → agno-2.0.3}/agno/tools/file.py +0 -0
  338. {agno-2.0.1 → agno-2.0.3}/agno/tools/financial_datasets.py +0 -0
  339. {agno-2.0.1 → agno-2.0.3}/agno/tools/firecrawl.py +0 -0
  340. {agno-2.0.1 → agno-2.0.3}/agno/tools/function.py +0 -0
  341. {agno-2.0.1 → agno-2.0.3}/agno/tools/giphy.py +0 -0
  342. {agno-2.0.1 → agno-2.0.3}/agno/tools/github.py +0 -0
  343. {agno-2.0.1 → agno-2.0.3}/agno/tools/gmail.py +0 -0
  344. {agno-2.0.1 → agno-2.0.3}/agno/tools/google_bigquery.py +0 -0
  345. {agno-2.0.1 → agno-2.0.3}/agno/tools/google_maps.py +0 -0
  346. {agno-2.0.1 → agno-2.0.3}/agno/tools/googlecalendar.py +0 -0
  347. {agno-2.0.1 → agno-2.0.3}/agno/tools/googlesearch.py +0 -0
  348. {agno-2.0.1 → agno-2.0.3}/agno/tools/googlesheets.py +0 -0
  349. {agno-2.0.1 → agno-2.0.3}/agno/tools/hackernews.py +0 -0
  350. {agno-2.0.1 → agno-2.0.3}/agno/tools/jina.py +0 -0
  351. {agno-2.0.1 → agno-2.0.3}/agno/tools/jira.py +0 -0
  352. {agno-2.0.1 → agno-2.0.3}/agno/tools/knowledge.py +0 -0
  353. {agno-2.0.1 → agno-2.0.3}/agno/tools/linear.py +0 -0
  354. {agno-2.0.1 → agno-2.0.3}/agno/tools/linkup.py +0 -0
  355. {agno-2.0.1 → agno-2.0.3}/agno/tools/local_file_system.py +0 -0
  356. {agno-2.0.1 → agno-2.0.3}/agno/tools/lumalab.py +0 -0
  357. {agno-2.0.1 → agno-2.0.3}/agno/tools/mem0.py +0 -0
  358. {agno-2.0.1 → agno-2.0.3}/agno/tools/memori.py +0 -0
  359. {agno-2.0.1 → agno-2.0.3}/agno/tools/mlx_transcribe.py +0 -0
  360. {agno-2.0.1 → agno-2.0.3}/agno/tools/models/__init__.py +0 -0
  361. {agno-2.0.1 → agno-2.0.3}/agno/tools/models/azure_openai.py +0 -0
  362. {agno-2.0.1 → agno-2.0.3}/agno/tools/models/gemini.py +0 -0
  363. {agno-2.0.1 → agno-2.0.3}/agno/tools/models/groq.py +0 -0
  364. {agno-2.0.1 → agno-2.0.3}/agno/tools/models/morph.py +0 -0
  365. {agno-2.0.1 → agno-2.0.3}/agno/tools/models/nebius.py +0 -0
  366. {agno-2.0.1 → agno-2.0.3}/agno/tools/models_labs.py +0 -0
  367. {agno-2.0.1 → agno-2.0.3}/agno/tools/moviepy_video.py +0 -0
  368. {agno-2.0.1 → agno-2.0.3}/agno/tools/neo4j.py +0 -0
  369. {agno-2.0.1 → agno-2.0.3}/agno/tools/newspaper.py +0 -0
  370. {agno-2.0.1 → agno-2.0.3}/agno/tools/newspaper4k.py +0 -0
  371. {agno-2.0.1 → agno-2.0.3}/agno/tools/openai.py +0 -0
  372. {agno-2.0.1 → agno-2.0.3}/agno/tools/openbb.py +0 -0
  373. {agno-2.0.1 → agno-2.0.3}/agno/tools/opencv.py +0 -0
  374. {agno-2.0.1 → agno-2.0.3}/agno/tools/openweather.py +0 -0
  375. {agno-2.0.1 → agno-2.0.3}/agno/tools/oxylabs.py +0 -0
  376. {agno-2.0.1 → agno-2.0.3}/agno/tools/pandas.py +0 -0
  377. {agno-2.0.1 → agno-2.0.3}/agno/tools/postgres.py +0 -0
  378. {agno-2.0.1 → agno-2.0.3}/agno/tools/pubmed.py +0 -0
  379. {agno-2.0.1 → agno-2.0.3}/agno/tools/python.py +0 -0
  380. {agno-2.0.1 → agno-2.0.3}/agno/tools/reasoning.py +0 -0
  381. {agno-2.0.1 → agno-2.0.3}/agno/tools/reddit.py +0 -0
  382. {agno-2.0.1 → agno-2.0.3}/agno/tools/replicate.py +0 -0
  383. {agno-2.0.1 → agno-2.0.3}/agno/tools/resend.py +0 -0
  384. {agno-2.0.1 → agno-2.0.3}/agno/tools/scrapegraph.py +0 -0
  385. {agno-2.0.1 → agno-2.0.3}/agno/tools/searxng.py +0 -0
  386. {agno-2.0.1 → agno-2.0.3}/agno/tools/serpapi.py +0 -0
  387. {agno-2.0.1 → agno-2.0.3}/agno/tools/serper.py +0 -0
  388. {agno-2.0.1 → agno-2.0.3}/agno/tools/shell.py +0 -0
  389. {agno-2.0.1 → agno-2.0.3}/agno/tools/slack.py +0 -0
  390. {agno-2.0.1 → agno-2.0.3}/agno/tools/sleep.py +0 -0
  391. {agno-2.0.1 → agno-2.0.3}/agno/tools/spider.py +0 -0
  392. {agno-2.0.1 → agno-2.0.3}/agno/tools/sql.py +0 -0
  393. {agno-2.0.1 → agno-2.0.3}/agno/tools/streamlit/__init__.py +0 -0
  394. {agno-2.0.1 → agno-2.0.3}/agno/tools/streamlit/components.py +0 -0
  395. {agno-2.0.1 → agno-2.0.3}/agno/tools/tavily.py +0 -0
  396. {agno-2.0.1 → agno-2.0.3}/agno/tools/telegram.py +0 -0
  397. {agno-2.0.1 → agno-2.0.3}/agno/tools/todoist.py +0 -0
  398. {agno-2.0.1 → agno-2.0.3}/agno/tools/tool_registry.py +0 -0
  399. {agno-2.0.1 → agno-2.0.3}/agno/tools/toolkit.py +0 -0
  400. {agno-2.0.1 → agno-2.0.3}/agno/tools/trafilatura.py +0 -0
  401. {agno-2.0.1 → agno-2.0.3}/agno/tools/trello.py +0 -0
  402. {agno-2.0.1 → agno-2.0.3}/agno/tools/twilio.py +0 -0
  403. {agno-2.0.1 → agno-2.0.3}/agno/tools/user_control_flow.py +0 -0
  404. {agno-2.0.1 → agno-2.0.3}/agno/tools/valyu.py +0 -0
  405. {agno-2.0.1 → agno-2.0.3}/agno/tools/visualization.py +0 -0
  406. {agno-2.0.1 → agno-2.0.3}/agno/tools/webbrowser.py +0 -0
  407. {agno-2.0.1 → agno-2.0.3}/agno/tools/webex.py +0 -0
  408. {agno-2.0.1 → agno-2.0.3}/agno/tools/website.py +0 -0
  409. {agno-2.0.1 → agno-2.0.3}/agno/tools/webtools.py +0 -0
  410. {agno-2.0.1 → agno-2.0.3}/agno/tools/whatsapp.py +0 -0
  411. {agno-2.0.1 → agno-2.0.3}/agno/tools/wikipedia.py +0 -0
  412. {agno-2.0.1 → agno-2.0.3}/agno/tools/x.py +0 -0
  413. {agno-2.0.1 → agno-2.0.3}/agno/tools/yfinance.py +0 -0
  414. {agno-2.0.1 → agno-2.0.3}/agno/tools/youtube.py +0 -0
  415. {agno-2.0.1 → agno-2.0.3}/agno/tools/zendesk.py +0 -0
  416. {agno-2.0.1 → agno-2.0.3}/agno/tools/zep.py +0 -0
  417. {agno-2.0.1 → agno-2.0.3}/agno/tools/zoom.py +0 -0
  418. {agno-2.0.1 → agno-2.0.3}/agno/utils/__init__.py +0 -0
  419. {agno-2.0.1 → agno-2.0.3}/agno/utils/certs.py +0 -0
  420. {agno-2.0.1 → agno-2.0.3}/agno/utils/code_execution.py +0 -0
  421. {agno-2.0.1 → agno-2.0.3}/agno/utils/common.py +0 -0
  422. {agno-2.0.1 → agno-2.0.3}/agno/utils/dttm.py +0 -0
  423. {agno-2.0.1 → agno-2.0.3}/agno/utils/enum.py +0 -0
  424. {agno-2.0.1 → agno-2.0.3}/agno/utils/env.py +0 -0
  425. {agno-2.0.1 → agno-2.0.3}/agno/utils/events.py +0 -0
  426. {agno-2.0.1 → agno-2.0.3}/agno/utils/format_str.py +0 -0
  427. {agno-2.0.1 → agno-2.0.3}/agno/utils/functions.py +0 -0
  428. {agno-2.0.1 → agno-2.0.3}/agno/utils/gemini.py +0 -0
  429. {agno-2.0.1 → agno-2.0.3}/agno/utils/http.py +0 -0
  430. {agno-2.0.1 → agno-2.0.3}/agno/utils/json_schema.py +0 -0
  431. {agno-2.0.1 → agno-2.0.3}/agno/utils/knowledge.py +0 -0
  432. {agno-2.0.1 → agno-2.0.3}/agno/utils/location.py +0 -0
  433. {agno-2.0.1 → agno-2.0.3}/agno/utils/log.py +0 -0
  434. {agno-2.0.1 → agno-2.0.3}/agno/utils/mcp.py +0 -0
  435. {agno-2.0.1 → agno-2.0.3}/agno/utils/media.py +0 -0
  436. {agno-2.0.1 → agno-2.0.3}/agno/utils/merge_dict.py +0 -0
  437. {agno-2.0.1 → agno-2.0.3}/agno/utils/message.py +0 -0
  438. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/__init__.py +0 -0
  439. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/ai_foundry.py +0 -0
  440. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/aws_claude.py +0 -0
  441. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/claude.py +0 -0
  442. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/cohere.py +0 -0
  443. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/llama.py +0 -0
  444. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/mistral.py +0 -0
  445. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/openai_responses.py +0 -0
  446. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/schema_utils.py +0 -0
  447. {agno-2.0.1 → agno-2.0.3}/agno/utils/models/watsonx.py +0 -0
  448. {agno-2.0.1 → agno-2.0.3}/agno/utils/openai.py +0 -0
  449. {agno-2.0.1 → agno-2.0.3}/agno/utils/pickle.py +0 -0
  450. {agno-2.0.1 → agno-2.0.3}/agno/utils/pprint.py +0 -0
  451. {agno-2.0.1 → agno-2.0.3}/agno/utils/print_response/__init__.py +0 -0
  452. {agno-2.0.1 → agno-2.0.3}/agno/utils/print_response/team.py +0 -0
  453. {agno-2.0.1 → agno-2.0.3}/agno/utils/print_response/workflow.py +0 -0
  454. {agno-2.0.1 → agno-2.0.3}/agno/utils/prompts.py +0 -0
  455. {agno-2.0.1 → agno-2.0.3}/agno/utils/reasoning.py +0 -0
  456. {agno-2.0.1 → agno-2.0.3}/agno/utils/response.py +0 -0
  457. {agno-2.0.1 → agno-2.0.3}/agno/utils/response_iterator.py +0 -0
  458. {agno-2.0.1 → agno-2.0.3}/agno/utils/safe_formatter.py +0 -0
  459. {agno-2.0.1 → agno-2.0.3}/agno/utils/shell.py +0 -0
  460. {agno-2.0.1 → agno-2.0.3}/agno/utils/streamlit.py +0 -0
  461. {agno-2.0.1 → agno-2.0.3}/agno/utils/string.py +0 -0
  462. {agno-2.0.1 → agno-2.0.3}/agno/utils/team.py +0 -0
  463. {agno-2.0.1 → agno-2.0.3}/agno/utils/timer.py +0 -0
  464. {agno-2.0.1 → agno-2.0.3}/agno/utils/tools.py +0 -0
  465. {agno-2.0.1 → agno-2.0.3}/agno/utils/web.py +0 -0
  466. {agno-2.0.1 → agno-2.0.3}/agno/utils/whatsapp.py +0 -0
  467. {agno-2.0.1 → agno-2.0.3}/agno/utils/yaml_io.py +0 -0
  468. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/__init__.py +0 -0
  469. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/base.py +0 -0
  470. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/cassandra/__init__.py +0 -0
  471. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/cassandra/cassandra.py +0 -0
  472. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  473. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/cassandra/index.py +0 -0
  474. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/chroma/__init__.py +0 -0
  475. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/chroma/chromadb.py +0 -0
  476. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/clickhouse/__init__.py +0 -0
  477. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  478. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/clickhouse/index.py +0 -0
  479. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/couchbase/__init__.py +0 -0
  480. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/couchbase/couchbase.py +0 -0
  481. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/distance.py +0 -0
  482. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/lancedb/__init__.py +0 -0
  483. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/lancedb/lance_db.py +0 -0
  484. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/langchaindb/__init__.py +0 -0
  485. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/langchaindb/langchaindb.py +0 -0
  486. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/lightrag/__init__.py +0 -0
  487. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/lightrag/lightrag.py +0 -0
  488. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/llamaindex/__init__.py +0 -0
  489. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
  490. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/milvus/__init__.py +0 -0
  491. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/milvus/milvus.py +0 -0
  492. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/mongodb/__init__.py +0 -0
  493. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/mongodb/mongodb.py +0 -0
  494. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/pgvector/__init__.py +0 -0
  495. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/pgvector/index.py +0 -0
  496. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/pgvector/pgvector.py +0 -0
  497. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/pineconedb/__init__.py +0 -0
  498. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  499. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/qdrant/__init__.py +0 -0
  500. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/qdrant/qdrant.py +0 -0
  501. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/search.py +0 -0
  502. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/singlestore/__init__.py +0 -0
  503. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/singlestore/index.py +0 -0
  504. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/singlestore/singlestore.py +0 -0
  505. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/surrealdb/__init__.py +0 -0
  506. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  507. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/upstashdb/__init__.py +0 -0
  508. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  509. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/weaviate/__init__.py +0 -0
  510. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/weaviate/index.py +0 -0
  511. {agno-2.0.1 → agno-2.0.3}/agno/vectordb/weaviate/weaviate.py +0 -0
  512. {agno-2.0.1 → agno-2.0.3}/agno/workflow/__init__.py +0 -0
  513. {agno-2.0.1 → agno-2.0.3}/agno/workflow/condition.py +0 -0
  514. {agno-2.0.1 → agno-2.0.3}/agno/workflow/loop.py +0 -0
  515. {agno-2.0.1 → agno-2.0.3}/agno/workflow/parallel.py +0 -0
  516. {agno-2.0.1 → agno-2.0.3}/agno/workflow/router.py +0 -0
  517. {agno-2.0.1 → agno-2.0.3}/agno/workflow/step.py +0 -0
  518. {agno-2.0.1 → agno-2.0.3}/agno/workflow/steps.py +0 -0
  519. {agno-2.0.1 → agno-2.0.3}/agno/workflow/types.py +0 -0
  520. {agno-2.0.1 → agno-2.0.3}/agno/workflow/workflow.py +0 -0
  521. {agno-2.0.1 → agno-2.0.3}/agno.egg-info/dependency_links.txt +0 -0
  522. {agno-2.0.1 → agno-2.0.3}/agno.egg-info/requires.txt +0 -0
  523. {agno-2.0.1 → agno-2.0.3}/agno.egg-info/top_level.txt +0 -0
  524. {agno-2.0.1 → agno-2.0.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.0.1
3
+ Version: 2.0.3
4
4
  Summary: Agno: a lightweight library for building Multi-Agent Systems
5
5
  Author-email: Ashpreet Bedi <ashpreet@agno.com>
6
6
  Project-URL: homepage, https://agno.com
@@ -4518,7 +4518,8 @@ class Agent:
4518
4518
  session = self.get_session(session_id=session_id) # type: ignore
4519
4519
 
4520
4520
  if session is None:
4521
- raise Exception("Session not found")
4521
+ log_warning(f"Session {session_id} not found")
4522
+ return []
4522
4523
 
4523
4524
  # Only filter by agent_id if this is part of a team
4524
4525
  return session.get_messages_from_last_n_runs(
@@ -7,7 +7,7 @@ from agno.knowledge.document.base import Document
7
7
  class FixedSizeChunking(ChunkingStrategy):
8
8
  """Chunking strategy that splits text into fixed-size chunks with optional overlap"""
9
9
 
10
- def __init__(self, chunk_size: int = 100, overlap: int = 0):
10
+ def __init__(self, chunk_size: int = 5000, overlap: int = 0):
11
11
  # overlap must be less than chunk size
12
12
  if overlap >= chunk_size:
13
13
  raise ValueError(f"Invalid parameters: overlap ({overlap}) must be less than chunk size ({chunk_size}).")
@@ -19,6 +19,7 @@ class Reader:
19
19
  name: Optional[str] = None
20
20
  description: Optional[str] = None
21
21
  max_results: int = 5 # Maximum number of results to return (useful for search-based readers)
22
+ encoding: Optional[str] = None
22
23
 
23
24
  def __init__(
24
25
  self,
@@ -29,6 +30,7 @@ class Reader:
29
30
  name: Optional[str] = None,
30
31
  description: Optional[str] = None,
31
32
  max_results: int = 5,
33
+ encoding: Optional[str] = None,
32
34
  **kwargs,
33
35
  ) -> None:
34
36
  self.chunk = chunk
@@ -40,6 +42,7 @@ class Reader:
40
42
  self.name = name
41
43
  self.description = description
42
44
  self.max_results = max_results
45
+ self.encoding = encoding
43
46
 
44
47
  def set_chunking_strategy_from_string(self, strategy_name: str, **kwargs) -> None:
45
48
  """Set the chunking strategy from a string name."""
@@ -47,7 +47,7 @@ class CSVReader(Reader):
47
47
  if not file.exists():
48
48
  raise FileNotFoundError(f"Could not find file: {file}")
49
49
  logger.info(f"Reading: {file}")
50
- file_content = file.open(newline="", mode="r", encoding="utf-8")
50
+ file_content = file.open(newline="", mode="r", encoding=self.encoding or "utf-8")
51
51
  else:
52
52
  logger.info(f"Reading retrieved file: {name or file.name}")
53
53
  file.seek(0)
@@ -43,7 +43,7 @@ class JSONReader(Reader):
43
43
  raise FileNotFoundError(f"Could not find file: {path}")
44
44
  log_info(f"Reading: {path}")
45
45
  json_name = name or path.name.split(".")[0]
46
- json_contents = json.loads(path.read_text("utf-8"))
46
+ json_contents = json.loads(path.read_text(self.encoding or "utf-8"))
47
47
 
48
48
  elif isinstance(path, BytesIO):
49
49
  json_name = name or path.name.split(".")[0]
@@ -67,12 +67,12 @@ class MarkdownReader(Reader):
67
67
  raise FileNotFoundError(f"Could not find file: {file}")
68
68
  log_info(f"Reading: {file}")
69
69
  file_name = name or file.stem
70
- file_contents = file.read_text("utf-8")
70
+ file_contents = file.read_text(encoding=self.encoding or "utf-8")
71
71
  else:
72
72
  log_info(f"Reading uploaded file: {file.name}")
73
73
  file_name = name or file.name.split(".")[0]
74
74
  file.seek(0)
75
- file_contents = file.read().decode("utf-8")
75
+ file_contents = file.read().decode(self.encoding or "utf-8")
76
76
 
77
77
  documents = [Document(name=file_name, id=str(uuid.uuid4()), content=file_contents)]
78
78
  if self.chunk:
@@ -97,16 +97,16 @@ class MarkdownReader(Reader):
97
97
  try:
98
98
  import aiofiles
99
99
 
100
- async with aiofiles.open(file, "r", encoding="utf-8") as f:
100
+ async with aiofiles.open(file, "r", encoding=self.encoding or "utf-8") as f:
101
101
  file_contents = await f.read()
102
102
  except ImportError:
103
103
  logger.warning("aiofiles not installed, using synchronous file I/O")
104
- file_contents = file.read_text("utf-8")
104
+ file_contents = file.read_text(self.encoding or "utf-8")
105
105
  else:
106
106
  log_info(f"Reading uploaded file asynchronously: {file.name}")
107
107
  file_name = name or file.name.split(".")[0]
108
108
  file.seek(0)
109
- file_contents = file.read().decode("utf-8")
109
+ file_contents = file.read().decode(self.encoding or "utf-8")
110
110
 
111
111
  document = Document(
112
112
  name=file_name,
@@ -74,18 +74,6 @@ class S3Reader(Reader):
74
74
  obj_name = s3_object.name.split("/")[-1]
75
75
  temporary_file = Path("storage").joinpath(obj_name)
76
76
  s3_object.download(temporary_file)
77
-
78
- # TODO: Before we were using textract here. Needed?
79
- # s3_object.download(temporary_file)
80
- # doc_content = textract.process(temporary_file)
81
- # documents = [
82
- # Document(
83
- # name=doc_name,
84
- # id=doc_name,
85
- # content=doc_content.decode("utf-8"),
86
- # )
87
- # ]
88
-
89
77
  documents = TextReader().read(file=temporary_file, name=doc_name)
90
78
 
91
79
  temporary_file.unlink()
@@ -39,12 +39,12 @@ class TextReader(Reader):
39
39
  raise FileNotFoundError(f"Could not find file: {file}")
40
40
  log_info(f"Reading: {file}")
41
41
  file_name = name or file.stem
42
- file_contents = file.read_text("utf-8")
42
+ file_contents = file.read_text(self.encoding or "utf-8")
43
43
  else:
44
44
  file_name = name or file.name.split(".")[0]
45
45
  log_info(f"Reading uploaded file: {file_name}")
46
46
  file.seek(0)
47
- file_contents = file.read().decode("utf-8")
47
+ file_contents = file.read().decode(self.encoding or "utf-8")
48
48
 
49
49
  documents = [
50
50
  Document(
@@ -75,16 +75,16 @@ class TextReader(Reader):
75
75
  try:
76
76
  import aiofiles
77
77
 
78
- async with aiofiles.open(file, "r", encoding="utf-8") as f:
78
+ async with aiofiles.open(file, "r", encoding=self.encoding or "utf-8") as f:
79
79
  file_contents = await f.read()
80
80
  except ImportError:
81
81
  logger.warning("aiofiles not installed, using synchronous file I/O")
82
- file_contents = file.read_text("utf-8")
82
+ file_contents = file.read_text(self.encoding or "utf-8")
83
83
  else:
84
84
  log_info(f"Reading uploaded file asynchronously: {file.name}")
85
85
  file_name = name or file.name.split(".")[0]
86
86
  file.seek(0)
87
- file_contents = file.read().decode("utf-8")
87
+ file_contents = file.read().decode(self.encoding or "utf-8")
88
88
 
89
89
  document = Document(
90
90
  name=file_name,
@@ -0,0 +1,3 @@
1
+ from agno.knowledge.reranker.base import Reranker
2
+
3
+ __all__ = ["Reranker"]
@@ -45,7 +45,7 @@ class Cerebras(Model):
45
45
  supports_json_schema_outputs: bool = True
46
46
 
47
47
  # Request parameters
48
- parallel_tool_calls: bool = False
48
+ parallel_tool_calls: Optional[bool] = None
49
49
  max_completion_tokens: Optional[int] = None
50
50
  repetition_penalty: Optional[float] = None
51
51
  temperature: Optional[float] = None
@@ -166,7 +166,6 @@ class Cerebras(Model):
166
166
  "type": "function",
167
167
  "function": {
168
168
  "name": tool["function"]["name"],
169
- "strict": True, # Ensure strict adherence to expected outputs
170
169
  "description": tool["function"]["description"],
171
170
  "parameters": tool["function"]["parameters"],
172
171
  },
@@ -174,7 +173,10 @@ class Cerebras(Model):
174
173
  for tool in tools
175
174
  ]
176
175
  # Cerebras requires parallel_tool_calls=False for llama-4-scout-17b-16e-instruct
177
- request_params["parallel_tool_calls"] = self.parallel_tool_calls
176
+ if self.id == "llama-4-scout-17b-16e-instruct":
177
+ request_params["parallel_tool_calls"] = False
178
+ elif self.parallel_tool_calls is not None:
179
+ request_params["parallel_tool_calls"] = self.parallel_tool_calls
178
180
 
179
181
  # Handle response format for structured outputs
180
182
  if response_format is not None:
@@ -16,7 +16,7 @@ class CerebrasOpenAI(OpenAILike):
16
16
  name: str = "CerebrasOpenAI"
17
17
  provider: str = "CerebrasOpenAI"
18
18
 
19
- parallel_tool_calls: bool = False
19
+ parallel_tool_calls: Optional[bool] = None
20
20
  base_url: str = "https://api.cerebras.ai/v1"
21
21
  api_key: Optional[str] = getenv("CEREBRAS_API_KEY", None)
22
22
 
@@ -44,7 +44,6 @@ class CerebrasOpenAI(OpenAILike):
44
44
  "type": "function",
45
45
  "function": {
46
46
  "name": tool["function"]["name"],
47
- "strict": True, # Ensure strict adherence to expected outputs
48
47
  "description": tool["function"]["description"],
49
48
  "parameters": tool["function"]["parameters"],
50
49
  },
@@ -52,7 +51,10 @@ class CerebrasOpenAI(OpenAILike):
52
51
  for tool in tools
53
52
  ]
54
53
  # Cerebras requires parallel_tool_calls=False for llama-4-scout-17b-16e-instruct
55
- request_params["parallel_tool_calls"] = self.parallel_tool_calls
54
+ if self.id == "llama-4-scout-17b-16e-instruct":
55
+ request_params["parallel_tool_calls"] = False
56
+ elif self.parallel_tool_calls is not None:
57
+ request_params["parallel_tool_calls"] = self.parallel_tool_calls
56
58
 
57
59
  if request_params:
58
60
  log_debug(f"Calling {self.provider} with request parameters: {request_params}", log_level=2)
@@ -87,7 +87,7 @@ class Gemini(Model):
87
87
  presence_penalty: Optional[float] = None
88
88
  frequency_penalty: Optional[float] = None
89
89
  seed: Optional[int] = None
90
- response_modalities: Optional[list[str]] = None # "Text" and/or "Image"
90
+ response_modalities: Optional[list[str]] = None # "TEXT", "IMAGE", and/or "AUDIO"
91
91
  speech_config: Optional[dict[str, Any]] = None
92
92
  cached_content: Optional[Any] = None
93
93
  thinking_budget: Optional[int] = None # Thinking budget for Gemini 2.5 models
@@ -817,11 +817,21 @@ class Gemini(Model):
817
817
  model_response.content += content_str
818
818
 
819
819
  if hasattr(part, "inline_data") and part.inline_data is not None:
820
- if model_response.images is None:
821
- model_response.images = []
822
- model_response.images.append(
823
- Image(id=str(uuid4()), content=part.inline_data.data, mime_type=part.inline_data.mime_type)
824
- )
820
+ # Handle audio responses (for TTS models)
821
+ if part.inline_data.mime_type and part.inline_data.mime_type.startswith("audio/"):
822
+ # Store raw bytes data
823
+ model_response.audio = Audio(
824
+ id=str(uuid4()),
825
+ content=part.inline_data.data,
826
+ mime_type=part.inline_data.mime_type,
827
+ )
828
+ # Image responses
829
+ else:
830
+ if model_response.images is None:
831
+ model_response.images = []
832
+ model_response.images.append(
833
+ Image(id=str(uuid4()), content=part.inline_data.data, mime_type=part.inline_data.mime_type)
834
+ )
825
835
 
826
836
  # Extract function call if present
827
837
  if hasattr(part, "function_call") and part.function_call is not None:
@@ -929,11 +939,23 @@ class Gemini(Model):
929
939
  model_response.content += text_content
930
940
 
931
941
  if hasattr(part, "inline_data") and part.inline_data is not None:
932
- if model_response.images is None:
933
- model_response.images = []
934
- model_response.images.append(
935
- Image(id=str(uuid4()), content=part.inline_data.data, mime_type=part.inline_data.mime_type)
936
- )
942
+ # Audio responses
943
+ if part.inline_data.mime_type and part.inline_data.mime_type.startswith("audio/"):
944
+ # Store raw bytes audio data
945
+ model_response.audio = Audio(
946
+ id=str(uuid4()),
947
+ content=part.inline_data.data,
948
+ mime_type=part.inline_data.mime_type,
949
+ )
950
+ # Image responses
951
+ else:
952
+ if model_response.images is None:
953
+ model_response.images = []
954
+ model_response.images.append(
955
+ Image(
956
+ id=str(uuid4()), content=part.inline_data.data, mime_type=part.inline_data.mime_type
957
+ )
958
+ )
937
959
 
938
960
  # Extract function call if present
939
961
  if hasattr(part, "function_call") and part.function_call is not None:
@@ -47,7 +47,7 @@ class LiteLLM(Model):
47
47
  super().__post_init__()
48
48
 
49
49
  # Set up API key from environment variable if not already set
50
- if not self.api_key:
50
+ if not self.client and not self.api_key:
51
51
  self.api_key = getenv("LITELLM_API_KEY")
52
52
  if not self.api_key:
53
53
  # Check for other present valid keys, e.g. OPENAI_API_KEY if self.id is an OpenAI model
@@ -20,9 +20,10 @@ from agno.utils.models.schema_utils import get_response_schema_for_provider
20
20
  try:
21
21
  from openai import APIConnectionError, APIStatusError, AsyncOpenAI, OpenAI, RateLimitError
22
22
  from openai.types.responses.response import Response
23
+ from openai.types.responses.response_reasoning_item import ResponseReasoningItem
23
24
  from openai.types.responses.response_stream_event import ResponseStreamEvent
24
25
  from openai.types.responses.response_usage import ResponseUsage
25
- except (ImportError, ModuleNotFoundError) as e:
26
+ except ImportError as e:
26
27
  raise ImportError("`openai` not installed. Please install using `pip install openai -U`") from e
27
28
 
28
29
 
@@ -256,23 +257,36 @@ class OpenAIResponses(Model):
256
257
 
257
258
  # Handle reasoning tools for o3 and o4-mini models
258
259
  if self._using_reasoning_model() and messages is not None:
259
- request_params["store"] = True
260
-
261
- # Check if the last assistant message has a previous_response_id to continue from
262
- previous_response_id = None
263
- for msg in reversed(messages):
264
- if (
265
- msg.role == "assistant"
266
- and hasattr(msg, "provider_data")
267
- and msg.provider_data
268
- and "response_id" in msg.provider_data
269
- ):
270
- previous_response_id = msg.provider_data["response_id"]
271
- log_debug(f"Using previous_response_id: {previous_response_id}")
272
- break
260
+ if self.store is False:
261
+ request_params["store"] = False
262
+
263
+ # Add encrypted reasoning content to include if not already present
264
+ include_list = request_params.get("include", []) or []
265
+ if "reasoning.encrypted_content" not in include_list:
266
+ include_list.append("reasoning.encrypted_content")
267
+ if request_params.get("include") is None:
268
+ request_params["include"] = include_list
269
+ elif isinstance(request_params["include"], list):
270
+ request_params["include"].extend(include_list)
273
271
 
274
- if previous_response_id:
275
- request_params["previous_response_id"] = previous_response_id
272
+ else:
273
+ request_params["store"] = True
274
+
275
+ # Check if the last assistant message has a previous_response_id to continue from
276
+ previous_response_id = None
277
+ for msg in reversed(messages):
278
+ if (
279
+ msg.role == "assistant"
280
+ and hasattr(msg, "provider_data")
281
+ and msg.provider_data
282
+ and "response_id" in msg.provider_data
283
+ ):
284
+ previous_response_id = msg.provider_data["response_id"]
285
+ log_debug(f"Using previous_response_id: {previous_response_id}")
286
+ break
287
+
288
+ if previous_response_id:
289
+ request_params["previous_response_id"] = previous_response_id
276
290
 
277
291
  # Add additional request params if provided
278
292
  if self.request_params:
@@ -375,7 +389,7 @@ class OpenAIResponses(Model):
375
389
 
376
390
  return formatted_tools
377
391
 
378
- def _format_messages(self, messages: List[Message]) -> List[Dict[str, Any]]:
392
+ def _format_messages(self, messages: List[Message]) -> List[Union[Dict[str, Any], ResponseReasoningItem]]:
379
393
  """
380
394
  Format a message into the format expected by OpenAI.
381
395
 
@@ -385,22 +399,23 @@ class OpenAIResponses(Model):
385
399
  Returns:
386
400
  Dict[str, Any]: The formatted message.
387
401
  """
388
- formatted_messages: List[Dict[str, Any]] = []
402
+ formatted_messages: List[Union[Dict[str, Any], ResponseReasoningItem]] = []
389
403
 
390
404
  if self._using_reasoning_model():
391
405
  # Detect whether we're chaining via previous_response_id. If so, we should NOT
392
406
  # re-send prior function_call items; the Responses API already has the state and
393
407
  # expects only the corresponding function_call_output items.
394
408
  previous_response_id: Optional[str] = None
395
- for msg in reversed(messages):
396
- if (
397
- msg.role == "assistant"
398
- and hasattr(msg, "provider_data")
399
- and msg.provider_data
400
- and "response_id" in msg.provider_data
401
- ):
402
- previous_response_id = msg.provider_data["response_id"]
403
- break
409
+ if self.store is not False:
410
+ for msg in reversed(messages):
411
+ if (
412
+ msg.role == "assistant"
413
+ and hasattr(msg, "provider_data")
414
+ and msg.provider_data
415
+ and "response_id" in msg.provider_data
416
+ ):
417
+ previous_response_id = msg.provider_data["response_id"]
418
+ break
404
419
 
405
420
  # Build a mapping from function_call id (fc_*) → call_id (call_*) from prior assistant tool_calls
406
421
  fc_id_to_call_id: Dict[str, str] = {}
@@ -475,6 +490,12 @@ class OpenAIResponses(Model):
475
490
  content = message.content if message.content is not None else ""
476
491
  formatted_messages.append({"role": self.role_map[message.role], "content": content})
477
492
 
493
+ if self.store is False and hasattr(message, "provider_data") and message.provider_data is not None:
494
+ if message.provider_data.get("reasoning_output") is not None:
495
+ reasoning_output = ResponseReasoningItem.model_validate(
496
+ message.provider_data["reasoning_output"]
497
+ )
498
+ formatted_messages.append(reasoning_output)
478
499
  return formatted_messages
479
500
 
480
501
  def invoke(
@@ -858,7 +879,7 @@ class OpenAIResponses(Model):
858
879
 
859
880
  # Add role
860
881
  model_response.role = "assistant"
861
- reasoning_summary: str = ""
882
+ reasoning_summary: Optional[str] = None
862
883
 
863
884
  for output in response.output:
864
885
  # Add content
@@ -898,8 +919,14 @@ class OpenAIResponses(Model):
898
919
  model_response.extra = model_response.extra or {}
899
920
  model_response.extra.setdefault("tool_call_ids", []).append(output.call_id)
900
921
 
901
- # Add reasoning summary
922
+ # Handle reasoning output items
902
923
  elif output.type == "reasoning":
924
+ # Save encrypted reasoning content for ZDR mode
925
+ if self.store is False:
926
+ if model_response.provider_data is None:
927
+ model_response.provider_data = {}
928
+ model_response.provider_data["reasoning_output"] = output.model_dump(exclude_none=True)
929
+
903
930
  if reasoning_summaries := getattr(output, "summary", None):
904
931
  for summary in reasoning_summaries:
905
932
  if isinstance(summary, dict):
@@ -1009,19 +1036,27 @@ class OpenAIResponses(Model):
1009
1036
  elif stream_event.type == "response.completed":
1010
1037
  model_response = ModelResponse()
1011
1038
 
1012
- # Add reasoning summary
1013
- if self.reasoning_summary is not None:
1039
+ # Handle reasoning output items
1040
+ if self.reasoning_summary is not None or self.store is False:
1014
1041
  summary_text: str = ""
1015
1042
  for out in getattr(stream_event.response, "output", []) or []:
1016
1043
  if getattr(out, "type", None) == "reasoning":
1017
- summaries = getattr(out, "summary", None)
1018
- if summaries:
1019
- for s in summaries:
1020
- text_val = s.get("text") if isinstance(s, dict) else getattr(s, "text", None)
1021
- if text_val:
1022
- if summary_text:
1023
- summary_text += "\n\n"
1024
- summary_text += text_val
1044
+ # In ZDR mode (store=False), store reasoning data for next request
1045
+ if self.store is False and hasattr(out, "encrypted_content"):
1046
+ if model_response.provider_data is None:
1047
+ model_response.provider_data = {}
1048
+ # Store the complete output item
1049
+ model_response.provider_data["reasoning_output"] = out.model_dump(exclude_none=True)
1050
+ if self.reasoning_summary is not None:
1051
+ summaries = getattr(out, "summary", None)
1052
+ if summaries:
1053
+ for s in summaries:
1054
+ text_val = s.get("text") if isinstance(s, dict) else getattr(s, "text", None)
1055
+ if text_val:
1056
+ if summary_text:
1057
+ summary_text += "\n\n"
1058
+ summary_text += text_val
1059
+
1025
1060
  if summary_text:
1026
1061
  model_response.reasoning_content = summary_text
1027
1062
 
@@ -10,7 +10,7 @@ from agno.utils.log import log_info
10
10
 
11
11
 
12
12
  def attach_routes(router: APIRouter, agent: Optional[Agent] = None, team: Optional[Team] = None) -> APIRouter:
13
- @router.post("/slack/events")
13
+ @router.post("/events")
14
14
  async def slack_events(request: Request, background_tasks: BackgroundTasks):
15
15
  body = await request.body()
16
16
  timestamp = request.headers.get("X-Slack-Request-Timestamp")
@@ -167,6 +167,8 @@ def attach_routes(router: APIRouter, agent: Optional[Agent] = None, team: Option
167
167
  )
168
168
  await _send_whatsapp_message(phone_number, response.content) # type: ignore
169
169
  await _send_whatsapp_message(phone_number, response.content) # type: ignore
170
+ else:
171
+ await _send_whatsapp_message(phone_number, response.content) # type: ignore
170
172
 
171
173
  except Exception as e:
172
174
  log_error(f"Error processing message: {str(e)}")