agno 1.8.0__tar.gz → 1.8.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. {agno-1.8.0 → agno-1.8.2}/PKG-INFO +4 -1
  2. agno-1.8.2/agno/__init__.py +8 -0
  3. {agno-1.8.0 → agno-1.8.2}/agno/agent/agent.py +5 -5
  4. {agno-1.8.0 → agno-1.8.2}/agno/agent/metrics.py +4 -1
  5. {agno-1.8.0 → agno-1.8.2}/agno/app/agui/utils.py +16 -9
  6. {agno-1.8.0 → agno-1.8.2}/agno/app/discord/client.py +5 -1
  7. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/async_router.py +3 -0
  8. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/schemas.py +3 -0
  9. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/sync_router.py +3 -0
  10. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/agent.py +8 -4
  11. {agno-1.8.0 → agno-1.8.2}/agno/media.py +2 -2
  12. {agno-1.8.0 → agno-1.8.2}/agno/models/anthropic/claude.py +3 -59
  13. {agno-1.8.0 → agno-1.8.2}/agno/models/aws/bedrock.py +3 -7
  14. {agno-1.8.0 → agno-1.8.2}/agno/models/dashscope/dashscope.py +14 -5
  15. {agno-1.8.0 → agno-1.8.2}/agno/models/google/gemini.py +23 -11
  16. {agno-1.8.0 → agno-1.8.2}/agno/models/openai/chat.py +14 -4
  17. {agno-1.8.0 → agno-1.8.2}/agno/models/openai/responses.py +56 -11
  18. {agno-1.8.0 → agno-1.8.2}/agno/team/team.py +17 -1
  19. {agno-1.8.0 → agno-1.8.2}/agno/tools/confluence.py +63 -10
  20. {agno-1.8.0 → agno-1.8.2}/agno/tools/e2b.py +1 -1
  21. {agno-1.8.0 → agno-1.8.2}/agno/tools/firecrawl.py +5 -4
  22. {agno-1.8.0 → agno-1.8.2}/agno/tools/gmail.py +1 -1
  23. {agno-1.8.0 → agno-1.8.2}/agno/tools/linear.py +1 -1
  24. agno-1.8.2/agno/tools/neo4j.py +132 -0
  25. {agno-1.8.0 → agno-1.8.2}/agno/utils/gemini.py +31 -1
  26. {agno-1.8.0 → agno-1.8.2}/agno/utils/location.py +2 -2
  27. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/claude.py +49 -0
  28. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/qdrant/qdrant.py +22 -0
  29. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/workflow.py +2 -1
  30. {agno-1.8.0 → agno-1.8.2}/agno.egg-info/PKG-INFO +4 -1
  31. {agno-1.8.0 → agno-1.8.2}/agno.egg-info/SOURCES.txt +1 -0
  32. {agno-1.8.0 → agno-1.8.2}/agno.egg-info/requires.txt +4 -0
  33. {agno-1.8.0 → agno-1.8.2}/pyproject.toml +4 -1
  34. agno-1.8.0/agno/workspace/__init__.py +0 -0
  35. {agno-1.8.0 → agno-1.8.2}/LICENSE +0 -0
  36. {agno-1.8.0 → agno-1.8.2}/README.md +0 -0
  37. {agno-1.8.0 → agno-1.8.2}/agno/agent/__init__.py +0 -0
  38. {agno-1.8.0/agno → agno-1.8.2/agno/api}/__init__.py +0 -0
  39. {agno-1.8.0 → agno-1.8.2}/agno/api/agent.py +0 -0
  40. {agno-1.8.0 → agno-1.8.2}/agno/api/api.py +0 -0
  41. {agno-1.8.0 → agno-1.8.2}/agno/api/app.py +0 -0
  42. {agno-1.8.0 → agno-1.8.2}/agno/api/evals.py +0 -0
  43. {agno-1.8.0 → agno-1.8.2}/agno/api/playground.py +0 -0
  44. {agno-1.8.0 → agno-1.8.2}/agno/api/routes.py +0 -0
  45. {agno-1.8.0/agno/api → agno-1.8.2/agno/api/schemas}/__init__.py +0 -0
  46. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/agent.py +0 -0
  47. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/app.py +0 -0
  48. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/evals.py +0 -0
  49. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/playground.py +0 -0
  50. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/response.py +0 -0
  51. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/team.py +0 -0
  52. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/user.py +0 -0
  53. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/workflows.py +0 -0
  54. {agno-1.8.0 → agno-1.8.2}/agno/api/schemas/workspace.py +0 -0
  55. {agno-1.8.0 → agno-1.8.2}/agno/api/team.py +0 -0
  56. {agno-1.8.0 → agno-1.8.2}/agno/api/user.py +0 -0
  57. {agno-1.8.0 → agno-1.8.2}/agno/api/workflows.py +0 -0
  58. {agno-1.8.0 → agno-1.8.2}/agno/api/workspace.py +0 -0
  59. {agno-1.8.0/agno/api/schemas → agno-1.8.2/agno/app}/__init__.py +0 -0
  60. {agno-1.8.0 → agno-1.8.2}/agno/app/agui/__init__.py +0 -0
  61. {agno-1.8.0 → agno-1.8.2}/agno/app/agui/app.py +0 -0
  62. {agno-1.8.0 → agno-1.8.2}/agno/app/agui/async_router.py +0 -0
  63. {agno-1.8.0 → agno-1.8.2}/agno/app/agui/sync_router.py +0 -0
  64. {agno-1.8.0 → agno-1.8.2}/agno/app/base.py +0 -0
  65. {agno-1.8.0 → agno-1.8.2}/agno/app/discord/__init__.py +0 -0
  66. {agno-1.8.0 → agno-1.8.2}/agno/app/fastapi/__init__.py +0 -0
  67. {agno-1.8.0 → agno-1.8.2}/agno/app/fastapi/app.py +0 -0
  68. {agno-1.8.0 → agno-1.8.2}/agno/app/fastapi/async_router.py +0 -0
  69. {agno-1.8.0 → agno-1.8.2}/agno/app/fastapi/sync_router.py +0 -0
  70. {agno-1.8.0/agno/app → agno-1.8.2/agno/app/playground}/__init__.py +0 -0
  71. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/app.py +0 -0
  72. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/deploy.py +0 -0
  73. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/operator.py +0 -0
  74. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/serve.py +0 -0
  75. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/settings.py +0 -0
  76. {agno-1.8.0 → agno-1.8.2}/agno/app/playground/utils.py +0 -0
  77. {agno-1.8.0 → agno-1.8.2}/agno/app/settings.py +0 -0
  78. {agno-1.8.0 → agno-1.8.2}/agno/app/slack/__init__.py +0 -0
  79. {agno-1.8.0 → agno-1.8.2}/agno/app/slack/app.py +0 -0
  80. {agno-1.8.0 → agno-1.8.2}/agno/app/slack/async_router.py +0 -0
  81. {agno-1.8.0 → agno-1.8.2}/agno/app/slack/security.py +0 -0
  82. {agno-1.8.0 → agno-1.8.2}/agno/app/slack/sync_router.py +0 -0
  83. {agno-1.8.0 → agno-1.8.2}/agno/app/utils.py +0 -0
  84. {agno-1.8.0 → agno-1.8.2}/agno/app/whatsapp/__init__.py +0 -0
  85. {agno-1.8.0 → agno-1.8.2}/agno/app/whatsapp/app.py +0 -0
  86. {agno-1.8.0 → agno-1.8.2}/agno/app/whatsapp/async_router.py +0 -0
  87. {agno-1.8.0 → agno-1.8.2}/agno/app/whatsapp/security.py +0 -0
  88. {agno-1.8.0 → agno-1.8.2}/agno/app/whatsapp/sync_router.py +0 -0
  89. {agno-1.8.0/agno/app/playground → agno-1.8.2/agno/cli}/__init__.py +0 -0
  90. {agno-1.8.0 → agno-1.8.2}/agno/cli/auth_server.py +0 -0
  91. {agno-1.8.0 → agno-1.8.2}/agno/cli/config.py +0 -0
  92. {agno-1.8.0 → agno-1.8.2}/agno/cli/console.py +0 -0
  93. {agno-1.8.0 → agno-1.8.2}/agno/cli/credentials.py +0 -0
  94. {agno-1.8.0 → agno-1.8.2}/agno/cli/entrypoint.py +0 -0
  95. {agno-1.8.0 → agno-1.8.2}/agno/cli/operator.py +0 -0
  96. {agno-1.8.0 → agno-1.8.2}/agno/cli/settings.py +0 -0
  97. {agno-1.8.0/agno/cli → agno-1.8.2/agno/cli/ws}/__init__.py +0 -0
  98. {agno-1.8.0 → agno-1.8.2}/agno/cli/ws/ws_cli.py +0 -0
  99. {agno-1.8.0 → agno-1.8.2}/agno/constants.py +0 -0
  100. {agno-1.8.0 → agno-1.8.2}/agno/debug.py +0 -0
  101. {agno-1.8.0 → agno-1.8.2}/agno/document/__init__.py +0 -0
  102. {agno-1.8.0 → agno-1.8.2}/agno/document/base.py +0 -0
  103. {agno-1.8.0/agno/cli/ws → agno-1.8.2/agno/document/chunking}/__init__.py +0 -0
  104. {agno-1.8.0 → agno-1.8.2}/agno/document/chunking/agentic.py +0 -0
  105. {agno-1.8.0 → agno-1.8.2}/agno/document/chunking/document.py +0 -0
  106. {agno-1.8.0 → agno-1.8.2}/agno/document/chunking/fixed.py +0 -0
  107. {agno-1.8.0 → agno-1.8.2}/agno/document/chunking/markdown.py +0 -0
  108. {agno-1.8.0 → agno-1.8.2}/agno/document/chunking/recursive.py +0 -0
  109. {agno-1.8.0 → agno-1.8.2}/agno/document/chunking/row.py +0 -0
  110. {agno-1.8.0 → agno-1.8.2}/agno/document/chunking/semantic.py +0 -0
  111. {agno-1.8.0 → agno-1.8.2}/agno/document/chunking/strategy.py +0 -0
  112. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/__init__.py +0 -0
  113. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/arxiv_reader.py +0 -0
  114. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/base.py +0 -0
  115. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/csv_reader.py +0 -0
  116. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/docx_reader.py +0 -0
  117. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/firecrawl_reader.py +0 -0
  118. {agno-1.8.0/agno/document/chunking → agno-1.8.2/agno/document/reader/gcs}/__init__.py +0 -0
  119. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/gcs/pdf_reader.py +0 -0
  120. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/json_reader.py +0 -0
  121. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/markdown_reader.py +0 -0
  122. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/pdf_reader.py +0 -0
  123. {agno-1.8.0/agno/document/reader/gcs → agno-1.8.2/agno/document/reader/s3}/__init__.py +0 -0
  124. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/s3/pdf_reader.py +0 -0
  125. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/s3/text_reader.py +0 -0
  126. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/text_reader.py +0 -0
  127. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/url_reader.py +0 -0
  128. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/website_reader.py +0 -0
  129. {agno-1.8.0 → agno-1.8.2}/agno/document/reader/youtube_reader.py +0 -0
  130. {agno-1.8.0 → agno-1.8.2}/agno/embedder/__init__.py +0 -0
  131. {agno-1.8.0 → agno-1.8.2}/agno/embedder/aws_bedrock.py +0 -0
  132. {agno-1.8.0 → agno-1.8.2}/agno/embedder/azure_openai.py +0 -0
  133. {agno-1.8.0 → agno-1.8.2}/agno/embedder/base.py +0 -0
  134. {agno-1.8.0 → agno-1.8.2}/agno/embedder/cohere.py +0 -0
  135. {agno-1.8.0 → agno-1.8.2}/agno/embedder/fastembed.py +0 -0
  136. {agno-1.8.0 → agno-1.8.2}/agno/embedder/fireworks.py +0 -0
  137. {agno-1.8.0 → agno-1.8.2}/agno/embedder/google.py +0 -0
  138. {agno-1.8.0 → agno-1.8.2}/agno/embedder/huggingface.py +0 -0
  139. {agno-1.8.0 → agno-1.8.2}/agno/embedder/jina.py +0 -0
  140. {agno-1.8.0 → agno-1.8.2}/agno/embedder/langdb.py +0 -0
  141. {agno-1.8.0 → agno-1.8.2}/agno/embedder/mistral.py +0 -0
  142. {agno-1.8.0 → agno-1.8.2}/agno/embedder/nebius.py +0 -0
  143. {agno-1.8.0 → agno-1.8.2}/agno/embedder/ollama.py +0 -0
  144. {agno-1.8.0 → agno-1.8.2}/agno/embedder/openai.py +0 -0
  145. {agno-1.8.0 → agno-1.8.2}/agno/embedder/sentence_transformer.py +0 -0
  146. {agno-1.8.0 → agno-1.8.2}/agno/embedder/together.py +0 -0
  147. {agno-1.8.0 → agno-1.8.2}/agno/embedder/voyageai.py +0 -0
  148. {agno-1.8.0/agno/document/reader/s3 → agno-1.8.2/agno/eval}/__init__.py +0 -0
  149. {agno-1.8.0 → agno-1.8.2}/agno/eval/accuracy.py +0 -0
  150. {agno-1.8.0 → agno-1.8.2}/agno/eval/performance.py +0 -0
  151. {agno-1.8.0 → agno-1.8.2}/agno/eval/reliability.py +0 -0
  152. {agno-1.8.0 → agno-1.8.2}/agno/eval/utils.py +0 -0
  153. {agno-1.8.0 → agno-1.8.2}/agno/exceptions.py +0 -0
  154. {agno-1.8.0 → agno-1.8.2}/agno/file/__init__.py +0 -0
  155. {agno-1.8.0 → agno-1.8.2}/agno/file/file.py +0 -0
  156. {agno-1.8.0/agno/eval → agno-1.8.2/agno/file/local}/__init__.py +0 -0
  157. {agno-1.8.0 → agno-1.8.2}/agno/file/local/csv.py +0 -0
  158. {agno-1.8.0 → agno-1.8.2}/agno/file/local/txt.py +0 -0
  159. {agno-1.8.0/agno/file/local → agno-1.8.2/agno/infra}/__init__.py +0 -0
  160. {agno-1.8.0 → agno-1.8.2}/agno/infra/app.py +0 -0
  161. {agno-1.8.0 → agno-1.8.2}/agno/infra/base.py +0 -0
  162. {agno-1.8.0 → agno-1.8.2}/agno/infra/context.py +0 -0
  163. {agno-1.8.0 → agno-1.8.2}/agno/infra/db_app.py +0 -0
  164. {agno-1.8.0 → agno-1.8.2}/agno/infra/resource.py +0 -0
  165. {agno-1.8.0 → agno-1.8.2}/agno/infra/resources.py +0 -0
  166. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/__init__.py +0 -0
  167. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/arxiv.py +0 -0
  168. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/combined.py +0 -0
  169. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/csv.py +0 -0
  170. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/csv_url.py +0 -0
  171. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/document.py +0 -0
  172. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/docx.py +0 -0
  173. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/firecrawl.py +0 -0
  174. {agno-1.8.0/agno/infra → agno-1.8.2/agno/knowledge/gcs}/__init__.py +0 -0
  175. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/gcs/base.py +0 -0
  176. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/gcs/pdf.py +0 -0
  177. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/json.py +0 -0
  178. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/langchain.py +0 -0
  179. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/light_rag.py +0 -0
  180. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/llamaindex.py +0 -0
  181. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/markdown.py +0 -0
  182. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/pdf.py +0 -0
  183. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/pdf_bytes.py +0 -0
  184. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/pdf_url.py +0 -0
  185. {agno-1.8.0/agno/knowledge/gcs → agno-1.8.2/agno/knowledge/s3}/__init__.py +0 -0
  186. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/s3/base.py +0 -0
  187. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/s3/pdf.py +0 -0
  188. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/s3/text.py +0 -0
  189. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/text.py +0 -0
  190. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/url.py +0 -0
  191. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/website.py +0 -0
  192. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/wikipedia.py +0 -0
  193. {agno-1.8.0 → agno-1.8.2}/agno/knowledge/youtube.py +0 -0
  194. {agno-1.8.0 → agno-1.8.2}/agno/memory/__init__.py +0 -0
  195. {agno-1.8.0 → agno-1.8.2}/agno/memory/agent.py +0 -0
  196. {agno-1.8.0 → agno-1.8.2}/agno/memory/classifier.py +0 -0
  197. {agno-1.8.0 → agno-1.8.2}/agno/memory/db/__init__.py +0 -0
  198. {agno-1.8.0 → agno-1.8.2}/agno/memory/db/base.py +0 -0
  199. {agno-1.8.0 → agno-1.8.2}/agno/memory/db/mongodb.py +0 -0
  200. {agno-1.8.0 → agno-1.8.2}/agno/memory/db/postgres.py +0 -0
  201. {agno-1.8.0 → agno-1.8.2}/agno/memory/db/sqlite.py +0 -0
  202. {agno-1.8.0 → agno-1.8.2}/agno/memory/manager.py +0 -0
  203. {agno-1.8.0 → agno-1.8.2}/agno/memory/memory.py +0 -0
  204. {agno-1.8.0 → agno-1.8.2}/agno/memory/row.py +0 -0
  205. {agno-1.8.0 → agno-1.8.2}/agno/memory/summarizer.py +0 -0
  206. {agno-1.8.0 → agno-1.8.2}/agno/memory/summary.py +0 -0
  207. {agno-1.8.0 → agno-1.8.2}/agno/memory/team.py +0 -0
  208. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/__init__.py +0 -0
  209. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/db/__init__.py +0 -0
  210. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/db/base.py +0 -0
  211. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/db/firestore.py +0 -0
  212. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/db/mongodb.py +0 -0
  213. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/db/postgres.py +0 -0
  214. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/db/redis.py +0 -0
  215. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/db/schema.py +0 -0
  216. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/db/sqlite.py +0 -0
  217. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/manager.py +0 -0
  218. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/memory.py +0 -0
  219. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/schema.py +0 -0
  220. {agno-1.8.0 → agno-1.8.2}/agno/memory/v2/summarizer.py +0 -0
  221. {agno-1.8.0 → agno-1.8.2}/agno/memory/workflow.py +0 -0
  222. {agno-1.8.0/agno/knowledge/s3 → agno-1.8.2/agno/models}/__init__.py +0 -0
  223. {agno-1.8.0 → agno-1.8.2}/agno/models/aimlapi/__init__.py +0 -0
  224. {agno-1.8.0 → agno-1.8.2}/agno/models/aimlapi/aimlapi.py +0 -0
  225. {agno-1.8.0 → agno-1.8.2}/agno/models/anthropic/__init__.py +0 -0
  226. {agno-1.8.0 → agno-1.8.2}/agno/models/aws/__init__.py +0 -0
  227. {agno-1.8.0 → agno-1.8.2}/agno/models/aws/claude.py +0 -0
  228. {agno-1.8.0 → agno-1.8.2}/agno/models/azure/__init__.py +0 -0
  229. {agno-1.8.0 → agno-1.8.2}/agno/models/azure/ai_foundry.py +0 -0
  230. {agno-1.8.0 → agno-1.8.2}/agno/models/azure/openai_chat.py +0 -0
  231. {agno-1.8.0 → agno-1.8.2}/agno/models/base.py +0 -0
  232. {agno-1.8.0 → agno-1.8.2}/agno/models/cerebras/__init__.py +0 -0
  233. {agno-1.8.0 → agno-1.8.2}/agno/models/cerebras/cerebras.py +0 -0
  234. {agno-1.8.0 → agno-1.8.2}/agno/models/cerebras/cerebras_openai.py +0 -0
  235. {agno-1.8.0 → agno-1.8.2}/agno/models/cohere/__init__.py +0 -0
  236. {agno-1.8.0 → agno-1.8.2}/agno/models/cohere/chat.py +0 -0
  237. {agno-1.8.0 → agno-1.8.2}/agno/models/dashscope/__init__.py +0 -0
  238. {agno-1.8.0 → agno-1.8.2}/agno/models/deepinfra/__init__.py +0 -0
  239. {agno-1.8.0 → agno-1.8.2}/agno/models/deepinfra/deepinfra.py +0 -0
  240. {agno-1.8.0 → agno-1.8.2}/agno/models/deepseek/__init__.py +0 -0
  241. {agno-1.8.0 → agno-1.8.2}/agno/models/deepseek/deepseek.py +0 -0
  242. {agno-1.8.0 → agno-1.8.2}/agno/models/defaults.py +0 -0
  243. {agno-1.8.0 → agno-1.8.2}/agno/models/fireworks/__init__.py +0 -0
  244. {agno-1.8.0 → agno-1.8.2}/agno/models/fireworks/fireworks.py +0 -0
  245. {agno-1.8.0 → agno-1.8.2}/agno/models/google/__init__.py +0 -0
  246. {agno-1.8.0 → agno-1.8.2}/agno/models/groq/__init__.py +0 -0
  247. {agno-1.8.0 → agno-1.8.2}/agno/models/groq/groq.py +0 -0
  248. {agno-1.8.0 → agno-1.8.2}/agno/models/huggingface/__init__.py +0 -0
  249. {agno-1.8.0 → agno-1.8.2}/agno/models/huggingface/huggingface.py +0 -0
  250. {agno-1.8.0 → agno-1.8.2}/agno/models/ibm/__init__.py +0 -0
  251. {agno-1.8.0 → agno-1.8.2}/agno/models/ibm/watsonx.py +0 -0
  252. {agno-1.8.0 → agno-1.8.2}/agno/models/internlm/__init__.py +0 -0
  253. {agno-1.8.0 → agno-1.8.2}/agno/models/internlm/internlm.py +0 -0
  254. {agno-1.8.0 → agno-1.8.2}/agno/models/langdb/__init__.py +0 -0
  255. {agno-1.8.0 → agno-1.8.2}/agno/models/langdb/langdb.py +0 -0
  256. {agno-1.8.0 → agno-1.8.2}/agno/models/litellm/__init__.py +0 -0
  257. {agno-1.8.0 → agno-1.8.2}/agno/models/litellm/chat.py +0 -0
  258. {agno-1.8.0 → agno-1.8.2}/agno/models/litellm/litellm_openai.py +0 -0
  259. {agno-1.8.0 → agno-1.8.2}/agno/models/lmstudio/__init__.py +0 -0
  260. {agno-1.8.0 → agno-1.8.2}/agno/models/lmstudio/lmstudio.py +0 -0
  261. {agno-1.8.0 → agno-1.8.2}/agno/models/message.py +0 -0
  262. {agno-1.8.0 → agno-1.8.2}/agno/models/meta/__init__.py +0 -0
  263. {agno-1.8.0 → agno-1.8.2}/agno/models/meta/llama.py +0 -0
  264. {agno-1.8.0 → agno-1.8.2}/agno/models/meta/llama_openai.py +0 -0
  265. {agno-1.8.0 → agno-1.8.2}/agno/models/mistral/__init__.py +0 -0
  266. {agno-1.8.0 → agno-1.8.2}/agno/models/mistral/mistral.py +0 -0
  267. {agno-1.8.0 → agno-1.8.2}/agno/models/nebius/__init__.py +0 -0
  268. {agno-1.8.0 → agno-1.8.2}/agno/models/nebius/nebius.py +0 -0
  269. {agno-1.8.0 → agno-1.8.2}/agno/models/nvidia/__init__.py +0 -0
  270. {agno-1.8.0 → agno-1.8.2}/agno/models/nvidia/nvidia.py +0 -0
  271. {agno-1.8.0 → agno-1.8.2}/agno/models/ollama/__init__.py +0 -0
  272. {agno-1.8.0 → agno-1.8.2}/agno/models/ollama/chat.py +0 -0
  273. {agno-1.8.0 → agno-1.8.2}/agno/models/ollama/tools.py +0 -0
  274. {agno-1.8.0 → agno-1.8.2}/agno/models/openai/__init__.py +0 -0
  275. {agno-1.8.0 → agno-1.8.2}/agno/models/openai/like.py +0 -0
  276. {agno-1.8.0 → agno-1.8.2}/agno/models/openrouter/__init__.py +0 -0
  277. {agno-1.8.0 → agno-1.8.2}/agno/models/openrouter/openrouter.py +0 -0
  278. {agno-1.8.0 → agno-1.8.2}/agno/models/perplexity/__init__.py +0 -0
  279. {agno-1.8.0 → agno-1.8.2}/agno/models/perplexity/perplexity.py +0 -0
  280. {agno-1.8.0 → agno-1.8.2}/agno/models/portkey/__init__.py +0 -0
  281. {agno-1.8.0 → agno-1.8.2}/agno/models/portkey/portkey.py +0 -0
  282. {agno-1.8.0 → agno-1.8.2}/agno/models/qwen/__init__.py +0 -0
  283. {agno-1.8.0 → agno-1.8.2}/agno/models/response.py +0 -0
  284. {agno-1.8.0 → agno-1.8.2}/agno/models/sambanova/__init__.py +0 -0
  285. {agno-1.8.0 → agno-1.8.2}/agno/models/sambanova/sambanova.py +0 -0
  286. {agno-1.8.0 → agno-1.8.2}/agno/models/together/__init__.py +0 -0
  287. {agno-1.8.0 → agno-1.8.2}/agno/models/together/together.py +0 -0
  288. {agno-1.8.0 → agno-1.8.2}/agno/models/vercel/__init__.py +0 -0
  289. {agno-1.8.0 → agno-1.8.2}/agno/models/vercel/v0.py +0 -0
  290. {agno-1.8.0 → agno-1.8.2}/agno/models/vllm/__init__.py +0 -0
  291. {agno-1.8.0 → agno-1.8.2}/agno/models/vllm/vllm.py +0 -0
  292. {agno-1.8.0 → agno-1.8.2}/agno/models/xai/__init__.py +0 -0
  293. {agno-1.8.0 → agno-1.8.2}/agno/models/xai/xai.py +0 -0
  294. {agno-1.8.0 → agno-1.8.2}/agno/playground/__init__.py +0 -0
  295. {agno-1.8.0 → agno-1.8.2}/agno/playground/deploy.py +0 -0
  296. {agno-1.8.0 → agno-1.8.2}/agno/playground/playground.py +0 -0
  297. {agno-1.8.0 → agno-1.8.2}/agno/playground/serve.py +0 -0
  298. {agno-1.8.0 → agno-1.8.2}/agno/playground/settings.py +0 -0
  299. {agno-1.8.0 → agno-1.8.2}/agno/py.typed +0 -0
  300. {agno-1.8.0/agno/models → agno-1.8.2/agno/reasoning}/__init__.py +0 -0
  301. {agno-1.8.0 → agno-1.8.2}/agno/reasoning/azure_ai_foundry.py +0 -0
  302. {agno-1.8.0 → agno-1.8.2}/agno/reasoning/deepseek.py +0 -0
  303. {agno-1.8.0 → agno-1.8.2}/agno/reasoning/default.py +0 -0
  304. {agno-1.8.0 → agno-1.8.2}/agno/reasoning/groq.py +0 -0
  305. {agno-1.8.0 → agno-1.8.2}/agno/reasoning/helpers.py +0 -0
  306. {agno-1.8.0 → agno-1.8.2}/agno/reasoning/ollama.py +0 -0
  307. {agno-1.8.0 → agno-1.8.2}/agno/reasoning/openai.py +0 -0
  308. {agno-1.8.0 → agno-1.8.2}/agno/reasoning/step.py +0 -0
  309. {agno-1.8.0/agno/reasoning → agno-1.8.2/agno/reranker}/__init__.py +0 -0
  310. {agno-1.8.0 → agno-1.8.2}/agno/reranker/base.py +0 -0
  311. {agno-1.8.0 → agno-1.8.2}/agno/reranker/cohere.py +0 -0
  312. {agno-1.8.0 → agno-1.8.2}/agno/reranker/infinity.py +0 -0
  313. {agno-1.8.0 → agno-1.8.2}/agno/reranker/sentence_transformer.py +0 -0
  314. {agno-1.8.0/agno/reranker → agno-1.8.2/agno/run}/__init__.py +0 -0
  315. {agno-1.8.0 → agno-1.8.2}/agno/run/base.py +0 -0
  316. {agno-1.8.0 → agno-1.8.2}/agno/run/messages.py +0 -0
  317. {agno-1.8.0 → agno-1.8.2}/agno/run/response.py +0 -0
  318. {agno-1.8.0 → agno-1.8.2}/agno/run/team.py +0 -0
  319. {agno-1.8.0/agno/run → agno-1.8.2/agno/run/v2}/__init__.py +0 -0
  320. {agno-1.8.0 → agno-1.8.2}/agno/run/v2/workflow.py +0 -0
  321. {agno-1.8.0 → agno-1.8.2}/agno/run/workflow.py +0 -0
  322. {agno-1.8.0/agno/run/v2 → agno-1.8.2/agno/storage}/__init__.py +0 -0
  323. {agno-1.8.0/agno/storage → agno-1.8.2/agno/storage/agent}/__init__.py +0 -0
  324. {agno-1.8.0 → agno-1.8.2}/agno/storage/agent/dynamodb.py +0 -0
  325. {agno-1.8.0 → agno-1.8.2}/agno/storage/agent/json.py +0 -0
  326. {agno-1.8.0 → agno-1.8.2}/agno/storage/agent/mongodb.py +0 -0
  327. {agno-1.8.0 → agno-1.8.2}/agno/storage/agent/postgres.py +0 -0
  328. {agno-1.8.0 → agno-1.8.2}/agno/storage/agent/singlestore.py +0 -0
  329. {agno-1.8.0 → agno-1.8.2}/agno/storage/agent/sqlite.py +0 -0
  330. {agno-1.8.0 → agno-1.8.2}/agno/storage/agent/yaml.py +0 -0
  331. {agno-1.8.0 → agno-1.8.2}/agno/storage/base.py +0 -0
  332. {agno-1.8.0 → agno-1.8.2}/agno/storage/dynamodb.py +0 -0
  333. {agno-1.8.0 → agno-1.8.2}/agno/storage/firestore.py +0 -0
  334. {agno-1.8.0 → agno-1.8.2}/agno/storage/gcs_json.py +0 -0
  335. {agno-1.8.0 → agno-1.8.2}/agno/storage/in_memory.py +0 -0
  336. {agno-1.8.0 → agno-1.8.2}/agno/storage/json.py +0 -0
  337. {agno-1.8.0 → agno-1.8.2}/agno/storage/mongodb.py +0 -0
  338. {agno-1.8.0 → agno-1.8.2}/agno/storage/mysql.py +0 -0
  339. {agno-1.8.0 → agno-1.8.2}/agno/storage/postgres.py +0 -0
  340. {agno-1.8.0 → agno-1.8.2}/agno/storage/redis.py +0 -0
  341. {agno-1.8.0 → agno-1.8.2}/agno/storage/session/__init__.py +0 -0
  342. {agno-1.8.0 → agno-1.8.2}/agno/storage/session/agent.py +0 -0
  343. {agno-1.8.0 → agno-1.8.2}/agno/storage/session/team.py +0 -0
  344. {agno-1.8.0 → agno-1.8.2}/agno/storage/session/v2/__init__.py +0 -0
  345. {agno-1.8.0 → agno-1.8.2}/agno/storage/session/v2/workflow.py +0 -0
  346. {agno-1.8.0 → agno-1.8.2}/agno/storage/session/workflow.py +0 -0
  347. {agno-1.8.0 → agno-1.8.2}/agno/storage/singlestore.py +0 -0
  348. {agno-1.8.0 → agno-1.8.2}/agno/storage/sqlite.py +0 -0
  349. {agno-1.8.0/agno/storage/agent → agno-1.8.2/agno/storage/workflow}/__init__.py +0 -0
  350. {agno-1.8.0 → agno-1.8.2}/agno/storage/workflow/mongodb.py +0 -0
  351. {agno-1.8.0 → agno-1.8.2}/agno/storage/workflow/postgres.py +0 -0
  352. {agno-1.8.0 → agno-1.8.2}/agno/storage/workflow/sqlite.py +0 -0
  353. {agno-1.8.0 → agno-1.8.2}/agno/storage/yaml.py +0 -0
  354. {agno-1.8.0 → agno-1.8.2}/agno/team/__init__.py +0 -0
  355. {agno-1.8.0 → agno-1.8.2}/agno/tools/__init__.py +0 -0
  356. {agno-1.8.0 → agno-1.8.2}/agno/tools/agentql.py +0 -0
  357. {agno-1.8.0 → agno-1.8.2}/agno/tools/airflow.py +0 -0
  358. {agno-1.8.0 → agno-1.8.2}/agno/tools/api.py +0 -0
  359. {agno-1.8.0 → agno-1.8.2}/agno/tools/apify.py +0 -0
  360. {agno-1.8.0 → agno-1.8.2}/agno/tools/arxiv.py +0 -0
  361. {agno-1.8.0 → agno-1.8.2}/agno/tools/aws_lambda.py +0 -0
  362. {agno-1.8.0 → agno-1.8.2}/agno/tools/aws_ses.py +0 -0
  363. {agno-1.8.0 → agno-1.8.2}/agno/tools/baidusearch.py +0 -0
  364. {agno-1.8.0 → agno-1.8.2}/agno/tools/bitbucket.py +0 -0
  365. {agno-1.8.0 → agno-1.8.2}/agno/tools/brandfetch.py +0 -0
  366. {agno-1.8.0 → agno-1.8.2}/agno/tools/bravesearch.py +0 -0
  367. {agno-1.8.0 → agno-1.8.2}/agno/tools/brightdata.py +0 -0
  368. {agno-1.8.0 → agno-1.8.2}/agno/tools/browserbase.py +0 -0
  369. {agno-1.8.0 → agno-1.8.2}/agno/tools/calcom.py +0 -0
  370. {agno-1.8.0 → agno-1.8.2}/agno/tools/calculator.py +0 -0
  371. {agno-1.8.0 → agno-1.8.2}/agno/tools/cartesia.py +0 -0
  372. {agno-1.8.0 → agno-1.8.2}/agno/tools/clickup_tool.py +0 -0
  373. {agno-1.8.0 → agno-1.8.2}/agno/tools/crawl4ai.py +0 -0
  374. {agno-1.8.0 → agno-1.8.2}/agno/tools/csv_toolkit.py +0 -0
  375. {agno-1.8.0 → agno-1.8.2}/agno/tools/dalle.py +0 -0
  376. {agno-1.8.0 → agno-1.8.2}/agno/tools/daytona.py +0 -0
  377. {agno-1.8.0 → agno-1.8.2}/agno/tools/decorator.py +0 -0
  378. {agno-1.8.0 → agno-1.8.2}/agno/tools/desi_vocal.py +0 -0
  379. {agno-1.8.0 → agno-1.8.2}/agno/tools/discord.py +0 -0
  380. {agno-1.8.0 → agno-1.8.2}/agno/tools/docker.py +0 -0
  381. {agno-1.8.0 → agno-1.8.2}/agno/tools/duckdb.py +0 -0
  382. {agno-1.8.0 → agno-1.8.2}/agno/tools/duckduckgo.py +0 -0
  383. {agno-1.8.0 → agno-1.8.2}/agno/tools/eleven_labs.py +0 -0
  384. {agno-1.8.0 → agno-1.8.2}/agno/tools/email.py +0 -0
  385. {agno-1.8.0 → agno-1.8.2}/agno/tools/evm.py +0 -0
  386. {agno-1.8.0 → agno-1.8.2}/agno/tools/exa.py +0 -0
  387. {agno-1.8.0 → agno-1.8.2}/agno/tools/fal.py +0 -0
  388. {agno-1.8.0 → agno-1.8.2}/agno/tools/file.py +0 -0
  389. {agno-1.8.0 → agno-1.8.2}/agno/tools/financial_datasets.py +0 -0
  390. {agno-1.8.0 → agno-1.8.2}/agno/tools/function.py +0 -0
  391. {agno-1.8.0 → agno-1.8.2}/agno/tools/giphy.py +0 -0
  392. {agno-1.8.0 → agno-1.8.2}/agno/tools/github.py +0 -0
  393. {agno-1.8.0 → agno-1.8.2}/agno/tools/google_bigquery.py +0 -0
  394. {agno-1.8.0 → agno-1.8.2}/agno/tools/google_maps.py +0 -0
  395. {agno-1.8.0 → agno-1.8.2}/agno/tools/googlecalendar.py +0 -0
  396. {agno-1.8.0 → agno-1.8.2}/agno/tools/googlesearch.py +0 -0
  397. {agno-1.8.0 → agno-1.8.2}/agno/tools/googlesheets.py +0 -0
  398. {agno-1.8.0 → agno-1.8.2}/agno/tools/hackernews.py +0 -0
  399. {agno-1.8.0 → agno-1.8.2}/agno/tools/jina.py +0 -0
  400. {agno-1.8.0 → agno-1.8.2}/agno/tools/jira.py +0 -0
  401. {agno-1.8.0 → agno-1.8.2}/agno/tools/knowledge.py +0 -0
  402. {agno-1.8.0 → agno-1.8.2}/agno/tools/linkup.py +0 -0
  403. {agno-1.8.0 → agno-1.8.2}/agno/tools/local_file_system.py +0 -0
  404. {agno-1.8.0 → agno-1.8.2}/agno/tools/lumalab.py +0 -0
  405. {agno-1.8.0 → agno-1.8.2}/agno/tools/mcp.py +0 -0
  406. {agno-1.8.0 → agno-1.8.2}/agno/tools/mem0.py +0 -0
  407. {agno-1.8.0 → agno-1.8.2}/agno/tools/memori.py +0 -0
  408. {agno-1.8.0 → agno-1.8.2}/agno/tools/mlx_transcribe.py +0 -0
  409. {agno-1.8.0/agno/storage/workflow → agno-1.8.2/agno/tools/models}/__init__.py +0 -0
  410. {agno-1.8.0 → agno-1.8.2}/agno/tools/models/azure_openai.py +0 -0
  411. {agno-1.8.0 → agno-1.8.2}/agno/tools/models/gemini.py +0 -0
  412. {agno-1.8.0 → agno-1.8.2}/agno/tools/models/groq.py +0 -0
  413. {agno-1.8.0 → agno-1.8.2}/agno/tools/models/morph.py +0 -0
  414. {agno-1.8.0 → agno-1.8.2}/agno/tools/models/nebius.py +0 -0
  415. {agno-1.8.0 → agno-1.8.2}/agno/tools/models_labs.py +0 -0
  416. {agno-1.8.0 → agno-1.8.2}/agno/tools/moviepy_video.py +0 -0
  417. {agno-1.8.0 → agno-1.8.2}/agno/tools/newspaper.py +0 -0
  418. {agno-1.8.0 → agno-1.8.2}/agno/tools/newspaper4k.py +0 -0
  419. {agno-1.8.0 → agno-1.8.2}/agno/tools/openai.py +0 -0
  420. {agno-1.8.0 → agno-1.8.2}/agno/tools/openbb.py +0 -0
  421. {agno-1.8.0 → agno-1.8.2}/agno/tools/opencv.py +0 -0
  422. {agno-1.8.0 → agno-1.8.2}/agno/tools/openweather.py +0 -0
  423. {agno-1.8.0 → agno-1.8.2}/agno/tools/oxylabs.py +0 -0
  424. {agno-1.8.0 → agno-1.8.2}/agno/tools/pandas.py +0 -0
  425. {agno-1.8.0 → agno-1.8.2}/agno/tools/postgres.py +0 -0
  426. {agno-1.8.0 → agno-1.8.2}/agno/tools/pubmed.py +0 -0
  427. {agno-1.8.0 → agno-1.8.2}/agno/tools/python.py +0 -0
  428. {agno-1.8.0 → agno-1.8.2}/agno/tools/reasoning.py +0 -0
  429. {agno-1.8.0 → agno-1.8.2}/agno/tools/reddit.py +0 -0
  430. {agno-1.8.0 → agno-1.8.2}/agno/tools/replicate.py +0 -0
  431. {agno-1.8.0 → agno-1.8.2}/agno/tools/resend.py +0 -0
  432. {agno-1.8.0 → agno-1.8.2}/agno/tools/scrapegraph.py +0 -0
  433. {agno-1.8.0 → agno-1.8.2}/agno/tools/searxng.py +0 -0
  434. {agno-1.8.0 → agno-1.8.2}/agno/tools/serpapi.py +0 -0
  435. {agno-1.8.0 → agno-1.8.2}/agno/tools/serper.py +0 -0
  436. {agno-1.8.0 → agno-1.8.2}/agno/tools/shell.py +0 -0
  437. {agno-1.8.0 → agno-1.8.2}/agno/tools/slack.py +0 -0
  438. {agno-1.8.0 → agno-1.8.2}/agno/tools/sleep.py +0 -0
  439. {agno-1.8.0 → agno-1.8.2}/agno/tools/spider.py +0 -0
  440. {agno-1.8.0 → agno-1.8.2}/agno/tools/sql.py +0 -0
  441. {agno-1.8.0/agno/tools/models → agno-1.8.2/agno/tools/streamlit}/__init__.py +0 -0
  442. {agno-1.8.0 → agno-1.8.2}/agno/tools/streamlit/components.py +0 -0
  443. {agno-1.8.0 → agno-1.8.2}/agno/tools/tavily.py +0 -0
  444. {agno-1.8.0 → agno-1.8.2}/agno/tools/telegram.py +0 -0
  445. {agno-1.8.0 → agno-1.8.2}/agno/tools/thinking.py +0 -0
  446. {agno-1.8.0 → agno-1.8.2}/agno/tools/todoist.py +0 -0
  447. {agno-1.8.0 → agno-1.8.2}/agno/tools/tool_registry.py +0 -0
  448. {agno-1.8.0 → agno-1.8.2}/agno/tools/toolkit.py +0 -0
  449. {agno-1.8.0 → agno-1.8.2}/agno/tools/trafilatura.py +0 -0
  450. {agno-1.8.0 → agno-1.8.2}/agno/tools/trello.py +0 -0
  451. {agno-1.8.0 → agno-1.8.2}/agno/tools/twilio.py +0 -0
  452. {agno-1.8.0 → agno-1.8.2}/agno/tools/user_control_flow.py +0 -0
  453. {agno-1.8.0 → agno-1.8.2}/agno/tools/valyu.py +0 -0
  454. {agno-1.8.0 → agno-1.8.2}/agno/tools/visualization.py +0 -0
  455. {agno-1.8.0 → agno-1.8.2}/agno/tools/webbrowser.py +0 -0
  456. {agno-1.8.0 → agno-1.8.2}/agno/tools/webex.py +0 -0
  457. {agno-1.8.0 → agno-1.8.2}/agno/tools/website.py +0 -0
  458. {agno-1.8.0 → agno-1.8.2}/agno/tools/webtools.py +0 -0
  459. {agno-1.8.0 → agno-1.8.2}/agno/tools/whatsapp.py +0 -0
  460. {agno-1.8.0 → agno-1.8.2}/agno/tools/wikipedia.py +0 -0
  461. {agno-1.8.0 → agno-1.8.2}/agno/tools/x.py +0 -0
  462. {agno-1.8.0 → agno-1.8.2}/agno/tools/yfinance.py +0 -0
  463. {agno-1.8.0 → agno-1.8.2}/agno/tools/youtube.py +0 -0
  464. {agno-1.8.0 → agno-1.8.2}/agno/tools/zendesk.py +0 -0
  465. {agno-1.8.0 → agno-1.8.2}/agno/tools/zep.py +0 -0
  466. {agno-1.8.0 → agno-1.8.2}/agno/tools/zoom.py +0 -0
  467. {agno-1.8.0/agno/tools/streamlit → agno-1.8.2/agno/utils}/__init__.py +0 -0
  468. {agno-1.8.0 → agno-1.8.2}/agno/utils/audio.py +0 -0
  469. {agno-1.8.0 → agno-1.8.2}/agno/utils/certs.py +0 -0
  470. {agno-1.8.0 → agno-1.8.2}/agno/utils/code_execution.py +0 -0
  471. {agno-1.8.0 → agno-1.8.2}/agno/utils/common.py +0 -0
  472. {agno-1.8.0 → agno-1.8.2}/agno/utils/defaults.py +0 -0
  473. {agno-1.8.0 → agno-1.8.2}/agno/utils/dttm.py +0 -0
  474. {agno-1.8.0 → agno-1.8.2}/agno/utils/enum.py +0 -0
  475. {agno-1.8.0 → agno-1.8.2}/agno/utils/env.py +0 -0
  476. {agno-1.8.0 → agno-1.8.2}/agno/utils/events.py +0 -0
  477. {agno-1.8.0 → agno-1.8.2}/agno/utils/filesystem.py +0 -0
  478. {agno-1.8.0 → agno-1.8.2}/agno/utils/format_str.py +0 -0
  479. {agno-1.8.0 → agno-1.8.2}/agno/utils/functions.py +0 -0
  480. {agno-1.8.0 → agno-1.8.2}/agno/utils/git.py +0 -0
  481. {agno-1.8.0 → agno-1.8.2}/agno/utils/http.py +0 -0
  482. {agno-1.8.0 → agno-1.8.2}/agno/utils/json_io.py +0 -0
  483. {agno-1.8.0 → agno-1.8.2}/agno/utils/json_schema.py +0 -0
  484. {agno-1.8.0 → agno-1.8.2}/agno/utils/load_env.py +0 -0
  485. {agno-1.8.0 → agno-1.8.2}/agno/utils/log.py +0 -0
  486. {agno-1.8.0 → agno-1.8.2}/agno/utils/mcp.py +0 -0
  487. {agno-1.8.0 → agno-1.8.2}/agno/utils/media.py +0 -0
  488. {agno-1.8.0 → agno-1.8.2}/agno/utils/merge_dict.py +0 -0
  489. {agno-1.8.0 → agno-1.8.2}/agno/utils/message.py +0 -0
  490. {agno-1.8.0/agno/utils → agno-1.8.2/agno/utils/models}/__init__.py +0 -0
  491. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/ai_foundry.py +0 -0
  492. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/aws_claude.py +0 -0
  493. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/cohere.py +0 -0
  494. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/llama.py +0 -0
  495. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/mistral.py +0 -0
  496. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/openai_responses.py +0 -0
  497. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/schema_utils.py +0 -0
  498. {agno-1.8.0 → agno-1.8.2}/agno/utils/models/watsonx.py +0 -0
  499. {agno-1.8.0 → agno-1.8.2}/agno/utils/openai.py +0 -0
  500. {agno-1.8.0 → agno-1.8.2}/agno/utils/pickle.py +0 -0
  501. {agno-1.8.0 → agno-1.8.2}/agno/utils/pprint.py +0 -0
  502. {agno-1.8.0 → agno-1.8.2}/agno/utils/prompts.py +0 -0
  503. {agno-1.8.0 → agno-1.8.2}/agno/utils/py_io.py +0 -0
  504. {agno-1.8.0 → agno-1.8.2}/agno/utils/pyproject.py +0 -0
  505. {agno-1.8.0 → agno-1.8.2}/agno/utils/resource_filter.py +0 -0
  506. {agno-1.8.0 → agno-1.8.2}/agno/utils/response.py +0 -0
  507. {agno-1.8.0 → agno-1.8.2}/agno/utils/response_iterator.py +0 -0
  508. {agno-1.8.0 → agno-1.8.2}/agno/utils/safe_formatter.py +0 -0
  509. {agno-1.8.0 → agno-1.8.2}/agno/utils/shell.py +0 -0
  510. {agno-1.8.0 → agno-1.8.2}/agno/utils/string.py +0 -0
  511. {agno-1.8.0 → agno-1.8.2}/agno/utils/timer.py +0 -0
  512. {agno-1.8.0 → agno-1.8.2}/agno/utils/tools.py +0 -0
  513. {agno-1.8.0 → agno-1.8.2}/agno/utils/web.py +0 -0
  514. {agno-1.8.0 → agno-1.8.2}/agno/utils/whatsapp.py +0 -0
  515. {agno-1.8.0 → agno-1.8.2}/agno/utils/yaml_io.py +0 -0
  516. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/__init__.py +0 -0
  517. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/base.py +0 -0
  518. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/cassandra/__init__.py +0 -0
  519. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/cassandra/cassandra.py +0 -0
  520. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  521. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/cassandra/index.py +0 -0
  522. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/chroma/__init__.py +0 -0
  523. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/chroma/chromadb.py +0 -0
  524. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/clickhouse/__init__.py +0 -0
  525. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  526. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/clickhouse/index.py +0 -0
  527. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/couchbase/__init__.py +0 -0
  528. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/couchbase/couchbase.py +0 -0
  529. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/distance.py +0 -0
  530. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/lancedb/__init__.py +0 -0
  531. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/lancedb/lance_db.py +0 -0
  532. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/milvus/__init__.py +0 -0
  533. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/milvus/milvus.py +0 -0
  534. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/mongodb/__init__.py +0 -0
  535. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/mongodb/mongodb.py +0 -0
  536. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/pgvector/__init__.py +0 -0
  537. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/pgvector/index.py +0 -0
  538. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/pgvector/pgvector.py +0 -0
  539. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/pineconedb/__init__.py +0 -0
  540. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  541. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/qdrant/__init__.py +0 -0
  542. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/search.py +0 -0
  543. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/singlestore/__init__.py +0 -0
  544. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/singlestore/index.py +0 -0
  545. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/singlestore/singlestore.py +0 -0
  546. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/surrealdb/__init__.py +0 -0
  547. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  548. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/upstashdb/__init__.py +0 -0
  549. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  550. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/weaviate/__init__.py +0 -0
  551. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/weaviate/index.py +0 -0
  552. {agno-1.8.0 → agno-1.8.2}/agno/vectordb/weaviate/weaviate.py +0 -0
  553. {agno-1.8.0 → agno-1.8.2}/agno/workflow/__init__.py +0 -0
  554. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/__init__.py +0 -0
  555. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/condition.py +0 -0
  556. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/loop.py +0 -0
  557. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/parallel.py +0 -0
  558. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/router.py +0 -0
  559. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/step.py +0 -0
  560. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/steps.py +0 -0
  561. {agno-1.8.0 → agno-1.8.2}/agno/workflow/v2/types.py +0 -0
  562. {agno-1.8.0 → agno-1.8.2}/agno/workflow/workflow.py +0 -0
  563. {agno-1.8.0/agno/utils/models → agno-1.8.2/agno/workspace}/__init__.py +0 -0
  564. {agno-1.8.0 → agno-1.8.2}/agno/workspace/config.py +0 -0
  565. {agno-1.8.0 → agno-1.8.2}/agno/workspace/enums.py +0 -0
  566. {agno-1.8.0 → agno-1.8.2}/agno/workspace/helpers.py +0 -0
  567. {agno-1.8.0 → agno-1.8.2}/agno/workspace/operator.py +0 -0
  568. {agno-1.8.0 → agno-1.8.2}/agno/workspace/settings.py +0 -0
  569. {agno-1.8.0 → agno-1.8.2}/agno.egg-info/dependency_links.txt +0 -0
  570. {agno-1.8.0 → agno-1.8.2}/agno.egg-info/entry_points.txt +0 -0
  571. {agno-1.8.0 → agno-1.8.2}/agno.egg-info/top_level.txt +0 -0
  572. {agno-1.8.0 → agno-1.8.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 1.8.0
3
+ Version: 1.8.2
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.
@@ -553,6 +553,8 @@ Provides-Extra: oxylabs
553
553
  Requires-Dist: oxylabs; extra == "oxylabs"
554
554
  Provides-Extra: trafilatura
555
555
  Requires-Dist: trafilatura; extra == "trafilatura"
556
+ Provides-Extra: neo4j
557
+ Requires-Dist: neo4j; extra == "neo4j"
556
558
  Provides-Extra: sql
557
559
  Requires-Dist: sqlalchemy; extra == "sql"
558
560
  Provides-Extra: postgres
@@ -670,6 +672,7 @@ Requires-Dist: agno[memori]; extra == "tools"
670
672
  Requires-Dist: agno[google_bigquery]; extra == "tools"
671
673
  Requires-Dist: agno[psycopg]; extra == "tools"
672
674
  Requires-Dist: agno[trafilatura]; extra == "tools"
675
+ Requires-Dist: agno[neo4j]; extra == "tools"
673
676
  Provides-Extra: storage
674
677
  Requires-Dist: agno[sql]; extra == "storage"
675
678
  Requires-Dist: agno[postgres]; extra == "storage"
@@ -0,0 +1,8 @@
1
+ from importlib.metadata import PackageNotFoundError, version
2
+
3
+ try:
4
+ __version__ = version("agno")
5
+ except PackageNotFoundError:
6
+ __version__ = "0.0.0"
7
+
8
+ __all__ = ["__version__"]
@@ -352,6 +352,7 @@ class Agent:
352
352
  agent_id: Optional[str] = None,
353
353
  introduction: Optional[str] = None,
354
354
  user_id: Optional[str] = None,
355
+ app_id: Optional[str] = None,
355
356
  session_id: Optional[str] = None,
356
357
  session_name: Optional[str] = None,
357
358
  session_state: Optional[Dict[str, Any]] = None,
@@ -443,6 +444,7 @@ class Agent:
443
444
  self.agent_id = agent_id
444
445
  self.introduction = introduction
445
446
  self.user_id = user_id
447
+ self.app_id = app_id
446
448
 
447
449
  self.session_id = session_id
448
450
  self.session_name = session_name
@@ -747,9 +749,7 @@ class Agent:
747
749
  self.session_id = session_id = str(uuid4())
748
750
 
749
751
  # Use the default user_id when necessary
750
- if user_id is not None and user_id != "":
751
- user_id = user_id
752
- else:
752
+ if user_id is None or user_id == "":
753
753
  user_id = self.user_id
754
754
 
755
755
  # Determine the session_state
@@ -1476,7 +1476,7 @@ class Agent:
1476
1476
 
1477
1477
  # Read existing session from storage
1478
1478
  if self.context is not None:
1479
- self.resolve_run_context()
1479
+ await self.aresolve_run_context()
1480
1480
 
1481
1481
  # Prepare arguments for the model
1482
1482
  self.set_default_model()
@@ -2152,7 +2152,7 @@ class Agent:
2152
2152
 
2153
2153
  # Read existing session from storage
2154
2154
  if self.context is not None:
2155
- self.resolve_run_context()
2155
+ await self.aresolve_run_context()
2156
2156
 
2157
2157
  # Prepare arguments for the model
2158
2158
  self.set_default_model()
@@ -69,7 +69,10 @@ class SessionMetrics:
69
69
  # Add values from other
70
70
  if other.prompt_tokens_details:
71
71
  for key, value in other.prompt_tokens_details.items():
72
- result.prompt_tokens_details[key] = result.prompt_tokens_details.get(key, 0) + value
72
+ existing_value = result.prompt_tokens_details.get(key, 0)
73
+ if not isinstance(existing_value, int):
74
+ continue
75
+ result.prompt_tokens_details[key] = existing_value + value
73
76
 
74
77
  # Handle completion_tokens_details similarly
75
78
  if self.completion_tokens_details or other.completion_tokens_details:
@@ -27,6 +27,7 @@ from agno.models.message import Message
27
27
  from agno.run.response import RunEvent, RunResponseContentEvent, RunResponseEvent, RunResponsePausedEvent
28
28
  from agno.run.team import RunResponseContentEvent as TeamRunResponseContentEvent
29
29
  from agno.run.team import TeamRunEvent, TeamRunResponseEvent
30
+ from agno.utils.message import get_text_from_message
30
31
 
31
32
 
32
33
  @dataclass
@@ -106,17 +107,23 @@ def extract_team_response_chunk_content(response: TeamRunResponseContentEvent) -
106
107
  members_content.append(f"Team member: {member_content}")
107
108
  members_response = "\n".join(members_content) if members_content else ""
108
109
 
109
- return str(response.content) + members_response
110
+ # Handle structured outputs
111
+ main_content = get_text_from_message(response.content) if response.content is not None else ""
112
+
113
+ return main_content + members_response
110
114
 
111
115
 
112
116
  def extract_response_chunk_content(response: RunResponseContentEvent) -> str:
113
117
  """Given a response stream chunk, find and extract the content."""
118
+
114
119
  if hasattr(response, "messages") and response.messages: # type: ignore
115
120
  for msg in reversed(response.messages): # type: ignore
116
121
  if hasattr(msg, "role") and msg.role == "assistant" and hasattr(msg, "content") and msg.content:
117
- return str(msg.content)
122
+ # Handle structured outputs from messages
123
+ return get_text_from_message(msg.content)
118
124
 
119
- return str(response.content) if response.content else ""
125
+ # Handle structured outputs
126
+ return get_text_from_message(response.content) if response.content is not None else ""
120
127
 
121
128
 
122
129
  def _create_events_from_chunk(
@@ -202,11 +209,11 @@ def _create_events_from_chunk(
202
209
 
203
210
  # Handle reasoning
204
211
  elif chunk.event == RunEvent.reasoning_started:
205
- step_event = StepStartedEvent(type=EventType.STEP_STARTED, step_name="reasoning")
206
- events_to_emit.append(step_event)
212
+ step_started_event = StepStartedEvent(type=EventType.STEP_STARTED, step_name="reasoning")
213
+ events_to_emit.append(step_started_event)
207
214
  elif chunk.event == RunEvent.reasoning_completed:
208
- step_event = StepFinishedEvent(type=EventType.STEP_FINISHED, step_name="reasoning")
209
- events_to_emit.append(step_event)
215
+ step_finished_event = StepFinishedEvent(type=EventType.STEP_FINISHED, step_name="reasoning")
216
+ events_to_emit.append(step_finished_event)
210
217
 
211
218
  return events_to_emit, message_started
212
219
 
@@ -220,7 +227,7 @@ def _create_completion_events(
220
227
  run_id: str,
221
228
  ) -> List[BaseEvent]:
222
229
  """Create events for run completion."""
223
- events_to_emit = []
230
+ events_to_emit: List[BaseEvent] = []
224
231
 
225
232
  # End remaining active tool calls if needed
226
233
  for tool_call_id in list(event_buffer.active_tool_call_ids):
@@ -271,7 +278,7 @@ def _create_completion_events(
271
278
 
272
279
  def _emit_event_logic(event: BaseEvent, event_buffer: EventBuffer) -> List[BaseEvent]:
273
280
  """Process an event through the buffer and return events to actually emit."""
274
- events_to_emit = []
281
+ events_to_emit: List[BaseEvent] = []
275
282
 
276
283
  if event_buffer.is_blocked():
277
284
  # Handle events related to the current blocking tool call
@@ -8,6 +8,7 @@ from agno.agent.agent import Agent, RunResponse
8
8
  from agno.media import Audio, File, Image, Video
9
9
  from agno.team.team import Team, TeamRunResponse
10
10
  from agno.utils.log import log_info, log_warning
11
+ from agno.utils.message import get_text_from_message
11
12
 
12
13
  try:
13
14
  import discord
@@ -167,7 +168,10 @@ class DiscordClient:
167
168
  thread=thread, message=f"Reasoning: \n{response.reasoning_content}", italics=True
168
169
  )
169
170
 
170
- await self._send_discord_messages(thread=thread, message=str(response.content))
171
+ # Handle structured outputs properly
172
+ content_message = get_text_from_message(response.content) if response.content is not None else ""
173
+
174
+ await self._send_discord_messages(thread=thread, message=content_message)
171
175
 
172
176
  async def _send_discord_messages(self, thread: discord.channel, message: str, italics: bool = False): # type: ignore
173
177
  if len(message) < 1500:
@@ -528,6 +528,7 @@ def get_async_playground_router(
528
528
  session_id=session.session_id,
529
529
  session_name=session.session_data.get("session_name") if session.session_data else None,
530
530
  created_at=session.created_at,
531
+ updated_at=session.updated_at,
531
532
  )
532
533
  )
533
534
  return agent_sessions
@@ -751,6 +752,7 @@ def get_async_playground_router(
751
752
  "session_id": session.session_id,
752
753
  "session_name": session.session_data.get("session_name") if session.session_data else None,
753
754
  "created_at": session.created_at,
755
+ "updated_at": session.updated_at,
754
756
  } # type: ignore
755
757
  )
756
758
  return workflow_sessions
@@ -945,6 +947,7 @@ def get_async_playground_router(
945
947
  session_id=session.session_id,
946
948
  session_name=session.session_data.get("session_name") if session.session_data else None,
947
949
  created_at=session.created_at,
950
+ updated_at=session.updated_at,
948
951
  )
949
952
  )
