agno 2.3.14__tar.gz → 2.3.15__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.15}/PKG-INFO +1 -1
  2. {agno-2.3.14 → agno-2.3.15}/agno/agent/agent.py +29 -1
  3. {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/manager.py +3 -3
  4. {agno-2.3.14 → agno-2.3.15}/agno/models/anthropic/claude.py +5 -3
  5. {agno-2.3.14 → agno-2.3.15}/agno/models/metrics.py +12 -0
  6. {agno-2.3.14 → agno-2.3.15}/agno/models/openai/chat.py +2 -0
  7. {agno-2.3.14 → agno-2.3.15}/agno/os/app.py +20 -2
  8. {agno-2.3.14 → agno-2.3.15}/agno/os/auth.py +40 -3
  9. {agno-2.3.14 → agno-2.3.15}/agno/os/router.py +1 -57
  10. agno-2.3.15/agno/os/routers/database.py +150 -0
  11. {agno-2.3.14 → agno-2.3.15}/agno/os/settings.py +3 -0
  12. {agno-2.3.14 → agno-2.3.15}/agno/run/agent.py +10 -0
  13. {agno-2.3.14 → agno-2.3.15}/agno/run/base.py +19 -0
  14. {agno-2.3.14 → agno-2.3.15}/agno/run/team.py +10 -0
  15. {agno-2.3.14 → agno-2.3.15}/agno/team/team.py +10 -0
  16. {agno-2.3.14 → agno-2.3.15}/agno/tools/toolkit.py +119 -8
  17. {agno-2.3.14 → agno-2.3.15}/agno/utils/events.py +30 -2
  18. {agno-2.3.14 → agno-2.3.15}/agno.egg-info/PKG-INFO +1 -1
  19. {agno-2.3.14 → agno-2.3.15}/agno.egg-info/SOURCES.txt +1 -0
  20. {agno-2.3.14 → agno-2.3.15}/pyproject.toml +1 -1
  21. {agno-2.3.14 → agno-2.3.15}/LICENSE +0 -0
  22. {agno-2.3.14 → agno-2.3.15}/README.md +0 -0
  23. {agno-2.3.14 → agno-2.3.15}/agno/__init__.py +0 -0
  24. {agno-2.3.14 → agno-2.3.15}/agno/agent/__init__.py +0 -0
  25. {agno-2.3.14 → agno-2.3.15}/agno/api/__init__.py +0 -0
  26. {agno-2.3.14 → agno-2.3.15}/agno/api/agent.py +0 -0
  27. {agno-2.3.14 → agno-2.3.15}/agno/api/api.py +0 -0
  28. {agno-2.3.14 → agno-2.3.15}/agno/api/evals.py +0 -0
  29. {agno-2.3.14 → agno-2.3.15}/agno/api/os.py +0 -0
  30. {agno-2.3.14 → agno-2.3.15}/agno/api/routes.py +0 -0
  31. {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/__init__.py +0 -0
  32. {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/agent.py +0 -0
  33. {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/evals.py +0 -0
  34. {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/os.py +0 -0
  35. {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/response.py +0 -0
  36. {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/team.py +0 -0
  37. {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/utils.py +0 -0
  38. {agno-2.3.14 → agno-2.3.15}/agno/api/schemas/workflows.py +0 -0
  39. {agno-2.3.14 → agno-2.3.15}/agno/api/settings.py +0 -0
  40. {agno-2.3.14 → agno-2.3.15}/agno/api/team.py +0 -0
  41. {agno-2.3.14 → agno-2.3.15}/agno/api/workflow.py +0 -0
  42. {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/base.py +0 -0
  43. {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/s3/__init__.py +0 -0
  44. {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/s3/api_client.py +0 -0
  45. {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/s3/bucket.py +0 -0
  46. {agno-2.3.14 → agno-2.3.15}/agno/cloud/aws/s3/object.py +0 -0
  47. {agno-2.3.14 → agno-2.3.15}/agno/compression/__init__.py +0 -0
  48. {agno-2.3.14 → agno-2.3.15}/agno/compression/manager.py +0 -0
  49. {agno-2.3.14 → agno-2.3.15}/agno/culture/__init__.py +0 -0
  50. {agno-2.3.14 → agno-2.3.15}/agno/culture/manager.py +0 -0
  51. {agno-2.3.14 → agno-2.3.15}/agno/db/__init__.py +0 -0
  52. {agno-2.3.14 → agno-2.3.15}/agno/db/async_postgres/__init__.py +0 -0
  53. {agno-2.3.14 → agno-2.3.15}/agno/db/base.py +0 -0
  54. {agno-2.3.14 → agno-2.3.15}/agno/db/dynamo/__init__.py +0 -0
  55. {agno-2.3.14 → agno-2.3.15}/agno/db/dynamo/dynamo.py +0 -0
  56. {agno-2.3.14 → agno-2.3.15}/agno/db/dynamo/schemas.py +0 -0
  57. {agno-2.3.14 → agno-2.3.15}/agno/db/dynamo/utils.py +0 -0
  58. {agno-2.3.14 → agno-2.3.15}/agno/db/firestore/__init__.py +0 -0
  59. {agno-2.3.14 → agno-2.3.15}/agno/db/firestore/firestore.py +0 -0
  60. {agno-2.3.14 → agno-2.3.15}/agno/db/firestore/schemas.py +0 -0
  61. {agno-2.3.14 → agno-2.3.15}/agno/db/firestore/utils.py +0 -0
  62. {agno-2.3.14 → agno-2.3.15}/agno/db/gcs_json/__init__.py +0 -0
  63. {agno-2.3.14 → agno-2.3.15}/agno/db/gcs_json/gcs_json_db.py +0 -0
  64. {agno-2.3.14 → agno-2.3.15}/agno/db/gcs_json/utils.py +0 -0
  65. {agno-2.3.14 → agno-2.3.15}/agno/db/in_memory/__init__.py +0 -0
  66. {agno-2.3.14 → agno-2.3.15}/agno/db/in_memory/in_memory_db.py +0 -0
  67. {agno-2.3.14 → agno-2.3.15}/agno/db/in_memory/utils.py +0 -0
  68. {agno-2.3.14 → agno-2.3.15}/agno/db/json/__init__.py +0 -0
  69. {agno-2.3.14 → agno-2.3.15}/agno/db/json/json_db.py +0 -0
  70. {agno-2.3.14 → agno-2.3.15}/agno/db/json/utils.py +0 -0
  71. {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/__init__.py +0 -0
  72. {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/v1_to_v2.py +0 -0
  73. {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/versions/__init__.py +0 -0
  74. {agno-2.3.14 → agno-2.3.15}/agno/db/migrations/versions/v2_3_0.py +0 -0
  75. {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/__init__.py +0 -0
  76. {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/async_mongo.py +0 -0
  77. {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/mongo.py +0 -0
  78. {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/schemas.py +0 -0
  79. {agno-2.3.14 → agno-2.3.15}/agno/db/mongo/utils.py +0 -0
  80. {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/__init__.py +0 -0
  81. {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/async_mysql.py +0 -0
  82. {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/mysql.py +0 -0
  83. {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/schemas.py +0 -0
  84. {agno-2.3.14 → agno-2.3.15}/agno/db/mysql/utils.py +0 -0
  85. {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/__init__.py +0 -0
  86. {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/async_postgres.py +0 -0
  87. {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/postgres.py +0 -0
  88. {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/schemas.py +0 -0
  89. {agno-2.3.14 → agno-2.3.15}/agno/db/postgres/utils.py +0 -0
  90. {agno-2.3.14 → agno-2.3.15}/agno/db/redis/__init__.py +0 -0
  91. {agno-2.3.14 → agno-2.3.15}/agno/db/redis/redis.py +0 -0
  92. {agno-2.3.14 → agno-2.3.15}/agno/db/redis/schemas.py +0 -0
  93. {agno-2.3.14 → agno-2.3.15}/agno/db/redis/utils.py +0 -0
  94. {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/__init__.py +0 -0
  95. {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/culture.py +0 -0
  96. {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/evals.py +0 -0
  97. {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/knowledge.py +0 -0
  98. {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/memory.py +0 -0
  99. {agno-2.3.14 → agno-2.3.15}/agno/db/schemas/metrics.py +0 -0
  100. {agno-2.3.14 → agno-2.3.15}/agno/db/singlestore/__init__.py +0 -0
  101. {agno-2.3.14 → agno-2.3.15}/agno/db/singlestore/schemas.py +0 -0
  102. {agno-2.3.14 → agno-2.3.15}/agno/db/singlestore/singlestore.py +0 -0
  103. {agno-2.3.14 → agno-2.3.15}/agno/db/singlestore/utils.py +0 -0
  104. {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/__init__.py +0 -0
  105. {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/async_sqlite.py +0 -0
  106. {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/schemas.py +0 -0
  107. {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/sqlite.py +0 -0
  108. {agno-2.3.14 → agno-2.3.15}/agno/db/sqlite/utils.py +0 -0
  109. {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/__init__.py +0 -0
  110. {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/metrics.py +0 -0
  111. {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/models.py +0 -0
  112. {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/queries.py +0 -0
  113. {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/surrealdb.py +0 -0
  114. {agno-2.3.14 → agno-2.3.15}/agno/db/surrealdb/utils.py +0 -0
  115. {agno-2.3.14 → agno-2.3.15}/agno/db/utils.py +0 -0
  116. {agno-2.3.14 → agno-2.3.15}/agno/debug.py +0 -0
  117. {agno-2.3.14 → agno-2.3.15}/agno/eval/__init__.py +0 -0
  118. {agno-2.3.14 → agno-2.3.15}/agno/eval/accuracy.py +0 -0
  119. {agno-2.3.14 → agno-2.3.15}/agno/eval/agent_as_judge.py +0 -0
  120. {agno-2.3.14 → agno-2.3.15}/agno/eval/base.py +0 -0
  121. {agno-2.3.14 → agno-2.3.15}/agno/eval/performance.py +0 -0
  122. {agno-2.3.14 → agno-2.3.15}/agno/eval/reliability.py +0 -0
  123. {agno-2.3.14 → agno-2.3.15}/agno/eval/utils.py +0 -0
  124. {agno-2.3.14 → agno-2.3.15}/agno/exceptions.py +0 -0
  125. {agno-2.3.14 → agno-2.3.15}/agno/filters.py +0 -0
  126. {agno-2.3.14 → agno-2.3.15}/agno/guardrails/__init__.py +0 -0
  127. {agno-2.3.14 → agno-2.3.15}/agno/guardrails/base.py +0 -0
  128. {agno-2.3.14 → agno-2.3.15}/agno/guardrails/openai.py +0 -0
  129. {agno-2.3.14 → agno-2.3.15}/agno/guardrails/pii.py +0 -0
  130. {agno-2.3.14 → agno-2.3.15}/agno/guardrails/prompt_injection.py +0 -0
  131. {agno-2.3.14 → agno-2.3.15}/agno/hooks/__init__.py +0 -0
  132. {agno-2.3.14 → agno-2.3.15}/agno/hooks/decorator.py +0 -0
  133. {agno-2.3.14 → agno-2.3.15}/agno/integrations/__init__.py +0 -0
  134. {agno-2.3.14 → agno-2.3.15}/agno/integrations/discord/__init__.py +0 -0
  135. {agno-2.3.14 → agno-2.3.15}/agno/integrations/discord/client.py +0 -0
  136. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/__init__.py +0 -0
  137. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/__init__.py +0 -0
  138. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/agentic.py +0 -0
  139. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/document.py +0 -0
  140. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/fixed.py +0 -0
  141. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/markdown.py +0 -0
  142. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/recursive.py +0 -0
  143. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/row.py +0 -0
  144. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/semantic.py +0 -0
  145. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/chunking/strategy.py +0 -0
  146. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/content.py +0 -0
  147. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/document/__init__.py +0 -0
  148. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/document/base.py +0 -0
  149. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/__init__.py +0 -0
  150. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/aws_bedrock.py +0 -0
  151. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/azure_openai.py +0 -0
  152. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/base.py +0 -0
  153. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/cohere.py +0 -0
  154. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/fastembed.py +0 -0
  155. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/fireworks.py +0 -0
  156. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/google.py +0 -0
  157. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/huggingface.py +0 -0
  158. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/jina.py +0 -0
  159. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/langdb.py +0 -0
  160. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/mistral.py +0 -0
  161. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/nebius.py +0 -0
  162. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/ollama.py +0 -0
  163. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/openai.py +0 -0
  164. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/sentence_transformer.py +0 -0
  165. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/together.py +0 -0
  166. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/vllm.py +0 -0
  167. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/embedder/voyageai.py +0 -0
  168. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/knowledge.py +0 -0
  169. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/__init__.py +0 -0
  170. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/arxiv_reader.py +0 -0
  171. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/base.py +0 -0
  172. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/csv_reader.py +0 -0
  173. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/docx_reader.py +0 -0
  174. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/field_labeled_csv_reader.py +0 -0
  175. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/firecrawl_reader.py +0 -0
  176. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/json_reader.py +0 -0
  177. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/markdown_reader.py +0 -0
  178. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/pdf_reader.py +0 -0
  179. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/pptx_reader.py +0 -0
  180. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/reader_factory.py +0 -0
  181. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/s3_reader.py +0 -0
  182. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/tavily_reader.py +0 -0
  183. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/text_reader.py +0 -0
  184. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/web_search_reader.py +0 -0
  185. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/website_reader.py +0 -0
  186. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/wikipedia_reader.py +0 -0
  187. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reader/youtube_reader.py +0 -0
  188. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/remote_content/__init__.py +0 -0
  189. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/remote_content/remote_content.py +0 -0
  190. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/__init__.py +0 -0
  191. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/base.py +0 -0
  192. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/cohere.py +0 -0
  193. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/infinity.py +0 -0
  194. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  195. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/types.py +0 -0
  196. {agno-2.3.14 → agno-2.3.15}/agno/knowledge/utils.py +0 -0
  197. {agno-2.3.14 → agno-2.3.15}/agno/media.py +0 -0
  198. {agno-2.3.14 → agno-2.3.15}/agno/memory/__init__.py +0 -0
  199. {agno-2.3.14 → agno-2.3.15}/agno/memory/manager.py +0 -0
  200. {agno-2.3.14 → agno-2.3.15}/agno/memory/strategies/__init__.py +0 -0
  201. {agno-2.3.14 → agno-2.3.15}/agno/memory/strategies/base.py +0 -0
  202. {agno-2.3.14 → agno-2.3.15}/agno/memory/strategies/summarize.py +0 -0
  203. {agno-2.3.14 → agno-2.3.15}/agno/memory/strategies/types.py +0 -0
  204. {agno-2.3.14 → agno-2.3.15}/agno/models/__init__.py +0 -0
  205. {agno-2.3.14 → agno-2.3.15}/agno/models/aimlapi/__init__.py +0 -0
  206. {agno-2.3.14 → agno-2.3.15}/agno/models/aimlapi/aimlapi.py +0 -0
  207. {agno-2.3.14 → agno-2.3.15}/agno/models/anthropic/__init__.py +0 -0
  208. {agno-2.3.14 → agno-2.3.15}/agno/models/aws/__init__.py +0 -0
  209. {agno-2.3.14 → agno-2.3.15}/agno/models/aws/bedrock.py +0 -0
  210. {agno-2.3.14 → agno-2.3.15}/agno/models/aws/claude.py +0 -0
  211. {agno-2.3.14 → agno-2.3.15}/agno/models/azure/__init__.py +0 -0
  212. {agno-2.3.14 → agno-2.3.15}/agno/models/azure/ai_foundry.py +0 -0
  213. {agno-2.3.14 → agno-2.3.15}/agno/models/azure/openai_chat.py +0 -0
  214. {agno-2.3.14 → agno-2.3.15}/agno/models/base.py +0 -0
  215. {agno-2.3.14 → agno-2.3.15}/agno/models/cerebras/__init__.py +0 -0
  216. {agno-2.3.14 → agno-2.3.15}/agno/models/cerebras/cerebras.py +0 -0
  217. {agno-2.3.14 → agno-2.3.15}/agno/models/cerebras/cerebras_openai.py +0 -0
  218. {agno-2.3.14 → agno-2.3.15}/agno/models/cohere/__init__.py +0 -0
  219. {agno-2.3.14 → agno-2.3.15}/agno/models/cohere/chat.py +0 -0
  220. {agno-2.3.14 → agno-2.3.15}/agno/models/cometapi/__init__.py +0 -0
  221. {agno-2.3.14 → agno-2.3.15}/agno/models/cometapi/cometapi.py +0 -0
  222. {agno-2.3.14 → agno-2.3.15}/agno/models/dashscope/__init__.py +0 -0
  223. {agno-2.3.14 → agno-2.3.15}/agno/models/dashscope/dashscope.py +0 -0
  224. {agno-2.3.14 → agno-2.3.15}/agno/models/deepinfra/__init__.py +0 -0
  225. {agno-2.3.14 → agno-2.3.15}/agno/models/deepinfra/deepinfra.py +0 -0
  226. {agno-2.3.14 → agno-2.3.15}/agno/models/deepseek/__init__.py +0 -0
  227. {agno-2.3.14 → agno-2.3.15}/agno/models/deepseek/deepseek.py +0 -0
  228. {agno-2.3.14 → agno-2.3.15}/agno/models/defaults.py +0 -0
  229. {agno-2.3.14 → agno-2.3.15}/agno/models/fireworks/__init__.py +0 -0
  230. {agno-2.3.14 → agno-2.3.15}/agno/models/fireworks/fireworks.py +0 -0
  231. {agno-2.3.14 → agno-2.3.15}/agno/models/google/__init__.py +0 -0
  232. {agno-2.3.14 → agno-2.3.15}/agno/models/google/gemini.py +0 -0
  233. {agno-2.3.14 → agno-2.3.15}/agno/models/google/utils.py +0 -0
  234. {agno-2.3.14 → agno-2.3.15}/agno/models/groq/__init__.py +0 -0
  235. {agno-2.3.14 → agno-2.3.15}/agno/models/groq/groq.py +0 -0
  236. {agno-2.3.14 → agno-2.3.15}/agno/models/huggingface/__init__.py +0 -0
  237. {agno-2.3.14 → agno-2.3.15}/agno/models/huggingface/huggingface.py +0 -0
  238. {agno-2.3.14 → agno-2.3.15}/agno/models/ibm/__init__.py +0 -0
  239. {agno-2.3.14 → agno-2.3.15}/agno/models/ibm/watsonx.py +0 -0
  240. {agno-2.3.14 → agno-2.3.15}/agno/models/internlm/__init__.py +0 -0
  241. {agno-2.3.14 → agno-2.3.15}/agno/models/internlm/internlm.py +0 -0
  242. {agno-2.3.14 → agno-2.3.15}/agno/models/langdb/__init__.py +0 -0
  243. {agno-2.3.14 → agno-2.3.15}/agno/models/langdb/langdb.py +0 -0
  244. {agno-2.3.14 → agno-2.3.15}/agno/models/litellm/__init__.py +0 -0
  245. {agno-2.3.14 → agno-2.3.15}/agno/models/litellm/chat.py +0 -0
  246. {agno-2.3.14 → agno-2.3.15}/agno/models/litellm/litellm_openai.py +0 -0
  247. {agno-2.3.14 → agno-2.3.15}/agno/models/llama_cpp/__init__.py +0 -0
  248. {agno-2.3.14 → agno-2.3.15}/agno/models/llama_cpp/llama_cpp.py +0 -0
  249. {agno-2.3.14 → agno-2.3.15}/agno/models/lmstudio/__init__.py +0 -0
  250. {agno-2.3.14 → agno-2.3.15}/agno/models/lmstudio/lmstudio.py +0 -0
  251. {agno-2.3.14 → agno-2.3.15}/agno/models/message.py +0 -0
  252. {agno-2.3.14 → agno-2.3.15}/agno/models/meta/__init__.py +0 -0
  253. {agno-2.3.14 → agno-2.3.15}/agno/models/meta/llama.py +0 -0
  254. {agno-2.3.14 → agno-2.3.15}/agno/models/meta/llama_openai.py +0 -0
  255. {agno-2.3.14 → agno-2.3.15}/agno/models/mistral/__init__.py +0 -0
  256. {agno-2.3.14 → agno-2.3.15}/agno/models/mistral/mistral.py +0 -0
  257. {agno-2.3.14 → agno-2.3.15}/agno/models/nebius/__init__.py +0 -0
  258. {agno-2.3.14 → agno-2.3.15}/agno/models/nebius/nebius.py +0 -0
  259. {agno-2.3.14 → agno-2.3.15}/agno/models/nexus/__init__.py +0 -0
  260. {agno-2.3.14 → agno-2.3.15}/agno/models/nexus/nexus.py +0 -0
  261. {agno-2.3.14 → agno-2.3.15}/agno/models/nvidia/__init__.py +0 -0
  262. {agno-2.3.14 → agno-2.3.15}/agno/models/nvidia/nvidia.py +0 -0
  263. {agno-2.3.14 → agno-2.3.15}/agno/models/ollama/__init__.py +0 -0
  264. {agno-2.3.14 → agno-2.3.15}/agno/models/ollama/chat.py +0 -0
  265. {agno-2.3.14 → agno-2.3.15}/agno/models/openai/__init__.py +0 -0
  266. {agno-2.3.14 → agno-2.3.15}/agno/models/openai/like.py +0 -0
  267. {agno-2.3.14 → agno-2.3.15}/agno/models/openai/responses.py +0 -0
  268. {agno-2.3.14 → agno-2.3.15}/agno/models/openrouter/__init__.py +0 -0
  269. {agno-2.3.14 → agno-2.3.15}/agno/models/openrouter/openrouter.py +0 -0
  270. {agno-2.3.14 → agno-2.3.15}/agno/models/perplexity/__init__.py +0 -0
  271. {agno-2.3.14 → agno-2.3.15}/agno/models/perplexity/perplexity.py +0 -0
  272. {agno-2.3.14 → agno-2.3.15}/agno/models/portkey/__init__.py +0 -0
  273. {agno-2.3.14 → agno-2.3.15}/agno/models/portkey/portkey.py +0 -0
  274. {agno-2.3.14 → agno-2.3.15}/agno/models/requesty/__init__.py +0 -0
  275. {agno-2.3.14 → agno-2.3.15}/agno/models/requesty/requesty.py +0 -0
  276. {agno-2.3.14 → agno-2.3.15}/agno/models/response.py +0 -0
  277. {agno-2.3.14 → agno-2.3.15}/agno/models/sambanova/__init__.py +0 -0
  278. {agno-2.3.14 → agno-2.3.15}/agno/models/sambanova/sambanova.py +0 -0
  279. {agno-2.3.14 → agno-2.3.15}/agno/models/siliconflow/__init__.py +0 -0
  280. {agno-2.3.14 → agno-2.3.15}/agno/models/siliconflow/siliconflow.py +0 -0
  281. {agno-2.3.14 → agno-2.3.15}/agno/models/together/__init__.py +0 -0
  282. {agno-2.3.14 → agno-2.3.15}/agno/models/together/together.py +0 -0
  283. {agno-2.3.14 → agno-2.3.15}/agno/models/utils.py +0 -0
  284. {agno-2.3.14 → agno-2.3.15}/agno/models/vercel/__init__.py +0 -0
  285. {agno-2.3.14 → agno-2.3.15}/agno/models/vercel/v0.py +0 -0
  286. {agno-2.3.14 → agno-2.3.15}/agno/models/vertexai/__init__.py +0 -0
  287. {agno-2.3.14 → agno-2.3.15}/agno/models/vertexai/claude.py +0 -0
  288. {agno-2.3.14 → agno-2.3.15}/agno/models/vllm/__init__.py +0 -0
  289. {agno-2.3.14 → agno-2.3.15}/agno/models/vllm/vllm.py +0 -0
  290. {agno-2.3.14 → agno-2.3.15}/agno/models/xai/__init__.py +0 -0
  291. {agno-2.3.14 → agno-2.3.15}/agno/models/xai/xai.py +0 -0
  292. {agno-2.3.14 → agno-2.3.15}/agno/os/__init__.py +0 -0
  293. {agno-2.3.14 → agno-2.3.15}/agno/os/config.py +0 -0
  294. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/__init__.py +0 -0
  295. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/a2a/__init__.py +0 -0
  296. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/a2a/a2a.py +0 -0
  297. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/a2a/router.py +0 -0
  298. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/a2a/utils.py +0 -0
  299. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/agui/__init__.py +0 -0
  300. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/agui/agui.py +0 -0
  301. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/agui/router.py +0 -0
  302. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/agui/utils.py +0 -0
  303. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/base.py +0 -0
  304. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/slack/__init__.py +0 -0
  305. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/slack/router.py +0 -0
  306. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/slack/security.py +0 -0
  307. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/slack/slack.py +0 -0
  308. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  309. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/whatsapp/router.py +0 -0
  310. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/whatsapp/security.py +0 -0
  311. {agno-2.3.14 → agno-2.3.15}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
  312. {agno-2.3.14 → agno-2.3.15}/agno/os/mcp.py +0 -0
  313. {agno-2.3.14 → agno-2.3.15}/agno/os/middleware/__init__.py +0 -0
  314. {agno-2.3.14 → agno-2.3.15}/agno/os/middleware/jwt.py +0 -0
  315. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/__init__.py +0 -0
  316. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/agents/__init__.py +0 -0
  317. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/agents/router.py +0 -0
  318. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/agents/schema.py +0 -0
  319. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/evals/__init__.py +0 -0
  320. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/evals/evals.py +0 -0
  321. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/evals/schemas.py +0 -0
  322. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/evals/utils.py +0 -0
  323. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/health.py +0 -0
  324. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/home.py +0 -0
  325. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/knowledge/__init__.py +0 -0
  326. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/knowledge/knowledge.py +0 -0
  327. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/knowledge/schemas.py +0 -0
  328. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/memory/__init__.py +0 -0
  329. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/memory/memory.py +0 -0
  330. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/memory/schemas.py +0 -0
  331. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/metrics/__init__.py +0 -0
  332. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/metrics/metrics.py +0 -0
  333. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/metrics/schemas.py +0 -0
  334. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/session/__init__.py +0 -0
  335. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/session/session.py +0 -0
  336. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/teams/__init__.py +0 -0
  337. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/teams/router.py +0 -0
  338. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/teams/schema.py +0 -0
  339. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/traces/__init__.py +0 -0
  340. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/traces/schemas.py +0 -0
  341. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/traces/traces.py +0 -0
  342. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/workflows/__init__.py +0 -0
  343. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/workflows/router.py +0 -0
  344. {agno-2.3.14 → agno-2.3.15}/agno/os/routers/workflows/schema.py +0 -0
  345. {agno-2.3.14 → agno-2.3.15}/agno/os/schema.py +0 -0
  346. {agno-2.3.14 → agno-2.3.15}/agno/os/scopes.py +0 -0
  347. {agno-2.3.14 → agno-2.3.15}/agno/os/utils.py +0 -0
  348. {agno-2.3.14 → agno-2.3.15}/agno/py.typed +0 -0
  349. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/__init__.py +0 -0
  350. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/anthropic.py +0 -0
  351. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/azure_ai_foundry.py +0 -0
  352. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/deepseek.py +0 -0
  353. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/default.py +0 -0
  354. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/gemini.py +0 -0
  355. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/groq.py +0 -0
  356. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/helpers.py +0 -0
  357. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/manager.py +0 -0
  358. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/ollama.py +0 -0
  359. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/openai.py +0 -0
  360. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/step.py +0 -0
  361. {agno-2.3.14 → agno-2.3.15}/agno/reasoning/vertexai.py +0 -0
  362. {agno-2.3.14 → agno-2.3.15}/agno/run/__init__.py +0 -0
  363. {agno-2.3.14 → agno-2.3.15}/agno/run/cancel.py +0 -0
  364. {agno-2.3.14 → agno-2.3.15}/agno/run/messages.py +0 -0
  365. {agno-2.3.14 → agno-2.3.15}/agno/run/requirement.py +0 -0
  366. {agno-2.3.14 → agno-2.3.15}/agno/run/workflow.py +0 -0
  367. {agno-2.3.14 → agno-2.3.15}/agno/session/__init__.py +0 -0
  368. {agno-2.3.14 → agno-2.3.15}/agno/session/agent.py +0 -0
  369. {agno-2.3.14 → agno-2.3.15}/agno/session/summary.py +0 -0
  370. {agno-2.3.14 → agno-2.3.15}/agno/session/team.py +0 -0
  371. {agno-2.3.14 → agno-2.3.15}/agno/session/workflow.py +0 -0
  372. {agno-2.3.14 → agno-2.3.15}/agno/table.py +0 -0
  373. {agno-2.3.14 → agno-2.3.15}/agno/team/__init__.py +0 -0
  374. {agno-2.3.14 → agno-2.3.15}/agno/tools/__init__.py +0 -0
  375. {agno-2.3.14 → agno-2.3.15}/agno/tools/agentql.py +0 -0
  376. {agno-2.3.14 → agno-2.3.15}/agno/tools/airflow.py +0 -0
  377. {agno-2.3.14 → agno-2.3.15}/agno/tools/api.py +0 -0
  378. {agno-2.3.14 → agno-2.3.15}/agno/tools/apify.py +0 -0
  379. {agno-2.3.14 → agno-2.3.15}/agno/tools/arxiv.py +0 -0
  380. {agno-2.3.14 → agno-2.3.15}/agno/tools/aws_lambda.py +0 -0
  381. {agno-2.3.14 → agno-2.3.15}/agno/tools/aws_ses.py +0 -0
  382. {agno-2.3.14 → agno-2.3.15}/agno/tools/baidusearch.py +0 -0
  383. {agno-2.3.14 → agno-2.3.15}/agno/tools/bitbucket.py +0 -0
  384. {agno-2.3.14 → agno-2.3.15}/agno/tools/brandfetch.py +0 -0
  385. {agno-2.3.14 → agno-2.3.15}/agno/tools/bravesearch.py +0 -0
  386. {agno-2.3.14 → agno-2.3.15}/agno/tools/brightdata.py +0 -0
  387. {agno-2.3.14 → agno-2.3.15}/agno/tools/browserbase.py +0 -0
  388. {agno-2.3.14 → agno-2.3.15}/agno/tools/calcom.py +0 -0
  389. {agno-2.3.14 → agno-2.3.15}/agno/tools/calculator.py +0 -0
  390. {agno-2.3.14 → agno-2.3.15}/agno/tools/cartesia.py +0 -0
  391. {agno-2.3.14 → agno-2.3.15}/agno/tools/clickup.py +0 -0
  392. {agno-2.3.14 → agno-2.3.15}/agno/tools/confluence.py +0 -0
  393. {agno-2.3.14 → agno-2.3.15}/agno/tools/crawl4ai.py +0 -0
  394. {agno-2.3.14 → agno-2.3.15}/agno/tools/csv_toolkit.py +0 -0
  395. {agno-2.3.14 → agno-2.3.15}/agno/tools/dalle.py +0 -0
  396. {agno-2.3.14 → agno-2.3.15}/agno/tools/daytona.py +0 -0
  397. {agno-2.3.14 → agno-2.3.15}/agno/tools/decorator.py +0 -0
  398. {agno-2.3.14 → agno-2.3.15}/agno/tools/desi_vocal.py +0 -0
  399. {agno-2.3.14 → agno-2.3.15}/agno/tools/discord.py +0 -0
  400. {agno-2.3.14 → agno-2.3.15}/agno/tools/docker.py +0 -0
  401. {agno-2.3.14 → agno-2.3.15}/agno/tools/duckdb.py +0 -0
  402. {agno-2.3.14 → agno-2.3.15}/agno/tools/duckduckgo.py +0 -0
  403. {agno-2.3.14 → agno-2.3.15}/agno/tools/e2b.py +0 -0
  404. {agno-2.3.14 → agno-2.3.15}/agno/tools/eleven_labs.py +0 -0
  405. {agno-2.3.14 → agno-2.3.15}/agno/tools/email.py +0 -0
  406. {agno-2.3.14 → agno-2.3.15}/agno/tools/evm.py +0 -0
  407. {agno-2.3.14 → agno-2.3.15}/agno/tools/exa.py +0 -0
  408. {agno-2.3.14 → agno-2.3.15}/agno/tools/fal.py +0 -0
  409. {agno-2.3.14 → agno-2.3.15}/agno/tools/file.py +0 -0
  410. {agno-2.3.14 → agno-2.3.15}/agno/tools/file_generation.py +0 -0
  411. {agno-2.3.14 → agno-2.3.15}/agno/tools/financial_datasets.py +0 -0
  412. {agno-2.3.14 → agno-2.3.15}/agno/tools/firecrawl.py +0 -0
  413. {agno-2.3.14 → agno-2.3.15}/agno/tools/function.py +0 -0
  414. {agno-2.3.14 → agno-2.3.15}/agno/tools/giphy.py +0 -0
  415. {agno-2.3.14 → agno-2.3.15}/agno/tools/github.py +0 -0
  416. {agno-2.3.14 → agno-2.3.15}/agno/tools/gmail.py +0 -0
  417. {agno-2.3.14 → agno-2.3.15}/agno/tools/google_bigquery.py +0 -0
  418. {agno-2.3.14 → agno-2.3.15}/agno/tools/google_drive.py +0 -0
  419. {agno-2.3.14 → agno-2.3.15}/agno/tools/google_maps.py +0 -0
  420. {agno-2.3.14 → agno-2.3.15}/agno/tools/googlecalendar.py +0 -0
  421. {agno-2.3.14 → agno-2.3.15}/agno/tools/googlesheets.py +0 -0
  422. {agno-2.3.14 → agno-2.3.15}/agno/tools/hackernews.py +0 -0
  423. {agno-2.3.14 → agno-2.3.15}/agno/tools/jina.py +0 -0
  424. {agno-2.3.14 → agno-2.3.15}/agno/tools/jira.py +0 -0
  425. {agno-2.3.14 → agno-2.3.15}/agno/tools/knowledge.py +0 -0
  426. {agno-2.3.14 → agno-2.3.15}/agno/tools/linear.py +0 -0
  427. {agno-2.3.14 → agno-2.3.15}/agno/tools/linkup.py +0 -0
  428. {agno-2.3.14 → agno-2.3.15}/agno/tools/local_file_system.py +0 -0
  429. {agno-2.3.14 → agno-2.3.15}/agno/tools/lumalab.py +0 -0
  430. {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp/__init__.py +0 -0
  431. {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp/mcp.py +0 -0
  432. {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp/multi_mcp.py +0 -0
  433. {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp/params.py +0 -0
  434. {agno-2.3.14 → agno-2.3.15}/agno/tools/mcp_toolbox.py +0 -0
  435. {agno-2.3.14 → agno-2.3.15}/agno/tools/mem0.py +0 -0
  436. {agno-2.3.14 → agno-2.3.15}/agno/tools/memory.py +0 -0
  437. {agno-2.3.14 → agno-2.3.15}/agno/tools/mlx_transcribe.py +0 -0
  438. {agno-2.3.14 → agno-2.3.15}/agno/tools/models/__init__.py +0 -0
  439. {agno-2.3.14 → agno-2.3.15}/agno/tools/models/azure_openai.py +0 -0
  440. {agno-2.3.14 → agno-2.3.15}/agno/tools/models/gemini.py +0 -0
  441. {agno-2.3.14 → agno-2.3.15}/agno/tools/models/groq.py +0 -0
  442. {agno-2.3.14 → agno-2.3.15}/agno/tools/models/morph.py +0 -0
  443. {agno-2.3.14 → agno-2.3.15}/agno/tools/models/nebius.py +0 -0
  444. {agno-2.3.14 → agno-2.3.15}/agno/tools/models_labs.py +0 -0
  445. {agno-2.3.14 → agno-2.3.15}/agno/tools/moviepy_video.py +0 -0
  446. {agno-2.3.14 → agno-2.3.15}/agno/tools/nano_banana.py +0 -0
  447. {agno-2.3.14 → agno-2.3.15}/agno/tools/neo4j.py +0 -0
  448. {agno-2.3.14 → agno-2.3.15}/agno/tools/newspaper.py +0 -0
  449. {agno-2.3.14 → agno-2.3.15}/agno/tools/newspaper4k.py +0 -0
  450. {agno-2.3.14 → agno-2.3.15}/agno/tools/notion.py +0 -0
  451. {agno-2.3.14 → agno-2.3.15}/agno/tools/openai.py +0 -0
  452. {agno-2.3.14 → agno-2.3.15}/agno/tools/openbb.py +0 -0
  453. {agno-2.3.14 → agno-2.3.15}/agno/tools/opencv.py +0 -0
  454. {agno-2.3.14 → agno-2.3.15}/agno/tools/openweather.py +0 -0
  455. {agno-2.3.14 → agno-2.3.15}/agno/tools/oxylabs.py +0 -0
  456. {agno-2.3.14 → agno-2.3.15}/agno/tools/pandas.py +0 -0
  457. {agno-2.3.14 → agno-2.3.15}/agno/tools/parallel.py +0 -0
  458. {agno-2.3.14 → agno-2.3.15}/agno/tools/postgres.py +0 -0
  459. {agno-2.3.14 → agno-2.3.15}/agno/tools/pubmed.py +0 -0
  460. {agno-2.3.14 → agno-2.3.15}/agno/tools/python.py +0 -0
  461. {agno-2.3.14 → agno-2.3.15}/agno/tools/reasoning.py +0 -0
  462. {agno-2.3.14 → agno-2.3.15}/agno/tools/reddit.py +0 -0
  463. {agno-2.3.14 → agno-2.3.15}/agno/tools/redshift.py +0 -0
  464. {agno-2.3.14 → agno-2.3.15}/agno/tools/replicate.py +0 -0
  465. {agno-2.3.14 → agno-2.3.15}/agno/tools/resend.py +0 -0
  466. {agno-2.3.14 → agno-2.3.15}/agno/tools/scrapegraph.py +0 -0
  467. {agno-2.3.14 → agno-2.3.15}/agno/tools/searxng.py +0 -0
  468. {agno-2.3.14 → agno-2.3.15}/agno/tools/serpapi.py +0 -0
  469. {agno-2.3.14 → agno-2.3.15}/agno/tools/serper.py +0 -0
  470. {agno-2.3.14 → agno-2.3.15}/agno/tools/shell.py +0 -0
  471. {agno-2.3.14 → agno-2.3.15}/agno/tools/shopify.py +0 -0
  472. {agno-2.3.14 → agno-2.3.15}/agno/tools/slack.py +0 -0
  473. {agno-2.3.14 → agno-2.3.15}/agno/tools/sleep.py +0 -0
  474. {agno-2.3.14 → agno-2.3.15}/agno/tools/spider.py +0 -0
  475. {agno-2.3.14 → agno-2.3.15}/agno/tools/spotify.py +0 -0
  476. {agno-2.3.14 → agno-2.3.15}/agno/tools/sql.py +0 -0
  477. {agno-2.3.14 → agno-2.3.15}/agno/tools/streamlit/__init__.py +0 -0
  478. {agno-2.3.14 → agno-2.3.15}/agno/tools/streamlit/components.py +0 -0
  479. {agno-2.3.14 → agno-2.3.15}/agno/tools/tavily.py +0 -0
  480. {agno-2.3.14 → agno-2.3.15}/agno/tools/telegram.py +0 -0
  481. {agno-2.3.14 → agno-2.3.15}/agno/tools/todoist.py +0 -0
  482. {agno-2.3.14 → agno-2.3.15}/agno/tools/tool_registry.py +0 -0
  483. {agno-2.3.14 → agno-2.3.15}/agno/tools/trafilatura.py +0 -0
  484. {agno-2.3.14 → agno-2.3.15}/agno/tools/trello.py +0 -0
  485. {agno-2.3.14 → agno-2.3.15}/agno/tools/twilio.py +0 -0
  486. {agno-2.3.14 → agno-2.3.15}/agno/tools/user_control_flow.py +0 -0
  487. {agno-2.3.14 → agno-2.3.15}/agno/tools/valyu.py +0 -0
  488. {agno-2.3.14 → agno-2.3.15}/agno/tools/visualization.py +0 -0
  489. {agno-2.3.14 → agno-2.3.15}/agno/tools/webbrowser.py +0 -0
  490. {agno-2.3.14 → agno-2.3.15}/agno/tools/webex.py +0 -0
  491. {agno-2.3.14 → agno-2.3.15}/agno/tools/website.py +0 -0
  492. {agno-2.3.14 → agno-2.3.15}/agno/tools/webtools.py +0 -0
  493. {agno-2.3.14 → agno-2.3.15}/agno/tools/whatsapp.py +0 -0
  494. {agno-2.3.14 → agno-2.3.15}/agno/tools/wikipedia.py +0 -0
  495. {agno-2.3.14 → agno-2.3.15}/agno/tools/workflow.py +0 -0
  496. {agno-2.3.14 → agno-2.3.15}/agno/tools/x.py +0 -0
  497. {agno-2.3.14 → agno-2.3.15}/agno/tools/yfinance.py +0 -0
  498. {agno-2.3.14 → agno-2.3.15}/agno/tools/youtube.py +0 -0
  499. {agno-2.3.14 → agno-2.3.15}/agno/tools/zendesk.py +0 -0
  500. {agno-2.3.14 → agno-2.3.15}/agno/tools/zep.py +0 -0
  501. {agno-2.3.14 → agno-2.3.15}/agno/tools/zoom.py +0 -0
  502. {agno-2.3.14 → agno-2.3.15}/agno/tracing/__init__.py +0 -0
  503. {agno-2.3.14 → agno-2.3.15}/agno/tracing/exporter.py +0 -0
  504. {agno-2.3.14 → agno-2.3.15}/agno/tracing/schemas.py +0 -0
  505. {agno-2.3.14 → agno-2.3.15}/agno/tracing/setup.py +0 -0
  506. {agno-2.3.14 → agno-2.3.15}/agno/utils/__init__.py +0 -0
  507. {agno-2.3.14 → agno-2.3.15}/agno/utils/agent.py +0 -0
  508. {agno-2.3.14 → agno-2.3.15}/agno/utils/audio.py +0 -0
  509. {agno-2.3.14 → agno-2.3.15}/agno/utils/certs.py +0 -0
  510. {agno-2.3.14 → agno-2.3.15}/agno/utils/code_execution.py +0 -0
  511. {agno-2.3.14 → agno-2.3.15}/agno/utils/common.py +0 -0
  512. {agno-2.3.14 → agno-2.3.15}/agno/utils/cryptography.py +0 -0
  513. {agno-2.3.14 → agno-2.3.15}/agno/utils/dttm.py +0 -0
  514. {agno-2.3.14 → agno-2.3.15}/agno/utils/enum.py +0 -0
  515. {agno-2.3.14 → agno-2.3.15}/agno/utils/env.py +0 -0
  516. {agno-2.3.14 → agno-2.3.15}/agno/utils/format_str.py +0 -0
  517. {agno-2.3.14 → agno-2.3.15}/agno/utils/functions.py +0 -0
  518. {agno-2.3.14 → agno-2.3.15}/agno/utils/gemini.py +0 -0
  519. {agno-2.3.14 → agno-2.3.15}/agno/utils/hooks.py +0 -0
  520. {agno-2.3.14 → agno-2.3.15}/agno/utils/http.py +0 -0
  521. {agno-2.3.14 → agno-2.3.15}/agno/utils/json_schema.py +0 -0
  522. {agno-2.3.14 → agno-2.3.15}/agno/utils/knowledge.py +0 -0
  523. {agno-2.3.14 → agno-2.3.15}/agno/utils/location.py +0 -0
  524. {agno-2.3.14 → agno-2.3.15}/agno/utils/log.py +0 -0
  525. {agno-2.3.14 → agno-2.3.15}/agno/utils/mcp.py +0 -0
  526. {agno-2.3.14 → agno-2.3.15}/agno/utils/media.py +0 -0
  527. {agno-2.3.14 → agno-2.3.15}/agno/utils/merge_dict.py +0 -0
  528. {agno-2.3.14 → agno-2.3.15}/agno/utils/message.py +0 -0
  529. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/__init__.py +0 -0
  530. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/ai_foundry.py +0 -0
  531. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/claude.py +0 -0
  532. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/cohere.py +0 -0
  533. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/llama.py +0 -0
  534. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/mistral.py +0 -0
  535. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/openai_responses.py +0 -0
  536. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/schema_utils.py +0 -0
  537. {agno-2.3.14 → agno-2.3.15}/agno/utils/models/watsonx.py +0 -0
  538. {agno-2.3.14 → agno-2.3.15}/agno/utils/openai.py +0 -0
  539. {agno-2.3.14 → agno-2.3.15}/agno/utils/pickle.py +0 -0
  540. {agno-2.3.14 → agno-2.3.15}/agno/utils/pprint.py +0 -0
  541. {agno-2.3.14 → agno-2.3.15}/agno/utils/print_response/__init__.py +0 -0
  542. {agno-2.3.14 → agno-2.3.15}/agno/utils/print_response/agent.py +0 -0
  543. {agno-2.3.14 → agno-2.3.15}/agno/utils/print_response/team.py +0 -0
  544. {agno-2.3.14 → agno-2.3.15}/agno/utils/print_response/workflow.py +0 -0
  545. {agno-2.3.14 → agno-2.3.15}/agno/utils/prompts.py +0 -0
  546. {agno-2.3.14 → agno-2.3.15}/agno/utils/reasoning.py +0 -0
  547. {agno-2.3.14 → agno-2.3.15}/agno/utils/response.py +0 -0
  548. {agno-2.3.14 → agno-2.3.15}/agno/utils/response_iterator.py +0 -0
  549. {agno-2.3.14 → agno-2.3.15}/agno/utils/safe_formatter.py +0 -0
  550. {agno-2.3.14 → agno-2.3.15}/agno/utils/serialize.py +0 -0
  551. {agno-2.3.14 → agno-2.3.15}/agno/utils/shell.py +0 -0
  552. {agno-2.3.14 → agno-2.3.15}/agno/utils/streamlit.py +0 -0
  553. {agno-2.3.14 → agno-2.3.15}/agno/utils/string.py +0 -0
  554. {agno-2.3.14 → agno-2.3.15}/agno/utils/team.py +0 -0
  555. {agno-2.3.14 → agno-2.3.15}/agno/utils/timer.py +0 -0
  556. {agno-2.3.14 → agno-2.3.15}/agno/utils/tokens.py +0 -0
  557. {agno-2.3.14 → agno-2.3.15}/agno/utils/tools.py +0 -0
  558. {agno-2.3.14 → agno-2.3.15}/agno/utils/web.py +0 -0
  559. {agno-2.3.14 → agno-2.3.15}/agno/utils/whatsapp.py +0 -0
  560. {agno-2.3.14 → agno-2.3.15}/agno/utils/yaml_io.py +0 -0
  561. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/__init__.py +0 -0
  562. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/base.py +0 -0
  563. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/cassandra/__init__.py +0 -0
  564. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/cassandra/cassandra.py +0 -0
  565. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  566. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/cassandra/index.py +0 -0
  567. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/chroma/__init__.py +0 -0
  568. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/chroma/chromadb.py +0 -0
  569. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/clickhouse/__init__.py +0 -0
  570. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  571. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/clickhouse/index.py +0 -0
  572. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/couchbase/__init__.py +0 -0
  573. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/couchbase/couchbase.py +0 -0
  574. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/distance.py +0 -0
  575. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/lancedb/__init__.py +0 -0
  576. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/lancedb/lance_db.py +0 -0
  577. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/langchaindb/__init__.py +0 -0
  578. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/langchaindb/langchaindb.py +0 -0
  579. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/lightrag/__init__.py +0 -0
  580. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/lightrag/lightrag.py +0 -0
  581. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/llamaindex/__init__.py +0 -0
  582. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
  583. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/milvus/__init__.py +0 -0
  584. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/milvus/milvus.py +0 -0
  585. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/mongodb/__init__.py +0 -0
  586. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/mongodb/mongodb.py +0 -0
  587. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pgvector/__init__.py +0 -0
  588. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pgvector/index.py +0 -0
  589. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pgvector/pgvector.py +0 -0
  590. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pineconedb/__init__.py +0 -0
  591. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  592. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/qdrant/__init__.py +0 -0
  593. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/qdrant/qdrant.py +0 -0
  594. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/redis/__init__.py +0 -0
  595. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/redis/redisdb.py +0 -0
  596. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/search.py +0 -0
  597. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/singlestore/__init__.py +0 -0
  598. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/singlestore/index.py +0 -0
  599. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/singlestore/singlestore.py +0 -0
  600. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/surrealdb/__init__.py +0 -0
  601. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  602. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/upstashdb/__init__.py +0 -0
  603. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  604. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/weaviate/__init__.py +0 -0
  605. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/weaviate/index.py +0 -0
  606. {agno-2.3.14 → agno-2.3.15}/agno/vectordb/weaviate/weaviate.py +0 -0
  607. {agno-2.3.14 → agno-2.3.15}/agno/workflow/__init__.py +0 -0
  608. {agno-2.3.14 → agno-2.3.15}/agno/workflow/agent.py +0 -0
  609. {agno-2.3.14 → agno-2.3.15}/agno/workflow/condition.py +0 -0
  610. {agno-2.3.14 → agno-2.3.15}/agno/workflow/loop.py +0 -0
  611. {agno-2.3.14 → agno-2.3.15}/agno/workflow/parallel.py +0 -0
  612. {agno-2.3.14 → agno-2.3.15}/agno/workflow/router.py +0 -0
  613. {agno-2.3.14 → agno-2.3.15}/agno/workflow/step.py +0 -0
  614. {agno-2.3.14 → agno-2.3.15}/agno/workflow/steps.py +0 -0
  615. {agno-2.3.14 → agno-2.3.15}/agno/workflow/types.py +0 -0
  616. {agno-2.3.14 → agno-2.3.15}/agno/workflow/workflow.py +0 -0
  617. {agno-2.3.14 → agno-2.3.15}/agno.egg-info/dependency_links.txt +0 -0
  618. {agno-2.3.14 → agno-2.3.15}/agno.egg-info/requires.txt +0 -0
  619. {agno-2.3.14 → agno-2.3.15}/agno.egg-info/top_level.txt +0 -0
  620. {agno-2.3.14 → agno-2.3.15}/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.15
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
 
@@ -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(
@@ -1,3 +1,4 @@
1
+ from os import getenv
1
2
  from typing import List, Set
2
3
 
3
4
  from fastapi import Depends, HTTPException, Request
@@ -10,18 +11,43 @@ from agno.os.settings import AgnoAPISettings
10
11
  security = HTTPBearer(auto_error=False)
11
12
 
12
13
 
14
+ def _is_jwt_configured() -> bool:
15
+ """Check if JWT authentication is configured via environment variables.
16
+
17
+ This covers cases where JWT middleware is set up manually (not via authorization=True).
18
+ """
19
+ return bool(getenv("JWT_VERIFICATION_KEY") or getenv("JWT_JWKS_FILE"))
20
+
21
+
13
22
  def get_authentication_dependency(settings: AgnoAPISettings):
14
23
  """
15
24
  Create an authentication dependency function for FastAPI routes.
16
25
 
26
+ This handles security key authentication (OS_SECURITY_KEY).
27
+ When JWT authorization is enabled (via authorization=True, JWT environment variables,
28
+ or manually added JWT middleware), this dependency is skipped as JWT middleware
29
+ handles authentication.
30
+
17
31
  Args:
18
- settings: The API settings containing the security key
32
+ settings: The API settings containing the security key and authorization flag
19
33
 
20
34
  Returns:
21
35
  A dependency function that can be used with FastAPI's Depends()
22
36
  """
23
37
 
24
- async def auth_dependency(credentials: HTTPAuthorizationCredentials = Depends(security)) -> bool:
38
+ async def auth_dependency(request: Request, credentials: HTTPAuthorizationCredentials = Depends(security)) -> bool:
39
+ # If JWT authorization is enabled via settings (authorization=True on AgentOS)
40
+ if settings and settings.authorization_enabled:
41
+ return True
42
+
43
+ # Check if JWT middleware has already handled authentication
44
+ if getattr(request.state, "authenticated", False):
45
+ return True
46
+
47
+ # Also skip if JWT is configured via environment variables
48
+ if _is_jwt_configured():
49
+ return True
50
+
25
51
  # If no security key is set, skip authentication entirely
26
52
  if not settings or not settings.os_security_key:
27
53
  return True
@@ -45,13 +71,24 @@ def validate_websocket_token(token: str, settings: AgnoAPISettings) -> bool:
45
71
  """
46
72
  Validate a bearer token for WebSocket authentication (legacy os_security_key method).
47
73
 
74
+ When JWT authorization is enabled (via authorization=True or JWT environment variables),
75
+ this validation is skipped as JWT middleware handles authentication.
76
+
48
77
  Args:
49
78
  token: The bearer token to validate
50
- settings: The API settings containing the security key
79
+ settings: The API settings containing the security key and authorization flag
51
80
 
52
81
  Returns:
53
82
  True if the token is valid or authentication is disabled, False otherwise
54
83
  """
84
+ # If JWT authorization is enabled, skip security key validation
85
+ if settings and settings.authorization_enabled:
86
+ return True
87
+
88
+ # Also skip if JWT is configured via environment variables (manual JWT middleware setup)
89
+ if _is_jwt_configured():
90
+ return True
91
+
55
92
  # If no security key is set, skip authentication entirely
56
93
  if not settings or not settings.os_security_key:
57
94
  return True
@@ -1,16 +1,11 @@
1
- from typing import TYPE_CHECKING, List, Optional, Union, cast
1
+ from typing import TYPE_CHECKING, List, Union, cast
2
2
 
3
3
  from fastapi import (
4
4
  APIRouter,
5
5
  Depends,
6
- HTTPException,
7
6
  )
8
- from fastapi.responses import JSONResponse
9
- from packaging import version
10
7
 
11
8
  from agno.agent.agent import Agent
12
- from agno.db.base import AsyncBaseDb
13
- from agno.db.migrations.manager import MigrationManager
14
9
  from agno.os.auth import get_authentication_dependency
15
10
  from agno.os.schema import (
16
11
  AgentSummaryResponse,
@@ -26,9 +21,6 @@ from agno.os.schema import (
26
21
  WorkflowSummaryResponse,
27
22
  )
28
23
  from agno.os.settings import AgnoAPISettings
29
- from agno.os.utils import (
30
- get_db,
31
- )
32
24
  from agno.team.team import Team
33
25
 
34
26
  if TYPE_CHECKING:
@@ -207,52 +199,4 @@ def get_base_router(
207
199
 
208
200
  return list(unique_models.values())
209
201
 
210
- # -- Database Migration routes ---
211
- @router.post(
212
- "/databases/{db_id}/migrate",
213
- tags=["Database"],
214
- operation_id="migrate_database",
215
- summary="Migrate Database",
216
- description=(
217
- "Migrate the given database schema to the given target version. "
218
- "If a target version is not provided, the database will be migrated to the latest version. "
219
- ),
220
- responses={
221
- 200: {
222
- "description": "Database migrated successfully",
223
- "content": {
224
- "application/json": {
225
- "example": {"message": "Database migrated successfully to version 3.0.0"},
226
- }
227
- },
228
- },
229
- 404: {"description": "Database not found", "model": NotFoundResponse},
230
- 500: {"description": "Failed to migrate database", "model": InternalServerErrorResponse},
231
- },
232
- )
233
- async def migrate_database(db_id: str, target_version: Optional[str] = None):
234
- db = await get_db(os.dbs, db_id)
235
- if not db:
236
- raise HTTPException(status_code=404, detail="Database not found")
237
-
238
- if target_version:
239
- # Use the session table as proxy for the database schema version
240
- if isinstance(db, AsyncBaseDb):
241
- current_version = await db.get_latest_schema_version(db.session_table_name)
242
- else:
243
- current_version = db.get_latest_schema_version(db.session_table_name)
244
-
245
- if version.parse(target_version) > version.parse(current_version): # type: ignore
246
- MigrationManager(db).up(target_version) # type: ignore
247
- else:
248
- MigrationManager(db).down(target_version) # type: ignore
249
-
250
- # If the target version is not provided, migrate to the latest version
251
- else:
252
- MigrationManager(db).up() # type: ignore
253
-
254
- return JSONResponse(
255
- content={"message": f"Database migrated successfully to version {target_version}"}, status_code=200
256
- )
257
-
258
202
  return router
@@ -0,0 +1,150 @@
1
+ from typing import TYPE_CHECKING, Optional
2
+
3
+ from fastapi import (
4
+ APIRouter,
5
+ Depends,
6
+ HTTPException,
7
+ )
8
+ from fastapi.responses import JSONResponse
9
+ from packaging import version
10
+
11
+ from agno.db.base import AsyncBaseDb
12
+ from agno.db.migrations.manager import MigrationManager
13
+ from agno.os.auth import get_authentication_dependency
14
+ from agno.os.schema import (
15
+ BadRequestResponse,
16
+ InternalServerErrorResponse,
17
+ NotFoundResponse,
18
+ UnauthenticatedResponse,
19
+ ValidationErrorResponse,
20
+ )
21
+ from agno.os.settings import AgnoAPISettings
22
+ from agno.os.utils import (
23
+ get_db,
24
+ )
25
+
26
+ if TYPE_CHECKING:
27
+ from agno.os.app import AgentOS
28
+
29
+
30
+ def get_database_router(
31
+ os: "AgentOS",
32
+ settings: AgnoAPISettings = AgnoAPISettings(),
33
+ ) -> APIRouter:
34
+ """Create the database router with comprehensive OpenAPI documentation."""
35
+ router = APIRouter(
36
+ dependencies=[Depends(get_authentication_dependency(settings))],
37
+ responses={
38
+ 400: {"description": "Bad Request", "model": BadRequestResponse},
39
+ 401: {"description": "Unauthorized", "model": UnauthenticatedResponse},
40
+ 404: {"description": "Not Found", "model": NotFoundResponse},
41
+ 422: {"description": "Validation Error", "model": ValidationErrorResponse},
42
+ 500: {"description": "Internal Server Error", "model": InternalServerErrorResponse},
43
+ },
44
+ )
45
+
46
+ async def _migrate_single_db(db, target_version: Optional[str] = None) -> None:
47
+ """Migrate a single database."""
48
+ if target_version:
49
+ # Use the session table as proxy for the database schema version
50
+ if isinstance(db, AsyncBaseDb):
51
+ current_version = await db.get_latest_schema_version(db.session_table_name)
52
+ else:
53
+ current_version = db.get_latest_schema_version(db.session_table_name)
54
+
55
+ if version.parse(target_version) > version.parse(current_version): # type: ignore
56
+ await MigrationManager(db).up(target_version) # type: ignore
57
+ else:
58
+ await MigrationManager(db).down(target_version) # type: ignore
59
+ else:
60
+ # If the target version is not provided, migrate to the latest version
61
+ await MigrationManager(db).up() # type: ignore
62
+
63
+ @router.post(
64
+ "/databases/all/migrate",
65
+ tags=["Database"],
66
+ operation_id="migrate_all_databases",
67
+ summary="Migrate All Databases",
68
+ description=(
69
+ "Migrate all database schemas to the given target version. "
70
+ "If a target version is not provided, all databases will be migrated to the latest version."
71
+ ),
72
+ responses={
73
+ 200: {
74
+ "description": "All databases migrated successfully",
75
+ "content": {
76
+ "application/json": {
77
+ "example": {"message": "All databases migrated successfully to version 3.0.0"},
78
+ }
79
+ },
80
+ },
81
+ 500: {"description": "Failed to migrate databases", "model": InternalServerErrorResponse},
82
+ },
83
+ )
84
+ async def migrate_all_databases(target_version: Optional[str] = None):
85
+ """Migrate all databases."""
86
+ all_dbs = {db.id: db for db_id, dbs in os.dbs.items() for db in dbs}
87
+ failed_dbs: dict[str, str] = {}
88
+
89
+ for db_id, db in all_dbs.items():
90
+ try:
91
+ await _migrate_single_db(db, target_version)
92
+ except Exception as e:
93
+ failed_dbs[db_id] = str(e)
94
+
95
+ version_msg = f"version {target_version}" if target_version else "latest version"
96
+ migrated_count = len(all_dbs) - len(failed_dbs)
97
+
98
+ if failed_dbs:
99
+ return JSONResponse(
100
+ content={
101
+ "message": f"Migrated {migrated_count}/{len(all_dbs)} databases to {version_msg}",
102
+ "failed": failed_dbs,
103
+ },
104
+ status_code=207, # Multi-Status
105
+ )
106
+
107
+ return JSONResponse(
108
+ content={"message": f"All databases migrated successfully to {version_msg}"}, status_code=200
109
+ )
110
+
111
+ @router.post(
112
+ "/databases/{db_id}/migrate",
113
+ tags=["Database"],
114
+ operation_id="migrate_database",
115
+ summary="Migrate Database",
116
+ description=(
117
+ "Migrate the given database schema to the given target version. "
118
+ "If a target version is not provided, the database will be migrated to the latest version."
119
+ ),
120
+ responses={
121
+ 200: {
122
+ "description": "Database migrated successfully",
123
+ "content": {
124
+ "application/json": {
125
+ "example": {"message": "Database migrated successfully to version 3.0.0"},
126
+ }
127
+ },
128
+ },
129
+ 404: {"description": "Database not found", "model": NotFoundResponse},
130
+ 500: {"description": "Failed to migrate database", "model": InternalServerErrorResponse},
131
+ },
132
+ )
133
+ async def migrate_database(db_id: str, target_version: Optional[str] = None):
134
+ db = await get_db(os.dbs, db_id)
135
+ if not db:
136
+ raise HTTPException(status_code=404, detail="Database not found")
137
+
138
+ try:
139
+ await _migrate_single_db(db, target_version)
140
+
141
+ version_msg = f"version {target_version}" if target_version else "latest version"
142
+ return JSONResponse(
143
+ content={"message": f"Database migrated successfully to {version_msg}"}, status_code=200
144
+ )
145
+ except HTTPException:
146
+ raise
147
+ except Exception as e:
148
+ raise HTTPException(status_code=500, detail=f"Failed to migrate database: {str(e)}")
149
+
150
+ return router
@@ -20,6 +20,9 @@ class AgnoAPISettings(BaseSettings):
20
20
  # Authentication settings
21
21
  os_security_key: Optional[str] = Field(default=None, description="Bearer token for API authentication")
22
22
 
23
+ # Authorization flag - when True, JWT middleware handles auth and security key validation is skipped
24
+ authorization_enabled: bool = Field(default=False, description="Whether JWT authorization is enabled")
25
+
23
26
  # Cors origin list to allow requests from.
24
27
  # This list is set using the set_cors_origin_list validator
25
28
  cors_origin_list: Optional[List[str]] = Field(default=None, validate_default=True)
@@ -153,6 +153,7 @@ class RunEvent(str, Enum):
153
153
 
154
154
  tool_call_started = "ToolCallStarted"
155
155
  tool_call_completed = "ToolCallCompleted"
156
+ tool_call_error = "ToolCallError"
156
157
 
157
158
  reasoning_started = "ReasoningStarted"
158
159
  reasoning_step = "ReasoningStep"
@@ -405,6 +406,13 @@ class ToolCallCompletedEvent(BaseAgentRunEvent):
405
406
  audio: Optional[List[Audio]] = None # Audio produced by the tool call
406
407
 
407
408
 
409
+ @dataclass
410
+ class ToolCallErrorEvent(BaseAgentRunEvent):
411
+ event: str = RunEvent.tool_call_error.value
412
+ tool: Optional[ToolExecution] = None
413
+ error: Optional[str] = None
414
+
415
+
408
416
  @dataclass
409
417
  class ParserModelResponseStartedEvent(BaseAgentRunEvent):
410
418
  event: str = RunEvent.parser_model_response_started.value
@@ -459,6 +467,7 @@ RunOutputEvent = Union[
459
467
  SessionSummaryCompletedEvent,
460
468
  ToolCallStartedEvent,
461
469
  ToolCallCompletedEvent,
470
+ ToolCallErrorEvent,
462
471
  ParserModelResponseStartedEvent,
463
472
  ParserModelResponseCompletedEvent,
464
473
  OutputModelResponseStartedEvent,
@@ -492,6 +501,7 @@ RUN_EVENT_TYPE_REGISTRY = {
492
501
  RunEvent.session_summary_completed.value: SessionSummaryCompletedEvent,
493
502
  RunEvent.tool_call_started.value: ToolCallStartedEvent,
494
503
  RunEvent.tool_call_completed.value: ToolCallCompletedEvent,
504
+ RunEvent.tool_call_error.value: ToolCallErrorEvent,
495
505
  RunEvent.parser_model_response_started.value: ParserModelResponseStartedEvent,
496
506
  RunEvent.parser_model_response_completed.value: ParserModelResponseCompletedEvent,
497
507
  RunEvent.output_model_response_started.value: OutputModelResponseStartedEvent,
@@ -51,6 +51,7 @@ class BaseRunOutputEvent:
51
51
  "session_summary",
52
52
  "metrics",
53
53
  "run_input",
54
+ "requirements",
54
55
  ]
55
56
  }
56
57
 
@@ -138,6 +139,9 @@ class BaseRunOutputEvent:
138
139
  if hasattr(self, "run_input") and self.run_input is not None:
139
140
  _dict["run_input"] = self.run_input.to_dict()
140
141
 
142
+ if hasattr(self, "requirements") and self.requirements is not None:
143
+ _dict["requirements"] = [req.to_dict() if hasattr(req, "to_dict") else req for req in self.requirements]
144
+
141
145
  return _dict
142
146
 
143
147
  def to_json(self, separators=(", ", ": "), indent: Optional[int] = 2) -> str:
@@ -219,6 +223,21 @@ class BaseRunOutputEvent:
219
223
 
220
224
  data["run_input"] = RunInput.from_dict(run_input)
221
225
 
226
+ # Handle requirements
227
+
228
+ # Handle requirements
229
+ requirements_data = data.pop("requirements", None)
230
+ if requirements_data is not None:
231
+ from agno.run.requirement import RunRequirement
232
+
233
+ requirements_list: List[RunRequirement] = []
234
+ for item in requirements_data:
235
+ if isinstance(item, RunRequirement):
236
+ requirements_list.append(item)
237
+ elif isinstance(item, dict):
238
+ requirements_list.append(RunRequirement.from_dict(item))
239
+ data["requirements"] = requirements_list if requirements_list else None
240
+
222
241
  # Filter data to only include fields that are actually defined in the target class
223
242
  from dataclasses import fields
224
243
 
@@ -146,6 +146,7 @@ class TeamRunEvent(str, Enum):
146
146
 
147
147
  tool_call_started = "TeamToolCallStarted"
148
148
  tool_call_completed = "TeamToolCallCompleted"
149
+ tool_call_error = "TeamToolCallError"
149
150
 
150
151
  reasoning_started = "TeamReasoningStarted"
151
152
  reasoning_step = "TeamReasoningStep"
@@ -378,6 +379,13 @@ class ToolCallCompletedEvent(BaseTeamRunEvent):
378
379
  audio: Optional[List[Audio]] = None # Audio produced by the tool call
379
380
 
380
381
 
382
+ @dataclass
383
+ class ToolCallErrorEvent(BaseTeamRunEvent):
384
+ event: str = TeamRunEvent.tool_call_error.value
385
+ tool: Optional[ToolExecution] = None
386
+ error: Optional[str] = None
387
+
388
+
381
389
  @dataclass
382
390
  class ParserModelResponseStartedEvent(BaseTeamRunEvent):
383
391
  event: str = TeamRunEvent.parser_model_response_started.value
@@ -428,6 +436,7 @@ TeamRunOutputEvent = Union[
428
436
  SessionSummaryCompletedEvent,
429
437
  ToolCallStartedEvent,
430
438
  ToolCallCompletedEvent,
439
+ ToolCallErrorEvent,
431
440
  ParserModelResponseStartedEvent,
432
441
  ParserModelResponseCompletedEvent,
433
442
  OutputModelResponseStartedEvent,
@@ -458,6 +467,7 @@ TEAM_RUN_EVENT_TYPE_REGISTRY = {
458
467
  TeamRunEvent.session_summary_completed.value: SessionSummaryCompletedEvent,
459
468
  TeamRunEvent.tool_call_started.value: ToolCallStartedEvent,
460
469
  TeamRunEvent.tool_call_completed.value: ToolCallCompletedEvent,
470
+ TeamRunEvent.tool_call_error.value: ToolCallErrorEvent,
461
471
  TeamRunEvent.parser_model_response_started.value: ParserModelResponseStartedEvent,
462
472
  TeamRunEvent.parser_model_response_completed.value: ParserModelResponseCompletedEvent,
463
473
  TeamRunEvent.output_model_response_started.value: OutputModelResponseStartedEvent,
@@ -129,6 +129,7 @@ from agno.utils.events import (
129
129
  create_team_session_summary_completed_event,
130
130
  create_team_session_summary_started_event,
131
131
  create_team_tool_call_completed_event,
132
+ create_team_tool_call_error_event,
132
133
  create_team_tool_call_started_event,
133
134
  handle_event,
134
135
  )
@@ -3831,6 +3832,15 @@ class Team:
3831
3832
  events_to_skip=self.events_to_skip,
3832
3833
  store_events=self.store_events,
3833
3834
  )
3835
+ if tool_call.tool_call_error:
3836
+ yield handle_event( # type: ignore
3837
+ create_team_tool_call_error_event(
3838
+ from_run_response=run_response, tool=tool_call, error=str(tool_call.result)
3839
+ ),
3840
+ run_response,
3841
+ events_to_skip=self.events_to_skip,
3842
+ store_events=self.store_events,
3843
+ )
3834
3844
 
3835
3845
  if stream_events:
3836
3846
  if reasoning_step is not None: