agno 2.0.6__tar.gz → 2.0.7__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 (530) hide show
  1. {agno-2.0.6 → agno-2.0.7}/PKG-INFO +1 -1
  2. {agno-2.0.6 → agno-2.0.7}/agno/agent/agent.py +15 -1
  3. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/semantic.py +33 -6
  4. {agno-2.0.6 → agno-2.0.7}/agno/media.py +2 -0
  5. {agno-2.0.6 → agno-2.0.7}/agno/models/base.py +38 -9
  6. agno-2.0.7/agno/models/llama_cpp/__init__.py +5 -0
  7. agno-2.0.7/agno/models/llama_cpp/llama_cpp.py +22 -0
  8. {agno-2.0.6 → agno-2.0.7}/agno/models/nexus/__init__.py +1 -1
  9. {agno-2.0.6 → agno-2.0.7}/agno/models/nexus/nexus.py +2 -5
  10. {agno-2.0.6 → agno-2.0.7}/agno/os/app.py +4 -10
  11. {agno-2.0.6 → agno-2.0.7}/agno/os/router.py +3 -4
  12. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/evals/evals.py +1 -1
  13. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/memory/memory.py +1 -1
  14. {agno-2.0.6 → agno-2.0.7}/agno/os/schema.py +3 -4
  15. {agno-2.0.6 → agno-2.0.7}/agno/os/utils.py +47 -12
  16. {agno-2.0.6 → agno-2.0.7}/agno/run/agent.py +4 -0
  17. {agno-2.0.6 → agno-2.0.7}/agno/run/team.py +3 -1
  18. {agno-2.0.6 → agno-2.0.7}/agno/team/team.py +21 -11
  19. {agno-2.0.6 → agno-2.0.7}/agno/tools/decorator.py +4 -2
  20. {agno-2.0.6 → agno-2.0.7}/agno/tools/mcp.py +1 -1
  21. {agno-2.0.6 → agno-2.0.7}/agno/tools/memori.py +1 -53
  22. {agno-2.0.6 → agno-2.0.7}/agno/utils/events.py +7 -1
  23. {agno-2.0.6 → agno-2.0.7}/agno/workflow/workflow.py +28 -0
  24. {agno-2.0.6 → agno-2.0.7}/agno.egg-info/PKG-INFO +1 -1
  25. {agno-2.0.6 → agno-2.0.7}/agno.egg-info/SOURCES.txt +2 -0
  26. {agno-2.0.6 → agno-2.0.7}/pyproject.toml +1 -1
  27. {agno-2.0.6 → agno-2.0.7}/LICENSE +0 -0
  28. {agno-2.0.6 → agno-2.0.7}/README.md +0 -0
  29. {agno-2.0.6 → agno-2.0.7}/agno/__init__.py +0 -0
  30. {agno-2.0.6 → agno-2.0.7}/agno/agent/__init__.py +0 -0
  31. {agno-2.0.6 → agno-2.0.7}/agno/api/__init__.py +0 -0
  32. {agno-2.0.6 → agno-2.0.7}/agno/api/agent.py +0 -0
  33. {agno-2.0.6 → agno-2.0.7}/agno/api/api.py +0 -0
  34. {agno-2.0.6 → agno-2.0.7}/agno/api/evals.py +0 -0
  35. {agno-2.0.6 → agno-2.0.7}/agno/api/os.py +0 -0
  36. {agno-2.0.6 → agno-2.0.7}/agno/api/routes.py +0 -0
  37. {agno-2.0.6 → agno-2.0.7}/agno/api/schemas/__init__.py +0 -0
  38. {agno-2.0.6 → agno-2.0.7}/agno/api/schemas/agent.py +0 -0
  39. {agno-2.0.6 → agno-2.0.7}/agno/api/schemas/evals.py +0 -0
  40. {agno-2.0.6 → agno-2.0.7}/agno/api/schemas/os.py +0 -0
  41. {agno-2.0.6 → agno-2.0.7}/agno/api/schemas/response.py +0 -0
  42. {agno-2.0.6 → agno-2.0.7}/agno/api/schemas/team.py +0 -0
  43. {agno-2.0.6 → agno-2.0.7}/agno/api/schemas/utils.py +0 -0
  44. {agno-2.0.6 → agno-2.0.7}/agno/api/schemas/workflows.py +0 -0
  45. {agno-2.0.6 → agno-2.0.7}/agno/api/settings.py +0 -0
  46. {agno-2.0.6 → agno-2.0.7}/agno/api/team.py +0 -0
  47. {agno-2.0.6 → agno-2.0.7}/agno/api/workflow.py +0 -0
  48. {agno-2.0.6 → agno-2.0.7}/agno/cloud/aws/base.py +0 -0
  49. {agno-2.0.6 → agno-2.0.7}/agno/cloud/aws/s3/__init__.py +0 -0
  50. {agno-2.0.6 → agno-2.0.7}/agno/cloud/aws/s3/api_client.py +0 -0
  51. {agno-2.0.6 → agno-2.0.7}/agno/cloud/aws/s3/bucket.py +0 -0
  52. {agno-2.0.6 → agno-2.0.7}/agno/cloud/aws/s3/object.py +0 -0
  53. {agno-2.0.6 → agno-2.0.7}/agno/db/__init__.py +0 -0
  54. {agno-2.0.6 → agno-2.0.7}/agno/db/base.py +0 -0
  55. {agno-2.0.6 → agno-2.0.7}/agno/db/dynamo/__init__.py +0 -0
  56. {agno-2.0.6 → agno-2.0.7}/agno/db/dynamo/dynamo.py +0 -0
  57. {agno-2.0.6 → agno-2.0.7}/agno/db/dynamo/schemas.py +0 -0
  58. {agno-2.0.6 → agno-2.0.7}/agno/db/dynamo/utils.py +0 -0
  59. {agno-2.0.6 → agno-2.0.7}/agno/db/firestore/__init__.py +0 -0
  60. {agno-2.0.6 → agno-2.0.7}/agno/db/firestore/firestore.py +0 -0
  61. {agno-2.0.6 → agno-2.0.7}/agno/db/firestore/schemas.py +0 -0
  62. {agno-2.0.6 → agno-2.0.7}/agno/db/firestore/utils.py +0 -0
  63. {agno-2.0.6 → agno-2.0.7}/agno/db/gcs_json/__init__.py +0 -0
  64. {agno-2.0.6 → agno-2.0.7}/agno/db/gcs_json/gcs_json_db.py +0 -0
  65. {agno-2.0.6 → agno-2.0.7}/agno/db/gcs_json/utils.py +0 -0
  66. {agno-2.0.6 → agno-2.0.7}/agno/db/in_memory/__init__.py +0 -0
  67. {agno-2.0.6 → agno-2.0.7}/agno/db/in_memory/in_memory_db.py +0 -0
  68. {agno-2.0.6 → agno-2.0.7}/agno/db/in_memory/utils.py +0 -0
  69. {agno-2.0.6 → agno-2.0.7}/agno/db/json/__init__.py +0 -0
  70. {agno-2.0.6 → agno-2.0.7}/agno/db/json/json_db.py +0 -0
  71. {agno-2.0.6 → agno-2.0.7}/agno/db/json/utils.py +0 -0
  72. {agno-2.0.6 → agno-2.0.7}/agno/db/migrations/__init__.py +0 -0
  73. {agno-2.0.6 → agno-2.0.7}/agno/db/migrations/v1_to_v2.py +0 -0
  74. {agno-2.0.6 → agno-2.0.7}/agno/db/mongo/__init__.py +0 -0
  75. {agno-2.0.6 → agno-2.0.7}/agno/db/mongo/mongo.py +0 -0
  76. {agno-2.0.6 → agno-2.0.7}/agno/db/mongo/schemas.py +0 -0
  77. {agno-2.0.6 → agno-2.0.7}/agno/db/mongo/utils.py +0 -0
  78. {agno-2.0.6 → agno-2.0.7}/agno/db/mysql/__init__.py +0 -0
  79. {agno-2.0.6 → agno-2.0.7}/agno/db/mysql/mysql.py +0 -0
  80. {agno-2.0.6 → agno-2.0.7}/agno/db/mysql/schemas.py +0 -0
  81. {agno-2.0.6 → agno-2.0.7}/agno/db/mysql/utils.py +0 -0
  82. {agno-2.0.6 → agno-2.0.7}/agno/db/postgres/__init__.py +0 -0
  83. {agno-2.0.6 → agno-2.0.7}/agno/db/postgres/postgres.py +0 -0
  84. {agno-2.0.6 → agno-2.0.7}/agno/db/postgres/schemas.py +0 -0
  85. {agno-2.0.6 → agno-2.0.7}/agno/db/postgres/utils.py +0 -0
  86. {agno-2.0.6 → agno-2.0.7}/agno/db/redis/__init__.py +0 -0
  87. {agno-2.0.6 → agno-2.0.7}/agno/db/redis/redis.py +0 -0
  88. {agno-2.0.6 → agno-2.0.7}/agno/db/redis/schemas.py +0 -0
  89. {agno-2.0.6 → agno-2.0.7}/agno/db/redis/utils.py +0 -0
  90. {agno-2.0.6 → agno-2.0.7}/agno/db/schemas/__init__.py +0 -0
  91. {agno-2.0.6 → agno-2.0.7}/agno/db/schemas/evals.py +0 -0
  92. {agno-2.0.6 → agno-2.0.7}/agno/db/schemas/knowledge.py +0 -0
  93. {agno-2.0.6 → agno-2.0.7}/agno/db/schemas/memory.py +0 -0
  94. {agno-2.0.6 → agno-2.0.7}/agno/db/schemas/metrics.py +0 -0
  95. {agno-2.0.6 → agno-2.0.7}/agno/db/singlestore/__init__.py +0 -0
  96. {agno-2.0.6 → agno-2.0.7}/agno/db/singlestore/schemas.py +0 -0
  97. {agno-2.0.6 → agno-2.0.7}/agno/db/singlestore/singlestore.py +0 -0
  98. {agno-2.0.6 → agno-2.0.7}/agno/db/singlestore/utils.py +0 -0
  99. {agno-2.0.6 → agno-2.0.7}/agno/db/sqlite/__init__.py +0 -0
  100. {agno-2.0.6 → agno-2.0.7}/agno/db/sqlite/schemas.py +0 -0
  101. {agno-2.0.6 → agno-2.0.7}/agno/db/sqlite/sqlite.py +0 -0
  102. {agno-2.0.6 → agno-2.0.7}/agno/db/sqlite/utils.py +0 -0
  103. {agno-2.0.6 → agno-2.0.7}/agno/db/utils.py +0 -0
  104. {agno-2.0.6 → agno-2.0.7}/agno/debug.py +0 -0
  105. {agno-2.0.6 → agno-2.0.7}/agno/eval/__init__.py +0 -0
  106. {agno-2.0.6 → agno-2.0.7}/agno/eval/accuracy.py +0 -0
  107. {agno-2.0.6 → agno-2.0.7}/agno/eval/performance.py +0 -0
  108. {agno-2.0.6 → agno-2.0.7}/agno/eval/reliability.py +0 -0
  109. {agno-2.0.6 → agno-2.0.7}/agno/eval/utils.py +0 -0
  110. {agno-2.0.6 → agno-2.0.7}/agno/exceptions.py +0 -0
  111. {agno-2.0.6 → agno-2.0.7}/agno/integrations/__init__.py +0 -0
  112. {agno-2.0.6 → agno-2.0.7}/agno/integrations/discord/__init__.py +0 -0
  113. {agno-2.0.6 → agno-2.0.7}/agno/integrations/discord/client.py +0 -0
  114. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/__init__.py +0 -0
  115. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/__init__.py +0 -0
  116. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/agentic.py +0 -0
  117. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/document.py +0 -0
  118. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/fixed.py +0 -0
  119. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/markdown.py +0 -0
  120. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/recursive.py +0 -0
  121. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/row.py +0 -0
  122. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/chunking/strategy.py +0 -0
  123. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/content.py +0 -0
  124. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/document/__init__.py +0 -0
  125. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/document/base.py +0 -0
  126. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/__init__.py +0 -0
  127. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/aws_bedrock.py +0 -0
  128. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/azure_openai.py +0 -0
  129. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/base.py +0 -0
  130. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/cohere.py +0 -0
  131. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/fastembed.py +0 -0
  132. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/fireworks.py +0 -0
  133. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/google.py +0 -0
  134. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/huggingface.py +0 -0
  135. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/jina.py +0 -0
  136. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/langdb.py +0 -0
  137. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/mistral.py +0 -0
  138. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/nebius.py +0 -0
  139. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/ollama.py +0 -0
  140. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/openai.py +0 -0
  141. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/sentence_transformer.py +0 -0
  142. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/together.py +0 -0
  143. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/embedder/voyageai.py +0 -0
  144. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/knowledge.py +0 -0
  145. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/__init__.py +0 -0
  146. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/arxiv_reader.py +0 -0
  147. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/base.py +0 -0
  148. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/csv_reader.py +0 -0
  149. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/docx_reader.py +0 -0
  150. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/firecrawl_reader.py +0 -0
  151. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/json_reader.py +0 -0
  152. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/markdown_reader.py +0 -0
  153. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/pdf_reader.py +0 -0
  154. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/reader_factory.py +0 -0
  155. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/s3_reader.py +0 -0
  156. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/text_reader.py +0 -0
  157. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/web_search_reader.py +0 -0
  158. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/website_reader.py +0 -0
  159. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/wikipedia_reader.py +0 -0
  160. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reader/youtube_reader.py +0 -0
  161. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/remote_content/__init__.py +0 -0
  162. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/remote_content/remote_content.py +0 -0
  163. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reranker/__init__.py +0 -0
  164. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reranker/base.py +0 -0
  165. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reranker/cohere.py +0 -0
  166. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reranker/infinity.py +0 -0
  167. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  168. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/types.py +0 -0
  169. {agno-2.0.6 → agno-2.0.7}/agno/knowledge/utils.py +0 -0
  170. {agno-2.0.6 → agno-2.0.7}/agno/memory/__init__.py +0 -0
  171. {agno-2.0.6 → agno-2.0.7}/agno/memory/manager.py +0 -0
  172. {agno-2.0.6 → agno-2.0.7}/agno/models/__init__.py +0 -0
  173. {agno-2.0.6 → agno-2.0.7}/agno/models/aimlapi/__init__.py +0 -0
  174. {agno-2.0.6 → agno-2.0.7}/agno/models/aimlapi/aimlapi.py +0 -0
  175. {agno-2.0.6 → agno-2.0.7}/agno/models/anthropic/__init__.py +0 -0
  176. {agno-2.0.6 → agno-2.0.7}/agno/models/anthropic/claude.py +0 -0
  177. {agno-2.0.6 → agno-2.0.7}/agno/models/aws/__init__.py +0 -0
  178. {agno-2.0.6 → agno-2.0.7}/agno/models/aws/bedrock.py +0 -0
  179. {agno-2.0.6 → agno-2.0.7}/agno/models/aws/claude.py +0 -0
  180. {agno-2.0.6 → agno-2.0.7}/agno/models/azure/__init__.py +0 -0
  181. {agno-2.0.6 → agno-2.0.7}/agno/models/azure/ai_foundry.py +0 -0
  182. {agno-2.0.6 → agno-2.0.7}/agno/models/azure/openai_chat.py +0 -0
  183. {agno-2.0.6 → agno-2.0.7}/agno/models/cerebras/__init__.py +0 -0
  184. {agno-2.0.6 → agno-2.0.7}/agno/models/cerebras/cerebras.py +0 -0
  185. {agno-2.0.6 → agno-2.0.7}/agno/models/cerebras/cerebras_openai.py +0 -0
  186. {agno-2.0.6 → agno-2.0.7}/agno/models/cohere/__init__.py +0 -0
  187. {agno-2.0.6 → agno-2.0.7}/agno/models/cohere/chat.py +0 -0
  188. {agno-2.0.6 → agno-2.0.7}/agno/models/dashscope/__init__.py +0 -0
  189. {agno-2.0.6 → agno-2.0.7}/agno/models/dashscope/dashscope.py +0 -0
  190. {agno-2.0.6 → agno-2.0.7}/agno/models/deepinfra/__init__.py +0 -0
  191. {agno-2.0.6 → agno-2.0.7}/agno/models/deepinfra/deepinfra.py +0 -0
  192. {agno-2.0.6 → agno-2.0.7}/agno/models/deepseek/__init__.py +0 -0
  193. {agno-2.0.6 → agno-2.0.7}/agno/models/deepseek/deepseek.py +0 -0
  194. {agno-2.0.6 → agno-2.0.7}/agno/models/defaults.py +0 -0
  195. {agno-2.0.6 → agno-2.0.7}/agno/models/fireworks/__init__.py +0 -0
  196. {agno-2.0.6 → agno-2.0.7}/agno/models/fireworks/fireworks.py +0 -0
  197. {agno-2.0.6 → agno-2.0.7}/agno/models/google/__init__.py +0 -0
  198. {agno-2.0.6 → agno-2.0.7}/agno/models/google/gemini.py +0 -0
  199. {agno-2.0.6 → agno-2.0.7}/agno/models/groq/__init__.py +0 -0
  200. {agno-2.0.6 → agno-2.0.7}/agno/models/groq/groq.py +0 -0
  201. {agno-2.0.6 → agno-2.0.7}/agno/models/huggingface/__init__.py +0 -0
  202. {agno-2.0.6 → agno-2.0.7}/agno/models/huggingface/huggingface.py +0 -0
  203. {agno-2.0.6 → agno-2.0.7}/agno/models/ibm/__init__.py +0 -0
  204. {agno-2.0.6 → agno-2.0.7}/agno/models/ibm/watsonx.py +0 -0
  205. {agno-2.0.6 → agno-2.0.7}/agno/models/internlm/__init__.py +0 -0
  206. {agno-2.0.6 → agno-2.0.7}/agno/models/internlm/internlm.py +0 -0
  207. {agno-2.0.6 → agno-2.0.7}/agno/models/langdb/__init__.py +0 -0
  208. {agno-2.0.6 → agno-2.0.7}/agno/models/langdb/langdb.py +0 -0
  209. {agno-2.0.6 → agno-2.0.7}/agno/models/litellm/__init__.py +0 -0
  210. {agno-2.0.6 → agno-2.0.7}/agno/models/litellm/chat.py +0 -0
  211. {agno-2.0.6 → agno-2.0.7}/agno/models/litellm/litellm_openai.py +0 -0
  212. {agno-2.0.6 → agno-2.0.7}/agno/models/lmstudio/__init__.py +0 -0
  213. {agno-2.0.6 → agno-2.0.7}/agno/models/lmstudio/lmstudio.py +0 -0
  214. {agno-2.0.6 → agno-2.0.7}/agno/models/message.py +0 -0
  215. {agno-2.0.6 → agno-2.0.7}/agno/models/meta/__init__.py +0 -0
  216. {agno-2.0.6 → agno-2.0.7}/agno/models/meta/llama.py +0 -0
  217. {agno-2.0.6 → agno-2.0.7}/agno/models/meta/llama_openai.py +0 -0
  218. {agno-2.0.6 → agno-2.0.7}/agno/models/metrics.py +0 -0
  219. {agno-2.0.6 → agno-2.0.7}/agno/models/mistral/__init__.py +0 -0
  220. {agno-2.0.6 → agno-2.0.7}/agno/models/mistral/mistral.py +0 -0
  221. {agno-2.0.6 → agno-2.0.7}/agno/models/nebius/__init__.py +0 -0
  222. {agno-2.0.6 → agno-2.0.7}/agno/models/nebius/nebius.py +0 -0
  223. {agno-2.0.6 → agno-2.0.7}/agno/models/nvidia/__init__.py +0 -0
  224. {agno-2.0.6 → agno-2.0.7}/agno/models/nvidia/nvidia.py +0 -0
  225. {agno-2.0.6 → agno-2.0.7}/agno/models/ollama/__init__.py +0 -0
  226. {agno-2.0.6 → agno-2.0.7}/agno/models/ollama/chat.py +0 -0
  227. {agno-2.0.6 → agno-2.0.7}/agno/models/openai/__init__.py +0 -0
  228. {agno-2.0.6 → agno-2.0.7}/agno/models/openai/chat.py +0 -0
  229. {agno-2.0.6 → agno-2.0.7}/agno/models/openai/like.py +0 -0
  230. {agno-2.0.6 → agno-2.0.7}/agno/models/openai/responses.py +0 -0
  231. {agno-2.0.6 → agno-2.0.7}/agno/models/openrouter/__init__.py +0 -0
  232. {agno-2.0.6 → agno-2.0.7}/agno/models/openrouter/openrouter.py +0 -0
  233. {agno-2.0.6 → agno-2.0.7}/agno/models/perplexity/__init__.py +0 -0
  234. {agno-2.0.6 → agno-2.0.7}/agno/models/perplexity/perplexity.py +0 -0
  235. {agno-2.0.6 → agno-2.0.7}/agno/models/portkey/__init__.py +0 -0
  236. {agno-2.0.6 → agno-2.0.7}/agno/models/portkey/portkey.py +0 -0
  237. {agno-2.0.6 → agno-2.0.7}/agno/models/response.py +0 -0
  238. {agno-2.0.6 → agno-2.0.7}/agno/models/sambanova/__init__.py +0 -0
  239. {agno-2.0.6 → agno-2.0.7}/agno/models/sambanova/sambanova.py +0 -0
  240. {agno-2.0.6 → agno-2.0.7}/agno/models/siliconflow/__init__.py +0 -0
  241. {agno-2.0.6 → agno-2.0.7}/agno/models/siliconflow/siliconflow.py +0 -0
  242. {agno-2.0.6 → agno-2.0.7}/agno/models/together/__init__.py +0 -0
  243. {agno-2.0.6 → agno-2.0.7}/agno/models/together/together.py +0 -0
  244. {agno-2.0.6 → agno-2.0.7}/agno/models/utils.py +0 -0
  245. {agno-2.0.6 → agno-2.0.7}/agno/models/vercel/__init__.py +0 -0
  246. {agno-2.0.6 → agno-2.0.7}/agno/models/vercel/v0.py +0 -0
  247. {agno-2.0.6 → agno-2.0.7}/agno/models/vllm/__init__.py +0 -0
  248. {agno-2.0.6 → agno-2.0.7}/agno/models/vllm/vllm.py +0 -0
  249. {agno-2.0.6 → agno-2.0.7}/agno/models/xai/__init__.py +0 -0
  250. {agno-2.0.6 → agno-2.0.7}/agno/models/xai/xai.py +0 -0
  251. {agno-2.0.6 → agno-2.0.7}/agno/os/__init__.py +0 -0
  252. {agno-2.0.6 → agno-2.0.7}/agno/os/auth.py +0 -0
  253. {agno-2.0.6 → agno-2.0.7}/agno/os/config.py +0 -0
  254. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/__init__.py +0 -0
  255. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/agui/__init__.py +0 -0
  256. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/agui/agui.py +0 -0
  257. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/agui/router.py +0 -0
  258. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/agui/utils.py +0 -0
  259. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/base.py +0 -0
  260. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/slack/__init__.py +0 -0
  261. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/slack/router.py +0 -0
  262. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/slack/security.py +0 -0
  263. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/slack/slack.py +0 -0
  264. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  265. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/whatsapp/router.py +0 -0
  266. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/whatsapp/security.py +0 -0
  267. {agno-2.0.6 → agno-2.0.7}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
  268. {agno-2.0.6 → agno-2.0.7}/agno/os/mcp.py +0 -0
  269. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/__init__.py +0 -0
  270. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/evals/__init__.py +0 -0
  271. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/evals/schemas.py +0 -0
  272. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/evals/utils.py +0 -0
  273. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/health.py +0 -0
  274. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/home.py +0 -0
  275. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/knowledge/__init__.py +0 -0
  276. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/knowledge/knowledge.py +0 -0
  277. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/knowledge/schemas.py +0 -0
  278. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/memory/__init__.py +0 -0
  279. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/memory/schemas.py +0 -0
  280. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/metrics/__init__.py +0 -0
  281. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/metrics/metrics.py +0 -0
  282. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/metrics/schemas.py +0 -0
  283. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/session/__init__.py +0 -0
  284. {agno-2.0.6 → agno-2.0.7}/agno/os/routers/session/session.py +0 -0
  285. {agno-2.0.6 → agno-2.0.7}/agno/os/settings.py +0 -0
  286. {agno-2.0.6 → agno-2.0.7}/agno/py.typed +0 -0
  287. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/__init__.py +0 -0
  288. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/azure_ai_foundry.py +0 -0
  289. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/deepseek.py +0 -0
  290. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/default.py +0 -0
  291. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/groq.py +0 -0
  292. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/helpers.py +0 -0
  293. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/ollama.py +0 -0
  294. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/openai.py +0 -0
  295. {agno-2.0.6 → agno-2.0.7}/agno/reasoning/step.py +0 -0
  296. {agno-2.0.6 → agno-2.0.7}/agno/run/__init__.py +0 -0
  297. {agno-2.0.6 → agno-2.0.7}/agno/run/base.py +0 -0
  298. {agno-2.0.6 → agno-2.0.7}/agno/run/cancel.py +0 -0
  299. {agno-2.0.6 → agno-2.0.7}/agno/run/messages.py +0 -0
  300. {agno-2.0.6 → agno-2.0.7}/agno/run/workflow.py +0 -0
  301. {agno-2.0.6 → agno-2.0.7}/agno/session/__init__.py +0 -0
  302. {agno-2.0.6 → agno-2.0.7}/agno/session/agent.py +0 -0
  303. {agno-2.0.6 → agno-2.0.7}/agno/session/summary.py +0 -0
  304. {agno-2.0.6 → agno-2.0.7}/agno/session/team.py +0 -0
  305. {agno-2.0.6 → agno-2.0.7}/agno/session/workflow.py +0 -0
  306. {agno-2.0.6 → agno-2.0.7}/agno/team/__init__.py +0 -0
  307. {agno-2.0.6 → agno-2.0.7}/agno/tools/__init__.py +0 -0
  308. {agno-2.0.6 → agno-2.0.7}/agno/tools/agentql.py +0 -0
  309. {agno-2.0.6 → agno-2.0.7}/agno/tools/airflow.py +0 -0
  310. {agno-2.0.6 → agno-2.0.7}/agno/tools/api.py +0 -0
  311. {agno-2.0.6 → agno-2.0.7}/agno/tools/apify.py +0 -0
  312. {agno-2.0.6 → agno-2.0.7}/agno/tools/arxiv.py +0 -0
  313. {agno-2.0.6 → agno-2.0.7}/agno/tools/aws_lambda.py +0 -0
  314. {agno-2.0.6 → agno-2.0.7}/agno/tools/aws_ses.py +0 -0
  315. {agno-2.0.6 → agno-2.0.7}/agno/tools/baidusearch.py +0 -0
  316. {agno-2.0.6 → agno-2.0.7}/agno/tools/bitbucket.py +0 -0
  317. {agno-2.0.6 → agno-2.0.7}/agno/tools/brandfetch.py +0 -0
  318. {agno-2.0.6 → agno-2.0.7}/agno/tools/bravesearch.py +0 -0
  319. {agno-2.0.6 → agno-2.0.7}/agno/tools/brightdata.py +0 -0
  320. {agno-2.0.6 → agno-2.0.7}/agno/tools/browserbase.py +0 -0
  321. {agno-2.0.6 → agno-2.0.7}/agno/tools/calcom.py +0 -0
  322. {agno-2.0.6 → agno-2.0.7}/agno/tools/calculator.py +0 -0
  323. {agno-2.0.6 → agno-2.0.7}/agno/tools/cartesia.py +0 -0
  324. {agno-2.0.6 → agno-2.0.7}/agno/tools/clickup.py +0 -0
  325. {agno-2.0.6 → agno-2.0.7}/agno/tools/confluence.py +0 -0
  326. {agno-2.0.6 → agno-2.0.7}/agno/tools/crawl4ai.py +0 -0
  327. {agno-2.0.6 → agno-2.0.7}/agno/tools/csv_toolkit.py +0 -0
  328. {agno-2.0.6 → agno-2.0.7}/agno/tools/dalle.py +0 -0
  329. {agno-2.0.6 → agno-2.0.7}/agno/tools/daytona.py +0 -0
  330. {agno-2.0.6 → agno-2.0.7}/agno/tools/desi_vocal.py +0 -0
  331. {agno-2.0.6 → agno-2.0.7}/agno/tools/discord.py +0 -0
  332. {agno-2.0.6 → agno-2.0.7}/agno/tools/docker.py +0 -0
  333. {agno-2.0.6 → agno-2.0.7}/agno/tools/duckdb.py +0 -0
  334. {agno-2.0.6 → agno-2.0.7}/agno/tools/duckduckgo.py +0 -0
  335. {agno-2.0.6 → agno-2.0.7}/agno/tools/e2b.py +0 -0
  336. {agno-2.0.6 → agno-2.0.7}/agno/tools/eleven_labs.py +0 -0
  337. {agno-2.0.6 → agno-2.0.7}/agno/tools/email.py +0 -0
  338. {agno-2.0.6 → agno-2.0.7}/agno/tools/evm.py +0 -0
  339. {agno-2.0.6 → agno-2.0.7}/agno/tools/exa.py +0 -0
  340. {agno-2.0.6 → agno-2.0.7}/agno/tools/fal.py +0 -0
  341. {agno-2.0.6 → agno-2.0.7}/agno/tools/file.py +0 -0
  342. {agno-2.0.6 → agno-2.0.7}/agno/tools/file_generation.py +0 -0
  343. {agno-2.0.6 → agno-2.0.7}/agno/tools/financial_datasets.py +0 -0
  344. {agno-2.0.6 → agno-2.0.7}/agno/tools/firecrawl.py +0 -0
  345. {agno-2.0.6 → agno-2.0.7}/agno/tools/function.py +0 -0
  346. {agno-2.0.6 → agno-2.0.7}/agno/tools/giphy.py +0 -0
  347. {agno-2.0.6 → agno-2.0.7}/agno/tools/github.py +0 -0
  348. {agno-2.0.6 → agno-2.0.7}/agno/tools/gmail.py +0 -0
  349. {agno-2.0.6 → agno-2.0.7}/agno/tools/google_bigquery.py +0 -0
  350. {agno-2.0.6 → agno-2.0.7}/agno/tools/google_maps.py +0 -0
  351. {agno-2.0.6 → agno-2.0.7}/agno/tools/googlecalendar.py +0 -0
  352. {agno-2.0.6 → agno-2.0.7}/agno/tools/googlesearch.py +0 -0
  353. {agno-2.0.6 → agno-2.0.7}/agno/tools/googlesheets.py +0 -0
  354. {agno-2.0.6 → agno-2.0.7}/agno/tools/hackernews.py +0 -0
  355. {agno-2.0.6 → agno-2.0.7}/agno/tools/jina.py +0 -0
  356. {agno-2.0.6 → agno-2.0.7}/agno/tools/jira.py +0 -0
  357. {agno-2.0.6 → agno-2.0.7}/agno/tools/knowledge.py +0 -0
  358. {agno-2.0.6 → agno-2.0.7}/agno/tools/linear.py +0 -0
  359. {agno-2.0.6 → agno-2.0.7}/agno/tools/linkup.py +0 -0
  360. {agno-2.0.6 → agno-2.0.7}/agno/tools/local_file_system.py +0 -0
  361. {agno-2.0.6 → agno-2.0.7}/agno/tools/lumalab.py +0 -0
  362. {agno-2.0.6 → agno-2.0.7}/agno/tools/mem0.py +0 -0
  363. {agno-2.0.6 → agno-2.0.7}/agno/tools/memory.py +0 -0
  364. {agno-2.0.6 → agno-2.0.7}/agno/tools/mlx_transcribe.py +0 -0
  365. {agno-2.0.6 → agno-2.0.7}/agno/tools/models/__init__.py +0 -0
  366. {agno-2.0.6 → agno-2.0.7}/agno/tools/models/azure_openai.py +0 -0
  367. {agno-2.0.6 → agno-2.0.7}/agno/tools/models/gemini.py +0 -0
  368. {agno-2.0.6 → agno-2.0.7}/agno/tools/models/groq.py +0 -0
  369. {agno-2.0.6 → agno-2.0.7}/agno/tools/models/morph.py +0 -0
  370. {agno-2.0.6 → agno-2.0.7}/agno/tools/models/nebius.py +0 -0
  371. {agno-2.0.6 → agno-2.0.7}/agno/tools/models_labs.py +0 -0
  372. {agno-2.0.6 → agno-2.0.7}/agno/tools/moviepy_video.py +0 -0
  373. {agno-2.0.6 → agno-2.0.7}/agno/tools/neo4j.py +0 -0
  374. {agno-2.0.6 → agno-2.0.7}/agno/tools/newspaper.py +0 -0
  375. {agno-2.0.6 → agno-2.0.7}/agno/tools/newspaper4k.py +0 -0
  376. {agno-2.0.6 → agno-2.0.7}/agno/tools/openai.py +0 -0
  377. {agno-2.0.6 → agno-2.0.7}/agno/tools/openbb.py +0 -0
  378. {agno-2.0.6 → agno-2.0.7}/agno/tools/opencv.py +0 -0
  379. {agno-2.0.6 → agno-2.0.7}/agno/tools/openweather.py +0 -0
  380. {agno-2.0.6 → agno-2.0.7}/agno/tools/oxylabs.py +0 -0
  381. {agno-2.0.6 → agno-2.0.7}/agno/tools/pandas.py +0 -0
  382. {agno-2.0.6 → agno-2.0.7}/agno/tools/postgres.py +0 -0
  383. {agno-2.0.6 → agno-2.0.7}/agno/tools/pubmed.py +0 -0
  384. {agno-2.0.6 → agno-2.0.7}/agno/tools/python.py +0 -0
  385. {agno-2.0.6 → agno-2.0.7}/agno/tools/reasoning.py +0 -0
  386. {agno-2.0.6 → agno-2.0.7}/agno/tools/reddit.py +0 -0
  387. {agno-2.0.6 → agno-2.0.7}/agno/tools/replicate.py +0 -0
  388. {agno-2.0.6 → agno-2.0.7}/agno/tools/resend.py +0 -0
  389. {agno-2.0.6 → agno-2.0.7}/agno/tools/scrapegraph.py +0 -0
  390. {agno-2.0.6 → agno-2.0.7}/agno/tools/searxng.py +0 -0
  391. {agno-2.0.6 → agno-2.0.7}/agno/tools/serpapi.py +0 -0
  392. {agno-2.0.6 → agno-2.0.7}/agno/tools/serper.py +0 -0
  393. {agno-2.0.6 → agno-2.0.7}/agno/tools/shell.py +0 -0
  394. {agno-2.0.6 → agno-2.0.7}/agno/tools/slack.py +0 -0
  395. {agno-2.0.6 → agno-2.0.7}/agno/tools/sleep.py +0 -0
  396. {agno-2.0.6 → agno-2.0.7}/agno/tools/spider.py +0 -0
  397. {agno-2.0.6 → agno-2.0.7}/agno/tools/sql.py +0 -0
  398. {agno-2.0.6 → agno-2.0.7}/agno/tools/streamlit/__init__.py +0 -0
  399. {agno-2.0.6 → agno-2.0.7}/agno/tools/streamlit/components.py +0 -0
  400. {agno-2.0.6 → agno-2.0.7}/agno/tools/tavily.py +0 -0
  401. {agno-2.0.6 → agno-2.0.7}/agno/tools/telegram.py +0 -0
  402. {agno-2.0.6 → agno-2.0.7}/agno/tools/todoist.py +0 -0
  403. {agno-2.0.6 → agno-2.0.7}/agno/tools/tool_registry.py +0 -0
  404. {agno-2.0.6 → agno-2.0.7}/agno/tools/toolkit.py +0 -0
  405. {agno-2.0.6 → agno-2.0.7}/agno/tools/trafilatura.py +0 -0
  406. {agno-2.0.6 → agno-2.0.7}/agno/tools/trello.py +0 -0
  407. {agno-2.0.6 → agno-2.0.7}/agno/tools/twilio.py +0 -0
  408. {agno-2.0.6 → agno-2.0.7}/agno/tools/user_control_flow.py +0 -0
  409. {agno-2.0.6 → agno-2.0.7}/agno/tools/valyu.py +0 -0
  410. {agno-2.0.6 → agno-2.0.7}/agno/tools/visualization.py +0 -0
  411. {agno-2.0.6 → agno-2.0.7}/agno/tools/webbrowser.py +0 -0
  412. {agno-2.0.6 → agno-2.0.7}/agno/tools/webex.py +0 -0
  413. {agno-2.0.6 → agno-2.0.7}/agno/tools/website.py +0 -0
  414. {agno-2.0.6 → agno-2.0.7}/agno/tools/webtools.py +0 -0
  415. {agno-2.0.6 → agno-2.0.7}/agno/tools/whatsapp.py +0 -0
  416. {agno-2.0.6 → agno-2.0.7}/agno/tools/wikipedia.py +0 -0
  417. {agno-2.0.6 → agno-2.0.7}/agno/tools/workflow.py +0 -0
  418. {agno-2.0.6 → agno-2.0.7}/agno/tools/x.py +0 -0
  419. {agno-2.0.6 → agno-2.0.7}/agno/tools/yfinance.py +0 -0
  420. {agno-2.0.6 → agno-2.0.7}/agno/tools/youtube.py +0 -0
  421. {agno-2.0.6 → agno-2.0.7}/agno/tools/zendesk.py +0 -0
  422. {agno-2.0.6 → agno-2.0.7}/agno/tools/zep.py +0 -0
  423. {agno-2.0.6 → agno-2.0.7}/agno/tools/zoom.py +0 -0
  424. {agno-2.0.6 → agno-2.0.7}/agno/utils/__init__.py +0 -0
  425. {agno-2.0.6 → agno-2.0.7}/agno/utils/audio.py +0 -0
  426. {agno-2.0.6 → agno-2.0.7}/agno/utils/certs.py +0 -0
  427. {agno-2.0.6 → agno-2.0.7}/agno/utils/code_execution.py +0 -0
  428. {agno-2.0.6 → agno-2.0.7}/agno/utils/common.py +0 -0
  429. {agno-2.0.6 → agno-2.0.7}/agno/utils/dttm.py +0 -0
  430. {agno-2.0.6 → agno-2.0.7}/agno/utils/enum.py +0 -0
  431. {agno-2.0.6 → agno-2.0.7}/agno/utils/env.py +0 -0
  432. {agno-2.0.6 → agno-2.0.7}/agno/utils/format_str.py +0 -0
  433. {agno-2.0.6 → agno-2.0.7}/agno/utils/functions.py +0 -0
  434. {agno-2.0.6 → agno-2.0.7}/agno/utils/gemini.py +0 -0
  435. {agno-2.0.6 → agno-2.0.7}/agno/utils/http.py +0 -0
  436. {agno-2.0.6 → agno-2.0.7}/agno/utils/json_schema.py +0 -0
  437. {agno-2.0.6 → agno-2.0.7}/agno/utils/knowledge.py +0 -0
  438. {agno-2.0.6 → agno-2.0.7}/agno/utils/location.py +0 -0
  439. {agno-2.0.6 → agno-2.0.7}/agno/utils/log.py +0 -0
  440. {agno-2.0.6 → agno-2.0.7}/agno/utils/mcp.py +0 -0
  441. {agno-2.0.6 → agno-2.0.7}/agno/utils/media.py +0 -0
  442. {agno-2.0.6 → agno-2.0.7}/agno/utils/merge_dict.py +0 -0
  443. {agno-2.0.6 → agno-2.0.7}/agno/utils/message.py +0 -0
  444. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/__init__.py +0 -0
  445. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/ai_foundry.py +0 -0
  446. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/aws_claude.py +0 -0
  447. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/claude.py +0 -0
  448. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/cohere.py +0 -0
  449. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/llama.py +0 -0
  450. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/mistral.py +0 -0
  451. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/openai_responses.py +0 -0
  452. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/schema_utils.py +0 -0
  453. {agno-2.0.6 → agno-2.0.7}/agno/utils/models/watsonx.py +0 -0
  454. {agno-2.0.6 → agno-2.0.7}/agno/utils/openai.py +0 -0
  455. {agno-2.0.6 → agno-2.0.7}/agno/utils/pickle.py +0 -0
  456. {agno-2.0.6 → agno-2.0.7}/agno/utils/pprint.py +0 -0
  457. {agno-2.0.6 → agno-2.0.7}/agno/utils/print_response/__init__.py +0 -0
  458. {agno-2.0.6 → agno-2.0.7}/agno/utils/print_response/agent.py +0 -0
  459. {agno-2.0.6 → agno-2.0.7}/agno/utils/print_response/team.py +0 -0
  460. {agno-2.0.6 → agno-2.0.7}/agno/utils/print_response/workflow.py +0 -0
  461. {agno-2.0.6 → agno-2.0.7}/agno/utils/prompts.py +0 -0
  462. {agno-2.0.6 → agno-2.0.7}/agno/utils/reasoning.py +0 -0
  463. {agno-2.0.6 → agno-2.0.7}/agno/utils/response.py +0 -0
  464. {agno-2.0.6 → agno-2.0.7}/agno/utils/response_iterator.py +0 -0
  465. {agno-2.0.6 → agno-2.0.7}/agno/utils/safe_formatter.py +0 -0
  466. {agno-2.0.6 → agno-2.0.7}/agno/utils/shell.py +0 -0
  467. {agno-2.0.6 → agno-2.0.7}/agno/utils/streamlit.py +0 -0
  468. {agno-2.0.6 → agno-2.0.7}/agno/utils/string.py +0 -0
  469. {agno-2.0.6 → agno-2.0.7}/agno/utils/team.py +0 -0
  470. {agno-2.0.6 → agno-2.0.7}/agno/utils/timer.py +0 -0
  471. {agno-2.0.6 → agno-2.0.7}/agno/utils/tools.py +0 -0
  472. {agno-2.0.6 → agno-2.0.7}/agno/utils/web.py +0 -0
  473. {agno-2.0.6 → agno-2.0.7}/agno/utils/whatsapp.py +0 -0
  474. {agno-2.0.6 → agno-2.0.7}/agno/utils/yaml_io.py +0 -0
  475. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/__init__.py +0 -0
  476. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/base.py +0 -0
  477. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/cassandra/__init__.py +0 -0
  478. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/cassandra/cassandra.py +0 -0
  479. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  480. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/cassandra/index.py +0 -0
  481. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/chroma/__init__.py +0 -0
  482. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/chroma/chromadb.py +0 -0
  483. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/clickhouse/__init__.py +0 -0
  484. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  485. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/clickhouse/index.py +0 -0
  486. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/couchbase/__init__.py +0 -0
  487. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/couchbase/couchbase.py +0 -0
  488. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/distance.py +0 -0
  489. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/lancedb/__init__.py +0 -0
  490. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/lancedb/lance_db.py +0 -0
  491. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/langchaindb/__init__.py +0 -0
  492. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/langchaindb/langchaindb.py +0 -0
  493. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/lightrag/__init__.py +0 -0
  494. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/lightrag/lightrag.py +0 -0
  495. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/llamaindex/__init__.py +0 -0
  496. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
  497. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/milvus/__init__.py +0 -0
  498. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/milvus/milvus.py +0 -0
  499. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/mongodb/__init__.py +0 -0
  500. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/mongodb/mongodb.py +0 -0
  501. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/pgvector/__init__.py +0 -0
  502. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/pgvector/index.py +0 -0
  503. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/pgvector/pgvector.py +0 -0
  504. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/pineconedb/__init__.py +0 -0
  505. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  506. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/qdrant/__init__.py +0 -0
  507. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/qdrant/qdrant.py +0 -0
  508. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/search.py +0 -0
  509. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/singlestore/__init__.py +0 -0
  510. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/singlestore/index.py +0 -0
  511. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/singlestore/singlestore.py +0 -0
  512. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/surrealdb/__init__.py +0 -0
  513. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  514. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/upstashdb/__init__.py +0 -0
  515. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  516. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/weaviate/__init__.py +0 -0
  517. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/weaviate/index.py +0 -0
  518. {agno-2.0.6 → agno-2.0.7}/agno/vectordb/weaviate/weaviate.py +0 -0
  519. {agno-2.0.6 → agno-2.0.7}/agno/workflow/__init__.py +0 -0
  520. {agno-2.0.6 → agno-2.0.7}/agno/workflow/condition.py +0 -0
  521. {agno-2.0.6 → agno-2.0.7}/agno/workflow/loop.py +0 -0
  522. {agno-2.0.6 → agno-2.0.7}/agno/workflow/parallel.py +0 -0
  523. {agno-2.0.6 → agno-2.0.7}/agno/workflow/router.py +0 -0
  524. {agno-2.0.6 → agno-2.0.7}/agno/workflow/step.py +0 -0
  525. {agno-2.0.6 → agno-2.0.7}/agno/workflow/steps.py +0 -0
  526. {agno-2.0.6 → agno-2.0.7}/agno/workflow/types.py +0 -0
  527. {agno-2.0.6 → agno-2.0.7}/agno.egg-info/dependency_links.txt +0 -0
  528. {agno-2.0.6 → agno-2.0.7}/agno.egg-info/requires.txt +0 -0
  529. {agno-2.0.6 → agno-2.0.7}/agno.egg-info/top_level.txt +0 -0
  530. {agno-2.0.6 → agno-2.0.7}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.0.6