950
953
  return team_sessions
@@ -91,6 +91,7 @@ class AgentSessionsResponse(BaseModel):
91
91
  session_id: Optional[str] = None
92
92
  session_name: Optional[str] = None
93
93
  created_at: Optional[int] = None
94
+ updated_at: Optional[int] = None
94
95
 
95
96
 
96
97
  class MemoryResponse(BaseModel):
@@ -115,6 +116,7 @@ class WorkflowSessionResponse(BaseModel):
115
116
  session_id: Optional[str] = None
116
117
  session_name: Optional[str] = None
117
118
  created_at: Optional[int] = None
119
+ updated_at: Optional[int] = None
118
120
 
119
121
 
120
122
  class WorkflowGetResponse(BaseModel):
@@ -213,6 +215,7 @@ class TeamSessionResponse(BaseModel):
213
215
  session_id: Optional[str] = None
214
216
  session_name: Optional[str] = None
215
217
  created_at: Optional[int] = None
218
+ updated_at: Optional[int] = None
216
219
 
217
220
 
218
221
  class TeamRenameRequest(BaseModel):
@@ -528,6 +528,7 @@ def get_sync_playground_router(
528
528
  session_id=session.session_id,
529
529
  session_name=session.session_data.get("session_name") if session.session_data else None,
530
530
  created_at=session.created_at,
531
+ updated_at=session.updated_at,
531
532
  )
