agno 2.3.14__tar.gz → 2.3.16__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 (620) hide show
  1. {agno-2.3.14 → agno-2.3.16}/PKG-INFO +1 -1
  2. {agno-2.3.14 → agno-2.3.16}/agno/agent/agent.py +29 -1
  3. {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/manager.py +3 -3
  4. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/csv_reader.py +10 -15
  5. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/docx_reader.py +2 -4
  6. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/field_labeled_csv_reader.py +12 -18
  7. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/json_reader.py +10 -18
  8. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/markdown_reader.py +6 -6
  9. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/pdf_reader.py +14 -11
  10. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/pptx_reader.py +2 -4
  11. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/s3_reader.py +2 -11
  12. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/text_reader.py +6 -18
  13. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/web_search_reader.py +4 -15
  14. {agno-2.3.14 → agno-2.3.16}/agno/models/anthropic/claude.py +5 -3
  15. {agno-2.3.14 → agno-2.3.16}/agno/models/metrics.py +12 -0
  16. {agno-2.3.14 → agno-2.3.16}/agno/models/openai/chat.py +2 -0
  17. {agno-2.3.14 → agno-2.3.16}/agno/os/app.py +20 -2
  18. {agno-2.3.14 → agno-2.3.16}/agno/os/auth.py +40 -3
  19. {agno-2.3.14 → agno-2.3.16}/agno/os/router.py +1 -57
  20. agno-2.3.16/agno/os/routers/database.py +150 -0
  21. {agno-2.3.14 → agno-2.3.16}/agno/os/settings.py +3 -0
  22. {agno-2.3.14 → agno-2.3.16}/agno/run/agent.py +10 -0
  23. {agno-2.3.14 → agno-2.3.16}/agno/run/base.py +19 -0
  24. {agno-2.3.14 → agno-2.3.16}/agno/run/team.py +10 -0
  25. {agno-2.3.14 → agno-2.3.16}/agno/team/team.py +10 -0
  26. {agno-2.3.14 → agno-2.3.16}/agno/tools/toolkit.py +119 -8
  27. {agno-2.3.14 → agno-2.3.16}/agno/utils/events.py +30 -2
  28. {agno-2.3.14 → agno-2.3.16}/agno.egg-info/PKG-INFO +1 -1
  29. {agno-2.3.14 → agno-2.3.16}/agno.egg-info/SOURCES.txt +1 -0
  30. {agno-2.3.14 → agno-2.3.16}/pyproject.toml +1 -1
  31. {agno-2.3.14 → agno-2.3.16}/LICENSE +0 -0
  32. {agno-2.3.14 → agno-2.3.16}/README.md +0 -0
  33. {agno-2.3.14 → agno-2.3.16}/agno/__init__.py +0 -0
  34. {agno-2.3.14 → agno-2.3.16}/agno/agent/__init__.py +0 -0
  35. {agno-2.3.14 → agno-2.3.16}/agno/api/__init__.py +0 -0
  36. {agno-2.3.14 → agno-2.3.16}/agno/api/agent.py +0 -0
  37. {agno-2.3.14 → agno-2.3.16}/agno/api/api.py +0 -0
  38. {agno-2.3.14 → agno-2.3.16}/agno/api/evals.py +0 -0
  39. {agno-2.3.14 → agno-2.3.16}/agno/api/os.py +0 -0
  40. {agno-2.3.14 → agno-2.3.16}/agno/api/routes.py +0 -0
  41. {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/__init__.py +0 -0
  42. {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/agent.py +0 -0
  43. {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/evals.py +0 -0
  44. {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/os.py +0 -0
  45. {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/response.py +0 -0
  46. {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/team.py +0 -0
  47. {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/utils.py +0 -0
  48. {agno-2.3.14 → agno-2.3.16}/agno/api/schemas/workflows.py +0 -0
  49. {agno-2.3.14 → agno-2.3.16}/agno/api/settings.py +0 -0
  50. {agno-2.3.14 → agno-2.3.16}/agno/api/team.py +0 -0
  51. {agno-2.3.14 → agno-2.3.16}/agno/api/workflow.py +0 -0
  52. {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/base.py +0 -0
  53. {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/s3/__init__.py +0 -0
  54. {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/s3/api_client.py +0 -0
  55. {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/s3/bucket.py +0 -0
  56. {agno-2.3.14 → agno-2.3.16}/agno/cloud/aws/s3/object.py +0 -0
  57. {agno-2.3.14 → agno-2.3.16}/agno/compression/__init__.py +0 -0
  58. {agno-2.3.14 → agno-2.3.16}/agno/compression/manager.py +0 -0
  59. {agno-2.3.14 → agno-2.3.16}/agno/culture/__init__.py +0 -0
  60. {agno-2.3.14 → agno-2.3.16}/agno/culture/manager.py +0 -0
  61. {agno-2.3.14 → agno-2.3.16}/agno/db/__init__.py +0 -0
  62. {agno-2.3.14 → agno-2.3.16}/agno/db/async_postgres/__init__.py +0 -0
  63. {agno-2.3.14 → agno-2.3.16}/agno/db/base.py +0 -0
  64. {agno-2.3.14 → agno-2.3.16}/agno/db/dynamo/__init__.py +0 -0
  65. {agno-2.3.14 → agno-2.3.16}/agno/db/dynamo/dynamo.py +0 -0
  66. {agno-2.3.14 → agno-2.3.16}/agno/db/dynamo/schemas.py +0 -0
  67. {agno-2.3.14 → agno-2.3.16}/agno/db/dynamo/utils.py +0 -0
  68. {agno-2.3.14 → agno-2.3.16}/agno/db/firestore/__init__.py +0 -0
  69. {agno-2.3.14 → agno-2.3.16}/agno/db/firestore/firestore.py +0 -0
  70. {agno-2.3.14 → agno-2.3.16}/agno/db/firestore/schemas.py +0 -0
  71. {agno-2.3.14 → agno-2.3.16}/agno/db/firestore/utils.py +0 -0
  72. {agno-2.3.14 → agno-2.3.16}/agno/db/gcs_json/__init__.py +0 -0
  73. {agno-2.3.14 → agno-2.3.16}/agno/db/gcs_json/gcs_json_db.py +0 -0
  74. {agno-2.3.14 → agno-2.3.16}/agno/db/gcs_json/utils.py +0 -0
  75. {agno-2.3.14 → agno-2.3.16}/agno/db/in_memory/__init__.py +0 -0
  76. {agno-2.3.14 → agno-2.3.16}/agno/db/in_memory/in_memory_db.py +0 -0
  77. {agno-2.3.14 → agno-2.3.16}/agno/db/in_memory/utils.py +0 -0
  78. {agno-2.3.14 → agno-2.3.16}/agno/db/json/__init__.py +0 -0
  79. {agno-2.3.14 → agno-2.3.16}/agno/db/json/json_db.py +0 -0
  80. {agno-2.3.14 → agno-2.3.16}/agno/db/json/utils.py +0 -0
  81. {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/__init__.py +0 -0
  82. {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/v1_to_v2.py +0 -0
  83. {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/versions/__init__.py +0 -0
  84. {agno-2.3.14 → agno-2.3.16}/agno/db/migrations/versions/v2_3_0.py +0 -0
  85. {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/__init__.py +0 -0
  86. {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/async_mongo.py +0 -0
  87. {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/mongo.py +0 -0
  88. {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/schemas.py +0 -0
  89. {agno-2.3.14 → agno-2.3.16}/agno/db/mongo/utils.py +0 -0
  90. {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/__init__.py +0 -0
  91. {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/async_mysql.py +0 -0
  92. {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/mysql.py +0 -0
  93. {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/schemas.py +0 -0
  94. {agno-2.3.14 → agno-2.3.16}/agno/db/mysql/utils.py +0 -0
  95. {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/__init__.py +0 -0
  96. {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/async_postgres.py +0 -0
  97. {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/postgres.py +0 -0
  98. {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/schemas.py +0 -0
  99. {agno-2.3.14 → agno-2.3.16}/agno/db/postgres/utils.py +0 -0
  100. {agno-2.3.14 → agno-2.3.16}/agno/db/redis/__init__.py +0 -0
  101. {agno-2.3.14 → agno-2.3.16}/agno/db/redis/redis.py +0 -0
  102. {agno-2.3.14 → agno-2.3.16}/agno/db/redis/schemas.py +0 -0
  103. {agno-2.3.14 → agno-2.3.16}/agno/db/redis/utils.py +0 -0
  104. {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/__init__.py +0 -0
  105. {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/culture.py +0 -0
  106. {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/evals.py +0 -0
  107. {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/knowledge.py +0 -0
  108. {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/memory.py +0 -0
  109. {agno-2.3.14 → agno-2.3.16}/agno/db/schemas/metrics.py +0 -0
  110. {agno-2.3.14 → agno-2.3.16}/agno/db/singlestore/__init__.py +0 -0
  111. {agno-2.3.14 → agno-2.3.16}/agno/db/singlestore/schemas.py +0 -0
  112. {agno-2.3.14 → agno-2.3.16}/agno/db/singlestore/singlestore.py +0 -0
  113. {agno-2.3.14 → agno-2.3.16}/agno/db/singlestore/utils.py +0 -0
  114. {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/__init__.py +0 -0
  115. {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/async_sqlite.py +0 -0
  116. {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/schemas.py +0 -0
  117. {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/sqlite.py +0 -0
  118. {agno-2.3.14 → agno-2.3.16}/agno/db/sqlite/utils.py +0 -0
  119. {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/__init__.py +0 -0
  120. {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/metrics.py +0 -0
  121. {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/models.py +0 -0
  122. {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/queries.py +0 -0
  123. {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/surrealdb.py +0 -0
  124. {agno-2.3.14 → agno-2.3.16}/agno/db/surrealdb/utils.py +0 -0
  125. {agno-2.3.14 → agno-2.3.16}/agno/db/utils.py +0 -0
  126. {agno-2.3.14 → agno-2.3.16}/agno/debug.py +0 -0
  127. {agno-2.3.14 → agno-2.3.16}/agno/eval/__init__.py +0 -0
  128. {agno-2.3.14 → agno-2.3.16}/agno/eval/accuracy.py +0 -0
  129. {agno-2.3.14 → agno-2.3.16}/agno/eval/agent_as_judge.py +0 -0
  130. {agno-2.3.14 → agno-2.3.16}/agno/eval/base.py +0 -0
  131. {agno-2.3.14 → agno-2.3.16}/agno/eval/performance.py +0 -0
  132. {agno-2.3.14 → agno-2.3.16}/agno/eval/reliability.py +0 -0
  133. {agno-2.3.14 → agno-2.3.16}/agno/eval/utils.py +0 -0
  134. {agno-2.3.14 → agno-2.3.16}/agno/exceptions.py +0 -0
  135. {agno-2.3.14 → agno-2.3.16}/agno/filters.py +0 -0
  136. {agno-2.3.14 → agno-2.3.16}/agno/guardrails/__init__.py +0 -0
  137. {agno-2.3.14 → agno-2.3.16}/agno/guardrails/base.py +0 -0
  138. {agno-2.3.14 → agno-2.3.16}/agno/guardrails/openai.py +0 -0
  139. {agno-2.3.14 → agno-2.3.16}/agno/guardrails/pii.py +0 -0
  140. {agno-2.3.14 → agno-2.3.16}/agno/guardrails/prompt_injection.py +0 -0
  141. {agno-2.3.14 → agno-2.3.16}/agno/hooks/__init__.py +0 -0
  142. {agno-2.3.14 → agno-2.3.16}/agno/hooks/decorator.py +0 -0
  143. {agno-2.3.14 → agno-2.3.16}/agno/integrations/__init__.py +0 -0
  144. {agno-2.3.14 → agno-2.3.16}/agno/integrations/discord/__init__.py +0 -0
  145. {agno-2.3.14 → agno-2.3.16}/agno/integrations/discord/client.py +0 -0
  146. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/__init__.py +0 -0
  147. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/__init__.py +0 -0
  148. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/agentic.py +0 -0
  149. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/document.py +0 -0
  150. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/fixed.py +0 -0
  151. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/markdown.py +0 -0
  152. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/recursive.py +0 -0
  153. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/row.py +0 -0
  154. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/semantic.py +0 -0
  155. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/chunking/strategy.py +0 -0
  156. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/content.py +0 -0
  157. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/document/__init__.py +0 -0
  158. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/document/base.py +0 -0
  159. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/__init__.py +0 -0
  160. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/aws_bedrock.py +0 -0
  161. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/azure_openai.py +0 -0
  162. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/base.py +0 -0
  163. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/cohere.py +0 -0
  164. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/fastembed.py +0 -0
  165. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/fireworks.py +0 -0
  166. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/google.py +0 -0
  167. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/huggingface.py +0 -0
  168. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/jina.py +0 -0
  169. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/langdb.py +0 -0
  170. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/mistral.py +0 -0
  171. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/nebius.py +0 -0
  172. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/ollama.py +0 -0
  173. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/openai.py +0 -0
  174. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/sentence_transformer.py +0 -0
  175. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/together.py +0 -0
  176. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/vllm.py +0 -0
  177. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/embedder/voyageai.py +0 -0
  178. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/knowledge.py +0 -0
  179. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/__init__.py +0 -0
  180. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/arxiv_reader.py +0 -0
  181. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/base.py +0 -0
  182. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/firecrawl_reader.py +0 -0
  183. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/reader_factory.py +0 -0
  184. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/tavily_reader.py +0 -0
  185. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/website_reader.py +0 -0
  186. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/wikipedia_reader.py +0 -0
  187. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reader/youtube_reader.py +0 -0
  188. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/remote_content/__init__.py +0 -0
  189. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/remote_content/remote_content.py +0 -0
  190. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/__init__.py +0 -0
  191. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/base.py +0 -0
  192. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/cohere.py +0 -0
  193. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/infinity.py +0 -0
  194. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  195. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/types.py +0 -0
  196. {agno-2.3.14 → agno-2.3.16}/agno/knowledge/utils.py +0 -0
  197. {agno-2.3.14 → agno-2.3.16}/agno/media.py +0 -0
  198. {agno-2.3.14 → agno-2.3.16}/agno/memory/__init__.py +0 -0
  199. {agno-2.3.14 → agno-2.3.16}/agno/memory/manager.py +0 -0
  200. {agno-2.3.14 → agno-2.3.16}/agno/memory/strategies/__init__.py +0 -0
  201. {agno-2.3.14 → agno-2.3.16}/agno/memory/strategies/base.py +0 -0
  202. {agno-2.3.14 → agno-2.3.16}/agno/memory/strategies/summarize.py +0 -0
  203. {agno-2.3.14 → agno-2.3.16}/agno/memory/strategies/types.py +0 -0
  204. {agno-2.3.14 → agno-2.3.16}/agno/models/__init__.py +0 -0
  205. {agno-2.3.14 → agno-2.3.16}/agno/models/aimlapi/__init__.py +0 -0
  206. {agno-2.3.14 → agno-2.3.16}/agno/models/aimlapi/aimlapi.py +0 -0
  207. {agno-2.3.14 → agno-2.3.16}/agno/models/anthropic/__init__.py +0 -0
  208. {agno-2.3.14 → agno-2.3.16}/agno/models/aws/__init__.py +0 -0
  209. {agno-2.3.14 → agno-2.3.16}/agno/models/aws/bedrock.py +0 -0
  210. {agno-2.3.14 → agno-2.3.16}/agno/models/aws/claude.py +0 -0
  211. {agno-2.3.14 → agno-2.3.16}/agno/models/azure/__init__.py +0 -0
  212. {agno-2.3.14 → agno-2.3.16}/agno/models/azure/ai_foundry.py +0 -0
  213. {agno-2.3.14 → agno-2.3.16}/agno/models/azure/openai_chat.py +0 -0
  214. {agno-2.3.14 → agno-2.3.16}/agno/models/base.py +0 -0
  215. {agno-2.3.14 → agno-2.3.16}/agno/models/cerebras/__init__.py +0 -0
  216. {agno-2.3.14 → agno-2.3.16}/agno/models/cerebras/cerebras.py +0 -0
  217. {agno-2.3.14 → agno-2.3.16}/agno/models/cerebras/cerebras_openai.py +0 -0
  218. {agno-2.3.14 → agno-2.3.16}/agno/models/cohere/__init__.py +0 -0
  219. {agno-2.3.14 → agno-2.3.16}/agno/models/cohere/chat.py +0 -0
  220. {agno-2.3.14 → agno-2.3.16}/agno/models/cometapi/__init__.py +0 -0
  221. {agno-2.3.14 → agno-2.3.16}/agno/models/cometapi/cometapi.py +0 -0
  222. {agno-2.3.14 → agno-2.3.16}/agno/models/dashscope/__init__.py +0 -0
  223. {agno-2.3.14 → agno-2.3.16}/agno/models/dashscope/dashscope.py +0 -0
  224. {agno-2.3.14 → agno-2.3.16}/agno/models/deepinfra/__init__.py +0 -0
  225. {agno-2.3.14 → agno-2.3.16}/agno/models/deepinfra/deepinfra.py +0 -0
  226. {agno-2.3.14 → agno-2.3.16}/agno/models/deepseek/__init__.py +0 -0
  227. {agno-2.3.14 → agno-2.3.16}/agno/models/deepseek/deepseek.py +0 -0
  228. {agno-2.3.14 → agno-2.3.16}/agno/models/defaults.py +0 -0
  229. {agno-2.3.14 → agno-2.3.16}/agno/models/fireworks/__init__.py +0 -0
  230. {agno-2.3.14 → agno-2.3.16}/agno/models/fireworks/fireworks.py +0 -0
  231. {agno-2.3.14 → agno-2.3.16}/agno/models/google/__init__.py +0 -0
  232. {agno-2.3.14 → agno-2.3.16}/agno/models/google/gemini.py +0 -0
  233. {agno-2.3.14 → agno-2.3.16}/agno/models/google/utils.py +0 -0
  234. {agno-2.3.14 → agno-2.3.16}/agno/models/groq/__init__.py +0 -0
  235. {agno-2.3.14 → agno-2.3.16}/agno/models/groq/groq.py +0 -0
  236. {agno-2.3.14 → agno-2.3.16}/agno/models/huggingface/__init__.py +0 -0
  237. {agno-2.3.14 → agno-2.3.16}/agno/models/huggingface/huggingface.py +0 -0
  238. {agno-2.3.14 → agno-2.3.16}/agno/models/ibm/__init__.py +0 -0
  239. {agno-2.3.14 → agno-2.3.16}/agno/models/ibm/watsonx.py +0 -0
  240. {agno-2.3.14 → agno-2.3.16}/agno/models/internlm/__init__.py +0 -0
  241. {agno-2.3.14 → agno-2.3.16}/agno/models/internlm/internlm.py +0 -0
  242. {agno-2.3.14 → agno-2.3.16}/agno/models/langdb/__init__.py +0 -0
  243. {agno-2.3.14 → agno-2.3.16}/agno/models/langdb/langdb.py +0 -0
  244. {agno-2.3.14 → agno-2.3.16}/agno/models/litellm/__init__.py +0 -0
  245. {agno-2.3.14 → agno-2.3.16}/agno/models/litellm/chat.py +0 -0
  246. {agno-2.3.14 → agno-2.3.16}/agno/models/litellm/litellm_openai.py +0 -0
  247. {agno-2.3.14 → agno-2.3.16}/agno/models/llama_cpp/__init__.py +0 -0
  248. {agno-2.3.14 → agno-2.3.16}/agno/models/llama_cpp/llama_cpp.py +0 -0
  249. {agno-2.3.14 → agno-2.3.16}/agno/models/lmstudio/__init__.py +0 -0
  250. {agno-2.3.14 → agno-2.3.16}/agno/models/lmstudio/lmstudio.py +0 -0
  251. {agno-2.3.14 → agno-2.3.16}/agno/models/message.py +0 -0
  252. {agno-2.3.14 → agno-2.3.16}/agno/models/meta/__init__.py +0 -0
  253. {agno-2.3.14 → agno-2.3.16}/agno/models/meta/llama.py +0 -0
  254. {agno-2.3.14 → agno-2.3.16}/agno/models/meta/llama_openai.py +0 -0
  255. {agno-2.3.14 → agno-2.3.16}/agno/models/mistral/__init__.py +0 -0
  256. {agno-2.3.14 → agno-2.3.16}/agno/models/mistral/mistral.py +0 -0
  257. {agno-2.3.14 → agno-2.3.16}/agno/models/nebius/__init__.py +0 -0
  258. {agno-2.3.14 → agno-2.3.16}/agno/models/nebius/nebius.py +0 -0
  259. {agno-2.3.14 → agno-2.3.16}/agno/models/nexus/__init__.py +0 -0
  260. {agno-2.3.14 → agno-2.3.16}/agno/models/nexus/nexus.py +0 -0
  261. {agno-2.3.14 → agno-2.3.16}/agno/models/nvidia/__init__.py +0 -0
  262. {agno-2.3.14 → agno-2.3.16}/agno/models/nvidia/nvidia.py +0 -0
  263. {agno-2.3.14 → agno-2.3.16}/agno/models/ollama/__init__.py +0 -0
  264. {agno-2.3.14 → agno-2.3.16}/agno/models/ollama/chat.py +0 -0
  265. {agno-2.3.14 → agno-2.3.16}/agno/models/openai/__init__.py +0 -0
  266. {agno-2.3.14 → agno-2.3.16}/agno/models/openai/like.py +0 -0
  267. {agno-2.3.14 → agno-2.3.16}/agno/models/openai/responses.py +0 -0
  268. {agno-2.3.14 → agno-2.3.16}/agno/models/openrouter/__init__.py +0 -0
  269. {agno-2.3.14 → agno-2.3.16}/agno/models/openrouter/openrouter.py +0 -0
  270. {agno-2.3.14 → agno-2.3.16}/agno/models/perplexity/__init__.py +0 -0
  271. {agno-2.3.14 → agno-2.3.16}/agno/models/perplexity/perplexity.py +0 -0
  272. {agno-2.3.14 → agno-2.3.16}/agno/models/portkey/__init__.py +0 -0
  273. {agno-2.3.14 → agno-2.3.16}/agno/models/portkey/portkey.py +0 -0
  274. {agno-2.3.14 → agno-2.3.16}/agno/models/requesty/__init__.py +0 -0
  275. {agno-2.3.14 → agno-2.3.16}/agno/models/requesty/requesty.py +0 -0
  276. {agno-2.3.14 → agno-2.3.16}/agno/models/response.py +0 -0
  277. {agno-2.3.14 → agno-2.3.16}/agno/models/sambanova/__init__.py +0 -0
  278. {agno-2.3.14 → agno-2.3.16}/agno/models/sambanova/sambanova.py +0 -0
  279. {agno-2.3.14 → agno-2.3.16}/agno/models/siliconflow/__init__.py +0 -0
  280. {agno-2.3.14 → agno-2.3.16}/agno/models/siliconflow/siliconflow.py +0 -0
  281. {agno-2.3.14 → agno-2.3.16}/agno/models/together/__init__.py +0 -0
  282. {agno-2.3.14 → agno-2.3.16}/agno/models/together/together.py +0 -0
  283. {agno-2.3.14 → agno-2.3.16}/agno/models/utils.py +0 -0
  284. {agno-2.3.14 → agno-2.3.16}/agno/models/vercel/__init__.py +0 -0
  285. {agno-2.3.14 → agno-2.3.16}/agno/models/vercel/v0.py +0 -0
  286. {agno-2.3.14 → agno-2.3.16}/agno/models/vertexai/__init__.py +0 -0
  287. {agno-2.3.14 → agno-2.3.16}/agno/models/vertexai/claude.py +0 -0
  288. {agno-2.3.14 → agno-2.3.16}/agno/models/vllm/__init__.py +0 -0
  289. {agno-2.3.14 → agno-2.3.16}/agno/models/vllm/vllm.py +0 -0
  290. {agno-2.3.14 → agno-2.3.16}/agno/models/xai/__init__.py +0 -0
  291. {agno-2.3.14 → agno-2.3.16}/agno/models/xai/xai.py +0 -0
  292. {agno-2.3.14 → agno-2.3.16}/agno/os/__init__.py +0 -0
  293. {agno-2.3.14 → agno-2.3.16}/agno/os/config.py +0 -0
  294. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/__init__.py +0 -0
  295. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/a2a/__init__.py +0 -0
  296. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/a2a/a2a.py +0 -0
  297. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/a2a/router.py +0 -0
  298. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/a2a/utils.py +0 -0
  299. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/agui/__init__.py +0 -0
  300. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/agui/agui.py +0 -0
  301. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/agui/router.py +0 -0
  302. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/agui/utils.py +0 -0
  303. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/base.py +0 -0
  304. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/slack/__init__.py +0 -0
  305. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/slack/router.py +0 -0
  306. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/slack/security.py +0 -0
  307. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/slack/slack.py +0 -0
  308. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  309. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/whatsapp/router.py +0 -0
  310. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/whatsapp/security.py +0 -0
  311. {agno-2.3.14 → agno-2.3.16}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
  312. {agno-2.3.14 → agno-2.3.16}/agno/os/mcp.py +0 -0
  313. {agno-2.3.14 → agno-2.3.16}/agno/os/middleware/__init__.py +0 -0
  314. {agno-2.3.14 → agno-2.3.16}/agno/os/middleware/jwt.py +0 -0
  315. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/__init__.py +0 -0
  316. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/agents/__init__.py +0 -0
  317. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/agents/router.py +0 -0
  318. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/agents/schema.py +0 -0
  319. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/evals/__init__.py +0 -0
  320. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/evals/evals.py +0 -0
  321. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/evals/schemas.py +0 -0
  322. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/evals/utils.py +0 -0
  323. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/health.py +0 -0
  324. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/home.py +0 -0
  325. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/knowledge/__init__.py +0 -0
  326. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/knowledge/knowledge.py +0 -0
  327. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/knowledge/schemas.py +0 -0
  328. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/memory/__init__.py +0 -0
  329. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/memory/memory.py +0 -0
  330. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/memory/schemas.py +0 -0
  331. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/metrics/__init__.py +0 -0
  332. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/metrics/metrics.py +0 -0
  333. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/metrics/schemas.py +0 -0
  334. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/session/__init__.py +0 -0
  335. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/session/session.py +0 -0
  336. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/teams/__init__.py +0 -0
  337. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/teams/router.py +0 -0
  338. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/teams/schema.py +0 -0
  339. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/traces/__init__.py +0 -0
  340. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/traces/schemas.py +0 -0
  341. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/traces/traces.py +0 -0
  342. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/workflows/__init__.py +0 -0
  343. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/workflows/router.py +0 -0
  344. {agno-2.3.14 → agno-2.3.16}/agno/os/routers/workflows/schema.py +0 -0
  345. {agno-2.3.14 → agno-2.3.16}/agno/os/schema.py +0 -0
  346. {agno-2.3.14 → agno-2.3.16}/agno/os/scopes.py +0 -0
  347. {agno-2.3.14 → agno-2.3.16}/agno/os/utils.py +0 -0
  348. {agno-2.3.14 → agno-2.3.16}/agno/py.typed +0 -0
  349. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/__init__.py +0 -0
  350. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/anthropic.py +0 -0
  351. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/azure_ai_foundry.py +0 -0
  352. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/deepseek.py +0 -0
  353. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/default.py +0 -0
  354. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/gemini.py +0 -0
  355. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/groq.py +0 -0
  356. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/helpers.py +0 -0
  357. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/manager.py +0 -0
  358. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/ollama.py +0 -0
  359. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/openai.py +0 -0
  360. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/step.py +0 -0
  361. {agno-2.3.14 → agno-2.3.16}/agno/reasoning/vertexai.py +0 -0
  362. {agno-2.3.14 → agno-2.3.16}/agno/run/__init__.py +0 -0
  363. {agno-2.3.14 → agno-2.3.16}/agno/run/cancel.py +0 -0
  364. {agno-2.3.14 → agno-2.3.16}/agno/run/messages.py +0 -0
  365. {agno-2.3.14 → agno-2.3.16}/agno/run/requirement.py +0 -0
  366. {agno-2.3.14 → agno-2.3.16}/agno/run/workflow.py +0 -0
  367. {agno-2.3.14 → agno-2.3.16}/agno/session/__init__.py +0 -0
  368. {agno-2.3.14 → agno-2.3.16}/agno/session/agent.py +0 -0
  369. {agno-2.3.14 → agno-2.3.16}/agno/session/summary.py +0 -0
  370. {agno-2.3.14 → agno-2.3.16}/agno/session/team.py +0 -0
  371. {agno-2.3.14 → agno-2.3.16}/agno/session/workflow.py +0 -0
  372. {agno-2.3.14 → agno-2.3.16}/agno/table.py +0 -0
  373. {agno-2.3.14 → agno-2.3.16}/agno/team/__init__.py +0 -0
  374. {agno-2.3.14 → agno-2.3.16}/agno/tools/__init__.py +0 -0
  375. {agno-2.3.14 → agno-2.3.16}/agno/tools/agentql.py +0 -0
  376. {agno-2.3.14 → agno-2.3.16}/agno/tools/airflow.py +0 -0
  377. {agno-2.3.14 → agno-2.3.16}/agno/tools/api.py +0 -0
  378. {agno-2.3.14 → agno-2.3.16}/agno/tools/apify.py +0 -0
  379. {agno-2.3.14 → agno-2.3.16}/agno/tools/arxiv.py +0 -0
  380. {agno-2.3.14 → agno-2.3.16}/agno/tools/aws_lambda.py +0 -0
  381. {agno-2.3.14 → agno-2.3.16}/agno/tools/aws_ses.py +0 -0
  382. {agno-2.3.14 → agno-2.3.16}/agno/tools/baidusearch.py +0 -0
  383. {agno-2.3.14 → agno-2.3.16}/agno/tools/bitbucket.py +0 -0
  384. {agno-2.3.14 → agno-2.3.16}/agno/tools/brandfetch.py +0 -0
  385. {agno-2.3.14 → agno-2.3.16}/agno/tools/bravesearch.py +0 -0
  386. {agno-2.3.14 → agno-2.3.16}/agno/tools/brightdata.py +0 -0
  387. {agno-2.3.14 → agno-2.3.16}/agno/tools/browserbase.py +0 -0
  388. {agno-2.3.14 → agno-2.3.16}/agno/tools/calcom.py +0 -0
  389. {agno-2.3.14 → agno-2.3.16}/agno/tools/calculator.py +0 -0
  390. {agno-2.3.14 → agno-2.3.16}/agno/tools/cartesia.py +0 -0
  391. {agno-2.3.14 → agno-2.3.16}/agno/tools/clickup.py +0 -0
  392. {agno-2.3.14 → agno-2.3.16}/agno/tools/confluence.py +0 -0
  393. {agno-2.3.14 → agno-2.3.16}/agno/tools/crawl4ai.py +0 -0
  394. {agno-2.3.14 → agno-2.3.16}/agno/tools/csv_toolkit.py +0 -0
  395. {agno-2.3.14 → agno-2.3.16}/agno/tools/dalle.py +0 -0
  396. {agno-2.3.14 → agno-2.3.16}/agno/tools/daytona.py +0 -0
  397. {agno-2.3.14 → agno-2.3.16}/agno/tools/decorator.py +0 -0
  398. {agno-2.3.14 → agno-2.3.16}/agno/tools/desi_vocal.py +0 -0
  399. {agno-2.3.14 → agno-2.3.16}/agno/tools/discord.py +0 -0
  400. {agno-2.3.14 → agno-2.3.16}/agno/tools/docker.py +0 -0
  401. {agno-2.3.14 → agno-2.3.16}/agno/tools/duckdb.py +0 -0
  402. {agno-2.3.14 → agno-2.3.16}/agno/tools/duckduckgo.py +0 -0
  403. {agno-2.3.14 → agno-2.3.16}/agno/tools/e2b.py +0 -0
  404. {agno-2.3.14 → agno-2.3.16}/agno/tools/eleven_labs.py +0 -0
  405. {agno-2.3.14 → agno-2.3.16}/agno/tools/email.py +0 -0
  406. {agno-2.3.14 → agno-2.3.16}/agno/tools/evm.py +0 -0
  407. {agno-2.3.14 → agno-2.3.16}/agno/tools/exa.py +0 -0
  408. {agno-2.3.14 → agno-2.3.16}/agno/tools/fal.py +0 -0
  409. {agno-2.3.14 → agno-2.3.16}/agno/tools/file.py +0 -0
  410. {agno-2.3.14 → agno-2.3.16}/agno/tools/file_generation.py +0 -0
  411. {agno-2.3.14 → agno-2.3.16}/agno/tools/financial_datasets.py +0 -0
  412. {agno-2.3.14 → agno-2.3.16}/agno/tools/firecrawl.py +0 -0
  413. {agno-2.3.14 → agno-2.3.16}/agno/tools/function.py +0 -0
  414. {agno-2.3.14 → agno-2.3.16}/agno/tools/giphy.py +0 -0
  415. {agno-2.3.14 → agno-2.3.16}/agno/tools/github.py +0 -0
  416. {agno-2.3.14 → agno-2.3.16}/agno/tools/gmail.py +0 -0
  417. {agno-2.3.14 → agno-2.3.16}/agno/tools/google_bigquery.py +0 -0
  418. {agno-2.3.14 → agno-2.3.16}/agno/tools/google_drive.py +0 -0
  419. {agno-2.3.14 → agno-2.3.16}/agno/tools/google_maps.py +0 -0
  420. {agno-2.3.14 → agno-2.3.16}/agno/tools/googlecalendar.py +0 -0
  421. {agno-2.3.14 → agno-2.3.16}/agno/tools/googlesheets.py +0 -0
  422. {agno-2.3.14 → agno-2.3.16}/agno/tools/hackernews.py +0 -0
  423. {agno-2.3.14 → agno-2.3.16}/agno/tools/jina.py +0 -0
  424. {agno-2.3.14 → agno-2.3.16}/agno/tools/jira.py +0 -0
  425. {agno-2.3.14 → agno-2.3.16}/agno/tools/knowledge.py +0 -0
  426. {agno-2.3.14 → agno-2.3.16}/agno/tools/linear.py +0 -0
  427. {agno-2.3.14 → agno-2.3.16}/agno/tools/linkup.py +0 -0
  428. {agno-2.3.14 → agno-2.3.16}/agno/tools/local_file_system.py +0 -0
  429. {agno-2.3.14 → agno-2.3.16}/agno/tools/lumalab.py +0 -0
  430. {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp/__init__.py +0 -0
  431. {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp/mcp.py +0 -0
  432. {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp/multi_mcp.py +0 -0
  433. {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp/params.py +0 -0
  434. {agno-2.3.14 → agno-2.3.16}/agno/tools/mcp_toolbox.py +0 -0
  435. {agno-2.3.14 → agno-2.3.16}/agno/tools/mem0.py +0 -0
  436. {agno-2.3.14 → agno-2.3.16}/agno/tools/memory.py +0 -0
  437. {agno-2.3.14 → agno-2.3.16}/agno/tools/mlx_transcribe.py +0 -0
  438. {agno-2.3.14 → agno-2.3.16}/agno/tools/models/__init__.py +0 -0
  439. {agno-2.3.14 → agno-2.3.16}/agno/tools/models/azure_openai.py +0 -0
  440. {agno-2.3.14 → agno-2.3.16}/agno/tools/models/gemini.py +0 -0
  441. {agno-2.3.14 → agno-2.3.16}/agno/tools/models/groq.py +0 -0
  442. {agno-2.3.14 → agno-2.3.16}/agno/tools/models/morph.py +0 -0
  443. {agno-2.3.14 → agno-2.3.16}/agno/tools/models/nebius.py +0 -0
  444. {agno-2.3.14 → agno-2.3.16}/agno/tools/models_labs.py +0 -0
  445. {agno-2.3.14 → agno-2.3.16}/agno/tools/moviepy_video.py +0 -0
  446. {agno-2.3.14 → agno-2.3.16}/agno/tools/nano_banana.py +0 -0
  447. {agno-2.3.14 → agno-2.3.16}/agno/tools/neo4j.py +0 -0
  448. {agno-2.3.14 → agno-2.3.16}/agno/tools/newspaper.py +0 -0
  449. {agno-2.3.14 → agno-2.3.16}/agno/tools/newspaper4k.py +0 -0
  450. {agno-2.3.14 → agno-2.3.16}/agno/tools/notion.py +0 -0
  451. {agno-2.3.14 → agno-2.3.16}/agno/tools/openai.py +0 -0
  452. {agno-2.3.14 → agno-2.3.16}/agno/tools/openbb.py +0 -0
  453. {agno-2.3.14 → agno-2.3.16}/agno/tools/opencv.py +0 -0
  454. {agno-2.3.14 → agno-2.3.16}/agno/tools/openweather.py +0 -0
  455. {agno-2.3.14 → agno-2.3.16}/agno/tools/oxylabs.py +0 -0
  456. {agno-2.3.14 → agno-2.3.16}/agno/tools/pandas.py +0 -0
  457. {agno-2.3.14 → agno-2.3.16}/agno/tools/parallel.py +0 -0
  458. {agno-2.3.14 → agno-2.3.16}/agno/tools/postgres.py +0 -0
  459. {agno-2.3.14 → agno-2.3.16}/agno/tools/pubmed.py +0 -0
  460. {agno-2.3.14 → agno-2.3.16}/agno/tools/python.py +0 -0
  461. {agno-2.3.14 → agno-2.3.16}/agno/tools/reasoning.py +0 -0
  462. {agno-2.3.14 → agno-2.3.16}/agno/tools/reddit.py +0 -0
  463. {agno-2.3.14 → agno-2.3.16}/agno/tools/redshift.py +0 -0
  464. {agno-2.3.14 → agno-2.3.16}/agno/tools/replicate.py +0 -0
  465. {agno-2.3.14 → agno-2.3.16}/agno/tools/resend.py +0 -0
  466. {agno-2.3.14 → agno-2.3.16}/agno/tools/scrapegraph.py +0 -0
  467. {agno-2.3.14 → agno-2.3.16}/agno/tools/searxng.py +0 -0
  468. {agno-2.3.14 → agno-2.3.16}/agno/tools/serpapi.py +0 -0
  469. {agno-2.3.14 → agno-2.3.16}/agno/tools/serper.py +0 -0
  470. {agno-2.3.14 → agno-2.3.16}/agno/tools/shell.py +0 -0
  471. {agno-2.3.14 → agno-2.3.16}/agno/tools/shopify.py +0 -0
  472. {agno-2.3.14 → agno-2.3.16}/agno/tools/slack.py +0 -0
  473. {agno-2.3.14 → agno-2.3.16}/agno/tools/sleep.py +0 -0
  474. {agno-2.3.14 → agno-2.3.16}/agno/tools/spider.py +0 -0
  475. {agno-2.3.14 → agno-2.3.16}/agno/tools/spotify.py +0 -0
  476. {agno-2.3.14 → agno-2.3.16}/agno/tools/sql.py +0 -0
  477. {agno-2.3.14 → agno-2.3.16}/agno/tools/streamlit/__init__.py +0 -0
  478. {agno-2.3.14 → agno-2.3.16}/agno/tools/streamlit/components.py +0 -0
  479. {agno-2.3.14 → agno-2.3.16}/agno/tools/tavily.py +0 -0
  480. {agno-2.3.14 → agno-2.3.16}/agno/tools/telegram.py +0 -0
  481. {agno-2.3.14 → agno-2.3.16}/agno/tools/todoist.py +0 -0
  482. {agno-2.3.14 → agno-2.3.16}/agno/tools/tool_registry.py +0 -0
  483. {agno-2.3.14 → agno-2.3.16}/agno/tools/trafilatura.py +0 -0
  484. {agno-2.3.14 → agno-2.3.16}/agno/tools/trello.py +0 -0
  485. {agno-2.3.14 → agno-2.3.16}/agno/tools/twilio.py +0 -0
  486. {agno-2.3.14 → agno-2.3.16}/agno/tools/user_control_flow.py +0 -0
  487. {agno-2.3.14 → agno-2.3.16}/agno/tools/valyu.py +0 -0
  488. {agno-2.3.14 → agno-2.3.16}/agno/tools/visualization.py +0 -0
  489. {agno-2.3.14 → agno-2.3.16}/agno/tools/webbrowser.py +0 -0
  490. {agno-2.3.14 → agno-2.3.16}/agno/tools/webex.py +0 -0
  491. {agno-2.3.14 → agno-2.3.16}/agno/tools/website.py +0 -0
  492. {agno-2.3.14 → agno-2.3.16}/agno/tools/webtools.py +0 -0
  493. {agno-2.3.14 → agno-2.3.16}/agno/tools/whatsapp.py +0 -0
  494. {agno-2.3.14 → agno-2.3.16}/agno/tools/wikipedia.py +0 -0
  495. {agno-2.3.14 → agno-2.3.16}/agno/tools/workflow.py +0 -0
  496. {agno-2.3.14 → agno-2.3.16}/agno/tools/x.py +0 -0
  497. {agno-2.3.14 → agno-2.3.16}/agno/tools/yfinance.py +0 -0
  498. {agno-2.3.14 → agno-2.3.16}/agno/tools/youtube.py +0 -0
  499. {agno-2.3.14 → agno-2.3.16}/agno/tools/zendesk.py +0 -0
  500. {agno-2.3.14 → agno-2.3.16}/agno/tools/zep.py +0 -0
  501. {agno-2.3.14 → agno-2.3.16}/agno/tools/zoom.py +0 -0
  502. {agno-2.3.14 → agno-2.3.16}/agno/tracing/__init__.py +0 -0
  503. {agno-2.3.14 → agno-2.3.16}/agno/tracing/exporter.py +0 -0
  504. {agno-2.3.14 → agno-2.3.16}/agno/tracing/schemas.py +0 -0
  505. {agno-2.3.14 → agno-2.3.16}/agno/tracing/setup.py +0 -0
  506. {agno-2.3.14 → agno-2.3.16}/agno/utils/__init__.py +0 -0
  507. {agno-2.3.14 → agno-2.3.16}/agno/utils/agent.py +0 -0
  508. {agno-2.3.14 → agno-2.3.16}/agno/utils/audio.py +0 -0
  509. {agno-2.3.14 → agno-2.3.16}/agno/utils/certs.py +0 -0
  510. {agno-2.3.14 → agno-2.3.16}/agno/utils/code_execution.py +0 -0
  511. {agno-2.3.14 → agno-2.3.16}/agno/utils/common.py +0 -0
  512. {agno-2.3.14 → agno-2.3.16}/agno/utils/cryptography.py +0 -0
  513. {agno-2.3.14 → agno-2.3.16}/agno/utils/dttm.py +0 -0
  514. {agno-2.3.14 → agno-2.3.16}/agno/utils/enum.py +0 -0
  515. {agno-2.3.14 → agno-2.3.16}/agno/utils/env.py +0 -0
  516. {agno-2.3.14 → agno-2.3.16}/agno/utils/format_str.py +0 -0
  517. {agno-2.3.14 → agno-2.3.16}/agno/utils/functions.py +0 -0
  518. {agno-2.3.14 → agno-2.3.16}/agno/utils/gemini.py +0 -0
  519. {agno-2.3.14 → agno-2.3.16}/agno/utils/hooks.py +0 -0
  520. {agno-2.3.14 → agno-2.3.16}/agno/utils/http.py +0 -0
  521. {agno-2.3.14 → agno-2.3.16}/agno/utils/json_schema.py +0 -0
  522. {agno-2.3.14 → agno-2.3.16}/agno/utils/knowledge.py +0 -0
  523. {agno-2.3.14 → agno-2.3.16}/agno/utils/location.py +0 -0
  524. {agno-2.3.14 → agno-2.3.16}/agno/utils/log.py +0 -0
  525. {agno-2.3.14 → agno-2.3.16}/agno/utils/mcp.py +0 -0
  526. {agno-2.3.14 → agno-2.3.16}/agno/utils/media.py +0 -0
  527. {agno-2.3.14 → agno-2.3.16}/agno/utils/merge_dict.py +0 -0
  528. {agno-2.3.14 → agno-2.3.16}/agno/utils/message.py +0 -0
  529. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/__init__.py +0 -0
  530. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/ai_foundry.py +0 -0
  531. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/claude.py +0 -0
  532. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/cohere.py +0 -0
  533. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/llama.py +0 -0
  534. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/mistral.py +0 -0
  535. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/openai_responses.py +0 -0
  536. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/schema_utils.py +0 -0
  537. {agno-2.3.14 → agno-2.3.16}/agno/utils/models/watsonx.py +0 -0
  538. {agno-2.3.14 → agno-2.3.16}/agno/utils/openai.py +0 -0
  539. {agno-2.3.14 → agno-2.3.16}/agno/utils/pickle.py +0 -0
  540. {agno-2.3.14 → agno-2.3.16}/agno/utils/pprint.py +0 -0
  541. {agno-2.3.14 → agno-2.3.16}/agno/utils/print_response/__init__.py +0 -0
  542. {agno-2.3.14 → agno-2.3.16}/agno/utils/print_response/agent.py +0 -0
  543. {agno-2.3.14 → agno-2.3.16}/agno/utils/print_response/team.py +0 -0
  544. {agno-2.3.14 → agno-2.3.16}/agno/utils/print_response/workflow.py +0 -0
  545. {agno-2.3.14 → agno-2.3.16}/agno/utils/prompts.py +0 -0
  546. {agno-2.3.14 → agno-2.3.16}/agno/utils/reasoning.py +0 -0
  547. {agno-2.3.14 → agno-2.3.16}/agno/utils/response.py +0 -0
  548. {agno-2.3.14 → agno-2.3.16}/agno/utils/response_iterator.py +0 -0
  549. {agno-2.3.14 → agno-2.3.16}/agno/utils/safe_formatter.py +0 -0
  550. {agno-2.3.14 → agno-2.3.16}/agno/utils/serialize.py +0 -0
  551. {agno-2.3.14 → agno-2.3.16}/agno/utils/shell.py +0 -0
  552. {agno-2.3.14 → agno-2.3.16}/agno/utils/streamlit.py +0 -0
  553. {agno-2.3.14 → agno-2.3.16}/agno/utils/string.py +0 -0
  554. {agno-2.3.14 → agno-2.3.16}/agno/utils/team.py +0 -0
  555. {agno-2.3.14 → agno-2.3.16}/agno/utils/timer.py +0 -0
  556. {agno-2.3.14 → agno-2.3.16}/agno/utils/tokens.py +0 -0
  557. {agno-2.3.14 → agno-2.3.16}/agno/utils/tools.py +0 -0
  558. {agno-2.3.14 → agno-2.3.16}/agno/utils/web.py +0 -0
  559. {agno-2.3.14 → agno-2.3.16}/agno/utils/whatsapp.py +0 -0
  560. {agno-2.3.14 → agno-2.3.16}/agno/utils/yaml_io.py +0 -0
  561. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/__init__.py +0 -0
  562. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/base.py +0 -0
  563. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/cassandra/__init__.py +0 -0
  564. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/cassandra/cassandra.py +0 -0
  565. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  566. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/cassandra/index.py +0 -0
  567. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/chroma/__init__.py +0 -0
  568. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/chroma/chromadb.py +0 -0
  569. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/clickhouse/__init__.py +0 -0
  570. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  571. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/clickhouse/index.py +0 -0
  572. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/couchbase/__init__.py +0 -0
  573. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/couchbase/couchbase.py +0 -0
  574. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/distance.py +0 -0
  575. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/lancedb/__init__.py +0 -0
  576. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/lancedb/lance_db.py +0 -0
  577. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/langchaindb/__init__.py +0 -0
  578. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/langchaindb/langchaindb.py +0 -0
  579. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/lightrag/__init__.py +0 -0
  580. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/lightrag/lightrag.py +0 -0
  581. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/llamaindex/__init__.py +0 -0
  582. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
  583. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/milvus/__init__.py +0 -0
  584. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/milvus/milvus.py +0 -0
  585. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/mongodb/__init__.py +0 -0
  586. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/mongodb/mongodb.py +0 -0
  587. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pgvector/__init__.py +0 -0
  588. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pgvector/index.py +0 -0
  589. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pgvector/pgvector.py +0 -0
  590. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pineconedb/__init__.py +0 -0
  591. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  592. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/qdrant/__init__.py +0 -0
  593. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/qdrant/qdrant.py +0 -0
  594. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/redis/__init__.py +0 -0
  595. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/redis/redisdb.py +0 -0
  596. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/search.py +0 -0
  597. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/singlestore/__init__.py +0 -0
  598. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/singlestore/index.py +0 -0
  599. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/singlestore/singlestore.py +0 -0
  600. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/surrealdb/__init__.py +0 -0
  601. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  602. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/upstashdb/__init__.py +0 -0
  603. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  604. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/weaviate/__init__.py +0 -0
  605. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/weaviate/index.py +0 -0
  606. {agno-2.3.14 → agno-2.3.16}/agno/vectordb/weaviate/weaviate.py +0 -0
  607. {agno-2.3.14 → agno-2.3.16}/agno/workflow/__init__.py +0 -0
  608. {agno-2.3.14 → agno-2.3.16}/agno/workflow/agent.py +0 -0
  609. {agno-2.3.14 → agno-2.3.16}/agno/workflow/condition.py +0 -0
  610. {agno-2.3.14 → agno-2.3.16}/agno/workflow/loop.py +0 -0
  611. {agno-2.3.14 → agno-2.3.16}/agno/workflow/parallel.py +0 -0
  612. {agno-2.3.14 → agno-2.3.16}/agno/workflow/router.py +0 -0
  613. {agno-2.3.14 → agno-2.3.16}/agno/workflow/step.py +0 -0
  614. {agno-2.3.14 → agno-2.3.16}/agno/workflow/steps.py +0 -0
  615. {agno-2.3.14 → agno-2.3.16}/agno/workflow/types.py +0 -0
  616. {agno-2.3.14 → agno-2.3.16}/agno/workflow/workflow.py +0 -0
  617. {agno-2.3.14 → agno-2.3.16}/agno.egg-info/dependency_links.txt +0 -0
  618. {agno-2.3.14 → agno-2.3.16}/agno.egg-info/requires.txt +0 -0
  619. {agno-2.3.14 → agno-2.3.16}/agno.egg-info/top_level.txt +0 -0
  620. {agno-2.3.14 → agno-2.3.16}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.3.14
3
+ Version: 2.3.16
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
@@ -131,6 +131,7 @@ from agno.utils.events import (
131
131
  create_session_summary_completed_event,
132
132
  create_session_summary_started_event,
133
133
  create_tool_call_completed_event,
134
+ create_tool_call_error_event,
134
135
  create_tool_call_started_event,
135
136
  handle_event,
136
137
  )
@@ -2304,7 +2305,7 @@ class Agent:
2304
2305
  cultural_knowledge_task = None
2305
2306
 
2306
2307
  # 1. Read or create session. Reads from the database if provided.
2307
- agent_session = self._read_or_create_session(session_id=session_id, user_id=user_id)
2308
+ agent_session = await self._aread_or_create_session(session_id=session_id, user_id=user_id)
2308
2309
 
2309
2310
  # Set up retry logic
2310
2311
  num_attempts = self.retries + 1
@@ -4946,6 +4947,15 @@ class Agent:
4946
4947
  events_to_skip=self.events_to_skip, # type: ignore
4947
4948
  store_events=self.store_events,
4948
4949
  )
4950
+ if tool.tool_call_error:
4951
+ yield handle_event( # type: ignore
4952
+ create_tool_call_error_event(
4953
+ from_run_response=run_response, tool=tool, error=str(tool.result)
4954
+ ),
4955
+ run_response,
4956
+ events_to_skip=self.events_to_skip, # type: ignore
4957
+ store_events=self.store_events,
4958
+ )
4949
4959
 
4950
4960
  if len(function_call_results) > 0:
4951
4961
  run_messages.messages.extend(function_call_results)
@@ -5003,6 +5013,15 @@ class Agent:
5003
5013
  events_to_skip=self.events_to_skip, # type: ignore
5004
5014
  store_events=self.store_events,
5005
5015
  )
5016
+ if tool.tool_call_error:
5017
+ yield handle_event( # type: ignore
5018
+ create_tool_call_error_event(
5019
+ from_run_response=run_response, tool=tool, error=str(tool.result)
5020
+ ),
5021
+ run_response,
5022
+ events_to_skip=self.events_to_skip, # type: ignore
5023
+ store_events=self.store_events,
5024
+ )
5006
5025
  if len(function_call_results) > 0:
5007
5026
  run_messages.messages.extend(function_call_results)
5008
5027
 
@@ -5756,6 +5775,15 @@ class Agent:
5756
5775
  events_to_skip=self.events_to_skip, # type: ignore
5757
5776
  store_events=self.store_events,
5758
5777
  )
5778
+ if tool_call.tool_call_error:
5779
+ yield handle_event( # type: ignore
5780
+ create_tool_call_error_event(
5781
+ from_run_response=run_response, tool=tool_call, error=str(tool_call.result)
5782
+ ),
5783
+ run_response,
5784
+ events_to_skip=self.events_to_skip, # type: ignore
5785
+ store_events=self.store_events,
5786
+ )
5759
5787
 
5760
5788
  if stream_events:
5761
5789
  if reasoning_step is not None:
@@ -66,13 +66,13 @@ class MigrationManager:
66
66
  current_version = packaging_version.parse(self.db.get_latest_schema_version(table_name))
67
67
 
68
68
  if current_version is None:
69
- log_warning(f"Skipping up migration: No version found for table {table_name}.")
69
+ log_info(f"Skipping migration: No version found for table {table_name}.")
70
70
  continue
71
71
 
72
72
  # If the target version is less or equal to the current version, no migrations needed
73
73
  if _target_version <= current_version and not force:
74
- log_warning(
75
- f"Skipping up migration: the version of table '{table_name}' ({current_version}) is less or equal to the target version ({_target_version})."
74
+ log_info(
75
+ f"Skipping migration: the version of table '{table_name}' ({current_version}) is less or equal to the target version ({_target_version})."
76
76
  )
77
77
  continue
78
78
 
@@ -47,17 +47,16 @@ class CSVReader(Reader):
47
47
  if not file.exists():
48
48
  raise FileNotFoundError(f"Could not find file: {file}")
49
49
  log_debug(f"Reading: {file}")
50
- file_content = file.open(newline="", mode="r", encoding=self.encoding or "utf-8")
50
+ csv_name = name or file.stem
51
+ file_content: Union[io.TextIOWrapper, io.StringIO] = file.open(
52
+ newline="", mode="r", encoding=self.encoding or "utf-8"
53
+ )
51
54
  else:
52
- log_debug(f"Reading retrieved file: {name or file.name}")
55
+ log_debug(f"Reading retrieved file: {getattr(file, 'name', 'BytesIO')}")
56
+ csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
53
57
  file.seek(0)
54
- file_content = io.StringIO(file.read().decode("utf-8")) # type: ignore
58
+ file_content = io.StringIO(file.read().decode("utf-8"))
55
59
 
56
- csv_name = name or (
57
- Path(file.name).stem
58
- if isinstance(file, Path)
59
- else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
60
- )
61
60
  csv_content = ""
62
61
  with file_content as csvfile:
63
62
  csv_reader = csv.reader(csvfile, delimiter=delimiter, quotechar=quotechar)
@@ -109,16 +108,12 @@ class CSVReader(Reader):
109
108
  async with aiofiles.open(file, mode="r", encoding="utf-8", newline="") as file_content:
110
109
  content = await file_content.read()
111
110
  file_content_io = io.StringIO(content)
111
+ csv_name = name or file.stem
112
112
  else:
113
113
  log_debug(f"Reading retrieved file async: {getattr(file, 'name', 'BytesIO')}")
114
114
  file.seek(0)
115
115
  file_content_io = io.StringIO(file.read().decode("utf-8"))
116
-
117
- csv_name = name or (
118
- Path(file.name).stem
119
- if isinstance(file, Path)
120
- else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
121
- )
116
+ csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
122
117
 
123
118
  file_content_io.seek(0)
124
119
  csv_reader = csv.reader(file_content_io, delimiter=delimiter, quotechar=quotechar)
@@ -161,4 +156,4 @@ class CSVReader(Reader):
161
156
  return documents
162
157
  except Exception as e:
163
158
  log_error(f"Error reading async: {getattr(file, 'name', str(file)) if isinstance(file, IO) else file}: {e}")
164
- return []
159
+ return []
@@ -47,11 +47,9 @@ class DocxReader(Reader):
47
47
  docx_document = DocxDocument(str(file))
48
48
  doc_name = name or file.stem
49
49
  else:
50
- log_debug(f"Reading uploaded file: {getattr(file, 'name', 'docx_file')}")
50
+ log_debug(f"Reading uploaded file: {getattr(file, 'name', 'BytesIO')}")
51
51
  docx_document = DocxDocument(file)
52
- doc_name = name or (
53
- getattr(file, "name", "docx_file").split(".")[0] if hasattr(file, "name") else "docx_file"
54
- )
52
+ doc_name = name or getattr(file, "name", "docx_file").split(".")[0]
55
53
 
56
54
  doc_content = "\n\n".join([para.text for para in docx_document.paragraphs])
57
55
 
@@ -106,17 +106,15 @@ class FieldLabeledCSVReader(Reader):
106
106
  if not file.exists():
107
107
  raise FileNotFoundError(f"Could not find file: {file}")
108
108
  log_debug(f"Reading: {file}")
109
- file_content = file.open(newline="", mode="r", encoding=self.encoding or "utf-8")
109
+ csv_name = name or file.stem
110
+ file_content: Union[io.TextIOWrapper, io.StringIO] = file.open(
111
+ newline="", mode="r", encoding=self.encoding or "utf-8"
112
+ )
110
113
  else:
111
- log_debug(f"Reading retrieved file: {name or file.name}")
114
+ log_debug(f"Reading retrieved file: {getattr(file, 'name', 'BytesIO')}")
115
+ csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
112
116
  file.seek(0)
113
- file_content = io.StringIO(file.read().decode("utf-8")) # type: ignore
114
-
115
- csv_name = name or (
116
- Path(file.name).stem
117
- if isinstance(file, Path)
118
- else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
119
- )
117
+ file_content = io.StringIO(file.read().decode("utf-8"))
120
118
 
121
119
  documents = []
122
120
 
@@ -189,16 +187,12 @@ class FieldLabeledCSVReader(Reader):
189
187
  async with aiofiles.open(file, mode="r", encoding=self.encoding or "utf-8", newline="") as file_content:
190
188
  content = await file_content.read()
191
189
  file_content_io = io.StringIO(content)
190
+ csv_name = name or file.stem
192
191
  else:
193
- log_debug(f"Reading retrieved file async: {name or file.name}")
192
+ log_debug(f"Reading retrieved file async: {getattr(file, 'name', 'BytesIO')}")
193
+ csv_name = name or getattr(file, "name", "csv_file").split(".")[0]
194
194
  file.seek(0)
195
- file_content_io = io.StringIO(file.read().decode("utf-8")) # type: ignore
196
-
197
- csv_name = name or (
198
- Path(file.name).stem
199
- if isinstance(file, Path)
200
- else (getattr(file, "name", "csv_file").split(".")[0] if hasattr(file, "name") else "csv_file")
201
- )
195
+ file_content_io = io.StringIO(file.read().decode("utf-8"))
202
196
 
203
197
  file_content_io.seek(0)
204
198
  csv_reader = csv.reader(file_content_io, delimiter=delimiter, quotechar=quotechar)
@@ -287,4 +281,4 @@ class FieldLabeledCSVReader(Reader):
287
281
 
288
282
  except Exception as e:
289
283
  log_error(f"Error reading async: {getattr(file, 'name', str(file)) if isinstance(file, IO) else file}: {e}")
290
- return []
284
+ return []
@@ -1,6 +1,5 @@
1
1
  import asyncio
2
2
  import json
3
- from io import BytesIO
4
3
  from pathlib import Path
5
4
  from typing import IO, Any, List, Optional, Union
6
5
  from uuid import uuid4
@@ -42,17 +41,15 @@ class JSONReader(Reader):
42
41
  if not path.exists():
43
42
  raise FileNotFoundError(f"Could not find file: {path}")
44
43
  log_debug(f"Reading: {path}")
45
- json_name = name or path.name.split(".")[0]
46
- json_contents = json.loads(path.read_text(self.encoding or "utf-8"))
47
-
48
- elif isinstance(path, BytesIO):
49
- json_name = name or path.name.split(".")[0]
50
- log_debug(f"Reading uploaded file: {json_name}")
44
+ json_name = name or path.stem
45
+ json_contents = json.loads(path.read_text(encoding=self.encoding or "utf-8"))
46
+ elif hasattr(path, "seek") and hasattr(path, "read"):
47
+ log_debug(f"Reading uploaded file: {getattr(path, 'name', 'BytesIO')}")
48
+ json_name = name or getattr(path, "name", "json_file").split(".")[0]
51
49
  path.seek(0)
52
50
  json_contents = json.load(path)
53
-
54
51
  else:
55
- raise ValueError("Unsupported file type. Must be Path or BytesIO.")
52
+ raise ValueError("Unsupported file type. Must be Path or file-like object.")
56
53
 
57
54
  if isinstance(json_contents, dict):
58
55
  json_contents = [json_contents]
@@ -72,17 +69,12 @@ class JSONReader(Reader):
72
69
  chunked_documents.extend(self.chunk_document(document))
73
70
  return chunked_documents
74
71
  return documents
72
+ except (FileNotFoundError, ValueError, json.JSONDecodeError):
73
+ raise
75
74
  except Exception as e:
76
75
  log_error(f"Error reading: {path}: {e}")
77
76
  raise
78
77
 
79
78
  async def async_read(self, path: Union[Path, IO[Any]], name: Optional[str] = None) -> List[Document]:
80
- """Asynchronously read JSON files.
81
-
82
- Args:
83
- path (Union[Path, IO[Any]]): Path to a JSON file or a file-like object
84
-
85
- Returns:
86
- List[Document]: List of documents from the JSON file
87
- """
88
- return await asyncio.to_thread(self.read, path, name)
79
+ """Asynchronously read JSON files."""
80
+ return await asyncio.to_thread(self.read, path, name)
@@ -69,8 +69,8 @@ class MarkdownReader(Reader):
69
69
  file_name = name or file.stem
70
70
  file_contents = file.read_text(encoding=self.encoding or "utf-8")
71
71
  else:
72
- log_debug(f"Reading uploaded file: {file.name}")
73
- file_name = name or file.name.split(".")[0]
72
+ log_debug(f"Reading uploaded file: {getattr(file, 'name', 'BytesIO')}")
73
+ file_name = name or getattr(file, "name", "file").split(".")[0]
74
74
  file.seek(0)
75
75
  file_contents = file.read().decode(self.encoding or "utf-8")
76
76
 
@@ -101,16 +101,16 @@ class MarkdownReader(Reader):
101
101
  file_contents = await f.read()
102
102
  except ImportError:
103
103
  log_warning("aiofiles not installed, using synchronous file I/O")
104
- file_contents = file.read_text(self.encoding or "utf-8")
104
+ file_contents = file.read_text(encoding=self.encoding or "utf-8")
105
105
  else:
106
- log_debug(f"Reading uploaded file asynchronously: {file.name}")
107
- file_name = name or file.name.split(".")[0]
106
+ log_debug(f"Reading uploaded file asynchronously: {getattr(file, 'name', 'BytesIO')}")
107
+ file_name = name or getattr(file, "name", "file").split(".")[0]
108
108
  file.seek(0)
109
109
  file_contents = file.read().decode(self.encoding or "utf-8")
110
110
 
111
111
  document = Document(
112
112
  name=file_name,
113
- id=str(uuid.uuid4()), # Fixed an issue with the id creation
113
+ id=str(uuid.uuid4()),
114
114
  content=file_contents,
115
115
  )
116
116
 
@@ -218,16 +218,13 @@ class BasePDFReader(Reader):
218
218
 
219
219
  def _get_doc_name(self, pdf_source: Union[str, Path, IO[Any]], name: Optional[str] = None) -> str:
220
220
  """Determines the document name from the source or a provided name."""
221
- try:
222
- if name:
223
- return name
224
- if isinstance(pdf_source, str):
225
- return pdf_source.split("/")[-1].split(".")[0].replace(" ", "_")
226
- # Assumes a file-like object with a .name attribute
227
- return pdf_source.name.split(".")[0]
228
- except Exception:
229
- # The original code had a bug here, it should check `name` first.
230
- return name or "pdf"
221
+ if name:
222
+ return name
223
+ if isinstance(pdf_source, str):
224
+ return Path(pdf_source).stem.replace(" ", "_")
225
+ if isinstance(pdf_source, Path):
226
+ return pdf_source.stem.replace(" ", "_")
227
+ return getattr(pdf_source, "name", "pdf_file").split(".")[0].replace(" ", "_")
231
228
 
232
229
  def _decrypt_pdf(self, doc_reader: DocumentReader, doc_name: str, password: Optional[str] = None) -> bool:
233
230
  if not doc_reader.is_encrypted:
@@ -341,8 +338,14 @@ class PDFReader(BasePDFReader):
341
338
  return [ContentType.PDF]
342
339
 
343
340
  def read(
344
- self, pdf: Union[str, Path, IO[Any]], name: Optional[str] = None, password: Optional[str] = None
341
+ self,
342
+ pdf: Optional[Union[str, Path, IO[Any]]] = None,
343
+ name: Optional[str] = None,
344
+ password: Optional[str] = None,
345
345
  ) -> List[Document]:
346
+ if pdf is None:
347
+ log_error("No pdf provided")
348
+ return []
346
349
  doc_name = self._get_doc_name(pdf, name)
347
350
  log_debug(f"Reading: {doc_name}")
348
351
 
@@ -47,11 +47,9 @@ class PPTXReader(Reader):
47
47
  presentation = Presentation(str(file))
48
48
  doc_name = name or file.stem
49
49
  else:
50
- log_debug(f"Reading uploaded file: {getattr(file, 'name', 'pptx_file')}")
50
+ log_debug(f"Reading uploaded file: {getattr(file, 'name', 'BytesIO')}")
51
51
  presentation = Presentation(file)
52
- doc_name = name or (
53
- getattr(file, "name", "pptx_file").split(".")[0] if hasattr(file, "name") else "pptx_file"
54
- )
52
+ doc_name = name or getattr(file, "name", "pptx_file").split(".")[0]
55
53
 
56
54
  # Extract text from all slides
57
55
  slide_texts = []
@@ -53,29 +53,20 @@ class S3Reader(Reader):
53
53
  try:
54
54
  log_debug(f"Reading S3 file: {s3_object.uri}")
55
55
 
56
+ doc_name = name or s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
57
+
56
58
  # Read PDF files
57
59
  if s3_object.uri.endswith(".pdf"):
58
60
  object_resource = s3_object.get_resource()
59
61
  object_body = object_resource.get()["Body"]
60
- doc_name = (
61
- s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
62
- if name is None
63
- else name
64
- )
65
62
  return PDFReader().read(pdf=BytesIO(object_body.read()), name=doc_name)
66
63
 
67
64
  # Read text files
68
65
  else:
69
- doc_name = (
70
- s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
71
- if name is None
72
- else name
73
- )
74
66
  obj_name = s3_object.name.split("/")[-1]
75
67
  temporary_file = Path("storage").joinpath(obj_name)
76
68
  s3_object.download(temporary_file)
77
69
  documents = TextReader().read(file=temporary_file, name=doc_name)
78
-
79
70
  temporary_file.unlink()
80
71
  return documents
81
72
 
@@ -39,16 +39,10 @@ class TextReader(Reader):
39
39
  raise FileNotFoundError(f"Could not find file: {file}")
40
40
  log_debug(f"Reading: {file}")
41
41
  file_name = name or file.stem
42
- file_contents = file.read_text(self.encoding or "utf-8")
42
+ file_contents = file.read_text(encoding=self.encoding or "utf-8")
43
43
  else:
44
- # Handle BytesIO and other file-like objects that may not have a name attribute
45
- if name:
46
- file_name = name
47
- elif hasattr(file, "name") and file.name is not None:
48
- file_name = file.name.split(".")[0]
49
- else:
50
- file_name = "text_file"
51
- log_debug(f"Reading uploaded file: {file_name}")
44
+ log_debug(f"Reading uploaded file: {getattr(file, 'name', 'BytesIO')}")
45
+ file_name = name or getattr(file, "name", "text_file").split(".")[0]
52
46
  file.seek(0)
53
47
  file_contents = file.read().decode(self.encoding or "utf-8")
54
48
 
@@ -85,16 +79,10 @@ class TextReader(Reader):
85
79
  file_contents = await f.read()
86
80
  except ImportError:
87
81
  log_warning("aiofiles not installed, using synchronous file I/O")
88
- file_contents = file.read_text(self.encoding or "utf-8")
82
+ file_contents = file.read_text(encoding=self.encoding or "utf-8")
89
83
  else:
90
- # Handle BytesIO and other file-like objects that may not have a name attribute
91
- if name:
92
- file_name = name
93
- elif hasattr(file, "name") and file.name is not None:
94
- file_name = file.name.split(".")[0]
95
- else:
96
- file_name = "text_file"
97
- log_debug(f"Reading uploaded file asynchronously: {file_name}")
84
+ log_debug(f"Reading uploaded file asynchronously: {getattr(file, 'name', 'BytesIO')}")
85
+ file_name = name or getattr(file, "name", "text_file").split(".")[0]
98
86
  file.seek(0)
99
87
  file_contents = file.read().decode(self.encoding or "utf-8")
100
88
 
@@ -263,21 +263,17 @@ class WebSearchReader(Reader):
263
263
 
264
264
  log_debug(f"Starting async web search reader for query: {query}")
265
265
 
266
- # Perform web search (synchronous operation)
267
266
  search_results = self._perform_web_search(query)
268
267
  if not search_results:
269
268
  logger.warning(f"No search results found for query: {query}")
270
269
  return []
271
270
 
272
- # Create tasks for fetching content from each URL
273
271
  async def fetch_url_async(result: Dict[str, str]) -> Optional[Document]:
274
272
  url = result.get("url", "")
275
273
 
276
- # Skip if URL is invalid or already visited
277
274
  if not self._is_valid_url(url):
278
275
  return None
279
276
 
280
- # Mark URL as visited
281
277
  self._visited_urls.add(url)
282
278
 
283
279
  try:
@@ -292,32 +288,25 @@ class WebSearchReader(Reader):
292
288
  else:
293
289
  content = response.text
294
290
 
295
- document = self._create_document_from_url(url, content, result)
296
- return document
291
+ return self._create_document_from_url(url, content, result)
297
292
 
298
293
  except Exception as e:
299
294
  logger.warning(f"Error fetching {url}: {e}")
300
295
  return None
301
296
 
302
- # Create tasks for all URLs
303
- tasks = [fetch_url_async(result) for result in search_results]
304
-
305
- # Execute all tasks concurrently with delays
306
297
  documents = []
307
- for i, task in enumerate(tasks):
308
- if i > 0: # Add delay between requests (except for the first one)
298
+ for i, result in enumerate(search_results):
299
+ if i > 0:
309
300
  await asyncio.sleep(self.delay_between_requests)
310
301
 
311
- doc = await task
302
+ doc = await fetch_url_async(result)
312
303
  if doc is not None:
313
- # Apply chunking if enabled
314
304
  if self.chunk:
315
305
  chunked_docs = await self.chunk_documents_async([doc])
316
306
  documents.extend(chunked_docs)
317
307
  else:
318
308
  documents.append(doc)
319
309
 
320
- # Stop if we've reached max_results
321
310
  if len(documents) >= self.max_results:
322
311
  break
323
312
 
@@ -102,8 +102,8 @@ class Claude(Model):
102
102
  # Claude Sonnet 4.x family (versions before 4.5)
103
103
  "claude-sonnet-4-20250514",
104
104
  "claude-sonnet-4",
105
- # Claude Opus 4.x family (versions before 4.1)
106
- # (Add any Opus 4.x models released before 4.1 if they exist)
105
+ # Claude Opus 4.x family (versions before 4.1 and 4.5)
106
+ # (Add any Opus 4.x models released before 4.1/4.5 if they exist)
107
107
  }
108
108
 
109
109
  id: str = "claude-sonnet-4-5-20250929"
@@ -191,7 +191,9 @@ class Claude(Model):
191
191
  return False
192
192
  if self.id.startswith("claude-sonnet-4-") and not self.id.startswith("claude-sonnet-4-5"):
193
193
  return False
194
- if self.id.startswith("claude-opus-4-") and not self.id.startswith("claude-opus-4-1"):
194
+ if self.id.startswith("claude-opus-4-") and not (
195
+ self.id.startswith("claude-opus-4-1") or self.id.startswith("claude-opus-4-5")
196
+ ):
195
197
  return False
196
198
 
197
199
  return True
@@ -13,6 +13,10 @@ class Metrics:
13
13
  output_tokens: int = 0
14
14
  total_tokens: int = 0
15
15
 
16
+ # Cost of the run
17
+ # Currently only supported by some providers
18
+ cost: Optional[float] = None
19
+
16
20
  # Audio token usage
17
21
  audio_input_tokens: int = 0
18
22
  audio_output_tokens: int = 0
@@ -43,6 +47,7 @@ class Metrics:
43
47
  metrics_dict = asdict(self)
44
48
  # Remove the timer util if present
45
49
  metrics_dict.pop("timer", None)
50
+ # Remove any None, 0, or empty dict values
46
51
  metrics_dict = {
47
52
  k: v
48
53
  for k, v in metrics_dict.items()
@@ -65,6 +70,13 @@ class Metrics:
65
70
  reasoning_tokens=self.reasoning_tokens + other.reasoning_tokens,
66
71
  )
67
72
 
73
+ if self.cost is not None and other.cost is not None:
74
+ result.cost = self.cost + other.cost
75
+ elif self.cost is not None:
76
+ result.cost = self.cost
77
+ elif other.cost is not None:
78
+ result.cost = other.cost
79
+
68
80
  # Handle provider_metrics
69
81
  if self.provider_metrics or other.provider_metrics:
70
82
  result.provider_metrics = {}
@@ -945,4 +945,6 @@ class OpenAIChat(Model):
945
945
  metrics.audio_output_tokens = completion_tokens_details.audio_tokens or 0
946
946
  metrics.reasoning_tokens = completion_tokens_details.reasoning_tokens or 0
947
947
 
948
+ metrics.cost = getattr(response_usage, "cost", None)
949
+
948
950
  return metrics
@@ -34,6 +34,7 @@ from agno.os.config import (
34
34
  from agno.os.interfaces.base import BaseInterface
35
35
  from agno.os.router import get_base_router
36
36
  from agno.os.routers.agents import get_agent_router
37
+ from agno.os.routers.database import get_database_router
37
38
  from agno.os.routers.evals import get_eval_router
38
39
  from agno.os.routers.health import get_health_router
39
40
  from agno.os.routers.home import get_home_router
@@ -574,6 +575,7 @@ class AgentOS:
574
575
  get_metrics_router(dbs=self.dbs),
575
576
  get_knowledge_router(knowledge_instances=self.knowledge_instances),
576
577
  get_traces_router(dbs=self.dbs),
578
+ get_database_router(self, settings=self.settings),
577
579
  ]
578
580
 
579
581
  for router in routers:
@@ -614,6 +616,18 @@ class AgentOS:
614
616
 
615
617
  # Add JWT middleware if authorization is enabled
616
618
  if self.authorization:
619
+ # Set authorization_enabled flag on settings so security key validation is skipped
620
+ self.settings.authorization_enabled = True
621
+
622
+ jwt_configured = bool(getenv("JWT_VERIFICATION_KEY") or getenv("JWT_JWKS_FILE"))
623
+ security_key_set = bool(self.settings.os_security_key)
624
+ if jwt_configured and security_key_set:
625
+ log_warning(
626
+ "Both JWT configuration (JWT_VERIFICATION_KEY or JWT_JWKS_FILE) and OS_SECURITY_KEY are set. "
627
+ "With authorization=True, only JWT authorization will be used. "
628
+ "Consider removing OS_SECURITY_KEY from your environment."
629
+ )
630
+
617
631
  self._add_jwt_middleware(fastapi_app)
618
632
 
619
633
  return fastapi_app
@@ -1033,8 +1047,12 @@ class AgentOS:
1033
1047
  Align.center(f"[bold cyan]{public_endpoint}[/bold cyan]"),
1034
1048
  Align.center(f"\n\n[bold dark_orange]OS running on:[/bold dark_orange] http://{host}:{port}"),
1035
1049
  ]
1036
- if bool(self.settings.os_security_key):
1037
- panel_group.append(Align.center("\n\n[bold chartreuse3]:lock: Security Enabled[/bold chartreuse3]"))
1050
+ if self.authorization:
1051
+ panel_group.append(
1052
+ Align.center("\n\n[bold chartreuse3]:lock: JWT Authorization Enabled[/bold chartreuse3]")
1053
+ )
1054
+ elif bool(self.settings.os_security_key):
1055
+ panel_group.append(Align.center("\n\n[bold chartreuse3]:lock: Security Key Enabled[/bold chartreuse3]"))
1038
1056
 
1039
1057
  console = Console()
1040
1058
  console.print(