3
+ Version: 2.0.7
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
@@ -762,6 +762,7 @@ class Agent:
762
762
  tool_call_limit=self.tool_call_limit,
763
763
  response_format=response_format,
764
764
  run_response=run_response,
765
+ send_media_to_model=self.send_media_to_model,
765
766
  )
766
767
 
767
768
  # Check for cancellation after model call
@@ -1359,6 +1360,7 @@ class Agent:
1359
1360
  tool_choice=self.tool_choice,
1360
1361
  tool_call_limit=self.tool_call_limit,
1361
1362
  response_format=response_format,
1363
+ send_media_to_model=self.send_media_to_model,
1362
1364
  )
1363
1365
 
1364
1366
  # Check for cancellation after model call
@@ -3100,6 +3102,8 @@ class Agent:
3100
3102
  # Update the run_response citations with the model response citations
3101
3103
  if model_response.citations is not None:
3102
3104
  run_response.citations = model_response.citations
3105
+ if model_response.provider_data is not None:
3106
+ run_response.model_provider_data = model_response.provider_data
3103
3107
 
3104
3108
  # Update the run_response tools with the model response tool_executions
3105
3109
  if model_response.tool_executions is not None:
@@ -3174,6 +3178,7 @@ class Agent:
3174
3178
  tool_call_limit=self.tool_call_limit,