532
533
  )
533
534
  return agent_sessions
@@ -743,6 +744,7 @@ def get_sync_playground_router(
743
744
  "session_id": session.session_id,
744
745
  "session_name": session.session_data.get("session_name") if session.session_data else None,
745
746
  "created_at": session.created_at,
747
+ "updated_at": session.updated_at,
746
748
  } # type: ignore
747
749
  )
748
750
  return workflow_sessions
@@ -940,6 +942,7 @@ def get_sync_playground_router(
940
942
  session_id=session.session_id,
941
943
  session_name=session.session_data.get("session_name") if session.session_data else None,
942
944
  created_at=session.created_at,
945
+ updated_at=session.updated_at,
943
946
  )
944
947
  )
945
948
  return team_sessions
@@ -161,7 +161,8 @@ class AgentKnowledge(BaseModel):
161
161
 
162
162
  # Upsert documents if upsert is True and vector db supports upsert
163
163
  if upsert and self.vector_db.upsert_available():
164
- self.vector_db.upsert(documents=documents_to_load, filters=doc.meta_data)
164
+ for doc in documents_to_load:
165
+ self.vector_db.upsert(documents=[doc], filters=doc.meta_data)
165
166
  # Insert documents
166
167
  else:
167
168
  # Filter out documents which already exist in the vector db
