agno 2.3.5__tar.gz → 2.3.6__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 (601) hide show
  1. {agno-2.3.5 → agno-2.3.6}/PKG-INFO +37 -32
  2. {agno-2.3.5 → agno-2.3.6}/README.md +35 -31
  3. {agno-2.3.5 → agno-2.3.6}/agno/agent/agent.py +7 -4
  4. {agno-2.3.5 → agno-2.3.6}/agno/db/postgres/async_postgres.py +14 -4
  5. {agno-2.3.5 → agno-2.3.6}/agno/db/postgres/postgres.py +9 -3
  6. {agno-2.3.5 → agno-2.3.6}/agno/db/sqlite/async_sqlite.py +1 -1
  7. {agno-2.3.5 → agno-2.3.6}/agno/db/sqlite/sqlite.py +3 -4
  8. {agno-2.3.5 → agno-2.3.6}/agno/eval/accuracy.py +8 -4
  9. {agno-2.3.5 → agno-2.3.6}/agno/integrations/discord/client.py +1 -1
  10. {agno-2.3.5 → agno-2.3.6}/agno/models/cerebras/cerebras.py +11 -12
  11. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/whatsapp/security.py +3 -1
  12. {agno-2.3.5 → agno-2.3.6}/agno/os/schema.py +2 -1
  13. {agno-2.3.5 → agno-2.3.6}/agno/session/team.py +0 -1
  14. {agno-2.3.5 → agno-2.3.6}/agno/table.py +1 -1
  15. {agno-2.3.5 → agno-2.3.6}/agno/team/team.py +7 -4
  16. {agno-2.3.5 → agno-2.3.6}/agno/tools/google_drive.py +4 -3
  17. agno-2.3.6/agno/tools/spotify.py +922 -0
  18. {agno-2.3.5 → agno-2.3.6}/agno/utils/agent.py +2 -2
  19. {agno-2.3.5 → agno-2.3.6}/agno/utils/mcp.py +1 -1
  20. {agno-2.3.5 → agno-2.3.6}/agno/workflow/workflow.py +5 -2
  21. {agno-2.3.5 → agno-2.3.6}/agno.egg-info/PKG-INFO +37 -32
  22. {agno-2.3.5 → agno-2.3.6}/agno.egg-info/SOURCES.txt +1 -0
  23. {agno-2.3.5 → agno-2.3.6}/agno.egg-info/requires.txt +1 -0
  24. {agno-2.3.5 → agno-2.3.6}/pyproject.toml +2 -1
  25. {agno-2.3.5 → agno-2.3.6}/LICENSE +0 -0
  26. {agno-2.3.5 → agno-2.3.6}/agno/__init__.py +0 -0
  27. {agno-2.3.5 → agno-2.3.6}/agno/agent/__init__.py +0 -0
  28. {agno-2.3.5 → agno-2.3.6}/agno/api/__init__.py +0 -0
  29. {agno-2.3.5 → agno-2.3.6}/agno/api/agent.py +0 -0
  30. {agno-2.3.5 → agno-2.3.6}/agno/api/api.py +0 -0
  31. {agno-2.3.5 → agno-2.3.6}/agno/api/evals.py +0 -0
  32. {agno-2.3.5 → agno-2.3.6}/agno/api/os.py +0 -0
  33. {agno-2.3.5 → agno-2.3.6}/agno/api/routes.py +0 -0
  34. {agno-2.3.5 → agno-2.3.6}/agno/api/schemas/__init__.py +0 -0
  35. {agno-2.3.5 → agno-2.3.6}/agno/api/schemas/agent.py +0 -0
  36. {agno-2.3.5 → agno-2.3.6}/agno/api/schemas/evals.py +0 -0
  37. {agno-2.3.5 → agno-2.3.6}/agno/api/schemas/os.py +0 -0
  38. {agno-2.3.5 → agno-2.3.6}/agno/api/schemas/response.py +0 -0
  39. {agno-2.3.5 → agno-2.3.6}/agno/api/schemas/team.py +0 -0
  40. {agno-2.3.5 → agno-2.3.6}/agno/api/schemas/utils.py +0 -0
  41. {agno-2.3.5 → agno-2.3.6}/agno/api/schemas/workflows.py +0 -0
  42. {agno-2.3.5 → agno-2.3.6}/agno/api/settings.py +0 -0
  43. {agno-2.3.5 → agno-2.3.6}/agno/api/team.py +0 -0
  44. {agno-2.3.5 → agno-2.3.6}/agno/api/workflow.py +0 -0
  45. {agno-2.3.5 → agno-2.3.6}/agno/cloud/aws/base.py +0 -0
  46. {agno-2.3.5 → agno-2.3.6}/agno/cloud/aws/s3/__init__.py +0 -0
  47. {agno-2.3.5 → agno-2.3.6}/agno/cloud/aws/s3/api_client.py +0 -0
  48. {agno-2.3.5 → agno-2.3.6}/agno/cloud/aws/s3/bucket.py +0 -0
  49. {agno-2.3.5 → agno-2.3.6}/agno/cloud/aws/s3/object.py +0 -0
  50. {agno-2.3.5 → agno-2.3.6}/agno/compression/__init__.py +0 -0
  51. {agno-2.3.5 → agno-2.3.6}/agno/compression/manager.py +0 -0
  52. {agno-2.3.5 → agno-2.3.6}/agno/culture/__init__.py +0 -0
  53. {agno-2.3.5 → agno-2.3.6}/agno/culture/manager.py +0 -0
  54. {agno-2.3.5 → agno-2.3.6}/agno/db/__init__.py +0 -0
  55. {agno-2.3.5 → agno-2.3.6}/agno/db/async_postgres/__init__.py +0 -0
  56. {agno-2.3.5 → agno-2.3.6}/agno/db/base.py +0 -0
  57. {agno-2.3.5 → agno-2.3.6}/agno/db/dynamo/__init__.py +0 -0
  58. {agno-2.3.5 → agno-2.3.6}/agno/db/dynamo/dynamo.py +0 -0
  59. {agno-2.3.5 → agno-2.3.6}/agno/db/dynamo/schemas.py +0 -0
  60. {agno-2.3.5 → agno-2.3.6}/agno/db/dynamo/utils.py +0 -0
  61. {agno-2.3.5 → agno-2.3.6}/agno/db/firestore/__init__.py +0 -0
  62. {agno-2.3.5 → agno-2.3.6}/agno/db/firestore/firestore.py +0 -0
  63. {agno-2.3.5 → agno-2.3.6}/agno/db/firestore/schemas.py +0 -0
  64. {agno-2.3.5 → agno-2.3.6}/agno/db/firestore/utils.py +0 -0
  65. {agno-2.3.5 → agno-2.3.6}/agno/db/gcs_json/__init__.py +0 -0
  66. {agno-2.3.5 → agno-2.3.6}/agno/db/gcs_json/gcs_json_db.py +0 -0
  67. {agno-2.3.5 → agno-2.3.6}/agno/db/gcs_json/utils.py +0 -0
  68. {agno-2.3.5 → agno-2.3.6}/agno/db/in_memory/__init__.py +0 -0
  69. {agno-2.3.5 → agno-2.3.6}/agno/db/in_memory/in_memory_db.py +0 -0
  70. {agno-2.3.5 → agno-2.3.6}/agno/db/in_memory/utils.py +0 -0
  71. {agno-2.3.5 → agno-2.3.6}/agno/db/json/__init__.py +0 -0
  72. {agno-2.3.5 → agno-2.3.6}/agno/db/json/json_db.py +0 -0
  73. {agno-2.3.5 → agno-2.3.6}/agno/db/json/utils.py +0 -0
  74. {agno-2.3.5 → agno-2.3.6}/agno/db/migrations/__init__.py +0 -0
  75. {agno-2.3.5 → agno-2.3.6}/agno/db/migrations/manager.py +0 -0
  76. {agno-2.3.5 → agno-2.3.6}/agno/db/migrations/v1_to_v2.py +0 -0
  77. {agno-2.3.5 → agno-2.3.6}/agno/db/migrations/versions/__init__.py +0 -0
  78. {agno-2.3.5 → agno-2.3.6}/agno/db/migrations/versions/v2_3_0.py +0 -0
  79. {agno-2.3.5 → agno-2.3.6}/agno/db/mongo/__init__.py +0 -0
  80. {agno-2.3.5 → agno-2.3.6}/agno/db/mongo/async_mongo.py +0 -0
  81. {agno-2.3.5 → agno-2.3.6}/agno/db/mongo/mongo.py +0 -0
  82. {agno-2.3.5 → agno-2.3.6}/agno/db/mongo/schemas.py +0 -0
  83. {agno-2.3.5 → agno-2.3.6}/agno/db/mongo/utils.py +0 -0
  84. {agno-2.3.5 → agno-2.3.6}/agno/db/mysql/__init__.py +0 -0
  85. {agno-2.3.5 → agno-2.3.6}/agno/db/mysql/mysql.py +0 -0
  86. {agno-2.3.5 → agno-2.3.6}/agno/db/mysql/schemas.py +0 -0
  87. {agno-2.3.5 → agno-2.3.6}/agno/db/mysql/utils.py +0 -0
  88. {agno-2.3.5 → agno-2.3.6}/agno/db/postgres/__init__.py +0 -0
  89. {agno-2.3.5 → agno-2.3.6}/agno/db/postgres/schemas.py +0 -0
  90. {agno-2.3.5 → agno-2.3.6}/agno/db/postgres/utils.py +0 -0
  91. {agno-2.3.5 → agno-2.3.6}/agno/db/redis/__init__.py +0 -0
  92. {agno-2.3.5 → agno-2.3.6}/agno/db/redis/redis.py +0 -0
  93. {agno-2.3.5 → agno-2.3.6}/agno/db/redis/schemas.py +0 -0
  94. {agno-2.3.5 → agno-2.3.6}/agno/db/redis/utils.py +0 -0
  95. {agno-2.3.5 → agno-2.3.6}/agno/db/schemas/__init__.py +0 -0
  96. {agno-2.3.5 → agno-2.3.6}/agno/db/schemas/culture.py +0 -0
  97. {agno-2.3.5 → agno-2.3.6}/agno/db/schemas/evals.py +0 -0
  98. {agno-2.3.5 → agno-2.3.6}/agno/db/schemas/knowledge.py +0 -0
  99. {agno-2.3.5 → agno-2.3.6}/agno/db/schemas/memory.py +0 -0
  100. {agno-2.3.5 → agno-2.3.6}/agno/db/schemas/metrics.py +0 -0
  101. {agno-2.3.5 → agno-2.3.6}/agno/db/singlestore/__init__.py +0 -0
  102. {agno-2.3.5 → agno-2.3.6}/agno/db/singlestore/schemas.py +0 -0
  103. {agno-2.3.5 → agno-2.3.6}/agno/db/singlestore/singlestore.py +0 -0
  104. {agno-2.3.5 → agno-2.3.6}/agno/db/singlestore/utils.py +0 -0
  105. {agno-2.3.5 → agno-2.3.6}/agno/db/sqlite/__init__.py +0 -0
  106. {agno-2.3.5 → agno-2.3.6}/agno/db/sqlite/schemas.py +0 -0
  107. {agno-2.3.5 → agno-2.3.6}/agno/db/sqlite/utils.py +0 -0
  108. {agno-2.3.5 → agno-2.3.6}/agno/db/surrealdb/__init__.py +0 -0
  109. {agno-2.3.5 → agno-2.3.6}/agno/db/surrealdb/metrics.py +0 -0
  110. {agno-2.3.5 → agno-2.3.6}/agno/db/surrealdb/models.py +0 -0
  111. {agno-2.3.5 → agno-2.3.6}/agno/db/surrealdb/queries.py +0 -0
  112. {agno-2.3.5 → agno-2.3.6}/agno/db/surrealdb/surrealdb.py +0 -0
  113. {agno-2.3.5 → agno-2.3.6}/agno/db/surrealdb/utils.py +0 -0
  114. {agno-2.3.5 → agno-2.3.6}/agno/db/utils.py +0 -0
  115. {agno-2.3.5 → agno-2.3.6}/agno/debug.py +0 -0
  116. {agno-2.3.5 → agno-2.3.6}/agno/eval/__init__.py +0 -0
  117. {agno-2.3.5 → agno-2.3.6}/agno/eval/performance.py +0 -0
  118. {agno-2.3.5 → agno-2.3.6}/agno/eval/reliability.py +0 -0
  119. {agno-2.3.5 → agno-2.3.6}/agno/eval/utils.py +0 -0
  120. {agno-2.3.5 → agno-2.3.6}/agno/exceptions.py +0 -0
  121. {agno-2.3.5 → agno-2.3.6}/agno/filters.py +0 -0
  122. {agno-2.3.5 → agno-2.3.6}/agno/guardrails/__init__.py +0 -0
  123. {agno-2.3.5 → agno-2.3.6}/agno/guardrails/base.py +0 -0
  124. {agno-2.3.5 → agno-2.3.6}/agno/guardrails/openai.py +0 -0
  125. {agno-2.3.5 → agno-2.3.6}/agno/guardrails/pii.py +0 -0
  126. {agno-2.3.5 → agno-2.3.6}/agno/guardrails/prompt_injection.py +0 -0
  127. {agno-2.3.5 → agno-2.3.6}/agno/hooks/__init__.py +0 -0
  128. {agno-2.3.5 → agno-2.3.6}/agno/hooks/decorator.py +0 -0
  129. {agno-2.3.5 → agno-2.3.6}/agno/integrations/__init__.py +0 -0
  130. {agno-2.3.5 → agno-2.3.6}/agno/integrations/discord/__init__.py +0 -0
  131. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/__init__.py +0 -0
  132. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/__init__.py +0 -0
  133. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/agentic.py +0 -0
  134. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/document.py +0 -0
  135. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/fixed.py +0 -0
  136. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/markdown.py +0 -0
  137. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/recursive.py +0 -0
  138. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/row.py +0 -0
  139. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/semantic.py +0 -0
  140. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/chunking/strategy.py +0 -0
  141. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/content.py +0 -0
  142. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/document/__init__.py +0 -0
  143. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/document/base.py +0 -0
  144. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/__init__.py +0 -0
  145. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/aws_bedrock.py +0 -0
  146. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/azure_openai.py +0 -0
  147. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/base.py +0 -0
  148. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/cohere.py +0 -0
  149. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/fastembed.py +0 -0
  150. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/fireworks.py +0 -0
  151. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/google.py +0 -0
  152. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/huggingface.py +0 -0
  153. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/jina.py +0 -0
  154. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/langdb.py +0 -0
  155. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/mistral.py +0 -0
  156. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/nebius.py +0 -0
  157. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/ollama.py +0 -0
  158. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/openai.py +0 -0
  159. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/sentence_transformer.py +0 -0
  160. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/together.py +0 -0
  161. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/vllm.py +0 -0
  162. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/embedder/voyageai.py +0 -0
  163. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/knowledge.py +0 -0
  164. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/__init__.py +0 -0
  165. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/arxiv_reader.py +0 -0
  166. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/base.py +0 -0
  167. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/csv_reader.py +0 -0
  168. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/docx_reader.py +0 -0
  169. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/field_labeled_csv_reader.py +0 -0
  170. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/firecrawl_reader.py +0 -0
  171. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/json_reader.py +0 -0
  172. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/markdown_reader.py +0 -0
  173. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/pdf_reader.py +0 -0
  174. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/pptx_reader.py +0 -0
  175. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/reader_factory.py +0 -0
  176. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/s3_reader.py +0 -0
  177. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/tavily_reader.py +0 -0
  178. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/text_reader.py +0 -0
  179. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/web_search_reader.py +0 -0
  180. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/website_reader.py +0 -0
  181. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/wikipedia_reader.py +0 -0
  182. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reader/youtube_reader.py +0 -0
  183. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/remote_content/__init__.py +0 -0
  184. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/remote_content/remote_content.py +0 -0
  185. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reranker/__init__.py +0 -0
  186. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reranker/base.py +0 -0
  187. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reranker/cohere.py +0 -0
  188. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reranker/infinity.py +0 -0
  189. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  190. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/types.py +0 -0
  191. {agno-2.3.5 → agno-2.3.6}/agno/knowledge/utils.py +0 -0
  192. {agno-2.3.5 → agno-2.3.6}/agno/media.py +0 -0
  193. {agno-2.3.5 → agno-2.3.6}/agno/memory/__init__.py +0 -0
  194. {agno-2.3.5 → agno-2.3.6}/agno/memory/manager.py +0 -0
  195. {agno-2.3.5 → agno-2.3.6}/agno/memory/strategies/__init__.py +0 -0
  196. {agno-2.3.5 → agno-2.3.6}/agno/memory/strategies/base.py +0 -0
  197. {agno-2.3.5 → agno-2.3.6}/agno/memory/strategies/summarize.py +0 -0
  198. {agno-2.3.5 → agno-2.3.6}/agno/memory/strategies/types.py +0 -0
  199. {agno-2.3.5 → agno-2.3.6}/agno/models/__init__.py +0 -0
  200. {agno-2.3.5 → agno-2.3.6}/agno/models/aimlapi/__init__.py +0 -0
  201. {agno-2.3.5 → agno-2.3.6}/agno/models/aimlapi/aimlapi.py +0 -0
  202. {agno-2.3.5 → agno-2.3.6}/agno/models/anthropic/__init__.py +0 -0
  203. {agno-2.3.5 → agno-2.3.6}/agno/models/anthropic/claude.py +0 -0
  204. {agno-2.3.5 → agno-2.3.6}/agno/models/aws/__init__.py +0 -0
  205. {agno-2.3.5 → agno-2.3.6}/agno/models/aws/bedrock.py +0 -0
  206. {agno-2.3.5 → agno-2.3.6}/agno/models/aws/claude.py +0 -0
  207. {agno-2.3.5 → agno-2.3.6}/agno/models/azure/__init__.py +0 -0
  208. {agno-2.3.5 → agno-2.3.6}/agno/models/azure/ai_foundry.py +0 -0
  209. {agno-2.3.5 → agno-2.3.6}/agno/models/azure/openai_chat.py +0 -0
  210. {agno-2.3.5 → agno-2.3.6}/agno/models/base.py +0 -0
  211. {agno-2.3.5 → agno-2.3.6}/agno/models/cerebras/__init__.py +0 -0
  212. {agno-2.3.5 → agno-2.3.6}/agno/models/cerebras/cerebras_openai.py +0 -0
  213. {agno-2.3.5 → agno-2.3.6}/agno/models/cohere/__init__.py +0 -0
  214. {agno-2.3.5 → agno-2.3.6}/agno/models/cohere/chat.py +0 -0
  215. {agno-2.3.5 → agno-2.3.6}/agno/models/cometapi/__init__.py +0 -0
  216. {agno-2.3.5 → agno-2.3.6}/agno/models/cometapi/cometapi.py +0 -0
  217. {agno-2.3.5 → agno-2.3.6}/agno/models/dashscope/__init__.py +0 -0
  218. {agno-2.3.5 → agno-2.3.6}/agno/models/dashscope/dashscope.py +0 -0
  219. {agno-2.3.5 → agno-2.3.6}/agno/models/deepinfra/__init__.py +0 -0
  220. {agno-2.3.5 → agno-2.3.6}/agno/models/deepinfra/deepinfra.py +0 -0
  221. {agno-2.3.5 → agno-2.3.6}/agno/models/deepseek/__init__.py +0 -0
  222. {agno-2.3.5 → agno-2.3.6}/agno/models/deepseek/deepseek.py +0 -0
  223. {agno-2.3.5 → agno-2.3.6}/agno/models/defaults.py +0 -0
  224. {agno-2.3.5 → agno-2.3.6}/agno/models/fireworks/__init__.py +0 -0
  225. {agno-2.3.5 → agno-2.3.6}/agno/models/fireworks/fireworks.py +0 -0
  226. {agno-2.3.5 → agno-2.3.6}/agno/models/google/__init__.py +0 -0
  227. {agno-2.3.5 → agno-2.3.6}/agno/models/google/gemini.py +0 -0
  228. {agno-2.3.5 → agno-2.3.6}/agno/models/groq/__init__.py +0 -0
  229. {agno-2.3.5 → agno-2.3.6}/agno/models/groq/groq.py +0 -0
  230. {agno-2.3.5 → agno-2.3.6}/agno/models/huggingface/__init__.py +0 -0
  231. {agno-2.3.5 → agno-2.3.6}/agno/models/huggingface/huggingface.py +0 -0
  232. {agno-2.3.5 → agno-2.3.6}/agno/models/ibm/__init__.py +0 -0
  233. {agno-2.3.5 → agno-2.3.6}/agno/models/ibm/watsonx.py +0 -0
  234. {agno-2.3.5 → agno-2.3.6}/agno/models/internlm/__init__.py +0 -0
  235. {agno-2.3.5 → agno-2.3.6}/agno/models/internlm/internlm.py +0 -0
  236. {agno-2.3.5 → agno-2.3.6}/agno/models/langdb/__init__.py +0 -0
  237. {agno-2.3.5 → agno-2.3.6}/agno/models/langdb/langdb.py +0 -0
  238. {agno-2.3.5 → agno-2.3.6}/agno/models/litellm/__init__.py +0 -0
  239. {agno-2.3.5 → agno-2.3.6}/agno/models/litellm/chat.py +0 -0
  240. {agno-2.3.5 → agno-2.3.6}/agno/models/litellm/litellm_openai.py +0 -0
  241. {agno-2.3.5 → agno-2.3.6}/agno/models/llama_cpp/__init__.py +0 -0
  242. {agno-2.3.5 → agno-2.3.6}/agno/models/llama_cpp/llama_cpp.py +0 -0
  243. {agno-2.3.5 → agno-2.3.6}/agno/models/lmstudio/__init__.py +0 -0
  244. {agno-2.3.5 → agno-2.3.6}/agno/models/lmstudio/lmstudio.py +0 -0
  245. {agno-2.3.5 → agno-2.3.6}/agno/models/message.py +0 -0
  246. {agno-2.3.5 → agno-2.3.6}/agno/models/meta/__init__.py +0 -0
  247. {agno-2.3.5 → agno-2.3.6}/agno/models/meta/llama.py +0 -0
  248. {agno-2.3.5 → agno-2.3.6}/agno/models/meta/llama_openai.py +0 -0
  249. {agno-2.3.5 → agno-2.3.6}/agno/models/metrics.py +0 -0
  250. {agno-2.3.5 → agno-2.3.6}/agno/models/mistral/__init__.py +0 -0
  251. {agno-2.3.5 → agno-2.3.6}/agno/models/mistral/mistral.py +0 -0
  252. {agno-2.3.5 → agno-2.3.6}/agno/models/nebius/__init__.py +0 -0
  253. {agno-2.3.5 → agno-2.3.6}/agno/models/nebius/nebius.py +0 -0
  254. {agno-2.3.5 → agno-2.3.6}/agno/models/nexus/__init__.py +0 -0
  255. {agno-2.3.5 → agno-2.3.6}/agno/models/nexus/nexus.py +0 -0
  256. {agno-2.3.5 → agno-2.3.6}/agno/models/nvidia/__init__.py +0 -0
  257. {agno-2.3.5 → agno-2.3.6}/agno/models/nvidia/nvidia.py +0 -0
  258. {agno-2.3.5 → agno-2.3.6}/agno/models/ollama/__init__.py +0 -0
  259. {agno-2.3.5 → agno-2.3.6}/agno/models/ollama/chat.py +0 -0
  260. {agno-2.3.5 → agno-2.3.6}/agno/models/openai/__init__.py +0 -0
  261. {agno-2.3.5 → agno-2.3.6}/agno/models/openai/chat.py +0 -0
  262. {agno-2.3.5 → agno-2.3.6}/agno/models/openai/like.py +0 -0
  263. {agno-2.3.5 → agno-2.3.6}/agno/models/openai/responses.py +0 -0
  264. {agno-2.3.5 → agno-2.3.6}/agno/models/openrouter/__init__.py +0 -0
  265. {agno-2.3.5 → agno-2.3.6}/agno/models/openrouter/openrouter.py +0 -0
  266. {agno-2.3.5 → agno-2.3.6}/agno/models/perplexity/__init__.py +0 -0
  267. {agno-2.3.5 → agno-2.3.6}/agno/models/perplexity/perplexity.py +0 -0
  268. {agno-2.3.5 → agno-2.3.6}/agno/models/portkey/__init__.py +0 -0
  269. {agno-2.3.5 → agno-2.3.6}/agno/models/portkey/portkey.py +0 -0
  270. {agno-2.3.5 → agno-2.3.6}/agno/models/requesty/__init__.py +0 -0
  271. {agno-2.3.5 → agno-2.3.6}/agno/models/requesty/requesty.py +0 -0
  272. {agno-2.3.5 → agno-2.3.6}/agno/models/response.py +0 -0
  273. {agno-2.3.5 → agno-2.3.6}/agno/models/sambanova/__init__.py +0 -0
  274. {agno-2.3.5 → agno-2.3.6}/agno/models/sambanova/sambanova.py +0 -0
  275. {agno-2.3.5 → agno-2.3.6}/agno/models/siliconflow/__init__.py +0 -0
  276. {agno-2.3.5 → agno-2.3.6}/agno/models/siliconflow/siliconflow.py +0 -0
  277. {agno-2.3.5 → agno-2.3.6}/agno/models/together/__init__.py +0 -0
  278. {agno-2.3.5 → agno-2.3.6}/agno/models/together/together.py +0 -0
  279. {agno-2.3.5 → agno-2.3.6}/agno/models/utils.py +0 -0
  280. {agno-2.3.5 → agno-2.3.6}/agno/models/vercel/__init__.py +0 -0
  281. {agno-2.3.5 → agno-2.3.6}/agno/models/vercel/v0.py +0 -0
  282. {agno-2.3.5 → agno-2.3.6}/agno/models/vertexai/__init__.py +0 -0
  283. {agno-2.3.5 → agno-2.3.6}/agno/models/vertexai/claude.py +0 -0
  284. {agno-2.3.5 → agno-2.3.6}/agno/models/vllm/__init__.py +0 -0
  285. {agno-2.3.5 → agno-2.3.6}/agno/models/vllm/vllm.py +0 -0
  286. {agno-2.3.5 → agno-2.3.6}/agno/models/xai/__init__.py +0 -0
  287. {agno-2.3.5 → agno-2.3.6}/agno/models/xai/xai.py +0 -0
  288. {agno-2.3.5 → agno-2.3.6}/agno/os/__init__.py +0 -0
  289. {agno-2.3.5 → agno-2.3.6}/agno/os/app.py +0 -0
  290. {agno-2.3.5 → agno-2.3.6}/agno/os/auth.py +0 -0
  291. {agno-2.3.5 → agno-2.3.6}/agno/os/config.py +0 -0
  292. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/__init__.py +0 -0
  293. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/a2a/__init__.py +0 -0
  294. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/a2a/a2a.py +0 -0
  295. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/a2a/router.py +0 -0
  296. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/a2a/utils.py +0 -0
  297. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/agui/__init__.py +0 -0
  298. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/agui/agui.py +0 -0
  299. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/agui/router.py +0 -0
  300. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/agui/utils.py +0 -0
  301. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/base.py +0 -0
  302. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/slack/__init__.py +0 -0
  303. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/slack/router.py +0 -0
  304. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/slack/security.py +0 -0
  305. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/slack/slack.py +0 -0
  306. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  307. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/whatsapp/router.py +0 -0
  308. {agno-2.3.5 → agno-2.3.6}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
  309. {agno-2.3.5 → agno-2.3.6}/agno/os/mcp.py +0 -0
  310. {agno-2.3.5 → agno-2.3.6}/agno/os/middleware/__init__.py +0 -0
  311. {agno-2.3.5 → agno-2.3.6}/agno/os/middleware/jwt.py +0 -0
  312. {agno-2.3.5 → agno-2.3.6}/agno/os/router.py +0 -0
  313. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/__init__.py +0 -0
  314. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/evals/__init__.py +0 -0
  315. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/evals/evals.py +0 -0
  316. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/evals/schemas.py +0 -0
  317. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/evals/utils.py +0 -0
  318. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/health.py +0 -0
  319. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/home.py +0 -0
  320. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/knowledge/__init__.py +0 -0
  321. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/knowledge/knowledge.py +0 -0
  322. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/knowledge/schemas.py +0 -0
  323. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/memory/__init__.py +0 -0
  324. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/memory/memory.py +0 -0
  325. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/memory/schemas.py +0 -0
  326. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/metrics/__init__.py +0 -0
  327. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/metrics/metrics.py +0 -0
  328. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/metrics/schemas.py +0 -0
  329. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/session/__init__.py +0 -0
  330. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/session/session.py +0 -0
  331. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/traces/__init__.py +0 -0
  332. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/traces/schemas.py +0 -0
  333. {agno-2.3.5 → agno-2.3.6}/agno/os/routers/traces/traces.py +0 -0
  334. {agno-2.3.5 → agno-2.3.6}/agno/os/settings.py +0 -0
  335. {agno-2.3.5 → agno-2.3.6}/agno/os/utils.py +0 -0
  336. {agno-2.3.5 → agno-2.3.6}/agno/py.typed +0 -0
  337. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/__init__.py +0 -0
  338. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/anthropic.py +0 -0
  339. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/azure_ai_foundry.py +0 -0
  340. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/deepseek.py +0 -0
  341. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/default.py +0 -0
  342. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/gemini.py +0 -0
  343. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/groq.py +0 -0
  344. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/helpers.py +0 -0
  345. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/ollama.py +0 -0
  346. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/openai.py +0 -0
  347. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/step.py +0 -0
  348. {agno-2.3.5 → agno-2.3.6}/agno/reasoning/vertexai.py +0 -0
  349. {agno-2.3.5 → agno-2.3.6}/agno/run/__init__.py +0 -0
  350. {agno-2.3.5 → agno-2.3.6}/agno/run/agent.py +0 -0
  351. {agno-2.3.5 → agno-2.3.6}/agno/run/base.py +0 -0
  352. {agno-2.3.5 → agno-2.3.6}/agno/run/cancel.py +0 -0
  353. {agno-2.3.5 → agno-2.3.6}/agno/run/messages.py +0 -0
  354. {agno-2.3.5 → agno-2.3.6}/agno/run/team.py +0 -0
  355. {agno-2.3.5 → agno-2.3.6}/agno/run/workflow.py +0 -0
  356. {agno-2.3.5 → agno-2.3.6}/agno/session/__init__.py +0 -0
  357. {agno-2.3.5 → agno-2.3.6}/agno/session/agent.py +0 -0
  358. {agno-2.3.5 → agno-2.3.6}/agno/session/summary.py +0 -0
  359. {agno-2.3.5 → agno-2.3.6}/agno/session/workflow.py +0 -0
  360. {agno-2.3.5 → agno-2.3.6}/agno/team/__init__.py +0 -0
  361. {agno-2.3.5 → agno-2.3.6}/agno/tools/__init__.py +0 -0
  362. {agno-2.3.5 → agno-2.3.6}/agno/tools/agentql.py +0 -0
  363. {agno-2.3.5 → agno-2.3.6}/agno/tools/airflow.py +0 -0
  364. {agno-2.3.5 → agno-2.3.6}/agno/tools/api.py +0 -0
  365. {agno-2.3.5 → agno-2.3.6}/agno/tools/apify.py +0 -0
  366. {agno-2.3.5 → agno-2.3.6}/agno/tools/arxiv.py +0 -0
  367. {agno-2.3.5 → agno-2.3.6}/agno/tools/aws_lambda.py +0 -0
  368. {agno-2.3.5 → agno-2.3.6}/agno/tools/aws_ses.py +0 -0
  369. {agno-2.3.5 → agno-2.3.6}/agno/tools/baidusearch.py +0 -0
  370. {agno-2.3.5 → agno-2.3.6}/agno/tools/bitbucket.py +0 -0
  371. {agno-2.3.5 → agno-2.3.6}/agno/tools/brandfetch.py +0 -0
  372. {agno-2.3.5 → agno-2.3.6}/agno/tools/bravesearch.py +0 -0
  373. {agno-2.3.5 → agno-2.3.6}/agno/tools/brightdata.py +0 -0
  374. {agno-2.3.5 → agno-2.3.6}/agno/tools/browserbase.py +0 -0
  375. {agno-2.3.5 → agno-2.3.6}/agno/tools/calcom.py +0 -0
  376. {agno-2.3.5 → agno-2.3.6}/agno/tools/calculator.py +0 -0
  377. {agno-2.3.5 → agno-2.3.6}/agno/tools/cartesia.py +0 -0
  378. {agno-2.3.5 → agno-2.3.6}/agno/tools/clickup.py +0 -0
  379. {agno-2.3.5 → agno-2.3.6}/agno/tools/confluence.py +0 -0
  380. {agno-2.3.5 → agno-2.3.6}/agno/tools/crawl4ai.py +0 -0
  381. {agno-2.3.5 → agno-2.3.6}/agno/tools/csv_toolkit.py +0 -0
  382. {agno-2.3.5 → agno-2.3.6}/agno/tools/dalle.py +0 -0
  383. {agno-2.3.5 → agno-2.3.6}/agno/tools/daytona.py +0 -0
  384. {agno-2.3.5 → agno-2.3.6}/agno/tools/decorator.py +0 -0
  385. {agno-2.3.5 → agno-2.3.6}/agno/tools/desi_vocal.py +0 -0
  386. {agno-2.3.5 → agno-2.3.6}/agno/tools/discord.py +0 -0
  387. {agno-2.3.5 → agno-2.3.6}/agno/tools/docker.py +0 -0
  388. {agno-2.3.5 → agno-2.3.6}/agno/tools/duckdb.py +0 -0
  389. {agno-2.3.5 → agno-2.3.6}/agno/tools/duckduckgo.py +0 -0
  390. {agno-2.3.5 → agno-2.3.6}/agno/tools/e2b.py +0 -0
  391. {agno-2.3.5 → agno-2.3.6}/agno/tools/eleven_labs.py +0 -0
  392. {agno-2.3.5 → agno-2.3.6}/agno/tools/email.py +0 -0
  393. {agno-2.3.5 → agno-2.3.6}/agno/tools/evm.py +0 -0
  394. {agno-2.3.5 → agno-2.3.6}/agno/tools/exa.py +0 -0
  395. {agno-2.3.5 → agno-2.3.6}/agno/tools/fal.py +0 -0
  396. {agno-2.3.5 → agno-2.3.6}/agno/tools/file.py +0 -0
  397. {agno-2.3.5 → agno-2.3.6}/agno/tools/file_generation.py +0 -0
  398. {agno-2.3.5 → agno-2.3.6}/agno/tools/financial_datasets.py +0 -0
  399. {agno-2.3.5 → agno-2.3.6}/agno/tools/firecrawl.py +0 -0
  400. {agno-2.3.5 → agno-2.3.6}/agno/tools/function.py +0 -0
  401. {agno-2.3.5 → agno-2.3.6}/agno/tools/giphy.py +0 -0
  402. {agno-2.3.5 → agno-2.3.6}/agno/tools/github.py +0 -0
  403. {agno-2.3.5 → agno-2.3.6}/agno/tools/gmail.py +0 -0
  404. {agno-2.3.5 → agno-2.3.6}/agno/tools/google_bigquery.py +0 -0
  405. {agno-2.3.5 → agno-2.3.6}/agno/tools/google_maps.py +0 -0
  406. {agno-2.3.5 → agno-2.3.6}/agno/tools/googlecalendar.py +0 -0
  407. {agno-2.3.5 → agno-2.3.6}/agno/tools/googlesheets.py +0 -0
  408. {agno-2.3.5 → agno-2.3.6}/agno/tools/hackernews.py +0 -0
  409. {agno-2.3.5 → agno-2.3.6}/agno/tools/jina.py +0 -0
  410. {agno-2.3.5 → agno-2.3.6}/agno/tools/jira.py +0 -0
  411. {agno-2.3.5 → agno-2.3.6}/agno/tools/knowledge.py +0 -0
  412. {agno-2.3.5 → agno-2.3.6}/agno/tools/linear.py +0 -0
  413. {agno-2.3.5 → agno-2.3.6}/agno/tools/linkup.py +0 -0
  414. {agno-2.3.5 → agno-2.3.6}/agno/tools/local_file_system.py +0 -0
  415. {agno-2.3.5 → agno-2.3.6}/agno/tools/lumalab.py +0 -0
  416. {agno-2.3.5 → agno-2.3.6}/agno/tools/mcp/__init__.py +0 -0
  417. {agno-2.3.5 → agno-2.3.6}/agno/tools/mcp/mcp.py +0 -0
  418. {agno-2.3.5 → agno-2.3.6}/agno/tools/mcp/multi_mcp.py +0 -0
  419. {agno-2.3.5 → agno-2.3.6}/agno/tools/mcp/params.py +0 -0
  420. {agno-2.3.5 → agno-2.3.6}/agno/tools/mcp_toolbox.py +0 -0
  421. {agno-2.3.5 → agno-2.3.6}/agno/tools/mem0.py +0 -0
  422. {agno-2.3.5 → agno-2.3.6}/agno/tools/memori.py +0 -0
  423. {agno-2.3.5 → agno-2.3.6}/agno/tools/memory.py +0 -0
  424. {agno-2.3.5 → agno-2.3.6}/agno/tools/mlx_transcribe.py +0 -0
  425. {agno-2.3.5 → agno-2.3.6}/agno/tools/models/__init__.py +0 -0
  426. {agno-2.3.5 → agno-2.3.6}/agno/tools/models/azure_openai.py +0 -0
  427. {agno-2.3.5 → agno-2.3.6}/agno/tools/models/gemini.py +0 -0
  428. {agno-2.3.5 → agno-2.3.6}/agno/tools/models/groq.py +0 -0
  429. {agno-2.3.5 → agno-2.3.6}/agno/tools/models/morph.py +0 -0
  430. {agno-2.3.5 → agno-2.3.6}/agno/tools/models/nebius.py +0 -0
  431. {agno-2.3.5 → agno-2.3.6}/agno/tools/models_labs.py +0 -0
  432. {agno-2.3.5 → agno-2.3.6}/agno/tools/moviepy_video.py +0 -0
  433. {agno-2.3.5 → agno-2.3.6}/agno/tools/nano_banana.py +0 -0
  434. {agno-2.3.5 → agno-2.3.6}/agno/tools/neo4j.py +0 -0
  435. {agno-2.3.5 → agno-2.3.6}/agno/tools/newspaper.py +0 -0
  436. {agno-2.3.5 → agno-2.3.6}/agno/tools/newspaper4k.py +0 -0
  437. {agno-2.3.5 → agno-2.3.6}/agno/tools/notion.py +0 -0
  438. {agno-2.3.5 → agno-2.3.6}/agno/tools/openai.py +0 -0
  439. {agno-2.3.5 → agno-2.3.6}/agno/tools/openbb.py +0 -0
  440. {agno-2.3.5 → agno-2.3.6}/agno/tools/opencv.py +0 -0
  441. {agno-2.3.5 → agno-2.3.6}/agno/tools/openweather.py +0 -0
  442. {agno-2.3.5 → agno-2.3.6}/agno/tools/oxylabs.py +0 -0
  443. {agno-2.3.5 → agno-2.3.6}/agno/tools/pandas.py +0 -0
  444. {agno-2.3.5 → agno-2.3.6}/agno/tools/parallel.py +0 -0
  445. {agno-2.3.5 → agno-2.3.6}/agno/tools/postgres.py +0 -0
  446. {agno-2.3.5 → agno-2.3.6}/agno/tools/pubmed.py +0 -0
  447. {agno-2.3.5 → agno-2.3.6}/agno/tools/python.py +0 -0
  448. {agno-2.3.5 → agno-2.3.6}/agno/tools/reasoning.py +0 -0
  449. {agno-2.3.5 → agno-2.3.6}/agno/tools/reddit.py +0 -0
  450. {agno-2.3.5 → agno-2.3.6}/agno/tools/replicate.py +0 -0
  451. {agno-2.3.5 → agno-2.3.6}/agno/tools/resend.py +0 -0
  452. {agno-2.3.5 → agno-2.3.6}/agno/tools/scrapegraph.py +0 -0
  453. {agno-2.3.5 → agno-2.3.6}/agno/tools/searxng.py +0 -0
  454. {agno-2.3.5 → agno-2.3.6}/agno/tools/serpapi.py +0 -0
  455. {agno-2.3.5 → agno-2.3.6}/agno/tools/serper.py +0 -0
  456. {agno-2.3.5 → agno-2.3.6}/agno/tools/shell.py +0 -0
  457. {agno-2.3.5 → agno-2.3.6}/agno/tools/slack.py +0 -0
  458. {agno-2.3.5 → agno-2.3.6}/agno/tools/sleep.py +0 -0
  459. {agno-2.3.5 → agno-2.3.6}/agno/tools/spider.py +0 -0
  460. {agno-2.3.5 → agno-2.3.6}/agno/tools/sql.py +0 -0
  461. {agno-2.3.5 → agno-2.3.6}/agno/tools/streamlit/__init__.py +0 -0
  462. {agno-2.3.5 → agno-2.3.6}/agno/tools/streamlit/components.py +0 -0
  463. {agno-2.3.5 → agno-2.3.6}/agno/tools/tavily.py +0 -0
  464. {agno-2.3.5 → agno-2.3.6}/agno/tools/telegram.py +0 -0
  465. {agno-2.3.5 → agno-2.3.6}/agno/tools/todoist.py +0 -0
  466. {agno-2.3.5 → agno-2.3.6}/agno/tools/tool_registry.py +0 -0
  467. {agno-2.3.5 → agno-2.3.6}/agno/tools/toolkit.py +0 -0
  468. {agno-2.3.5 → agno-2.3.6}/agno/tools/trafilatura.py +0 -0
  469. {agno-2.3.5 → agno-2.3.6}/agno/tools/trello.py +0 -0
  470. {agno-2.3.5 → agno-2.3.6}/agno/tools/twilio.py +0 -0
  471. {agno-2.3.5 → agno-2.3.6}/agno/tools/user_control_flow.py +0 -0
  472. {agno-2.3.5 → agno-2.3.6}/agno/tools/valyu.py +0 -0
  473. {agno-2.3.5 → agno-2.3.6}/agno/tools/visualization.py +0 -0
  474. {agno-2.3.5 → agno-2.3.6}/agno/tools/webbrowser.py +0 -0
  475. {agno-2.3.5 → agno-2.3.6}/agno/tools/webex.py +0 -0
  476. {agno-2.3.5 → agno-2.3.6}/agno/tools/website.py +0 -0
  477. {agno-2.3.5 → agno-2.3.6}/agno/tools/webtools.py +0 -0
  478. {agno-2.3.5 → agno-2.3.6}/agno/tools/whatsapp.py +0 -0
  479. {agno-2.3.5 → agno-2.3.6}/agno/tools/wikipedia.py +0 -0
  480. {agno-2.3.5 → agno-2.3.6}/agno/tools/workflow.py +0 -0
  481. {agno-2.3.5 → agno-2.3.6}/agno/tools/x.py +0 -0
  482. {agno-2.3.5 → agno-2.3.6}/agno/tools/yfinance.py +0 -0
  483. {agno-2.3.5 → agno-2.3.6}/agno/tools/youtube.py +0 -0
  484. {agno-2.3.5 → agno-2.3.6}/agno/tools/zendesk.py +0 -0
  485. {agno-2.3.5 → agno-2.3.6}/agno/tools/zep.py +0 -0
  486. {agno-2.3.5 → agno-2.3.6}/agno/tools/zoom.py +0 -0
  487. {agno-2.3.5 → agno-2.3.6}/agno/tracing/__init__.py +0 -0
  488. {agno-2.3.5 → agno-2.3.6}/agno/tracing/exporter.py +0 -0
  489. {agno-2.3.5 → agno-2.3.6}/agno/tracing/schemas.py +0 -0
  490. {agno-2.3.5 → agno-2.3.6}/agno/tracing/setup.py +0 -0
  491. {agno-2.3.5 → agno-2.3.6}/agno/utils/__init__.py +0 -0
  492. {agno-2.3.5 → agno-2.3.6}/agno/utils/audio.py +0 -0
  493. {agno-2.3.5 → agno-2.3.6}/agno/utils/certs.py +0 -0
  494. {agno-2.3.5 → agno-2.3.6}/agno/utils/code_execution.py +0 -0
  495. {agno-2.3.5 → agno-2.3.6}/agno/utils/common.py +0 -0
  496. {agno-2.3.5 → agno-2.3.6}/agno/utils/dttm.py +0 -0
  497. {agno-2.3.5 → agno-2.3.6}/agno/utils/enum.py +0 -0
  498. {agno-2.3.5 → agno-2.3.6}/agno/utils/env.py +0 -0
  499. {agno-2.3.5 → agno-2.3.6}/agno/utils/events.py +0 -0
  500. {agno-2.3.5 → agno-2.3.6}/agno/utils/format_str.py +0 -0
  501. {agno-2.3.5 → agno-2.3.6}/agno/utils/functions.py +0 -0
  502. {agno-2.3.5 → agno-2.3.6}/agno/utils/gemini.py +0 -0
  503. {agno-2.3.5 → agno-2.3.6}/agno/utils/hooks.py +0 -0
  504. {agno-2.3.5 → agno-2.3.6}/agno/utils/http.py +0 -0
  505. {agno-2.3.5 → agno-2.3.6}/agno/utils/json_schema.py +0 -0
  506. {agno-2.3.5 → agno-2.3.6}/agno/utils/knowledge.py +0 -0
  507. {agno-2.3.5 → agno-2.3.6}/agno/utils/location.py +0 -0
  508. {agno-2.3.5 → agno-2.3.6}/agno/utils/log.py +0 -0
  509. {agno-2.3.5 → agno-2.3.6}/agno/utils/media.py +0 -0
  510. {agno-2.3.5 → agno-2.3.6}/agno/utils/merge_dict.py +0 -0
  511. {agno-2.3.5 → agno-2.3.6}/agno/utils/message.py +0 -0
  512. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/__init__.py +0 -0
  513. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/ai_foundry.py +0 -0
  514. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/claude.py +0 -0
  515. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/cohere.py +0 -0
  516. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/llama.py +0 -0
  517. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/mistral.py +0 -0
  518. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/openai_responses.py +0 -0
  519. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/schema_utils.py +0 -0
  520. {agno-2.3.5 → agno-2.3.6}/agno/utils/models/watsonx.py +0 -0
  521. {agno-2.3.5 → agno-2.3.6}/agno/utils/openai.py +0 -0
  522. {agno-2.3.5 → agno-2.3.6}/agno/utils/pickle.py +0 -0
  523. {agno-2.3.5 → agno-2.3.6}/agno/utils/pprint.py +0 -0
  524. {agno-2.3.5 → agno-2.3.6}/agno/utils/print_response/__init__.py +0 -0
  525. {agno-2.3.5 → agno-2.3.6}/agno/utils/print_response/agent.py +0 -0
  526. {agno-2.3.5 → agno-2.3.6}/agno/utils/print_response/team.py +0 -0
  527. {agno-2.3.5 → agno-2.3.6}/agno/utils/print_response/workflow.py +0 -0
  528. {agno-2.3.5 → agno-2.3.6}/agno/utils/prompts.py +0 -0
  529. {agno-2.3.5 → agno-2.3.6}/agno/utils/reasoning.py +0 -0
  530. {agno-2.3.5 → agno-2.3.6}/agno/utils/response.py +0 -0
  531. {agno-2.3.5 → agno-2.3.6}/agno/utils/response_iterator.py +0 -0
  532. {agno-2.3.5 → agno-2.3.6}/agno/utils/safe_formatter.py +0 -0
  533. {agno-2.3.5 → agno-2.3.6}/agno/utils/serialize.py +0 -0
  534. {agno-2.3.5 → agno-2.3.6}/agno/utils/shell.py +0 -0
  535. {agno-2.3.5 → agno-2.3.6}/agno/utils/streamlit.py +0 -0
  536. {agno-2.3.5 → agno-2.3.6}/agno/utils/string.py +0 -0
  537. {agno-2.3.5 → agno-2.3.6}/agno/utils/team.py +0 -0
  538. {agno-2.3.5 → agno-2.3.6}/agno/utils/timer.py +0 -0
  539. {agno-2.3.5 → agno-2.3.6}/agno/utils/tokens.py +0 -0
  540. {agno-2.3.5 → agno-2.3.6}/agno/utils/tools.py +0 -0
  541. {agno-2.3.5 → agno-2.3.6}/agno/utils/web.py +0 -0
  542. {agno-2.3.5 → agno-2.3.6}/agno/utils/whatsapp.py +0 -0
  543. {agno-2.3.5 → agno-2.3.6}/agno/utils/yaml_io.py +0 -0
  544. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/__init__.py +0 -0
  545. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/base.py +0 -0
  546. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/cassandra/__init__.py +0 -0
  547. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/cassandra/cassandra.py +0 -0
  548. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  549. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/cassandra/index.py +0 -0
  550. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/chroma/__init__.py +0 -0
  551. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/chroma/chromadb.py +0 -0
  552. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/clickhouse/__init__.py +0 -0
  553. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  554. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/clickhouse/index.py +0 -0
  555. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/couchbase/__init__.py +0 -0
  556. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/couchbase/couchbase.py +0 -0
  557. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/distance.py +0 -0
  558. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/lancedb/__init__.py +0 -0
  559. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/lancedb/lance_db.py +0 -0
  560. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/langchaindb/__init__.py +0 -0
  561. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/langchaindb/langchaindb.py +0 -0
  562. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/lightrag/__init__.py +0 -0
  563. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/lightrag/lightrag.py +0 -0
  564. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/llamaindex/__init__.py +0 -0
  565. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
  566. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/milvus/__init__.py +0 -0
  567. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/milvus/milvus.py +0 -0
  568. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/mongodb/__init__.py +0 -0
  569. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/mongodb/mongodb.py +0 -0
  570. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/pgvector/__init__.py +0 -0
  571. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/pgvector/index.py +0 -0
  572. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/pgvector/pgvector.py +0 -0
  573. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/pineconedb/__init__.py +0 -0
  574. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  575. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/qdrant/__init__.py +0 -0
  576. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/qdrant/qdrant.py +0 -0
  577. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/redis/__init__.py +0 -0
  578. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/redis/redisdb.py +0 -0
  579. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/search.py +0 -0
  580. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/singlestore/__init__.py +0 -0
  581. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/singlestore/index.py +0 -0
  582. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/singlestore/singlestore.py +0 -0
  583. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/surrealdb/__init__.py +0 -0
  584. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  585. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/upstashdb/__init__.py +0 -0
  586. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  587. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/weaviate/__init__.py +0 -0
  588. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/weaviate/index.py +0 -0
  589. {agno-2.3.5 → agno-2.3.6}/agno/vectordb/weaviate/weaviate.py +0 -0
  590. {agno-2.3.5 → agno-2.3.6}/agno/workflow/__init__.py +0 -0
  591. {agno-2.3.5 → agno-2.3.6}/agno/workflow/agent.py +0 -0
  592. {agno-2.3.5 → agno-2.3.6}/agno/workflow/condition.py +0 -0
  593. {agno-2.3.5 → agno-2.3.6}/agno/workflow/loop.py +0 -0
  594. {agno-2.3.5 → agno-2.3.6}/agno/workflow/parallel.py +0 -0
  595. {agno-2.3.5 → agno-2.3.6}/agno/workflow/router.py +0 -0
  596. {agno-2.3.5 → agno-2.3.6}/agno/workflow/step.py +0 -0
  597. {agno-2.3.5 → agno-2.3.6}/agno/workflow/steps.py +0 -0
  598. {agno-2.3.5 → agno-2.3.6}/agno/workflow/types.py +0 -0
  599. {agno-2.3.5 → agno-2.3.6}/agno.egg-info/dependency_links.txt +0 -0
  600. {agno-2.3.5 → agno-2.3.6}/agno.egg-info/top_level.txt +0 -0
  601. {agno-2.3.5 → agno-2.3.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.3.5
3
+ Version: 2.3.6
4
4
  Summary: Agno: a lightweight library for building Multi-Agent Systems
5
5
  Author-email: Ashpreet Bedi <ashpreet@agno.com>
6
6
  Project-URL: homepage, https://agno.com
@@ -381,6 +381,7 @@ Requires-Dist: agno[agui]; extra == "tests"
381
381
  Requires-Dist: agno[integration-tests]; extra == "tests"
382
382
  Requires-Dist: twine; extra == "tests"
383
383
  Requires-Dist: build; extra == "tests"
384
+ Requires-Dist: grpcio==1.74.0; extra == "tests"
384
385
  Provides-Extra: integration-tests
385
386
  Requires-Dist: exa_py; extra == "integration-tests"
386
387
  Requires-Dist: ddgs; extra == "integration-tests"
@@ -411,15 +412,15 @@ Dynamic: license-file
411
412
 
412
413
  ## What is Agno?
413
414
 
414
- Agno is a multi-agent framework, runtime and control plane. Built for speed, privacy, and scale.
415
+ Agno is an incredibly fast multi-agent framework, runtime and control plane.
415
416
 
416
- It provides a rich set of tools for building:
417
+ It provides the complete stack for building, running and managing multi-agent systems:
417
418
 
418
- - **Agents** with memory, knowledge, session management, and advanced features like human-in-the-loop, guardrails, dynamic context management and best-in-class MCP support.
419
- - **Multi-Agent Teams** that operate autonomously under a team leader that maintains shared state and context. Perfect for use cases where the scope exceeds beyond a single agent.
420
- - **Step-based Workflows** for controlled, deterministic execution. Steps can be Agents, Teams, or regular python functions that run sequentially, in parallel, in loops, branches, or conditionally.
419
+ - **Framework**: Build agents, multi-agent teams and workflows with memory, knowledge, state, guardrails, HITL, context compression, MCP, A2A and 100+ toolkits.
420
+ - **AgentOS Runtime**: Run your multi-agent system in production with a secure, stateless runtime and ready to use integration endpoints.
421
+ - **AgentOS Control Plane**: Test, monitor and manage AgentOS deployments across environments with full operational visibility.
421
422
 
422
- Agno also provides a ready-to-use FastAPI app (called the AgentOS) for serving your agents, teams and workflows in production. Stateless, horizontally scalable and designed for scale, the AgentOS gives you major head start in building your AI product.
423
+ Checkout the full list of features [here](#features).
423
424
 
424
425
  ## Getting started
425
426
 
@@ -436,7 +437,7 @@ After that, checkout the [examples gallery](https://docs.agno.com/examples/use-c
436
437
 
437
438
  ## Example
438
439
 
439
- Heres an example of an Agent that connects to an MCP server, manages conversation state in a database, is served using a FastAPI application that you can chat with using the [AgentOS UI](https://os.agno.com).
440
+ Here's an example of an Agent that connects to an MCP server, manages conversation state in a database, is served using a FastAPI application that you can chat with using the [AgentOS UI](https://os.agno.com).
440
441
 
441
442
  ```python agno_agent.py
442
443
  from agno.agent import Agent
@@ -471,21 +472,21 @@ if __name__ == "__main__":
471
472
 
472
473
  ## AgentOS - Production Runtime for Multi-Agent Systems
473
474
 
474
- Building Agents is easy, running them is hard, and that's where the AgentOS comes in. AgentOS is a high-performance runtime for serving multi-agent systems in production. Key features include:
475
+ Building Agents is easy, running them as a secure, scalable service is hard. AgentOS solves this by providing a high performance runtime for serving multi-agent systems in production. Key features include:
475
476
 
476
- 1. **Pre-built FastAPI app**: AgentOS ships with a ready-to-use FastAPI app for orchestrating your agents, teams, and workflows. This gives you a major head start in building your AI product.
477
+ 1. **Pre-built FastAPI app**: AgentOS includes a ready-to-use FastAPI app for running your agents, teams and workflows. This gives you a significant head start when building an AI product.
477
478
 
478
- 2. **Integrated Control Plane**: The [AgentOS UI](https://os.agno.com) connects directly to your runtime, letting you test, monitor, and manage your system in real time, giving you unmatched control over your system.
479
+ 2. **Integrated Control Plane**: The [AgentOS UI](https://os.agno.com) connects directly to your runtime, so you can test, monitor and manage your system in real time with full operational visibility.
479
480
 
480
- 3. **Private by Design**: AgentOS runs entirely in your cloud, ensuring complete data privacy. No data ever leaves your system. This is ideal for security-conscious enterprises.
481
+ 3. **Private by Design**: AgentOS runs entirely in your cloud, ensuring complete data privacy. No data leaves your environment, making it ideal for security conscious enterprises..
481
482
 
482
- Here's what the [AgentOS UI](https://os.agno.com) looks like in action:
483
+ When you run the example script shared above, you get a FastAPI app that you can connect to the [AgentOS UI](https://os.agno.com). Here's what it looks like in action:
483
484
 
484
485
  https://github.com/user-attachments/assets/feb23db8-15cc-4e88-be7c-01a21a03ebf6
485
486
 
486
487
  ## The Complete Agentic Solution
487
488
 
488
- For companies building agents, Agno provides the complete agentic solution:
489
+ Agno provides the complete solution for companies building agentic systems:
489
490
 
490
491
  - The fastest framework for building agents, multi-agent teams and agentic workflows.
491
492
  - A ready-to-use FastAPI app that gets you building AI products on day one.
@@ -493,28 +494,32 @@ For companies building agents, Agno provides the complete agentic solution:
493
494
 
494
495
  Agno brings a novel architecture that no other framework provides, your AgentOS runs securely in your cloud, and the control plane connects directly to it from your browser. You don't need to send data to any external services or pay retention costs, you get complete privacy and control.
495
496
 
496
- ## Designed for Agent Engineering
497
+ ## Features
497
498
 
498
- Agno is an incredibly feature-rich framework, designed for Agent Engineering. Here are some key features:
499
+ Agno is an incredibly feature-rich framework purpose-built for Agent Engineering. Here are some key features:
499
500
 
500
501
  | **Category** | **Feature** | **Description** |
501
502
  | -------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
502
- | **Core Intelligence** | **Model Agnostic** | Works with any model provider so you can use your favorite LLMs. |
503
- | | **Type Safe** | Enforce structured I/O through `input_schema` and `output_schema` for predictable, composable behavior. |
504
- | | **Dynamic Context Engineering** | Inject variables, state, and retrieved data on the fly into context. Perfect for dependency-driven agents. |
505
- | **Memory, Knowledge, and Persistence** | **Persistent Storage** | Give your Agents, Teams, and Workflows a database to persist session history, state, and messages. |
506
- | | **User Memory** | Built-in memory system that allows Agents to recall user-specific context across sessions. |
507
- | | **Agentic RAG** | Connect to 20+ vector stores (called **Knowledge** in Agno) with hybrid search + reranking out of the box. |
508
- | | **Culture (Collective Memory)** | Shared knowledge that compounds across agents and time. |
509
- | **Execution & Control** | **Human-in-the-Loop** | Native support for confirmations, manual overrides, and external tool execution. |
503
+ | **Foundational Principles** | **Model Agnostic** | Supports all model providers so you can choose the best model for your use case |
504
+ | | **Type Safe** | Enforces structured I/O through input_schema and output_schema for predictable and composable agent behavior. |
505
+ | | **Dynamic Context** | Inject variables, state, and retrieved data at runtime into context. Compress, summarize and filter context to keep your Agents focused and efficient. |
506
+ | | **Designed for Scale** | Designed around async execution and long-running tasks for high throughput agent workloads. |
507
+ | **Memory, Knowledge, and Persistence** | **Persistent Storage** | Give your Agents, Teams, and Workflows a database to persist session history, state, and messages. |
508
+ | | **User Memory** | Built in memory layer that helps agents recall user specific context across sessions. |
509
+ | | **Agentic RAG** | Connect to 20+ vector stores (called **Knowledge**) with hybrid search, reranking, and chunking out of the box. |
510
+ | | **Culture** | Shared long term collective memory that compounds across agents and time. |
511
+ | | **Ephemeral Context** | In memory scratchpad for short lived reasoning without polluting long term state. |
512
+ | **Execution & Control** | **Human-in-the-Loop** | Native support for confirmations, approvals, manual overrides, and external actions. |
510
513
  | | **Guardrails** | Built-in safeguards for validation, security, and prompt protection. |
511
- | | **Agent Lifecycle Hooks** | Pre- and post-hooks to validate or transform inputs and outputs. |
512
- | | **MCP Integration** | First-class support for the Model Context Protocol (MCP) to connect Agents with external systems. |
513
- | | **Toolkits** | 100+ built-in toolkits with thousands of tools, ready for use across data, code, web, and enterprise APIs. |
514
- | **Runtime & Evaluation** | **Runtime** | Pre-built FastAPI based runtime with SSE compatible endpoints, ready for production on day 1. |
515
- | | **Control Plane (UI)** | Integrated interface to visualize, monitor, and debug agent activity in real time. |
516
- | | **Natively Multimodal** | Agents can process and generate text, images, audio, video, and files. |
517
- | | **Evals** | Measure your Agents' Accuracy, Performance, and Reliability. |
514
+ | | **Agent Lifecycle Hooks** | Pre and post hooks to validate, enrich, or transform inputs and outputs. |
515
+ | | **MCP Integration** | First-class support for the Model Context Protocol (MCP) to connect Agents with external systems. |
516
+ | | **A2A Integration** | First-class support for the Agent to Agent communication protocol (A2A). |
517
+ | | **Toolkits** | 100+ built in toolkits with thousands of tools covering data, code, web, and enterprise APIs. |
518
+ | **Runtime & Evaluation** | **Runtime** | Prebuilt FastAPI runtime with SSE compatible endpoints. Production ready from day one. |
519
+ | | **Control Plane (UI)** | Integrated interface to test, observe, and debug your agents, teams, and workflows in real time. |
520
+ | | **Natively Multimodal** | Agents can process and generate text, images, audio, video, and files. |
521
+ | | **Evals** | Measure Accuracy, Performance, Latency, and Reliability across agents and workflows. |
522
+ | | **Durable Execution** | Built in support for long running, resumable workflows. |
518
523
  | **Security & Privacy** | **Private by Design** | Runs entirely in your cloud. The UI connects directly to your AgentOS from your browser, no data is ever sent externally. |
519
524
  | | **Data Governance** | Your data lives securely in your Agent database, no external data sharing or vendor lock-in. |
520
525
  | | **Access Control** | Role-based access (RBAC) and per-agent permissions to protect sensitive contexts and tools. |
@@ -544,7 +549,7 @@ At Agno, we optimize performance across 3 dimensions:
544
549
 
545
550
  1. **Agent performance:** We optimize static operations (instantiation, memory footprint) and runtime operations (tool calls, memory updates, history management).
546
551
  2. **System performance:** The AgentOS API is async by default and has a minimal memory footprint. The system is stateless and horizontally scalable, with a focus on preventing memory leaks. It handles parallel and batch embedding generation during knowledge ingestion, metrics collection in background tasks, and other system-level optimizations.
547
- 3. **Agent reliability and accuracy:** Monitored through evals, which well explore later.
552
+ 3. **Agent reliability and accuracy:** Monitored through evals, which we'll explore later.
548
553
 
549
554
  ### Agent Performance
550
555
 
@@ -19,15 +19,15 @@
19
19
 
20
20
  ## What is Agno?
21
21
 
22
- Agno is a multi-agent framework, runtime and control plane. Built for speed, privacy, and scale.
22
+ Agno is an incredibly fast multi-agent framework, runtime and control plane.
23
23
 
24
- It provides a rich set of tools for building:
24
+ It provides the complete stack for building, running and managing multi-agent systems:
25
25
 
26
- - **Agents** with memory, knowledge, session management, and advanced features like human-in-the-loop, guardrails, dynamic context management and best-in-class MCP support.
27
- - **Multi-Agent Teams** that operate autonomously under a team leader that maintains shared state and context. Perfect for use cases where the scope exceeds beyond a single agent.
28
- - **Step-based Workflows** for controlled, deterministic execution. Steps can be Agents, Teams, or regular python functions that run sequentially, in parallel, in loops, branches, or conditionally.
26
+ - **Framework**: Build agents, multi-agent teams and workflows with memory, knowledge, state, guardrails, HITL, context compression, MCP, A2A and 100+ toolkits.
27
+ - **AgentOS Runtime**: Run your multi-agent system in production with a secure, stateless runtime and ready to use integration endpoints.
28
+ - **AgentOS Control Plane**: Test, monitor and manage AgentOS deployments across environments with full operational visibility.
29
29
 
30
- Agno also provides a ready-to-use FastAPI app (called the AgentOS) for serving your agents, teams and workflows in production. Stateless, horizontally scalable and designed for scale, the AgentOS gives you major head start in building your AI product.
30
+ Checkout the full list of features [here](#features).
31
31
 
32
32
  ## Getting started
33
33
 
@@ -44,7 +44,7 @@ After that, checkout the [examples gallery](https://docs.agno.com/examples/use-c
44
44
 
45
45
  ## Example
46
46
 
47
- Heres an example of an Agent that connects to an MCP server, manages conversation state in a database, is served using a FastAPI application that you can chat with using the [AgentOS UI](https://os.agno.com).
47
+ Here's an example of an Agent that connects to an MCP server, manages conversation state in a database, is served using a FastAPI application that you can chat with using the [AgentOS UI](https://os.agno.com).
48
48
 
49
49
  ```python agno_agent.py
50
50
  from agno.agent import Agent
@@ -79,21 +79,21 @@ if __name__ == "__main__":
79
79
 
80
80
  ## AgentOS - Production Runtime for Multi-Agent Systems
81
81
 
82
- Building Agents is easy, running them is hard, and that's where the AgentOS comes in. AgentOS is a high-performance runtime for serving multi-agent systems in production. Key features include:
82
+ Building Agents is easy, running them as a secure, scalable service is hard. AgentOS solves this by providing a high performance runtime for serving multi-agent systems in production. Key features include:
83
83
 
84
- 1. **Pre-built FastAPI app**: AgentOS ships with a ready-to-use FastAPI app for orchestrating your agents, teams, and workflows. This gives you a major head start in building your AI product.
84
+ 1. **Pre-built FastAPI app**: AgentOS includes a ready-to-use FastAPI app for running your agents, teams and workflows. This gives you a significant head start when building an AI product.
85
85
 
86
- 2. **Integrated Control Plane**: The [AgentOS UI](https://os.agno.com) connects directly to your runtime, letting you test, monitor, and manage your system in real time, giving you unmatched control over your system.
86
+ 2. **Integrated Control Plane**: The [AgentOS UI](https://os.agno.com) connects directly to your runtime, so you can test, monitor and manage your system in real time with full operational visibility.
87
87
 
88
- 3. **Private by Design**: AgentOS runs entirely in your cloud, ensuring complete data privacy. No data ever leaves your system. This is ideal for security-conscious enterprises.
88
+ 3. **Private by Design**: AgentOS runs entirely in your cloud, ensuring complete data privacy. No data leaves your environment, making it ideal for security conscious enterprises..
89
89
 
90
- Here's what the [AgentOS UI](https://os.agno.com) looks like in action:
90
+ When you run the example script shared above, you get a FastAPI app that you can connect to the [AgentOS UI](https://os.agno.com). Here's what it looks like in action:
91
91
 
92
92
  https://github.com/user-attachments/assets/feb23db8-15cc-4e88-be7c-01a21a03ebf6
93
93
 
94
94
  ## The Complete Agentic Solution
95
95
 
96
- For companies building agents, Agno provides the complete agentic solution:
96
+ Agno provides the complete solution for companies building agentic systems:
97
97
 
98
98
  - The fastest framework for building agents, multi-agent teams and agentic workflows.
99
99
  - A ready-to-use FastAPI app that gets you building AI products on day one.
@@ -101,28 +101,32 @@ For companies building agents, Agno provides the complete agentic solution:
101
101
 
102
102
  Agno brings a novel architecture that no other framework provides, your AgentOS runs securely in your cloud, and the control plane connects directly to it from your browser. You don't need to send data to any external services or pay retention costs, you get complete privacy and control.
103
103
 
104
- ## Designed for Agent Engineering
104
+ ## Features
105
105
 
106
- Agno is an incredibly feature-rich framework, designed for Agent Engineering. Here are some key features:
106
+ Agno is an incredibly feature-rich framework purpose-built for Agent Engineering. Here are some key features:
107
107
 
108
108
  | **Category** | **Feature** | **Description** |
109
109
  | -------------------------------------- | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
110
- | **Core Intelligence** | **Model Agnostic** | Works with any model provider so you can use your favorite LLMs. |
111
- | | **Type Safe** | Enforce structured I/O through `input_schema` and `output_schema` for predictable, composable behavior. |
112
- | | **Dynamic Context Engineering** | Inject variables, state, and retrieved data on the fly into context. Perfect for dependency-driven agents. |
113
- | **Memory, Knowledge, and Persistence** | **Persistent Storage** | Give your Agents, Teams, and Workflows a database to persist session history, state, and messages. |
114
- | | **User Memory** | Built-in memory system that allows Agents to recall user-specific context across sessions. |
115
- | | **Agentic RAG** | Connect to 20+ vector stores (called **Knowledge** in Agno) with hybrid search + reranking out of the box. |
116
- | | **Culture (Collective Memory)** | Shared knowledge that compounds across agents and time. |
117
- | **Execution & Control** | **Human-in-the-Loop** | Native support for confirmations, manual overrides, and external tool execution. |
110
+ | **Foundational Principles** | **Model Agnostic** | Supports all model providers so you can choose the best model for your use case |
111
+ | | **Type Safe** | Enforces structured I/O through input_schema and output_schema for predictable and composable agent behavior. |
112
+ | | **Dynamic Context** | Inject variables, state, and retrieved data at runtime into context. Compress, summarize and filter context to keep your Agents focused and efficient. |
113
+ | | **Designed for Scale** | Designed around async execution and long-running tasks for high throughput agent workloads. |
114
+ | **Memory, Knowledge, and Persistence** | **Persistent Storage** | Give your Agents, Teams, and Workflows a database to persist session history, state, and messages. |
115
+ | | **User Memory** | Built in memory layer that helps agents recall user specific context across sessions. |
116
+ | | **Agentic RAG** | Connect to 20+ vector stores (called **Knowledge**) with hybrid search, reranking, and chunking out of the box. |
117
+ | | **Culture** | Shared long term collective memory that compounds across agents and time. |
118
+ | | **Ephemeral Context** | In memory scratchpad for short lived reasoning without polluting long term state. |
119
+ | **Execution & Control** | **Human-in-the-Loop** | Native support for confirmations, approvals, manual overrides, and external actions. |
118
120
  | | **Guardrails** | Built-in safeguards for validation, security, and prompt protection. |
119
- | | **Agent Lifecycle Hooks** | Pre- and post-hooks to validate or transform inputs and outputs. |
120
- | | **MCP Integration** | First-class support for the Model Context Protocol (MCP) to connect Agents with external systems. |
121
- | | **Toolkits** | 100+ built-in toolkits with thousands of tools, ready for use across data, code, web, and enterprise APIs. |
122
- | **Runtime & Evaluation** | **Runtime** | Pre-built FastAPI based runtime with SSE compatible endpoints, ready for production on day 1. |
123
- | | **Control Plane (UI)** | Integrated interface to visualize, monitor, and debug agent activity in real time. |
124
- | | **Natively Multimodal** | Agents can process and generate text, images, audio, video, and files. |
125
- | | **Evals** | Measure your Agents' Accuracy, Performance, and Reliability. |
121
+ | | **Agent Lifecycle Hooks** | Pre and post hooks to validate, enrich, or transform inputs and outputs. |
122
+ | | **MCP Integration** | First-class support for the Model Context Protocol (MCP) to connect Agents with external systems. |
123
+ | | **A2A Integration** | First-class support for the Agent to Agent communication protocol (A2A). |
124
+ | | **Toolkits** | 100+ built in toolkits with thousands of tools covering data, code, web, and enterprise APIs. |
125
+ | **Runtime & Evaluation** | **Runtime** | Prebuilt FastAPI runtime with SSE compatible endpoints. Production ready from day one. |
126
+ | | **Control Plane (UI)** | Integrated interface to test, observe, and debug your agents, teams, and workflows in real time. |
127
+ | | **Natively Multimodal** | Agents can process and generate text, images, audio, video, and files. |
128
+ | | **Evals** | Measure Accuracy, Performance, Latency, and Reliability across agents and workflows. |
129
+ | | **Durable Execution** | Built in support for long running, resumable workflows. |
126
130
  | **Security & Privacy** | **Private by Design** | Runs entirely in your cloud. The UI connects directly to your AgentOS from your browser, no data is ever sent externally. |
127
131
  | | **Data Governance** | Your data lives securely in your Agent database, no external data sharing or vendor lock-in. |
128
132
  | | **Access Control** | Role-based access (RBAC) and per-agent permissions to protect sensitive contexts and tools. |
@@ -152,7 +156,7 @@ At Agno, we optimize performance across 3 dimensions:
152
156
 
153
157
  1. **Agent performance:** We optimize static operations (instantiation, memory footprint) and runtime operations (tool calls, memory updates, history management).
154
158
  2. **System performance:** The AgentOS API is async by default and has a minimal memory footprint. The system is stateless and horizontally scalable, with a focus on preventing memory leaks. It handles parallel and batch embedding generation during knowledge ingestion, metrics collection in background tasks, and other system-level optimizations.
155
- 3. **Agent reliability and accuracy:** Monitored through evals, which well explore later.
159
+ 3. **Agent reliability and accuracy:** Monitored through evals, which we'll explore later.
156
160
 
157
161
  ### Agent Performance
158
162
 
@@ -1645,7 +1645,10 @@ class Agent:
1645
1645
 
1646
1646
  # Initialize session state
1647
1647
  session_state = self._initialize_session_state(
1648
- session_state=session_state or {}, user_id=user_id, session_id=session_id, run_id=run_id
1648
+ session_state=session_state if session_state is not None else {},
1649
+ user_id=user_id,
1650
+ session_id=session_id,
1651
+ run_id=run_id,
1649
1652
  )
1650
1653
  # Update session state from DB
1651
1654
  session_state = self._load_session_state(session=agent_session, session_state=session_state)
@@ -1866,7 +1869,7 @@ class Agent:
1866
1869
  self._update_metadata(session=agent_session)
1867
1870
  # Initialize session state
1868
1871
  run_context.session_state = self._initialize_session_state(
1869
- session_state=run_context.session_state or {},
1872
+ session_state=run_context.session_state if run_context.session_state is not None else {},
1870
1873
  user_id=user_id,
1871
1874
  session_id=session_id,
1872
1875
  run_id=run_response.run_id,
@@ -2144,7 +2147,7 @@ class Agent:
2144
2147
  self._update_metadata(session=agent_session)
2145
2148
  # Initialize session state
2146
2149
  run_context.session_state = self._initialize_session_state(
2147
- session_state=run_context.session_state or {},
2150
+ session_state=run_context.session_state if run_context.session_state is not None else {},
2148
2151
  user_id=user_id,
2149
2152
  session_id=session_id,
2150
2153
  run_id=run_response.run_id,
@@ -6988,7 +6991,7 @@ class Agent:
6988
6991
 
6989
6992
  # Should already be resolved and passed from run() method
6990
6993
  format_variables = ChainMap(
6991
- session_state or {},
6994
+ session_state if session_state is not None else {},
6992
6995
  dependencies or {},
6993
6996
  metadata or {},
6994
6997
  {"user_id": user_id} if user_id is not None else {},
@@ -32,6 +32,7 @@ from agno.utils.log import log_debug, log_error, log_info, log_warning
32
32
  try:
33
33
  from sqlalchemy import Index, String, Table, UniqueConstraint, func, update
34
34
  from sqlalchemy.dialects import postgresql
35
+ from sqlalchemy.exc import ProgrammingError
35
36
  from sqlalchemy.ext.asyncio import AsyncEngine, async_sessionmaker, create_async_engine
36
37
  from sqlalchemy.schema import Column, MetaData
37
38
  from sqlalchemy.sql.expression import select, text
@@ -897,10 +898,19 @@ class AsyncPostgresDb(AsyncBaseDb):
897
898
  table = await self._get_table(table_type="memories")
898
899
 
899
900
  async with self.async_session_factory() as sess, sess.begin():
900
- stmt = select(func.json_array_elements_text(table.c.topics))
901
- if user_id is not None:
902
- stmt = stmt.where(table.c.user_id == user_id)
903
- result = await sess.execute(stmt)
901
+ try:
902
+ stmt = select(func.jsonb_array_elements_text(table.c.topics))
903
+ if user_id is not None:
904
+ stmt = stmt.where(table.c.user_id == user_id)
905
+ result = await sess.execute(stmt)
906
+ except ProgrammingError:
907
+ # Retrying with json_array_elements_text. This works in older versions,
908
+ # where the topics column was of type JSON instead of JSONB
909
+ stmt = select(func.json_array_elements_text(table.c.topics))
910
+ if user_id is not None:
911
+ stmt = stmt.where(table.c.user_id == user_id)
912
+ result = await sess.execute(stmt)
913
+
904
914
  records = result.fetchall()
905
915
 
906
916
  return list(set([record[0] for record in records]))
@@ -33,6 +33,7 @@ try:
33
33
  from sqlalchemy import ForeignKey, Index, String, UniqueConstraint, func, select, update
34
34
  from sqlalchemy.dialects import postgresql
35
35
  from sqlalchemy.engine import Engine, create_engine
36
+ from sqlalchemy.exc import ProgrammingError
36
37
  from sqlalchemy.orm import scoped_session, sessionmaker
37
38
  from sqlalchemy.schema import Column, MetaData, Table
38
39
  from sqlalchemy.sql.expression import text
@@ -1082,9 +1083,14 @@ class PostgresDb(BaseDb):
1082
1083
  return []
1083
1084
 
1084
1085
  with self.Session() as sess, sess.begin():
1085
- stmt = select(func.json_array_elements_text(table.c.topics))
1086
-
1087
- result = sess.execute(stmt).fetchall()
1086
+ try:
1087
+ stmt = select(func.jsonb_array_elements_text(table.c.topics))
1088
+ result = sess.execute(stmt).fetchall()
1089
+ except ProgrammingError:
1090
+ # Retrying with json_array_elements_text. This works in older versions,
1091
+ # where the topics column was of type JSON instead of JSONB
1092
+ stmt = select(func.json_array_elements_text(table.c.topics))
1093
+ result = sess.execute(stmt).fetchall()
1088
1094
 
1089
1095
  return list(set([record[0] for record in result]))
1090
1096
 
@@ -1114,7 +1114,7 @@ class AsyncSqliteDb(AsyncBaseDb):
1114
1114
 
1115
1115
  async with self.async_session_factory() as sess, sess.begin():
1116
1116
  # Select topics from all results
1117
- stmt = select(func.json_array_elements_text(table.c.topics)).select_from(table)
1117
+ stmt = select(table.c.topics)
1118
1118
  result = (await sess.execute(stmt)).fetchall()
1119
1119
 
1120
1120
  return list(set([record[0] for record in result]))
@@ -245,9 +245,9 @@ class SqliteDb(BaseDb):
245
245
  return table
246
246
 
247
247
  except Exception as e:
248
- from traceback import format_exc
248
+ from traceback import print_exc
249
249
 
250
- print(format_exc())
250
+ print_exc()
251
251
  log_error(f"Could not create table '{table_name}': {e}")
252
252
  raise e
253
253
 
@@ -1109,9 +1109,8 @@ class SqliteDb(BaseDb):
1109
1109
 
1110
1110
  with self.Session() as sess, sess.begin():
1111
1111
  # Select topics from all results
1112
- stmt = select(func.json_array_elements_text(table.c.topics)).select_from(table)
1112
+ stmt = select(table.c.topics)
1113
1113
  result = sess.execute(stmt).fetchall()
1114
-
1115
1114
  return list(set([record[0] for record in result]))
1116
1115
 
1117
1116
  except Exception as e:
@@ -359,10 +359,12 @@ Remember: You must only compare the agent_output to the expected_output. The exp
359
359
  status = Status(f"Running evaluation {i + 1}...", spinner="dots", speed=1.0, refresh_per_second=10)
360
360
  live_log.update(status)
361
361
 
362
+ agent_session_id = f"eval_{self.eval_id}_{i + 1}"
363
+
362
364
  if self.agent is not None:
363
- output = self.agent.run(input=eval_input).content
365
+ output = self.agent.run(input=eval_input, session_id=agent_session_id).content
364
366
  elif self.team is not None:
365
- output = self.team.run(input=eval_input).content
367
+ output = self.team.run(input=eval_input, session_id=agent_session_id).content
366
368
 
367
369
  if not output:
368
370
  logger.error(f"Failed to generate a valid answer on iteration {i + 1}: {output}")
@@ -500,11 +502,13 @@ Remember: You must only compare the agent_output to the expected_output. The exp
500
502
  status = Status(f"Running evaluation {i + 1}...", spinner="dots", speed=1.0, refresh_per_second=10)
501
503
  live_log.update(status)
502
504
 
505
+ agent_session_id = f"eval_{self.eval_id}_{i + 1}"
506
+
503
507
  if self.agent is not None:
504
- response = await self.agent.arun(input=eval_input)
508
+ response = await self.agent.arun(input=eval_input, session_id=agent_session_id)
505
509
  output = response.content
506
510
  elif self.team is not None:
507
- response = await self.team.arun(input=eval_input) # type: ignore
511
+ response = await self.team.arun(input=eval_input, session_id=agent_session_id) # type: ignore
508
512
  output = response.content
509
513
 
510
514
  if not output:
@@ -14,7 +14,7 @@ try:
14
14
  import discord
15
15
 
16
16
  except (ImportError, ModuleNotFoundError):
17
- print("`discord.py` not installed. Please install using `pip install discord.py`")
17
+ raise ImportError("`discord.py` not installed. Please install using `pip install discord.py`")
18
18
 
19
19
 
20
20
  class RequiresConfirmationView(discord.ui.View):
@@ -512,14 +512,16 @@ class Cerebras(Model):
512
512
 
513
513
  # Extend the list if needed
514
514
  while len(tool_calls) <= index:
515
- tool_calls.append({
516
- "id": None,
517
- "type": None,
518
- "function": {
519
- "name": "",
520
- "arguments": "",
521
- },
522
- })
515
+ tool_calls.append(
516
+ {
517
+ "id": None,
518
+ "type": None,
519
+ "function": {
520
+ "name": "",
521
+ "arguments": "",
522
+ },
523
+ }
524
+ )
523
525
 
524
526
  tool_call_entry = tool_calls[index]
525
527
 
@@ -540,10 +542,7 @@ class Cerebras(Model):
540
542
  tool_call_entry["function"]["arguments"] += func_delta["arguments"]
541
543
 
542
544
  # Filter out any incomplete tool calls (missing id or function name)
543
- complete_tool_calls = [
544
- tc for tc in tool_calls
545
- if tc.get("id") and tc.get("function", {}).get("name")
546
- ]
545
+ complete_tool_calls = [tc for tc in tool_calls if tc.get("id") and tc.get("function", {}).get("name")]
547
546
 
548
547
  return complete_tool_calls
549
548
 
@@ -3,6 +3,8 @@ import hmac
3
3
  import os
4
4
  from typing import Optional
5
5
 
6
+ from agno.utils.log import log_warning
7
+
6
8
 
7
9
  def is_development_mode() -> bool:
8
10
  """Check if the application is running in development mode."""
@@ -36,7 +38,7 @@ def validate_webhook_signature(payload: bytes, signature_header: Optional[str])
36
38
  """
37
39
  # In development mode, we can bypass signature validation
38
40
  if is_development_mode():
39
- print("WARNING: Bypassing signature validation in development mode")
41
+ log_warning("Bypassing signature validation in development mode")
40
42
  return True
41
43
 
42
44
  if not signature_header or not signature_header.startswith("sha256="):
@@ -742,10 +742,11 @@ class SessionSchema(BaseModel):
742
742
  @classmethod
743
743
  def from_dict(cls, session: Dict[str, Any]) -> "SessionSchema":
744
744
  session_name = get_session_name(session)
745
+ session_data = session.get("session_data", {}) or {}
745
746
  return cls(
746
747
  session_id=session.get("session_id", ""),
747
748
  session_name=session_name,
748
- session_state=session.get("session_data", {}).get("session_state", None),
749
+ session_state=session_data.get("session_state", None),
749
750
  created_at=datetime.fromtimestamp(session.get("created_at", 0), tz=timezone.utc)
750
751
  if session.get("created_at")
751
752
  else None,
@@ -46,7 +46,6 @@ class TeamSession:
46
46
  session_dict = asdict(self)
47
47
 
48
48
  session_dict["runs"] = [run.to_dict() for run in self.runs] if self.runs else None
49
- print(session_dict["runs"])
50
49
  session_dict["summary"] = self.summary.to_dict() if self.summary else None
51
50
 
52
51
  return session_dict
@@ -7,4 +7,4 @@ conn = sqlite3.connect(db_path)
7
7
  cur = conn.cursor()
8
8
  cur.execute(f"DROP TABLE IF EXISTS {table_name}")
9
9
  conn.commit()
10
- conn.close()
10
+ conn.close()
@@ -2060,7 +2060,10 @@ class Team:
2060
2060
 
2061
2061
  # Initialize session state
2062
2062
  session_state = self._initialize_session_state(
2063
- session_state=session_state or {}, user_id=user_id, session_id=session_id, run_id=run_id
2063
+ session_state=session_state if session_state is not None else {},
2064
+ user_id=user_id,
2065
+ session_id=session_id,
2066
+ run_id=run_id,
2064
2067
  )
2065
2068
  # Update session state from DB
2066
2069
  session_state = self._load_session_state(session=team_session, session_state=session_state)
@@ -2293,7 +2296,7 @@ class Team:
2293
2296
  self._update_metadata(session=team_session)
2294
2297
  # Initialize session state
2295
2298
  run_context.session_state = self._initialize_session_state(
2296
- session_state=run_context.session_state or {},
2299
+ session_state=run_context.session_state if run_context.session_state is not None else {},
2297
2300
  user_id=user_id,
2298
2301
  session_id=session_id,
2299
2302
  run_id=run_response.run_id,
@@ -2533,7 +2536,7 @@ class Team:
2533
2536
  self._update_metadata(session=team_session)
2534
2537
  # Initialize session state
2535
2538
  run_context.session_state = self._initialize_session_state(
2536
- session_state=run_context.session_state or {},
2539
+ session_state=run_context.session_state if run_context.session_state is not None else {},
2537
2540
  user_id=user_id,
2538
2541
  session_id=session_id,
2539
2542
  run_id=run_response.run_id,
@@ -6877,7 +6880,7 @@ class Team:
6877
6880
  return message
6878
6881
  # Should already be resolved and passed from run() method
6879
6882
  format_variables = ChainMap(
6880
- session_state or {},
6883
+ session_state if session_state is not None else {},
6881
6884
  dependencies or {},
6882
6885
  metadata or {},
6883
6886
  {"user_id": user_id} if user_id is not None else {},
@@ -69,6 +69,7 @@ from pathlib import Path
69
69
  from typing import Any, List, Optional, Union
70
70
 
71
71
  from agno.tools import Toolkit
72
+ from agno.utils.log import log_error
72
73
 
73
74
  try:
74
75
  from google.auth.transport.requests import Request
@@ -202,7 +203,7 @@ class GoogleDriveTools(Toolkit):
202
203
  items = results.get("files", [])
203
204
  return items
204
205
  except Exception as error:
205
- print(f"Could not list files: {error}")
206
+ log_error(f"Could not list files: {error}")
206
207
  return []
207
208
 
208
209
  @authenticate
@@ -238,7 +239,7 @@ class GoogleDriveTools(Toolkit):
238
239
  )
239
240
  return uploaded_file
240
241
  except Exception as error:
241
- print(f"Could not upload file '{file_path}': {error}")
242
+ log_error(f"Could not upload file '{file_path}': {error}")
242
243
  return None
243
244
 
244
245
  @authenticate
@@ -266,5 +267,5 @@ class GoogleDriveTools(Toolkit):
266
267
  print(f"Download progress: {int(status.progress() * 100)}%.")
267
268
  return dest_path
268
269
  except Exception as error:
269
- print(f"Could not download file '{file_id}': {error}")
270
+ log_error(f"Could not download file '{file_id}': {error}")
270
271
  return None