3175
3179
  stream_model_response=stream_model_response,
3176
3180
  run_response=run_response,
3181
+ send_media_to_model=self.send_media_to_model,
3177
3182
  ):
3178
3183
  yield from self._handle_model_response_chunk(
3179
3184
  session=session,
@@ -3250,6 +3255,7 @@ class Agent:
3250
3255
  tool_call_limit=self.tool_call_limit,
3251
3256
  stream_model_response=stream_model_response,
3252
3257
  run_response=run_response,
3258
+ send_media_to_model=self.send_media_to_model,
3253
3259
  ) # type: ignore
3254
3260
 
3255
3261
  async for model_response_event in model_response_stream: # type: ignore
@@ -3352,6 +3358,10 @@ class Agent:
3352
3358
  model_response.reasoning_content += model_response_event.redacted_reasoning_content
3353
3359
  run_response.reasoning_content = model_response.reasoning_content
3354
3360
 
3361
+ if model_response_event.provider_data is not None:
3362
+ # We get citations in one chunk
3363
+ run_response.model_provider_data = model_response.provider_data
3364
+
3355
3365
  if model_response_event.citations is not None:
3356
3366
  # We get citations in one chunk
3357
3367
  run_response.citations = model_response_event.citations
@@ -3372,6 +3382,7 @@ class Agent:
3372
3382
  or model_response_event.reasoning_content is not None