@@ -170,7 +171,8 @@ class AgentKnowledge(BaseModel):
170
171
  documents_to_load = self.filter_existing_documents(document_list)
171
172
 
172
173
  if documents_to_load:
173
- self.vector_db.insert(documents=documents_to_load, filters=doc.meta_data)
174
+ for doc in documents_to_load:
175
+ self.vector_db.insert(documents=[doc], filters=doc.meta_data)
174
176
 
175
177
  num_documents += len(documents_to_load)
176
178
  log_info(f"Added {num_documents} documents to knowledge base")
@@ -204,7 +206,8 @@ class AgentKnowledge(BaseModel):
204
206
 
205
207
  # Upsert documents if upsert is True and vector db supports upsert
206
208
  if upsert and self.vector_db.upsert_available():
207
- await self.vector_db.async_upsert(documents=documents_to_load, filters=doc.meta_data)
209
+ for doc in documents_to_load:
210
+ await self.vector_db.async_upsert(documents=[doc], filters=doc.meta_data)
208
211
  # Insert documents
209
212
  else:
210
213
  # Filter out documents which already exist in the vector db
@@ -213,7 +216,8 @@ class AgentKnowledge(BaseModel):
213
216
  documents_to_load = await self.async_filter_existing_documents(document_list)
214
217
 
