agno 1.8.0__tar.gz → 1.8.1__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 (571) hide show
  1. {agno-1.8.0 → agno-1.8.1}/PKG-INFO +4 -1
  2. {agno-1.8.0 → agno-1.8.1}/agno/agent/agent.py +3 -3
  3. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/agent.py +8 -4
  4. {agno-1.8.0 → agno-1.8.1}/agno/media.py +2 -2
  5. {agno-1.8.0 → agno-1.8.1}/agno/models/dashscope/dashscope.py +14 -5
  6. {agno-1.8.0 → agno-1.8.1}/agno/models/google/gemini.py +23 -11
  7. {agno-1.8.0 → agno-1.8.1}/agno/models/openai/chat.py +14 -4
  8. {agno-1.8.0 → agno-1.8.1}/agno/models/openai/responses.py +56 -11
  9. {agno-1.8.0 → agno-1.8.1}/agno/team/team.py +17 -1
  10. {agno-1.8.0 → agno-1.8.1}/agno/tools/confluence.py +63 -10
  11. {agno-1.8.0 → agno-1.8.1}/agno/tools/e2b.py +1 -1
  12. {agno-1.8.0 → agno-1.8.1}/agno/tools/gmail.py +1 -1
  13. agno-1.8.1/agno/tools/neo4j.py +132 -0
  14. {agno-1.8.0 → agno-1.8.1}/agno/utils/location.py +2 -2
  15. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/qdrant/qdrant.py +22 -0
  16. {agno-1.8.0 → agno-1.8.1}/agno.egg-info/PKG-INFO +4 -1
  17. {agno-1.8.0 → agno-1.8.1}/agno.egg-info/SOURCES.txt +1 -0
  18. {agno-1.8.0 → agno-1.8.1}/agno.egg-info/requires.txt +4 -0
  19. {agno-1.8.0 → agno-1.8.1}/pyproject.toml +4 -1
  20. {agno-1.8.0 → agno-1.8.1}/LICENSE +0 -0
  21. {agno-1.8.0 → agno-1.8.1}/README.md +0 -0
  22. {agno-1.8.0 → agno-1.8.1}/agno/__init__.py +0 -0
  23. {agno-1.8.0 → agno-1.8.1}/agno/agent/__init__.py +0 -0
  24. {agno-1.8.0 → agno-1.8.1}/agno/agent/metrics.py +0 -0
  25. {agno-1.8.0 → agno-1.8.1}/agno/api/__init__.py +0 -0
  26. {agno-1.8.0 → agno-1.8.1}/agno/api/agent.py +0 -0
  27. {agno-1.8.0 → agno-1.8.1}/agno/api/api.py +0 -0
  28. {agno-1.8.0 → agno-1.8.1}/agno/api/app.py +0 -0
  29. {agno-1.8.0 → agno-1.8.1}/agno/api/evals.py +0 -0
  30. {agno-1.8.0 → agno-1.8.1}/agno/api/playground.py +0 -0
  31. {agno-1.8.0 → agno-1.8.1}/agno/api/routes.py +0 -0
  32. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/__init__.py +0 -0
  33. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/agent.py +0 -0
  34. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/app.py +0 -0
  35. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/evals.py +0 -0
  36. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/playground.py +0 -0
  37. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/response.py +0 -0
  38. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/team.py +0 -0
  39. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/user.py +0 -0
  40. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/workflows.py +0 -0
  41. {agno-1.8.0 → agno-1.8.1}/agno/api/schemas/workspace.py +0 -0
  42. {agno-1.8.0 → agno-1.8.1}/agno/api/team.py +0 -0
  43. {agno-1.8.0 → agno-1.8.1}/agno/api/user.py +0 -0
  44. {agno-1.8.0 → agno-1.8.1}/agno/api/workflows.py +0 -0
  45. {agno-1.8.0 → agno-1.8.1}/agno/api/workspace.py +0 -0
  46. {agno-1.8.0 → agno-1.8.1}/agno/app/__init__.py +0 -0
  47. {agno-1.8.0 → agno-1.8.1}/agno/app/agui/__init__.py +0 -0
  48. {agno-1.8.0 → agno-1.8.1}/agno/app/agui/app.py +0 -0
  49. {agno-1.8.0 → agno-1.8.1}/agno/app/agui/async_router.py +0 -0
  50. {agno-1.8.0 → agno-1.8.1}/agno/app/agui/sync_router.py +0 -0
  51. {agno-1.8.0 → agno-1.8.1}/agno/app/agui/utils.py +0 -0
  52. {agno-1.8.0 → agno-1.8.1}/agno/app/base.py +0 -0
  53. {agno-1.8.0 → agno-1.8.1}/agno/app/discord/__init__.py +0 -0
  54. {agno-1.8.0 → agno-1.8.1}/agno/app/discord/client.py +0 -0
  55. {agno-1.8.0 → agno-1.8.1}/agno/app/fastapi/__init__.py +0 -0
  56. {agno-1.8.0 → agno-1.8.1}/agno/app/fastapi/app.py +0 -0
  57. {agno-1.8.0 → agno-1.8.1}/agno/app/fastapi/async_router.py +0 -0
  58. {agno-1.8.0 → agno-1.8.1}/agno/app/fastapi/sync_router.py +0 -0
  59. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/__init__.py +0 -0
  60. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/app.py +0 -0
  61. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/async_router.py +0 -0
  62. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/deploy.py +0 -0
  63. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/operator.py +0 -0
  64. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/schemas.py +0 -0
  65. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/serve.py +0 -0
  66. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/settings.py +0 -0
  67. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/sync_router.py +0 -0
  68. {agno-1.8.0 → agno-1.8.1}/agno/app/playground/utils.py +0 -0
  69. {agno-1.8.0 → agno-1.8.1}/agno/app/settings.py +0 -0
  70. {agno-1.8.0 → agno-1.8.1}/agno/app/slack/__init__.py +0 -0
  71. {agno-1.8.0 → agno-1.8.1}/agno/app/slack/app.py +0 -0
  72. {agno-1.8.0 → agno-1.8.1}/agno/app/slack/async_router.py +0 -0
  73. {agno-1.8.0 → agno-1.8.1}/agno/app/slack/security.py +0 -0
  74. {agno-1.8.0 → agno-1.8.1}/agno/app/slack/sync_router.py +0 -0
  75. {agno-1.8.0 → agno-1.8.1}/agno/app/utils.py +0 -0
  76. {agno-1.8.0 → agno-1.8.1}/agno/app/whatsapp/__init__.py +0 -0
  77. {agno-1.8.0 → agno-1.8.1}/agno/app/whatsapp/app.py +0 -0
  78. {agno-1.8.0 → agno-1.8.1}/agno/app/whatsapp/async_router.py +0 -0
  79. {agno-1.8.0 → agno-1.8.1}/agno/app/whatsapp/security.py +0 -0
  80. {agno-1.8.0 → agno-1.8.1}/agno/app/whatsapp/sync_router.py +0 -0
  81. {agno-1.8.0 → agno-1.8.1}/agno/cli/__init__.py +0 -0
  82. {agno-1.8.0 → agno-1.8.1}/agno/cli/auth_server.py +0 -0
  83. {agno-1.8.0 → agno-1.8.1}/agno/cli/config.py +0 -0
  84. {agno-1.8.0 → agno-1.8.1}/agno/cli/console.py +0 -0
  85. {agno-1.8.0 → agno-1.8.1}/agno/cli/credentials.py +0 -0
  86. {agno-1.8.0 → agno-1.8.1}/agno/cli/entrypoint.py +0 -0
  87. {agno-1.8.0 → agno-1.8.1}/agno/cli/operator.py +0 -0
  88. {agno-1.8.0 → agno-1.8.1}/agno/cli/settings.py +0 -0
  89. {agno-1.8.0 → agno-1.8.1}/agno/cli/ws/__init__.py +0 -0
  90. {agno-1.8.0 → agno-1.8.1}/agno/cli/ws/ws_cli.py +0 -0
  91. {agno-1.8.0 → agno-1.8.1}/agno/constants.py +0 -0
  92. {agno-1.8.0 → agno-1.8.1}/agno/debug.py +0 -0
  93. {agno-1.8.0 → agno-1.8.1}/agno/document/__init__.py +0 -0
  94. {agno-1.8.0 → agno-1.8.1}/agno/document/base.py +0 -0
  95. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/__init__.py +0 -0
  96. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/agentic.py +0 -0
  97. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/document.py +0 -0
  98. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/fixed.py +0 -0
  99. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/markdown.py +0 -0
  100. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/recursive.py +0 -0
  101. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/row.py +0 -0
  102. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/semantic.py +0 -0
  103. {agno-1.8.0 → agno-1.8.1}/agno/document/chunking/strategy.py +0 -0
  104. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/__init__.py +0 -0
  105. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/arxiv_reader.py +0 -0
  106. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/base.py +0 -0
  107. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/csv_reader.py +0 -0
  108. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/docx_reader.py +0 -0
  109. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/firecrawl_reader.py +0 -0
  110. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/gcs/__init__.py +0 -0
  111. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/gcs/pdf_reader.py +0 -0
  112. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/json_reader.py +0 -0
  113. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/markdown_reader.py +0 -0
  114. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/pdf_reader.py +0 -0
  115. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/s3/__init__.py +0 -0
  116. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/s3/pdf_reader.py +0 -0
  117. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/s3/text_reader.py +0 -0
  118. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/text_reader.py +0 -0
  119. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/url_reader.py +0 -0
  120. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/website_reader.py +0 -0
  121. {agno-1.8.0 → agno-1.8.1}/agno/document/reader/youtube_reader.py +0 -0
  122. {agno-1.8.0 → agno-1.8.1}/agno/embedder/__init__.py +0 -0
  123. {agno-1.8.0 → agno-1.8.1}/agno/embedder/aws_bedrock.py +0 -0
  124. {agno-1.8.0 → agno-1.8.1}/agno/embedder/azure_openai.py +0 -0
  125. {agno-1.8.0 → agno-1.8.1}/agno/embedder/base.py +0 -0
  126. {agno-1.8.0 → agno-1.8.1}/agno/embedder/cohere.py +0 -0
  127. {agno-1.8.0 → agno-1.8.1}/agno/embedder/fastembed.py +0 -0
  128. {agno-1.8.0 → agno-1.8.1}/agno/embedder/fireworks.py +0 -0
  129. {agno-1.8.0 → agno-1.8.1}/agno/embedder/google.py +0 -0
  130. {agno-1.8.0 → agno-1.8.1}/agno/embedder/huggingface.py +0 -0
  131. {agno-1.8.0 → agno-1.8.1}/agno/embedder/jina.py +0 -0
  132. {agno-1.8.0 → agno-1.8.1}/agno/embedder/langdb.py +0 -0
  133. {agno-1.8.0 → agno-1.8.1}/agno/embedder/mistral.py +0 -0
  134. {agno-1.8.0 → agno-1.8.1}/agno/embedder/nebius.py +0 -0
  135. {agno-1.8.0 → agno-1.8.1}/agno/embedder/ollama.py +0 -0
  136. {agno-1.8.0 → agno-1.8.1}/agno/embedder/openai.py +0 -0
  137. {agno-1.8.0 → agno-1.8.1}/agno/embedder/sentence_transformer.py +0 -0
  138. {agno-1.8.0 → agno-1.8.1}/agno/embedder/together.py +0 -0
  139. {agno-1.8.0 → agno-1.8.1}/agno/embedder/voyageai.py +0 -0
  140. {agno-1.8.0 → agno-1.8.1}/agno/eval/__init__.py +0 -0
  141. {agno-1.8.0 → agno-1.8.1}/agno/eval/accuracy.py +0 -0
  142. {agno-1.8.0 → agno-1.8.1}/agno/eval/performance.py +0 -0
  143. {agno-1.8.0 → agno-1.8.1}/agno/eval/reliability.py +0 -0
  144. {agno-1.8.0 → agno-1.8.1}/agno/eval/utils.py +0 -0
  145. {agno-1.8.0 → agno-1.8.1}/agno/exceptions.py +0 -0
  146. {agno-1.8.0 → agno-1.8.1}/agno/file/__init__.py +0 -0
  147. {agno-1.8.0 → agno-1.8.1}/agno/file/file.py +0 -0
  148. {agno-1.8.0 → agno-1.8.1}/agno/file/local/__init__.py +0 -0
  149. {agno-1.8.0 → agno-1.8.1}/agno/file/local/csv.py +0 -0
  150. {agno-1.8.0 → agno-1.8.1}/agno/file/local/txt.py +0 -0
  151. {agno-1.8.0 → agno-1.8.1}/agno/infra/__init__.py +0 -0
  152. {agno-1.8.0 → agno-1.8.1}/agno/infra/app.py +0 -0
  153. {agno-1.8.0 → agno-1.8.1}/agno/infra/base.py +0 -0
  154. {agno-1.8.0 → agno-1.8.1}/agno/infra/context.py +0 -0
  155. {agno-1.8.0 → agno-1.8.1}/agno/infra/db_app.py +0 -0
  156. {agno-1.8.0 → agno-1.8.1}/agno/infra/resource.py +0 -0
  157. {agno-1.8.0 → agno-1.8.1}/agno/infra/resources.py +0 -0
  158. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/__init__.py +0 -0
  159. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/arxiv.py +0 -0
  160. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/combined.py +0 -0
  161. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/csv.py +0 -0
  162. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/csv_url.py +0 -0
  163. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/document.py +0 -0
  164. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/docx.py +0 -0
  165. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/firecrawl.py +0 -0
  166. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/gcs/__init__.py +0 -0
  167. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/gcs/base.py +0 -0
  168. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/gcs/pdf.py +0 -0
  169. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/json.py +0 -0
  170. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/langchain.py +0 -0
  171. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/light_rag.py +0 -0
  172. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/llamaindex.py +0 -0
  173. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/markdown.py +0 -0
  174. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/pdf.py +0 -0
  175. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/pdf_bytes.py +0 -0
  176. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/pdf_url.py +0 -0
  177. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/s3/__init__.py +0 -0
  178. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/s3/base.py +0 -0
  179. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/s3/pdf.py +0 -0
  180. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/s3/text.py +0 -0
  181. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/text.py +0 -0
  182. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/url.py +0 -0
  183. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/website.py +0 -0
  184. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/wikipedia.py +0 -0
  185. {agno-1.8.0 → agno-1.8.1}/agno/knowledge/youtube.py +0 -0
  186. {agno-1.8.0 → agno-1.8.1}/agno/memory/__init__.py +0 -0
  187. {agno-1.8.0 → agno-1.8.1}/agno/memory/agent.py +0 -0
  188. {agno-1.8.0 → agno-1.8.1}/agno/memory/classifier.py +0 -0
  189. {agno-1.8.0 → agno-1.8.1}/agno/memory/db/__init__.py +0 -0
  190. {agno-1.8.0 → agno-1.8.1}/agno/memory/db/base.py +0 -0
  191. {agno-1.8.0 → agno-1.8.1}/agno/memory/db/mongodb.py +0 -0
  192. {agno-1.8.0 → agno-1.8.1}/agno/memory/db/postgres.py +0 -0
  193. {agno-1.8.0 → agno-1.8.1}/agno/memory/db/sqlite.py +0 -0
  194. {agno-1.8.0 → agno-1.8.1}/agno/memory/manager.py +0 -0
  195. {agno-1.8.0 → agno-1.8.1}/agno/memory/memory.py +0 -0
  196. {agno-1.8.0 → agno-1.8.1}/agno/memory/row.py +0 -0
  197. {agno-1.8.0 → agno-1.8.1}/agno/memory/summarizer.py +0 -0
  198. {agno-1.8.0 → agno-1.8.1}/agno/memory/summary.py +0 -0
  199. {agno-1.8.0 → agno-1.8.1}/agno/memory/team.py +0 -0
  200. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/__init__.py +0 -0
  201. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/db/__init__.py +0 -0
  202. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/db/base.py +0 -0
  203. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/db/firestore.py +0 -0
  204. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/db/mongodb.py +0 -0
  205. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/db/postgres.py +0 -0
  206. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/db/redis.py +0 -0
  207. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/db/schema.py +0 -0
  208. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/db/sqlite.py +0 -0
  209. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/manager.py +0 -0
  210. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/memory.py +0 -0
  211. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/schema.py +0 -0
  212. {agno-1.8.0 → agno-1.8.1}/agno/memory/v2/summarizer.py +0 -0
  213. {agno-1.8.0 → agno-1.8.1}/agno/memory/workflow.py +0 -0
  214. {agno-1.8.0 → agno-1.8.1}/agno/models/__init__.py +0 -0
  215. {agno-1.8.0 → agno-1.8.1}/agno/models/aimlapi/__init__.py +0 -0
  216. {agno-1.8.0 → agno-1.8.1}/agno/models/aimlapi/aimlapi.py +0 -0
  217. {agno-1.8.0 → agno-1.8.1}/agno/models/anthropic/__init__.py +0 -0
  218. {agno-1.8.0 → agno-1.8.1}/agno/models/anthropic/claude.py +0 -0
  219. {agno-1.8.0 → agno-1.8.1}/agno/models/aws/__init__.py +0 -0
  220. {agno-1.8.0 → agno-1.8.1}/agno/models/aws/bedrock.py +0 -0
  221. {agno-1.8.0 → agno-1.8.1}/agno/models/aws/claude.py +0 -0
  222. {agno-1.8.0 → agno-1.8.1}/agno/models/azure/__init__.py +0 -0
  223. {agno-1.8.0 → agno-1.8.1}/agno/models/azure/ai_foundry.py +0 -0
  224. {agno-1.8.0 → agno-1.8.1}/agno/models/azure/openai_chat.py +0 -0
  225. {agno-1.8.0 → agno-1.8.1}/agno/models/base.py +0 -0
  226. {agno-1.8.0 → agno-1.8.1}/agno/models/cerebras/__init__.py +0 -0
  227. {agno-1.8.0 → agno-1.8.1}/agno/models/cerebras/cerebras.py +0 -0
  228. {agno-1.8.0 → agno-1.8.1}/agno/models/cerebras/cerebras_openai.py +0 -0
  229. {agno-1.8.0 → agno-1.8.1}/agno/models/cohere/__init__.py +0 -0
  230. {agno-1.8.0 → agno-1.8.1}/agno/models/cohere/chat.py +0 -0
  231. {agno-1.8.0 → agno-1.8.1}/agno/models/dashscope/__init__.py +0 -0
  232. {agno-1.8.0 → agno-1.8.1}/agno/models/deepinfra/__init__.py +0 -0
  233. {agno-1.8.0 → agno-1.8.1}/agno/models/deepinfra/deepinfra.py +0 -0
  234. {agno-1.8.0 → agno-1.8.1}/agno/models/deepseek/__init__.py +0 -0
  235. {agno-1.8.0 → agno-1.8.1}/agno/models/deepseek/deepseek.py +0 -0
  236. {agno-1.8.0 → agno-1.8.1}/agno/models/defaults.py +0 -0
  237. {agno-1.8.0 → agno-1.8.1}/agno/models/fireworks/__init__.py +0 -0
  238. {agno-1.8.0 → agno-1.8.1}/agno/models/fireworks/fireworks.py +0 -0
  239. {agno-1.8.0 → agno-1.8.1}/agno/models/google/__init__.py +0 -0
  240. {agno-1.8.0 → agno-1.8.1}/agno/models/groq/__init__.py +0 -0
  241. {agno-1.8.0 → agno-1.8.1}/agno/models/groq/groq.py +0 -0
  242. {agno-1.8.0 → agno-1.8.1}/agno/models/huggingface/__init__.py +0 -0
  243. {agno-1.8.0 → agno-1.8.1}/agno/models/huggingface/huggingface.py +0 -0
  244. {agno-1.8.0 → agno-1.8.1}/agno/models/ibm/__init__.py +0 -0
  245. {agno-1.8.0 → agno-1.8.1}/agno/models/ibm/watsonx.py +0 -0
  246. {agno-1.8.0 → agno-1.8.1}/agno/models/internlm/__init__.py +0 -0
  247. {agno-1.8.0 → agno-1.8.1}/agno/models/internlm/internlm.py +0 -0
  248. {agno-1.8.0 → agno-1.8.1}/agno/models/langdb/__init__.py +0 -0
  249. {agno-1.8.0 → agno-1.8.1}/agno/models/langdb/langdb.py +0 -0
  250. {agno-1.8.0 → agno-1.8.1}/agno/models/litellm/__init__.py +0 -0
  251. {agno-1.8.0 → agno-1.8.1}/agno/models/litellm/chat.py +0 -0
  252. {agno-1.8.0 → agno-1.8.1}/agno/models/litellm/litellm_openai.py +0 -0
  253. {agno-1.8.0 → agno-1.8.1}/agno/models/lmstudio/__init__.py +0 -0
  254. {agno-1.8.0 → agno-1.8.1}/agno/models/lmstudio/lmstudio.py +0 -0
  255. {agno-1.8.0 → agno-1.8.1}/agno/models/message.py +0 -0
  256. {agno-1.8.0 → agno-1.8.1}/agno/models/meta/__init__.py +0 -0
  257. {agno-1.8.0 → agno-1.8.1}/agno/models/meta/llama.py +0 -0
  258. {agno-1.8.0 → agno-1.8.1}/agno/models/meta/llama_openai.py +0 -0
  259. {agno-1.8.0 → agno-1.8.1}/agno/models/mistral/__init__.py +0 -0
  260. {agno-1.8.0 → agno-1.8.1}/agno/models/mistral/mistral.py +0 -0
  261. {agno-1.8.0 → agno-1.8.1}/agno/models/nebius/__init__.py +0 -0
  262. {agno-1.8.0 → agno-1.8.1}/agno/models/nebius/nebius.py +0 -0
  263. {agno-1.8.0 → agno-1.8.1}/agno/models/nvidia/__init__.py +0 -0
  264. {agno-1.8.0 → agno-1.8.1}/agno/models/nvidia/nvidia.py +0 -0
  265. {agno-1.8.0 → agno-1.8.1}/agno/models/ollama/__init__.py +0 -0
  266. {agno-1.8.0 → agno-1.8.1}/agno/models/ollama/chat.py +0 -0
  267. {agno-1.8.0 → agno-1.8.1}/agno/models/ollama/tools.py +0 -0
  268. {agno-1.8.0 → agno-1.8.1}/agno/models/openai/__init__.py +0 -0
  269. {agno-1.8.0 → agno-1.8.1}/agno/models/openai/like.py +0 -0
  270. {agno-1.8.0 → agno-1.8.1}/agno/models/openrouter/__init__.py +0 -0
  271. {agno-1.8.0 → agno-1.8.1}/agno/models/openrouter/openrouter.py +0 -0
  272. {agno-1.8.0 → agno-1.8.1}/agno/models/perplexity/__init__.py +0 -0
  273. {agno-1.8.0 → agno-1.8.1}/agno/models/perplexity/perplexity.py +0 -0
  274. {agno-1.8.0 → agno-1.8.1}/agno/models/portkey/__init__.py +0 -0
  275. {agno-1.8.0 → agno-1.8.1}/agno/models/portkey/portkey.py +0 -0
  276. {agno-1.8.0 → agno-1.8.1}/agno/models/qwen/__init__.py +0 -0
  277. {agno-1.8.0 → agno-1.8.1}/agno/models/response.py +0 -0
  278. {agno-1.8.0 → agno-1.8.1}/agno/models/sambanova/__init__.py +0 -0
  279. {agno-1.8.0 → agno-1.8.1}/agno/models/sambanova/sambanova.py +0 -0
  280. {agno-1.8.0 → agno-1.8.1}/agno/models/together/__init__.py +0 -0
  281. {agno-1.8.0 → agno-1.8.1}/agno/models/together/together.py +0 -0
  282. {agno-1.8.0 → agno-1.8.1}/agno/models/vercel/__init__.py +0 -0
  283. {agno-1.8.0 → agno-1.8.1}/agno/models/vercel/v0.py +0 -0
  284. {agno-1.8.0 → agno-1.8.1}/agno/models/vllm/__init__.py +0 -0
  285. {agno-1.8.0 → agno-1.8.1}/agno/models/vllm/vllm.py +0 -0
  286. {agno-1.8.0 → agno-1.8.1}/agno/models/xai/__init__.py +0 -0
  287. {agno-1.8.0 → agno-1.8.1}/agno/models/xai/xai.py +0 -0
  288. {agno-1.8.0 → agno-1.8.1}/agno/playground/__init__.py +0 -0
  289. {agno-1.8.0 → agno-1.8.1}/agno/playground/deploy.py +0 -0
  290. {agno-1.8.0 → agno-1.8.1}/agno/playground/playground.py +0 -0
  291. {agno-1.8.0 → agno-1.8.1}/agno/playground/serve.py +0 -0
  292. {agno-1.8.0 → agno-1.8.1}/agno/playground/settings.py +0 -0
  293. {agno-1.8.0 → agno-1.8.1}/agno/py.typed +0 -0
  294. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/__init__.py +0 -0
  295. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/azure_ai_foundry.py +0 -0
  296. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/deepseek.py +0 -0
  297. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/default.py +0 -0
  298. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/groq.py +0 -0
  299. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/helpers.py +0 -0
  300. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/ollama.py +0 -0
  301. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/openai.py +0 -0
  302. {agno-1.8.0 → agno-1.8.1}/agno/reasoning/step.py +0 -0
  303. {agno-1.8.0 → agno-1.8.1}/agno/reranker/__init__.py +0 -0
  304. {agno-1.8.0 → agno-1.8.1}/agno/reranker/base.py +0 -0
  305. {agno-1.8.0 → agno-1.8.1}/agno/reranker/cohere.py +0 -0
  306. {agno-1.8.0 → agno-1.8.1}/agno/reranker/infinity.py +0 -0
  307. {agno-1.8.0 → agno-1.8.1}/agno/reranker/sentence_transformer.py +0 -0
  308. {agno-1.8.0 → agno-1.8.1}/agno/run/__init__.py +0 -0
  309. {agno-1.8.0 → agno-1.8.1}/agno/run/base.py +0 -0
  310. {agno-1.8.0 → agno-1.8.1}/agno/run/messages.py +0 -0
  311. {agno-1.8.0 → agno-1.8.1}/agno/run/response.py +0 -0
  312. {agno-1.8.0 → agno-1.8.1}/agno/run/team.py +0 -0
  313. {agno-1.8.0 → agno-1.8.1}/agno/run/v2/__init__.py +0 -0
  314. {agno-1.8.0 → agno-1.8.1}/agno/run/v2/workflow.py +0 -0
  315. {agno-1.8.0 → agno-1.8.1}/agno/run/workflow.py +0 -0
  316. {agno-1.8.0 → agno-1.8.1}/agno/storage/__init__.py +0 -0
  317. {agno-1.8.0 → agno-1.8.1}/agno/storage/agent/__init__.py +0 -0
  318. {agno-1.8.0 → agno-1.8.1}/agno/storage/agent/dynamodb.py +0 -0
  319. {agno-1.8.0 → agno-1.8.1}/agno/storage/agent/json.py +0 -0
  320. {agno-1.8.0 → agno-1.8.1}/agno/storage/agent/mongodb.py +0 -0
  321. {agno-1.8.0 → agno-1.8.1}/agno/storage/agent/postgres.py +0 -0
  322. {agno-1.8.0 → agno-1.8.1}/agno/storage/agent/singlestore.py +0 -0
  323. {agno-1.8.0 → agno-1.8.1}/agno/storage/agent/sqlite.py +0 -0
  324. {agno-1.8.0 → agno-1.8.1}/agno/storage/agent/yaml.py +0 -0
  325. {agno-1.8.0 → agno-1.8.1}/agno/storage/base.py +0 -0
  326. {agno-1.8.0 → agno-1.8.1}/agno/storage/dynamodb.py +0 -0
  327. {agno-1.8.0 → agno-1.8.1}/agno/storage/firestore.py +0 -0
  328. {agno-1.8.0 → agno-1.8.1}/agno/storage/gcs_json.py +0 -0
  329. {agno-1.8.0 → agno-1.8.1}/agno/storage/in_memory.py +0 -0
  330. {agno-1.8.0 → agno-1.8.1}/agno/storage/json.py +0 -0
  331. {agno-1.8.0 → agno-1.8.1}/agno/storage/mongodb.py +0 -0
  332. {agno-1.8.0 → agno-1.8.1}/agno/storage/mysql.py +0 -0
  333. {agno-1.8.0 → agno-1.8.1}/agno/storage/postgres.py +0 -0
  334. {agno-1.8.0 → agno-1.8.1}/agno/storage/redis.py +0 -0
  335. {agno-1.8.0 → agno-1.8.1}/agno/storage/session/__init__.py +0 -0
  336. {agno-1.8.0 → agno-1.8.1}/agno/storage/session/agent.py +0 -0
  337. {agno-1.8.0 → agno-1.8.1}/agno/storage/session/team.py +0 -0
  338. {agno-1.8.0 → agno-1.8.1}/agno/storage/session/v2/__init__.py +0 -0
  339. {agno-1.8.0 → agno-1.8.1}/agno/storage/session/v2/workflow.py +0 -0
  340. {agno-1.8.0 → agno-1.8.1}/agno/storage/session/workflow.py +0 -0
  341. {agno-1.8.0 → agno-1.8.1}/agno/storage/singlestore.py +0 -0
  342. {agno-1.8.0 → agno-1.8.1}/agno/storage/sqlite.py +0 -0
  343. {agno-1.8.0 → agno-1.8.1}/agno/storage/workflow/__init__.py +0 -0
  344. {agno-1.8.0 → agno-1.8.1}/agno/storage/workflow/mongodb.py +0 -0
  345. {agno-1.8.0 → agno-1.8.1}/agno/storage/workflow/postgres.py +0 -0
  346. {agno-1.8.0 → agno-1.8.1}/agno/storage/workflow/sqlite.py +0 -0
  347. {agno-1.8.0 → agno-1.8.1}/agno/storage/yaml.py +0 -0
  348. {agno-1.8.0 → agno-1.8.1}/agno/team/__init__.py +0 -0
  349. {agno-1.8.0 → agno-1.8.1}/agno/tools/__init__.py +0 -0
  350. {agno-1.8.0 → agno-1.8.1}/agno/tools/agentql.py +0 -0
  351. {agno-1.8.0 → agno-1.8.1}/agno/tools/airflow.py +0 -0
  352. {agno-1.8.0 → agno-1.8.1}/agno/tools/api.py +0 -0
  353. {agno-1.8.0 → agno-1.8.1}/agno/tools/apify.py +0 -0
  354. {agno-1.8.0 → agno-1.8.1}/agno/tools/arxiv.py +0 -0
  355. {agno-1.8.0 → agno-1.8.1}/agno/tools/aws_lambda.py +0 -0
  356. {agno-1.8.0 → agno-1.8.1}/agno/tools/aws_ses.py +0 -0
  357. {agno-1.8.0 → agno-1.8.1}/agno/tools/baidusearch.py +0 -0
  358. {agno-1.8.0 → agno-1.8.1}/agno/tools/bitbucket.py +0 -0
  359. {agno-1.8.0 → agno-1.8.1}/agno/tools/brandfetch.py +0 -0
  360. {agno-1.8.0 → agno-1.8.1}/agno/tools/bravesearch.py +0 -0
  361. {agno-1.8.0 → agno-1.8.1}/agno/tools/brightdata.py +0 -0
  362. {agno-1.8.0 → agno-1.8.1}/agno/tools/browserbase.py +0 -0
  363. {agno-1.8.0 → agno-1.8.1}/agno/tools/calcom.py +0 -0
  364. {agno-1.8.0 → agno-1.8.1}/agno/tools/calculator.py +0 -0
  365. {agno-1.8.0 → agno-1.8.1}/agno/tools/cartesia.py +0 -0
  366. {agno-1.8.0 → agno-1.8.1}/agno/tools/clickup_tool.py +0 -0
  367. {agno-1.8.0 → agno-1.8.1}/agno/tools/crawl4ai.py +0 -0
  368. {agno-1.8.0 → agno-1.8.1}/agno/tools/csv_toolkit.py +0 -0
  369. {agno-1.8.0 → agno-1.8.1}/agno/tools/dalle.py +0 -0
  370. {agno-1.8.0 → agno-1.8.1}/agno/tools/daytona.py +0 -0
  371. {agno-1.8.0 → agno-1.8.1}/agno/tools/decorator.py +0 -0
  372. {agno-1.8.0 → agno-1.8.1}/agno/tools/desi_vocal.py +0 -0
  373. {agno-1.8.0 → agno-1.8.1}/agno/tools/discord.py +0 -0
  374. {agno-1.8.0 → agno-1.8.1}/agno/tools/docker.py +0 -0
  375. {agno-1.8.0 → agno-1.8.1}/agno/tools/duckdb.py +0 -0
  376. {agno-1.8.0 → agno-1.8.1}/agno/tools/duckduckgo.py +0 -0
  377. {agno-1.8.0 → agno-1.8.1}/agno/tools/eleven_labs.py +0 -0
  378. {agno-1.8.0 → agno-1.8.1}/agno/tools/email.py +0 -0
  379. {agno-1.8.0 → agno-1.8.1}/agno/tools/evm.py +0 -0
  380. {agno-1.8.0 → agno-1.8.1}/agno/tools/exa.py +0 -0
  381. {agno-1.8.0 → agno-1.8.1}/agno/tools/fal.py +0 -0
  382. {agno-1.8.0 → agno-1.8.1}/agno/tools/file.py +0 -0
  383. {agno-1.8.0 → agno-1.8.1}/agno/tools/financial_datasets.py +0 -0
  384. {agno-1.8.0 → agno-1.8.1}/agno/tools/firecrawl.py +0 -0
  385. {agno-1.8.0 → agno-1.8.1}/agno/tools/function.py +0 -0
  386. {agno-1.8.0 → agno-1.8.1}/agno/tools/giphy.py +0 -0
  387. {agno-1.8.0 → agno-1.8.1}/agno/tools/github.py +0 -0
  388. {agno-1.8.0 → agno-1.8.1}/agno/tools/google_bigquery.py +0 -0
  389. {agno-1.8.0 → agno-1.8.1}/agno/tools/google_maps.py +0 -0
  390. {agno-1.8.0 → agno-1.8.1}/agno/tools/googlecalendar.py +0 -0
  391. {agno-1.8.0 → agno-1.8.1}/agno/tools/googlesearch.py +0 -0
  392. {agno-1.8.0 → agno-1.8.1}/agno/tools/googlesheets.py +0 -0
  393. {agno-1.8.0 → agno-1.8.1}/agno/tools/hackernews.py +0 -0
  394. {agno-1.8.0 → agno-1.8.1}/agno/tools/jina.py +0 -0
  395. {agno-1.8.0 → agno-1.8.1}/agno/tools/jira.py +0 -0
  396. {agno-1.8.0 → agno-1.8.1}/agno/tools/knowledge.py +0 -0
  397. {agno-1.8.0 → agno-1.8.1}/agno/tools/linear.py +0 -0
  398. {agno-1.8.0 → agno-1.8.1}/agno/tools/linkup.py +0 -0
  399. {agno-1.8.0 → agno-1.8.1}/agno/tools/local_file_system.py +0 -0
  400. {agno-1.8.0 → agno-1.8.1}/agno/tools/lumalab.py +0 -0
  401. {agno-1.8.0 → agno-1.8.1}/agno/tools/mcp.py +0 -0
  402. {agno-1.8.0 → agno-1.8.1}/agno/tools/mem0.py +0 -0
  403. {agno-1.8.0 → agno-1.8.1}/agno/tools/memori.py +0 -0
  404. {agno-1.8.0 → agno-1.8.1}/agno/tools/mlx_transcribe.py +0 -0
  405. {agno-1.8.0 → agno-1.8.1}/agno/tools/models/__init__.py +0 -0
  406. {agno-1.8.0 → agno-1.8.1}/agno/tools/models/azure_openai.py +0 -0
  407. {agno-1.8.0 → agno-1.8.1}/agno/tools/models/gemini.py +0 -0
  408. {agno-1.8.0 → agno-1.8.1}/agno/tools/models/groq.py +0 -0
  409. {agno-1.8.0 → agno-1.8.1}/agno/tools/models/morph.py +0 -0
  410. {agno-1.8.0 → agno-1.8.1}/agno/tools/models/nebius.py +0 -0
  411. {agno-1.8.0 → agno-1.8.1}/agno/tools/models_labs.py +0 -0
  412. {agno-1.8.0 → agno-1.8.1}/agno/tools/moviepy_video.py +0 -0
  413. {agno-1.8.0 → agno-1.8.1}/agno/tools/newspaper.py +0 -0
  414. {agno-1.8.0 → agno-1.8.1}/agno/tools/newspaper4k.py +0 -0
  415. {agno-1.8.0 → agno-1.8.1}/agno/tools/openai.py +0 -0
  416. {agno-1.8.0 → agno-1.8.1}/agno/tools/openbb.py +0 -0
  417. {agno-1.8.0 → agno-1.8.1}/agno/tools/opencv.py +0 -0
  418. {agno-1.8.0 → agno-1.8.1}/agno/tools/openweather.py +0 -0
  419. {agno-1.8.0 → agno-1.8.1}/agno/tools/oxylabs.py +0 -0
  420. {agno-1.8.0 → agno-1.8.1}/agno/tools/pandas.py +0 -0
  421. {agno-1.8.0 → agno-1.8.1}/agno/tools/postgres.py +0 -0
  422. {agno-1.8.0 → agno-1.8.1}/agno/tools/pubmed.py +0 -0
  423. {agno-1.8.0 → agno-1.8.1}/agno/tools/python.py +0 -0
  424. {agno-1.8.0 → agno-1.8.1}/agno/tools/reasoning.py +0 -0
  425. {agno-1.8.0 → agno-1.8.1}/agno/tools/reddit.py +0 -0
  426. {agno-1.8.0 → agno-1.8.1}/agno/tools/replicate.py +0 -0
  427. {agno-1.8.0 → agno-1.8.1}/agno/tools/resend.py +0 -0
  428. {agno-1.8.0 → agno-1.8.1}/agno/tools/scrapegraph.py +0 -0
  429. {agno-1.8.0 → agno-1.8.1}/agno/tools/searxng.py +0 -0
  430. {agno-1.8.0 → agno-1.8.1}/agno/tools/serpapi.py +0 -0
  431. {agno-1.8.0 → agno-1.8.1}/agno/tools/serper.py +0 -0
  432. {agno-1.8.0 → agno-1.8.1}/agno/tools/shell.py +0 -0
  433. {agno-1.8.0 → agno-1.8.1}/agno/tools/slack.py +0 -0
  434. {agno-1.8.0 → agno-1.8.1}/agno/tools/sleep.py +0 -0
  435. {agno-1.8.0 → agno-1.8.1}/agno/tools/spider.py +0 -0
  436. {agno-1.8.0 → agno-1.8.1}/agno/tools/sql.py +0 -0
  437. {agno-1.8.0 → agno-1.8.1}/agno/tools/streamlit/__init__.py +0 -0
  438. {agno-1.8.0 → agno-1.8.1}/agno/tools/streamlit/components.py +0 -0
  439. {agno-1.8.0 → agno-1.8.1}/agno/tools/tavily.py +0 -0
  440. {agno-1.8.0 → agno-1.8.1}/agno/tools/telegram.py +0 -0
  441. {agno-1.8.0 → agno-1.8.1}/agno/tools/thinking.py +0 -0
  442. {agno-1.8.0 → agno-1.8.1}/agno/tools/todoist.py +0 -0
  443. {agno-1.8.0 → agno-1.8.1}/agno/tools/tool_registry.py +0 -0
  444. {agno-1.8.0 → agno-1.8.1}/agno/tools/toolkit.py +0 -0
  445. {agno-1.8.0 → agno-1.8.1}/agno/tools/trafilatura.py +0 -0
  446. {agno-1.8.0 → agno-1.8.1}/agno/tools/trello.py +0 -0
  447. {agno-1.8.0 → agno-1.8.1}/agno/tools/twilio.py +0 -0
  448. {agno-1.8.0 → agno-1.8.1}/agno/tools/user_control_flow.py +0 -0
  449. {agno-1.8.0 → agno-1.8.1}/agno/tools/valyu.py +0 -0
  450. {agno-1.8.0 → agno-1.8.1}/agno/tools/visualization.py +0 -0
  451. {agno-1.8.0 → agno-1.8.1}/agno/tools/webbrowser.py +0 -0
  452. {agno-1.8.0 → agno-1.8.1}/agno/tools/webex.py +0 -0
  453. {agno-1.8.0 → agno-1.8.1}/agno/tools/website.py +0 -0
  454. {agno-1.8.0 → agno-1.8.1}/agno/tools/webtools.py +0 -0
  455. {agno-1.8.0 → agno-1.8.1}/agno/tools/whatsapp.py +0 -0
  456. {agno-1.8.0 → agno-1.8.1}/agno/tools/wikipedia.py +0 -0
  457. {agno-1.8.0 → agno-1.8.1}/agno/tools/x.py +0 -0
  458. {agno-1.8.0 → agno-1.8.1}/agno/tools/yfinance.py +0 -0
  459. {agno-1.8.0 → agno-1.8.1}/agno/tools/youtube.py +0 -0
  460. {agno-1.8.0 → agno-1.8.1}/agno/tools/zendesk.py +0 -0
  461. {agno-1.8.0 → agno-1.8.1}/agno/tools/zep.py +0 -0
  462. {agno-1.8.0 → agno-1.8.1}/agno/tools/zoom.py +0 -0
  463. {agno-1.8.0 → agno-1.8.1}/agno/utils/__init__.py +0 -0
  464. {agno-1.8.0 → agno-1.8.1}/agno/utils/audio.py +0 -0
  465. {agno-1.8.0 → agno-1.8.1}/agno/utils/certs.py +0 -0
  466. {agno-1.8.0 → agno-1.8.1}/agno/utils/code_execution.py +0 -0
  467. {agno-1.8.0 → agno-1.8.1}/agno/utils/common.py +0 -0
  468. {agno-1.8.0 → agno-1.8.1}/agno/utils/defaults.py +0 -0
  469. {agno-1.8.0 → agno-1.8.1}/agno/utils/dttm.py +0 -0
  470. {agno-1.8.0 → agno-1.8.1}/agno/utils/enum.py +0 -0
  471. {agno-1.8.0 → agno-1.8.1}/agno/utils/env.py +0 -0
  472. {agno-1.8.0 → agno-1.8.1}/agno/utils/events.py +0 -0
  473. {agno-1.8.0 → agno-1.8.1}/agno/utils/filesystem.py +0 -0
  474. {agno-1.8.0 → agno-1.8.1}/agno/utils/format_str.py +0 -0
  475. {agno-1.8.0 → agno-1.8.1}/agno/utils/functions.py +0 -0
  476. {agno-1.8.0 → agno-1.8.1}/agno/utils/gemini.py +0 -0
  477. {agno-1.8.0 → agno-1.8.1}/agno/utils/git.py +0 -0
  478. {agno-1.8.0 → agno-1.8.1}/agno/utils/http.py +0 -0
  479. {agno-1.8.0 → agno-1.8.1}/agno/utils/json_io.py +0 -0
  480. {agno-1.8.0 → agno-1.8.1}/agno/utils/json_schema.py +0 -0
  481. {agno-1.8.0 → agno-1.8.1}/agno/utils/load_env.py +0 -0
  482. {agno-1.8.0 → agno-1.8.1}/agno/utils/log.py +0 -0
  483. {agno-1.8.0 → agno-1.8.1}/agno/utils/mcp.py +0 -0
  484. {agno-1.8.0 → agno-1.8.1}/agno/utils/media.py +0 -0
  485. {agno-1.8.0 → agno-1.8.1}/agno/utils/merge_dict.py +0 -0
  486. {agno-1.8.0 → agno-1.8.1}/agno/utils/message.py +0 -0
  487. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/__init__.py +0 -0
  488. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/ai_foundry.py +0 -0
  489. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/aws_claude.py +0 -0
  490. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/claude.py +0 -0
  491. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/cohere.py +0 -0
  492. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/llama.py +0 -0
  493. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/mistral.py +0 -0
  494. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/openai_responses.py +0 -0
  495. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/schema_utils.py +0 -0
  496. {agno-1.8.0 → agno-1.8.1}/agno/utils/models/watsonx.py +0 -0
  497. {agno-1.8.0 → agno-1.8.1}/agno/utils/openai.py +0 -0
  498. {agno-1.8.0 → agno-1.8.1}/agno/utils/pickle.py +0 -0
  499. {agno-1.8.0 → agno-1.8.1}/agno/utils/pprint.py +0 -0
  500. {agno-1.8.0 → agno-1.8.1}/agno/utils/prompts.py +0 -0
  501. {agno-1.8.0 → agno-1.8.1}/agno/utils/py_io.py +0 -0
  502. {agno-1.8.0 → agno-1.8.1}/agno/utils/pyproject.py +0 -0
  503. {agno-1.8.0 → agno-1.8.1}/agno/utils/resource_filter.py +0 -0
  504. {agno-1.8.0 → agno-1.8.1}/agno/utils/response.py +0 -0
  505. {agno-1.8.0 → agno-1.8.1}/agno/utils/response_iterator.py +0 -0
  506. {agno-1.8.0 → agno-1.8.1}/agno/utils/safe_formatter.py +0 -0
  507. {agno-1.8.0 → agno-1.8.1}/agno/utils/shell.py +0 -0
  508. {agno-1.8.0 → agno-1.8.1}/agno/utils/string.py +0 -0
  509. {agno-1.8.0 → agno-1.8.1}/agno/utils/timer.py +0 -0
  510. {agno-1.8.0 → agno-1.8.1}/agno/utils/tools.py +0 -0
  511. {agno-1.8.0 → agno-1.8.1}/agno/utils/web.py +0 -0
  512. {agno-1.8.0 → agno-1.8.1}/agno/utils/whatsapp.py +0 -0
  513. {agno-1.8.0 → agno-1.8.1}/agno/utils/yaml_io.py +0 -0
  514. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/__init__.py +0 -0
  515. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/base.py +0 -0
  516. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/cassandra/__init__.py +0 -0
  517. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/cassandra/cassandra.py +0 -0
  518. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  519. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/cassandra/index.py +0 -0
  520. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/chroma/__init__.py +0 -0
  521. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/chroma/chromadb.py +0 -0
  522. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/clickhouse/__init__.py +0 -0
  523. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  524. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/clickhouse/index.py +0 -0
  525. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/couchbase/__init__.py +0 -0
  526. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/couchbase/couchbase.py +0 -0
  527. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/distance.py +0 -0
  528. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/lancedb/__init__.py +0 -0
  529. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/lancedb/lance_db.py +0 -0
  530. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/milvus/__init__.py +0 -0
  531. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/milvus/milvus.py +0 -0
  532. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/mongodb/__init__.py +0 -0
  533. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/mongodb/mongodb.py +0 -0
  534. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/pgvector/__init__.py +0 -0
  535. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/pgvector/index.py +0 -0
  536. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/pgvector/pgvector.py +0 -0
  537. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/pineconedb/__init__.py +0 -0
  538. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  539. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/qdrant/__init__.py +0 -0
  540. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/search.py +0 -0
  541. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/singlestore/__init__.py +0 -0
  542. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/singlestore/index.py +0 -0
  543. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/singlestore/singlestore.py +0 -0
  544. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/surrealdb/__init__.py +0 -0
  545. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  546. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/upstashdb/__init__.py +0 -0
  547. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  548. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/weaviate/__init__.py +0 -0
  549. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/weaviate/index.py +0 -0
  550. {agno-1.8.0 → agno-1.8.1}/agno/vectordb/weaviate/weaviate.py +0 -0
  551. {agno-1.8.0 → agno-1.8.1}/agno/workflow/__init__.py +0 -0
  552. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/__init__.py +0 -0
  553. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/condition.py +0 -0
  554. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/loop.py +0 -0
  555. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/parallel.py +0 -0
  556. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/router.py +0 -0
  557. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/step.py +0 -0
  558. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/steps.py +0 -0
  559. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/types.py +0 -0
  560. {agno-1.8.0 → agno-1.8.1}/agno/workflow/v2/workflow.py +0 -0
  561. {agno-1.8.0 → agno-1.8.1}/agno/workflow/workflow.py +0 -0
  562. {agno-1.8.0 → agno-1.8.1}/agno/workspace/__init__.py +0 -0
  563. {agno-1.8.0 → agno-1.8.1}/agno/workspace/config.py +0 -0
  564. {agno-1.8.0 → agno-1.8.1}/agno/workspace/enums.py +0 -0
  565. {agno-1.8.0 → agno-1.8.1}/agno/workspace/helpers.py +0 -0
  566. {agno-1.8.0 → agno-1.8.1}/agno/workspace/operator.py +0 -0
  567. {agno-1.8.0 → agno-1.8.1}/agno/workspace/settings.py +0 -0
  568. {agno-1.8.0 → agno-1.8.1}/agno.egg-info/dependency_links.txt +0 -0
  569. {agno-1.8.0 → agno-1.8.1}/agno.egg-info/entry_points.txt +0 -0
  570. {agno-1.8.0 → agno-1.8.1}/agno.egg-info/top_level.txt +0 -0
  571. {agno-1.8.0 → agno-1.8.1}/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.1
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"
@@ -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
@@ -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):
@@ -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(
@@ -44,6 +44,7 @@ class OpenAIResponses(Model):
44
44
  reasoning: Optional[Dict[str, Any]] = None
45
45
  verbosity: Optional[Literal["low", "medium", "high"]] = None
46
46
  reasoning_effort: Optional[Literal["minimal", "medium", "high"]] = None
47
+ reasoning_summary: Optional[Literal["auto", "concise", "detailed"]] = None
47
48
  store: Optional[bool] = None
48
49
  temperature: Optional[float] = None
49
50
  top_p: Optional[float] = None
@@ -84,6 +85,18 @@ class OpenAIResponses(Model):
84
85
  """Return True if the contextual used model is a known reasoning model."""
85
86
  return self.id.startswith("o3") or self.id.startswith("o4-mini") or self.id.startswith("gpt-5")
86
87
 
88
+ def _set_reasoning_request_param(self, base_params: Dict[str, Any]) -> Dict[str, Any]:
89
+ """Set the reasoning request parameter."""
90
+ base_params["reasoning"] = self.reasoning or {}
91
+
92
+ if self.reasoning_effort is not None:
93
+ base_params["reasoning"]["effort"] = self.reasoning_effort
94
+
95
+ if self.reasoning_summary is not None:
96
+ base_params["reasoning"]["summary"] = self.reasoning_summary
97
+
98
+ return base_params
99
+
87
100
  def _get_client_params(self) -> Dict[str, Any]:
88
101
  """
89
102
  Get client parameters for API requests.
@@ -185,12 +198,8 @@ class OpenAIResponses(Model):
185
198
  "user": self.user,
186
199
  "service_tier": self.service_tier,
187
200
  }
188
-
189
- # Handle reasoning parameter - convert reasoning_effort to reasoning format
190
- if self.reasoning is not None:
191
- base_params["reasoning"] = self.reasoning
192
- elif self.reasoning_effort is not None:
193
- base_params["reasoning"] = {"effort": self.reasoning_effort}
201
+ # Populate the reasoning parameter
202
+ base_params = self._set_reasoning_request_param(base_params)
194
203
 
195
204
  # Build text parameter
196
205
  text_params: Dict[str, Any] = {}
@@ -478,7 +487,6 @@ class OpenAIResponses(Model):
478
487
  request_params = self.get_request_params(
479
488
  messages=messages, response_format=response_format, tools=tools, tool_choice=tool_choice
480
489
  )
481
-
482
490
  return self.get_client().responses.create(
483
491
  model=self.id,
484
492
  input=self._format_messages(messages), # type: ignore
@@ -730,7 +738,10 @@ class OpenAIResponses(Model):
730
738
 
731
739
  # Add role
732
740
  model_response.role = "assistant"
741
+ reasoning_summary: str = ""
742
+
733
743
  for output in response.output:
744
+ # Add content
734
745
  if output.type == "message":
735
746
  model_response.content = response.output_text
736
747
 
@@ -746,6 +757,8 @@ class OpenAIResponses(Model):
746
757
  citations.urls.append(UrlCitation(url=annotation.url, title=annotation.title))
747
758
  if citations.urls or citations.documents:
748
759
  model_response.citations = citations
760
+
761
+ # Add tool calls
749
762
  elif output.type == "function_call":
750
763
  if model_response.tool_calls is None:
751
764
  model_response.tool_calls = []
@@ -765,10 +778,24 @@ class OpenAIResponses(Model):
765
778
  model_response.extra = model_response.extra or {}
766
779
  model_response.extra.setdefault("tool_call_ids", []).append(output.call_id)
767
780
 
768
- # i.e. we asked for reasoning, so we need to add the reasoning content
769
- if self.reasoning is not None:
781
+ # Add reasoning summary
782
+ elif output.type == "reasoning":
783
+ if reasoning_summaries := getattr(output, "summary", None):
784
+ for summary in reasoning_summaries:
785
+ if isinstance(summary, dict):
786
+ summary_text = summary.get("text")
787
+ else:
788
+ summary_text = getattr(summary, "text", None)
789
+ if summary_text:
790
+ reasoning_summary = (reasoning_summary or "") + summary_text
791
+
792
+ # Add reasoning content
793
+ if reasoning_summary is not None:
794
+ model_response.reasoning_content = reasoning_summary
795
+ elif self.reasoning is not None:
770
796
  model_response.reasoning_content = response.output_text
771
797
 
798
+ # Add metrics
772
799
  if response.usage is not None:
773
800
  model_response.response_usage = response.usage
774
801
 
@@ -835,7 +862,8 @@ class OpenAIResponses(Model):
835
862
  model_response.content = stream_event.delta
836
863
  stream_data.response_content += stream_event.delta
837
864
 
838
- if self.reasoning is not None:
865
+ # Treat the output_text deltas as reasoning content if the reasoning summary is not requested.
866
+ if self.reasoning is not None and self.reasoning_summary is None:
839
867
  model_response.reasoning_content = stream_event.delta
840
868
  stream_data.response_thinking += stream_event.delta
841
869
 
@@ -868,7 +896,24 @@ class OpenAIResponses(Model):
868
896
 
869
897
  elif stream_event.type == "response.completed":
870
898
  model_response = ModelResponse()
871
- # Add usage metrics if present
899
+
900
+ # Add reasoning summary
901
+ if self.reasoning_summary is not None:
902
+ summary_text: str = ""
903
+ for out in getattr(stream_event.response, "output", []) or []:
904
+ if getattr(out, "type", None) == "reasoning":
905
+ summaries = getattr(out, "summary", None)
906
+ if summaries:
907
+ for s in summaries:
908
+ text_val = s.get("text") if isinstance(s, dict) else getattr(s, "text", None)
909
+ if text_val:
910
+ if summary_text:
911
+ summary_text += "\n\n"
912
+ summary_text += text_val
913
+ if summary_text:
914
+ model_response.reasoning_content = summary_text
915
+
916
+ # Add metrics
872
917
  if stream_event.response.usage is not None:
873
918
  model_response.response_usage = stream_event.response.usage
874
919
 
@@ -157,6 +157,8 @@ class Team:
157
157
  add_datetime_to_instructions: bool = False
158
158
  # If True, add the current location to the instructions to give the team a sense of location
159
159
  add_location_to_instructions: bool = False
160
+ # Allows for custom timezone for datetime instructions following the TZ Database format (e.g. "Etc/UTC")
161
+ timezone_identifier: Optional[str] = None
160
162
  # If True, add the tools available to team members to the system message
161
163
  add_member_tools_to_system_message: bool = True
162
164
 
@@ -328,6 +330,7 @@ class Team:
328
330
  markdown: bool = False,
329
331
  add_datetime_to_instructions: bool = False,
330
332
  add_location_to_instructions: bool = False,
333
+ timezone_identifier: Optional[str] = None,
331
334
  add_member_tools_to_system_message: bool = True,
332
335
  system_message: Optional[Union[str, Callable, Message]] = None,
333
336
  system_message_role: str = "system",
@@ -411,6 +414,7 @@ class Team:
411
414
  self.markdown = markdown
412
415
  self.add_datetime_to_instructions = add_datetime_to_instructions
413
416
  self.add_location_to_instructions = add_location_to_instructions
417
+ self.timezone_identifier = timezone_identifier
414
418
  self.add_member_tools_to_system_message = add_member_tools_to_system_message
415
419
  self.system_message = system_message
416
420
  self.system_message_role = system_message_role
@@ -5308,7 +5312,19 @@ class Team:
5308
5312
  if self.add_datetime_to_instructions:
5309
5313
  from datetime import datetime
5310
5314
 
5311
- additional_information.append(f"The current time is {datetime.now()}")
5315
+ tz = None
5316
+
5317
+ if self.timezone_identifier:
5318
+ try:
5319
+ from zoneinfo import ZoneInfo
5320
+
5321
+ tz = ZoneInfo(self.timezone_identifier)
5322
+ except Exception:
5323
+ log_warning("Invalid timezone identifier")
5324
+
5325
+ time = datetime.now(tz) if tz else datetime.now()
5326
+
5327
+ additional_information.append(f"The current time is {time}.")
5312
5328
 
5313
5329
  # 1.3.3 Add the current location
5314
5330
  if self.add_location_to_instructions:
@@ -2,6 +2,8 @@ import json
2
2
  from os import getenv
3
3
  from typing import Any, List, Optional
4
4
 
5
+ import requests
6
+
5
7
  from agno.tools import Toolkit
6
8
  from agno.utils.log import log_info, logger
7
9
 
@@ -55,14 +57,22 @@ class ConfluenceTools(Toolkit):
55
57
  if not self.password:
56
58
  raise ValueError("Confluence API KEY or password not provided")
57
59
 
58
- self.confluence = Confluence(
59
- url=self.url, username=self.username, password=self.password, verify_ssl=verify_ssl
60
- )
60
+ session = requests.Session()
61
+ session.verify = verify_ssl
62
+
61
63
  if not verify_ssl:
62
64
  import urllib3
63
65
 
64
66
  urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
65
67
 
68
+ self.confluence = Confluence(
69
+ url=self.url,
70
+ username=self.username,
71
+ password=self.password,
72
+ verify_ssl=verify_ssl,
73
+ session=session,
74
+ )
75
+
66
76
  tools: List[Any] = []
67
77
  tools.append(self.get_page_content)
68
78
  tools.append(self.get_space_key)
@@ -87,6 +97,9 @@ class ConfluenceTools(Toolkit):
87
97
  try:
88
98
  log_info(f"Retrieving page content from space '{space_name}'")
89
99
  key = self.get_space_key(space_name=space_name)
100
+ if key == "No space found":
101
+ return json.dumps({"error": f"Space '{space_name}' not found"})
102
+
90
103
  page = self.confluence.get_page_by_title(key, page_title, expand=expand)
91
104
  if page:
92
105
  log_info(f"Successfully retrieved page '{page_title}' from space '{space_name}'")
@@ -106,7 +119,20 @@ class ConfluenceTools(Toolkit):
106
119
  str: List of space details as a string.
107
120
  """
108
121
  log_info("Retrieving details for all Confluence spaces")
109
- results = self.confluence.get_all_spaces()["results"]
122
+ results = []
123
+ start = 0
124
+ limit = 50
125
+
126
+ while True:
127
+ spaces_data = self.confluence.get_all_spaces(start=start, limit=limit)
128
+ if not spaces_data.get("results"):
129
+ break
130
+ results.extend(spaces_data["results"])
131
+
132
+ if len(spaces_data["results"]) < limit:
133
+ break
134
+ start += limit
135
+
110
136
  return str(results)
111
137
 
112
138
  def get_space_key(self, space_name: str):
@@ -118,13 +144,29 @@ class ConfluenceTools(Toolkit):
118
144
  Returns:
119
145
  str: Space key or "No space found" if space doesn't exist.
120
146
  """
121
- result = self.confluence.get_all_spaces()
122
- spaces = result["results"]
147
+ start = 0
148
+ limit = 50
149
+
150
+ while True:
151
+ result = self.confluence.get_all_spaces(start=start, limit=limit)
152
+ if not result.get("results"):
153
+ break
154
+
155
+ spaces = result["results"]
156
+
157
+ for space in spaces:
158
+ if space["name"].lower() == space_name.lower():
159
+ log_info(f"Found space key for '{space_name}': {space['key']}")
160
+ return space["key"]
161
+
162
+ for space in spaces:
163
+ if space["key"] == space_name:
164
+ log_info(f"'{space_name}' is already a space key")
165
+ return space_name
123
166
 
124
- for space in spaces:
125
- if space["name"] == space_name:
126
- log_info(f"Found space key for '{space_name}'")
127
- return space["key"]
167
+ if len(spaces) < limit:
168
+ break
169
+ start += limit
128
170
 
129
171
  logger.warning(f"No space named {space_name} found")
130
172
  return "No space found"
@@ -140,9 +182,17 @@ class ConfluenceTools(Toolkit):
140
182
  """
141
183
  log_info(f"Retrieving all pages from space '{space_name}'")
142
184
  space_key = self.get_space_key(space_name)
185
+
186
+ if space_key == "No space found":
187
+ return json.dumps({"error": f"Space '{space_name}' not found"})
188
+
143
189
  page_details = self.confluence.get_all_pages_from_space(
144
190
  space_key, status=None, expand=None, content_type="page"
145
191
  )
192
+
193
+ if not page_details:
194
+ return json.dumps({"error": f"No pages found in space '{space_name}'"})
195
+
146
196
  page_details = str([{"id": page["id"], "title": page["title"]} for page in page_details])
147
197
  return page_details
148
198
 
@@ -160,6 +210,9 @@ class ConfluenceTools(Toolkit):
160
210
  """
161
211
  try:
162
212
  space_key = self.get_space_key(space_name=space_name)
213
+ if space_key == "No space found":
214
+ return json.dumps({"error": f"Space '{space_name}' not found"})
215
+
163
216
  page = self.confluence.create_page(space_key, title, body, parent_id=parent_id)
164
217
  log_info(f"Page created: {title} with ID {page['id']}")
165
218
  return json.dumps({"id": page["id"], "title": title})
@@ -58,7 +58,7 @@ class E2BTools(Toolkit):
58
58
 
59
59
  # According to official docs, the parameter is 'timeout' (in seconds), not 'timeout_ms'
60
60
  try:
61
- self.sandbox = Sandbox(api_key=self.api_key, timeout=timeout, **self.sandbox_options)
61
+ self.sandbox = Sandbox.create(api_key=self.api_key, timeout=timeout, **self.sandbox_options)
62
62
  except Exception as e:
63
63
  logger.error(f"Warning: Could not create sandbox: {e}")
64
64
  raise e
@@ -133,7 +133,7 @@ class GmailTools(Toolkit):
133
133
  send_email (bool): Enable sending emails. Defaults to True.
134
134
  search_emails (bool): Enable searching emails. Defaults to True.
135
135
  send_email_reply (bool): Enable sending email replies. Defaults to True.
136
- creds (Optional[Credentials]): Pre-existing credentials. Defaults to None.
136
+ creds (Optional[Credentials]): Pre-fetched OAuth credentials. Use this to skip a new auth flow. Defaults to None.
137
137
  credentials_path (Optional[str]): Path to credentials file. Defaults to None.
138
138
  token_path (Optional[str]): Path to token file. Defaults to None.
139
139
  scopes (Optional[List[str]]): Custom OAuth scopes. If None, uses DEFAULT_SCOPES.