3373
3383
  or model_response_event.redacted_reasoning_content is not None
3374
3384
  or model_response_event.citations is not None
3385
+ or model_response_event.provider_data is not None
3375
3386
  ):
3376
3387
  yield self._handle_event(
3377
3388
  create_run_output_content_event(
@@ -3380,6 +3391,7 @@ class Agent:
3380
3391
  reasoning_content=model_response_event.reasoning_content,
3381
3392
  redacted_reasoning_content=model_response_event.redacted_reasoning_content,
3382
3393
  citations=model_response_event.citations,
3394
+ model_provider_data=model_response_event.provider_data,
3383
3395
  ),
3384
3396
  run_response,
3385
3397
  workflow_context=workflow_context,
@@ -3813,7 +3825,9 @@ class Agent:
3813
3825
  self._rebuild_tools = True
3814
3826
  if self.search_session_history:
3815
3827
  agent_tools.append(
3816
- self._get_previous_sessions_messages_function(num_history_sessions=self.num_history_sessions, user_id=user_id)
3828
+ self._get_previous_sessions_messages_function(
3829
+ num_history_sessions=self.num_history_sessions, user_id=user_id
3830
+ )
3817
3831
  )
3818
3832
  self._rebuild_tools = True
3819
3833
 
@@ -1,4 +1,5 @@
1
- from typing import List, Optional
1
+ import inspect
2
+ from typing import Any, Dict, List, Optional
2
3
 
3
4
  from agno.knowledge.chunking.strategy import ChunkingStrategy
4
5
  from agno.knowledge.document.base import Document
@@ -26,11 +27,37 @@ class SemanticChunking(ChunkingStrategy):
26
27
  "Please install it using `pip install chonkie` to use SemanticChunking."
27
28
  )