215
218
  if documents_to_load:
216
- await self.vector_db.async_insert(documents=documents_to_load, filters=doc.meta_data)
219
+ for doc in documents_to_load:
220
+ await self.vector_db.async_insert(documents=[doc], filters=doc.meta_data)
217
221
 
218
222
  num_documents += len(documents_to_load)
219
223
  log_info(f"Added {num_documents} documents to knowledge base")
@@ -157,7 +157,7 @@ class Video(BaseModel):
157
157
 
158
158
  @classmethod
159
159
  def from_artifact(cls, artifact: VideoArtifact) -> "Video":
160
- return cls(url=artifact.url)
160
+ return cls(url=artifact.url, content=artifact.content, format=artifact.mime_type)
161
161
 
162
162
 
163
163
  class Audio(BaseModel):
@@ -329,7 +329,7 @@ class Image(BaseModel):
329
329
 
330
330
  @classmethod
331
331
  def from_artifact(cls, artifact: ImageArtifact) -> "Image":
332
- return cls(url=artifact.url)
332
+ return cls(url=artifact.url, content=artifact.content, format=artifact.mime_type)
333
333
 
334
334
 
335
335
  class File(BaseModel):
@@ -11,7 +11,7 @@ from agno.models.base import Model
11
11
  from agno.models.message import Citations, DocumentCitation, Message, UrlCitation