28
29
 
29
- self.chunker = SemanticChunker(
30
- embedding_model=self.embedder.id, # type: ignore
31
- chunk_size=self.chunk_size,
32
- threshold=self.similarity_threshold,
33
- )
30
+ # Build arguments dynamically based on chonkie's supported signature
31
+ params: Dict[str, Any] = {
32
+ "chunk_size": self.chunk_size,
33
+ "threshold": self.similarity_threshold,
34
+ }
35
+
36
+ try:
37
+ sig = inspect.signature(SemanticChunker)
38
+ param_names = set(sig.parameters.keys())
39
+
40
+ # Prefer passing a callable to avoid Chonkie initializing its own client
41
+ if "embedding_fn" in param_names:
42
+ params["embedding_fn"] = self.embedder.get_embedding # type: ignore[attr-defined]
43
+ # If chonkie allows specifying dimensions, provide them
44
+ if "embedding_dimensions" in param_names and getattr(self.embedder, "dimensions", None):
45
+ params["embedding_dimensions"] = self.embedder.dimensions # type: ignore[attr-defined]
46
+ elif "embedder" in param_names:
47
+ # Some versions may accept an embedder object directly
48
+ params["embedder"] = self.embedder
49
+ else:
50
+ # Fallback to model id
51
+ params["embedding_model"] = getattr(self.embedder, "id", None) or "text-embedding-3-small"
52
+
53
+ self.chunker = SemanticChunker(**params)
54
+ except Exception:
55
+ # As a final fallback, use the original behavior
56
+ self.chunker = SemanticChunker(
57
+ embedding_model=getattr(self.embedder, "id", None) or "text-embedding-3-small",
58
+ chunk_size=self.chunk_size,
59
+ threshold=self.similarity_threshold,
60
+ )
34
61
 
35
62
  def chunk(self, document: Document) -> List[Document]:
36
63
  """Split document into semantic chunks using chonkie"""
@@ -371,6 +371,8 @@ class File(BaseModel):
371
371
  "application/pdf",
372
372
  "application/json",
373
373
  "application/x-javascript",
374
+ "application/json",
375
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
374
376
  "text/javascript",
375
377
  "application/x-python",
376
378
  "text/x-python",
@@ -196,6 +196,7 @@ class Model(ABC):
196
196
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
197
197
  tool_call_limit: Optional[int] = None,
198
198
  run_response: Optional[RunOutput] = None,
199
+ send_media_to_model: bool = True,
199
200
  ) -> ModelResponse:
200
201
  """
201
202
  Generate a response from the model.
@@ -301,7 +302,11 @@ class Model(ABC):
301
302
 
302
303
  if any(msg.images or msg.videos or msg.audio or msg.files for msg in function_call_results):
303
304
  # Handle function call media
304
- self._handle_function_call_media(messages=messages, function_call_results=function_call_results)
305
+ self._handle_function_call_media(
306
+ messages=messages,
307
+ function_call_results=function_call_results,
308
+ send_media_to_model=send_media_to_model,
309
+ )
305
310
 
306
311
  for function_call_result in function_call_results:
307
312
  function_call_result.log(metrics=True)
@@ -339,6 +344,7 @@ class Model(ABC):
339
344
  functions: Optional[Dict[str, Function]] = None,
340
345
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
341
346
  tool_call_limit: Optional[int] = None,
347
+ send_media_to_model: bool = True,
342
348
  ) -> ModelResponse:
343
349
  """
344
350
  Generate an asynchronous response from the model.
@@ -441,7 +447,11 @@ class Model(ABC):
441
447
 
442
448
  if any(msg.images or msg.videos or msg.audio or msg.files for msg in function_call_results):
443
449
  # Handle function call media
444
- self._handle_function_call_media(messages=messages, function_call_results=function_call_results)
450
+ self._handle_function_call_media(
451
+ messages=messages,
452
+ function_call_results=function_call_results,
453
+ send_media_to_model=send_media_to_model,
454
+ )
445
455
 
446
456
  for function_call_result in function_call_results:
447
457
  function_call_result.log(metrics=True)
@@ -689,6 +699,7 @@ class Model(ABC):
689
699
  tool_call_limit: Optional[int] = None,
690
700
  stream_model_response: bool = True,
691
701
  run_response: Optional[RunOutput] = None,