12
12
  from agno.models.response import ModelResponse
13
13
  from agno.utils.log import log_debug, log_error, log_warning
14
- from agno.utils.models.claude import MCPServerConfiguration, format_messages
14
+ from agno.utils.models.claude import MCPServerConfiguration, format_messages, format_tools_for_model
15
15
 
16
16
  try:
17
17
  from anthropic import (
@@ -176,59 +176,12 @@ class Claude(Model):
176
176
  request_kwargs["system"] = [{"text": system_message, "type": "text"}]
177
177
 
178
178
  if tools:
179
- request_kwargs["tools"] = self._format_tools_for_model(tools)
179
+ request_kwargs["tools"] = format_tools_for_model(tools)
180
180
 
181
181
  if request_kwargs:
182
182
  log_debug(f"Calling {self.provider} with request parameters: {request_kwargs}", log_level=2)
183
183
  return request_kwargs
184
184
 
185
- def _format_tools_for_model(self, tools: Optional[List[Dict[str, Any]]] = None) -> Optional[List[Dict[str, Any]]]:
186
- """
187
- Transforms function definitions into a format accepted by the Anthropic API.
188
- """
189
- if not tools:
190
- return None
191
-
192
- parsed_tools: List[Dict[str, Any]] = []
193
- for tool_def in tools:
194
- if tool_def.get("type", "") != "function":
195
- parsed_tools.append(tool_def)
196
- continue
197
-
198
- func_def = tool_def.get("function", {})
199
- parameters: Dict[str, Any] = func_def.get("parameters", {})
200
- properties: Dict[str, Any] = parameters.get("properties", {})
201
- required_params: List[str] = []
202
-
203
- for param_name, param_info in properties.items():
204
- param_type = param_info.get("type", "")
205
- param_type_list: List[str] = [param_type] if isinstance(param_type, str) else param_type or []
206
-
207
- if "null" not in param_type_list:
208
- required_params.append(param_name)
209
-
210
- input_properties: Dict[str, Dict[str, Union[str, List[str]]]] = {}
211
- for param_name, param_info in properties.items():
212
- input_properties[param_name] = {
213
- "description": param_info.get("description", ""),
214
- }
215
- if "type" not in param_info and "anyOf" in param_info:
216
- input_properties[param_name]["anyOf"] = param_info["anyOf"]
217
- else:
218
- input_properties[param_name]["type"] = param_info.get("type", "")
219
-
220
- tool = {
221
- "name": func_def.get("name") or "",
222
- "description": func_def.get("description") or "",
223
- "input_schema": {
224
- "type": parameters.get("type", "object"),
225
- "properties": input_properties,
226
- "required": required_params,
227
- },
228
- }
229
- parsed_tools.append(tool)
230
- return parsed_tools
231
-
232
185
  def invoke(
233
186
  self,
234
187
  messages: List[Message],
@@ -570,16 +523,7 @@ class Claude(Model):
570
523
  }
571
524
 
572
525
  elif isinstance(response, ContentBlockStopEvent):
573
- # Handle completed thinking content
574
- if response.content_block.type == "thinking": # type: ignore
575
- model_response.thinking = response.content_block.thinking # type: ignore
576
- # Store signature if available
577
- if hasattr(response.content_block, "signature"): # type: ignore
578
- model_response.provider_data = {
579
- "signature": response.content_block.signature, # type: ignore
580
- }
581
- # Handle tool calls
582
- elif response.content_block.type == "tool_use": # type: ignore
526
+ if response.content_block.type == "tool_use": # type: ignore
583
527
  tool_use = response.content_block # type: ignore
584
528
  tool_name = tool_use.name
585
529
  tool_input = tool_use.input
@@ -179,14 +179,10 @@ class AwsBedrock(Model):
179
179
  required = []
180
180
 
181
181
  for param_name, param_info in func_def.get("parameters", {}).get("properties", {}).items():
182
- param_type = param_info.get("type")
183
- if isinstance(param_type, list):
184
- param_type = [t for t in param_type if t != "null"][0]
182
+ properties[param_name] = param_info.copy()
185
183
 
186
- properties[param_name] = {
187
- "type": param_type or "string",
188
- "description": param_info.get("description") or "",
189
- }
184
+ if "description" not in properties[param_name]:
185
+ properties[param_name]["description"] = ""
190
186
 
191
187
  if "null" not in (
192
188
  param_info.get("type") if isinstance(param_info.get("type"), list) else [param_info.get("type")]
@@ -19,7 +19,7 @@ class DashScope(OpenAILike):
19
19
  provider (str): The provider name. Defaults to "Qwen".
20
20
  api_key (Optional[str]): The DashScope API key.
21
21
  base_url (str): The base URL. Defaults to "https://dashscope-intl.aliyuncs.com/compatible-mode/v1".
22
- enable_thinking (Optional[bool]): Enable thinking process (DashScope native parameter). Defaults to None.
22
+ enable_thinking (bool): Enable thinking process (DashScope native parameter). Defaults to False.
23
23
  include_thoughts (Optional[bool]): Include thinking process in response (alternative parameter). Defaults to None.
24
24
  """
25
25
 
@@ -31,8 +31,9 @@ class DashScope(OpenAILike):
31
31
  base_url: str = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
32
32
 
33
33
  # Thinking parameters
34
- enable_thinking: Optional[bool] = None
34
+ enable_thinking: bool = False
35
35
  include_thoughts: Optional[bool] = None
36
+ thinking_budget: Optional[int] = None
36
37
 
37
38
  # DashScope supports structured outputs
38
39
  supports_native_structured_outputs: bool = True
@@ -75,7 +76,15 @@ class DashScope(OpenAILike):
75
76
  ) -> Dict[str, Any]:
76
77
  params = super().get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice)
77
78
 
78
- should_include_thoughts = self.enable_thinking or self.include_thoughts
79
- if should_include_thoughts:
80
- params["extra_body"] = {"enable_thinking": True}
79
+ if self.include_thoughts is not None:
80
+ self.enable_thinking = self.include_thoughts
81
+
82
+ if self.enable_thinking is not None:
83
+ params["extra_body"] = {
84
+ "enable_thinking": self.enable_thinking,
85
+ }
86
+
87
+ if self.thinking_budget is not None:
88
+ params["extra_body"]["thinking_budget"] = self.thinking_budget
89
+
81
90
  return params
@@ -793,12 +793,18 @@ class Gemini(Model):
793
793
  grounding_metadata = response.candidates[0].grounding_metadata.model_dump()
794
794
  citations_raw["grounding_metadata"] = grounding_metadata
795
795
 
796
- chunks = grounding_metadata.get("grounding_chunks", [])
797
- citation_pairs = [
798
- (chunk.get("web", {}).get("uri"), chunk.get("web", {}).get("title"))
799
- for chunk in chunks
800
- if chunk.get("web", {}).get("uri")
801
- ]
796
+ chunks = grounding_metadata.get("grounding_chunks", []) or []
797
+ citation_pairs = []
798
+ for chunk in chunks:
799
+ if not isinstance(chunk, dict):
800
+ continue
801
+ web = chunk.get("web")
802
+ if not isinstance(web, dict):
803
+ continue
804
+ uri = web.get("uri")
805
+ title = web.get("title")
806
+ if uri:
807
+ citation_pairs.append((uri, title))
802
808
 
803
809
  # Create citation objects from filtered pairs
804
810
  grounding_urls = [UrlCitation(url=url, title=title) for url, title in citation_pairs]
@@ -907,11 +913,17 @@ class Gemini(Model):
907
913
 
908
914
  # Extract url and title
909
915
  chunks = grounding_metadata.pop("grounding_chunks", None) or []
910
- citation_pairs = [
911
- (chunk.get("web", {}).get("uri"), chunk.get("web", {}).get("title"))
912
- for chunk in chunks
913
- if chunk.get("web", {}).get("uri")
914
- ]
916
+ citation_pairs = []
917
+ for chunk in chunks:
918
+ if not isinstance(chunk, dict):
919
+ continue
920
+ web = chunk.get("web")
921
+ if not isinstance(web, dict):
922
+ continue
923
+ uri = web.get("uri")
924
+ title = web.get("title")
925
+ if uri:
926
+ citation_pairs.append((uri, title))
915
927
 
916
928
  # Create citation objects from filtered pairs
917
929
  citations.urls = [UrlCitation(url=url, title=title) for url, title in citation_pairs]
@@ -77,7 +77,7 @@ class OpenAIChat(Model):
77
77
  max_retries: Optional[int] = None
78
78
  default_headers: Optional[Any] = None
79
79
  default_query: Optional[Any] = None
80
- http_client: Optional[httpx.Client] = None
80
+ http_client: Optional[Union[httpx.Client, httpx.AsyncClient]] = None
81
81
  client_params: Optional[Dict[str, Any]] = None
82
82
 
83
83
  # The role to map the message role to.
@@ -123,8 +123,11 @@ class OpenAIChat(Model):
123
123
  OpenAIClient: An instance of the OpenAI client.
124
124
  """
125
125
  client_params: Dict[str, Any] = self._get_client_params()
126
- if self.http_client is not None:
127
- client_params["http_client"] = self.http_client
126
+ if self.http_client:
127
+ if isinstance(self.http_client, httpx.Client):
128
+ client_params["http_client"] = self.http_client
129
+ else:
130
+ log_warning("http_client is not an instance of httpx.Client.")
128
131
  return OpenAIClient(**client_params)
129
132
 
130
133
  def get_async_client(self) -> AsyncOpenAIClient:
@@ -136,7 +139,14 @@ class OpenAIChat(Model):
136
139
  """
137
140
  client_params: Dict[str, Any] = self._get_client_params()
138
141
  if self.http_client:
139
- client_params["http_client"] = self.http_client
142
+ if isinstance(self.http_client, httpx.AsyncClient):
143
+ client_params["http_client"] = self.http_client
144
+ else:
145
+ log_warning("http_client is not an instance of httpx.AsyncClient. Using default httpx.AsyncClient.")
146
+ # Create a new async HTTP client with custom limits
147
+ client_params["http_client"] = httpx.AsyncClient(
148
+ limits=httpx.Limits(max_connections=1000, max_keepalive_connections=100)
149
+ )
140
150
  else:
141
151
  # Create a new async HTTP client with custom limits
142
152
  client_params["http_client"] = httpx.AsyncClient(