702
+ send_media_to_model: bool = True,
692
703
  ) -> Iterator[Union[ModelResponse, RunOutputEvent, TeamRunOutputEvent]]:
693
704
  """
694
705
  Generate a streaming response from the model.
@@ -778,7 +789,11 @@ class Model(ABC):
778
789
 
779
790
  # Handle function call media
780
791
  if any(msg.images or msg.videos or msg.audio for msg in function_call_results):
781
- self._handle_function_call_media(messages=messages, function_call_results=function_call_results)
792
+ self._handle_function_call_media(
793
+ messages=messages,
794
+ function_call_results=function_call_results,
795
+ send_media_to_model=send_media_to_model,
796
+ )
782
797
 
783
798
  for function_call_result in function_call_results:
784
799
  function_call_result.log(metrics=True)
@@ -848,6 +863,7 @@ class Model(ABC):
848
863
  tool_call_limit: Optional[int] = None,
849
864
  stream_model_response: bool = True,
850
865
  run_response: Optional[RunOutput] = None,
866
+ send_media_to_model: bool = True,
851
867
  ) -> AsyncIterator[Union[ModelResponse, RunOutputEvent, TeamRunOutputEvent]]:
852
868
  """
853
869
  Generate an asynchronous streaming response from the model.
@@ -937,7 +953,11 @@ class Model(ABC):
937
953
 
938
954
  # Handle function call media
939
955
  if any(msg.images or msg.videos or msg.audio for msg in function_call_results):
940
- self._handle_function_call_media(messages=messages, function_call_results=function_call_results)
956
+ self._handle_function_call_media(
957
+ messages=messages,
958
+ function_call_results=function_call_results,
959
+ send_media_to_model=send_media_to_model,
960
+ )
941
961
 
942
962
  for function_call_result in function_call_results:
943
963
  function_call_result.log(metrics=True)
@@ -1041,7 +1061,13 @@ class Model(ABC):
1041
1061
  if model_response_delta.extra is not None:
1042
1062
  if stream_data.extra is None:
1043
1063
  stream_data.extra = {}
1044
- stream_data.extra.update(model_response_delta.extra)
1064
+ for key in model_response_delta.extra:
1065
+ if isinstance(model_response_delta.extra[key], list):
1066
+ if not stream_data.extra.get(key):
1067
+ stream_data.extra[key] = []
1068
+ stream_data.extra[key].extend(model_response_delta.extra[key])
1069
+ else:
1070
+ stream_data.extra[key] = model_response_delta.extra[key]
1045
1071
 
1046
1072
  if should_yield:
1047
1073
  yield model_response_delta
@@ -1708,7 +1734,9 @@ class Model(ABC):
1708
1734
  if len(function_call_results) > 0:
1709
1735
  messages.extend(function_call_results)
1710
1736
 
1711
- def _handle_function_call_media(self, messages: List[Message], function_call_results: List[Message]) -> None:
1737
+ def _handle_function_call_media(
1738
+ self, messages: List[Message], function_call_results: List[Message], send_media_to_model: bool = True
1739
+ ) -> None:
1712
1740
  """
1713
1741
  Handle media artifacts from function calls by adding follow-up user messages for generated media if needed.
1714
1742
  """
@@ -1739,9 +1767,10 @@ class Model(ABC):
1739
1767
  all_files.extend(result_message.files)
1740
1768
  result_message.files = None
1741
1769
 
1742
- # If we have media artifacts, add a follow-up "user" message instead of a "tool"
1743
- # message with the media artifacts which throws error for some models
1744
- if all_images or all_videos or all_audio or all_files:
1770
+ # Only add media message if we should send media to model
1771
+ if send_media_to_model and (all_images or all_videos or all_audio or all_files):
1772
+ # If we have media artifacts, add a follow-up "user" message instead of a "tool"
1773
+ # message with the media artifacts which throws error for some models
1745
1774
  media_message = Message(
1746
1775
  role="user",
1747
1776
  content="Take note of the following content",
@@ -0,0 +1,5 @@
1
+ from agno.models.llama_cpp.llama_cpp import LlamaCpp
2
+
3
+ __all__ = [
4
+ "LlamaCpp",
5
+ ]
@@ -0,0 +1,22 @@
1
+ from dataclasses import dataclass
2
+
3
+ from agno.models.openai.like import OpenAILike
4
+
5
+
6
+ @dataclass
7
+ class LlamaCpp(OpenAILike):
8
+ """
9
+ A class for interacting with LLMs using Llama CPP.
10
+
11
+ Attributes:
12
+ id (str): The id of the Llama CPP model. Default is "ggml-org/gpt-oss-20b-GGUF".
13
+ name (str): The name of this chat model instance. Default is "LlamaCpp".
14
+ provider (str): The provider of the model. Default is "LlamaCpp".
15
+ base_url (str): The base url to which the requests are sent.
16
+ """
17
+
18
+ id: str = "ggml-org/gpt-oss-20b-GGUF"
19
+ name: str = "LlamaCpp"
20
+ provider: str = "LlamaCpp"
21
+
22
+ base_url: str = "http://127.0.0.1:8080/v1"
@@ -1,3 +1,3 @@
1
1
  from agno.models.nexus.nexus import Nexus
2
2
 
3
- __all__ = ["Nexus"]
3
+ __all__ = ["Nexus"]
@@ -6,13 +6,12 @@ from agno.models.openai.like import OpenAILike
6
6
  @dataclass
7
7
  class Nexus(OpenAILike):
8
8
  """
9
- A class for interacting with Nvidia models.
9
+ A class for interacting with LLMs using Nexus.
10
10
 
11
11
  Attributes:
12
- id (str): The id of the Nexus model to use. Default is "nvidia/llama-3.1-nemotron-70b-instruct".
12
+ id (str): The id of the Nexus model to use. Default is "openai/gpt-4".
13
13
  name (str): The name of this chat model instance. Default is "Nexus"
14
14
  provider (str): The provider of the model. Default is "Nexus".
15
- api_key (str): The api key to authorize request to Nexus.
16
15
  base_url (str): The base url to which the requests are sent.
17
16
  """
18
17
 
@@ -21,5 +20,3 @@ class Nexus(OpenAILike):
21
20
  provider: str = "Nexus"
22
21
 
23
22
  base_url: str = "http://localhost:8000/llm/v1/"
24
-
25
- supports_native_structured_outputs: bool = False
@@ -9,7 +9,6 @@ from fastapi.responses import JSONResponse
9
9
  from fastapi.routing import APIRoute
10
10
  from rich import box
11
11
  from rich.panel import Panel
12
- from starlette.middleware.cors import CORSMiddleware
13
12
  from starlette.requests import Request
14
13
 
15
14
  from agno.agent.agent import Agent
@@ -37,6 +36,7 @@ from agno.os.routers.memory import get_memory_router
37
36
  from agno.os.routers.metrics import get_metrics_router
38
37
  from agno.os.routers.session import get_session_router
39
38
  from agno.os.settings import AgnoAPISettings
39
+ from agno.os.utils import update_cors_middleware
40
40
  from agno.team.team import Team
41
41
  from agno.utils.log import logger
42
42
  from agno.utils.string import generate_id, generate_id_from_name
@@ -286,14 +286,8 @@ class AgentOS:
286
286
 
287
287
  self.fastapi_app.middleware("http")(general_exception_handler)
288
288
 
289
- self.fastapi_app.add_middleware(
290
- CORSMiddleware,
291
- allow_origins=self.settings.cors_origin_list, # type: ignore
292
- allow_credentials=True,
293
- allow_methods=["*"],
294
- allow_headers=["*"],
295
- expose_headers=["*"],
296
- )
289
+ # Update CORS middleware
290
+ update_cors_middleware(self.fastapi_app, self.settings.cors_origin_list) # type: ignore
297
291
 
298
292
  return self.fastapi_app
299
293
 
@@ -368,7 +362,7 @@ class AgentOS:
368
362
  for route in self.fastapi_app.routes:
369
363
  for conflict in conflicts:
370
364
  if isinstance(route, APIRoute):
371
- if route.path == conflict["path"] and list(route.methods) == list(conflict["methods"]):
365
+ if route.path == conflict["path"] and list(route.methods) == list(conflict["methods"]): # type: ignore
372
366
  self.fastapi_app.routes.pop(self.fastapi_app.routes.index(route))
373
367
 
374
368
  self.fastapi_app.include_router(router)
@@ -731,10 +731,9 @@ def get_base_router(
731
731
  ]:
732
732
  # Process document files
733
733
  try:
734
- file_content = await file.read()
735
- input_files.append(
736
- FileMedia(content=file_content, filename=file.filename, mime_type=file.content_type)
737
- )
734
+ input_file = process_document(file)
735
+ if input_file is not None:
736
+ input_files.append(input_file)
738
737
  except Exception as e:
739
738
  log_error(f"Error processing file {file.filename}: {e}")
740
739
  continue
@@ -380,7 +380,7 @@ def parse_eval_types_filter(
380
380
  eval_types: Optional[str] = Query(
381
381
  default=None,
382
382
  description="Comma-separated eval types (accuracy,performance,reliability)",
383
- example="accuracy,performance",
383
+ examples=["accuracy,performance"],
384
384
  ),
385
385
  ) -> Optional[List[EvalType]]:
386
386
  """Parse comma-separated eval types into EvalType enums for filtering evaluation runs."""
@@ -396,7 +396,7 @@ def parse_topics(
396
396
  topics: Optional[List[str]] = Query(
397
397
  default=None,
398
398
  description="Comma-separated list of topics to filter by",
399
- example=["preferences,technical,communication_style"],
399
+ examples=["preferences,technical,communication_style"],
400
400
  ),
401
401
  ) -> Optional[List[str]]:
402
402
  """Parse comma-separated topics into a list for filtering memories by topic."""
@@ -461,11 +461,8 @@ class TeamResponse(BaseModel):
461
461
  "stream_member_events": False,
462
462
  }
463
463
 
464
- if team.model is None:
465
- raise ValueError("Team model is required")
466
-
467
464
  team.determine_tools_for_model(
468
- model=team.model,
465
+ model=team.model, # type: ignore
469
466
  session=TeamSession(session_id=str(uuid4()), session_data={}),
470
467
  run_response=TeamRunOutput(run_id=str(uuid4())),
471
468
  async_mode=True,
@@ -763,6 +760,7 @@ class TeamSessionDetailSchema(BaseModel):
763
760
  session_state: Optional[dict]
764
761
  metrics: Optional[dict]
765
762
  team_data: Optional[dict]
763
+ chat_history: Optional[List[dict]]
766
764
  created_at: Optional[datetime]
767
765
  updated_at: Optional[datetime]
768
766
  total_tokens: Optional[int]
@@ -784,6 +782,7 @@ class TeamSessionDetailSchema(BaseModel):
784
782
  if session.session_data
785
783
  else None,
786
784
  metrics=session.session_data.get("session_metrics", {}) if session.session_data else None,
785
+ chat_history=[message.to_dict() for message in session.get_chat_history()],
787
786
  created_at=datetime.fromtimestamp(session.created_at, tz=timezone.utc) if session.created_at else None,
788
787
  updated_at=datetime.fromtimestamp(session.updated_at, tz=timezone.utc) if session.updated_at else None,
789
788
  )
@@ -1,6 +1,7 @@
1
1
  from typing import Any, Callable, Dict, List, Optional, Union
2
2
 
3
- from fastapi import HTTPException, UploadFile
3
+ from fastapi import FastAPI, HTTPException, UploadFile
4
+ from starlette.middleware.cors import CORSMiddleware
4
5
 
5
6
  from agno.agent.agent import Agent
6
7
  from agno.db.base import BaseDb
@@ -109,27 +110,21 @@ def process_image(file: UploadFile) -> Image:
109
110
  content = file.file.read()
110
111
  if not content:
111
112
  raise HTTPException(status_code=400, detail="Empty file")
112
- return Image(content=content)
113
+ return Image(content=content, format=extract_format(file), mime_type=file.content_type)
113
114
 
114
115
 
115
116
  def process_audio(file: UploadFile) -> Audio:
116
117
  content = file.file.read()
117
118
  if not content:
118
119
  raise HTTPException(status_code=400, detail="Empty file")
119
- format = None
120
- if file.filename and "." in file.filename:
121
- format = file.filename.split(".")[-1].lower()
122
- elif file.content_type:
123
- format = file.content_type.split("/")[-1]
124
-
125
- return Audio(content=content, format=format)
120
+ return Audio(content=content, format=extract_format(file), mime_type=file.content_type)
126
121
 
127
122
 
128
123
  def process_video(file: UploadFile) -> Video:
129
124
  content = file.file.read()
130
125
  if not content:
131
126
  raise HTTPException(status_code=400, detail="Empty file")
132
- return Video(content=content, format=file.content_type)
127
+ return Video(content=content, format=extract_format(file), mime_type=file.content_type)
133
128
 
134
129
 
135
130
  def process_document(file: UploadFile) -> Optional[FileMedia]:
@@ -137,13 +132,23 @@ def process_document(file: UploadFile) -> Optional[FileMedia]:
137
132
  content = file.file.read()
138
133
  if not content:
139
134
  raise HTTPException(status_code=400, detail="Empty file")
140
-
141
- return FileMedia(content=content, filename=file.filename, mime_type=file.content_type)
135
+ return FileMedia(
136
+ content=content, filename=file.filename, format=extract_format(file), mime_type=file.content_type
137
+ )
142
138
  except Exception as e:
143
139
  logger.error(f"Error processing document {file.filename}: {e}")
144
140
  return None
145
141
 
146
142
 
143
+ def extract_format(file: UploadFile):
144
+ format = None
145
+ if file.filename and "." in file.filename:
146
+ format = file.filename.split(".")[-1].lower()
147
+ elif file.content_type:
148
+ format = file.content_type.split("/")[-1]
149
+ return format
150
+
151
+
147
152
  def format_tools(agent_tools: List[Union[Dict[str, Any], Toolkit, Function, Callable]]):
148
153
  formatted_tools = []
149
154
  if agent_tools is not None:
@@ -260,3 +265,33 @@ def _generate_schema_from_params(params: Dict[str, Any]) -> Dict[str, Any]:
260
265
  schema["required"] = required
261
266
 
262
267
  return schema
268
+
269
+
270
+ def update_cors_middleware(app: FastAPI, new_origins: list):
271
+ existing_origins: List[str] = []
272
+
273
+ # TODO: Allow more options where CORS is properly merged and user can disable this behaviour
274
+
275
+ # Extract existing origins from current CORS middleware
276
+ for middleware in app.user_middleware:
277
+ if middleware.cls == CORSMiddleware:
278
+ if hasattr(middleware, "kwargs"):
279
+ existing_origins = middleware.kwargs.get("allow_origins", [])
280
+ break
281
+ # Merge origins
282
+ merged_origins = list(set(new_origins + existing_origins))
283
+ final_origins = [origin for origin in merged_origins if origin != "*"]
284
+
285
+ # Remove existing CORS
286
+ app.user_middleware = [m for m in app.user_middleware if m.cls != CORSMiddleware]
287
+ app.middleware_stack = None
288
+
289
+ # Add updated CORS
290
+ app.add_middleware(
291
+ CORSMiddleware,
292
+ allow_origins=final_origins,
293
+ allow_credentials=True,
294
+ allow_methods=["*"],
295
+ allow_headers=["*"],
296
+ expose_headers=["*"],
297
+ )
@@ -96,6 +96,7 @@ class RunContentEvent(BaseAgentRunEvent):
96
96
  content: Optional[Any] = None
97
97
  content_type: str = "str"
98
98
  reasoning_content: Optional[str] = None
99
+ model_provider_data: Optional[Dict[str, Any]] = None
99
100
  citations: Optional[Citations] = None
100
101
  response_audio: Optional[Audio] = None # Model audio response
101
102
  image: Optional[Image] = None # Image attached to the response
@@ -119,6 +120,7 @@ class RunCompletedEvent(BaseAgentRunEvent):
119
120
  content_type: str = "str"
120
121
  reasoning_content: Optional[str] = None
121
122
  citations: Optional[Citations] = None
123
+ model_provider_data: Optional[Dict[str, Any]] = None
122
124
  images: Optional[List[Image]] = None # Images attached to the response
123
125
  videos: Optional[List[Video]] = None # Videos attached to the response
124
126
  audio: Optional[List[Audio]] = None # Audio attached to the response
@@ -383,6 +385,8 @@ class RunOutput:
383
385
  reasoning_steps: Optional[List[ReasoningStep]] = None
384
386
  reasoning_messages: Optional[List[Message]] = None
385
387
 
388
+ model_provider_data: Optional[Dict[str, Any]] = None
389
+
386
390
  model: Optional[str] = None
387
391
  model_provider: Optional[str] = None
388
392
  messages: Optional[List[Message]] = None
@@ -98,6 +98,7 @@ class RunContentEvent(BaseTeamRunEvent):
98
98
  content: Optional[Any] = None
99
99
  content_type: str = "str"
100
100
  reasoning_content: Optional[str] = None
101
+ model_provider_data: Optional[Dict[str, Any]] = None
101
102
  citations: Optional[Citations] = None
102
103
  response_audio: Optional[Audio] = None # Model audio response
103
104
  image: Optional[Image] = None # Image attached to the response
@@ -121,6 +122,7 @@ class RunCompletedEvent(BaseTeamRunEvent):
121
122
  content_type: str = "str"
122
123
  reasoning_content: Optional[str] = None
123
124
  citations: Optional[Citations] = None
125
+ model_provider_data: Optional[Dict[str, Any]] = None
124
126
  images: Optional[List[Image]] = None # Images attached to the response
125
127
  videos: Optional[List[Video]] = None # Videos attached to the response
126
128
  audio: Optional[List[Audio]] = None # Audio attached to the response
@@ -382,7 +384,7 @@ class TeamRunOutput:
382
384
  reasoning_content: Optional[str] = None
383
385
 
384
386
  citations: Optional[Citations] = None
385
-
387
+ model_provider_data: Optional[Dict[str, Any]] = None
386
388
  metadata: Optional[Dict[str, Any]] = None
387
389
 
388
390
  references: Optional[List[MessageReferences]] = None