agno 2.0.7__tar.gz → 2.0.8__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 (532) hide show
  1. {agno-2.0.7 → agno-2.0.8}/PKG-INFO +1 -1
  2. {agno-2.0.7 → agno-2.0.8}/agno/agent/agent.py +81 -49
  3. {agno-2.0.7 → agno-2.0.8}/agno/db/migrations/v1_to_v2.py +140 -11
  4. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/sentence_transformer.py +3 -3
  5. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/knowledge.py +152 -31
  6. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/types.py +8 -0
  7. agno-2.0.8/agno/models/cometapi/__init__.py +5 -0
  8. agno-2.0.8/agno/models/cometapi/cometapi.py +57 -0
  9. {agno-2.0.7 → agno-2.0.8}/agno/models/google/gemini.py +4 -8
  10. {agno-2.0.7 → agno-2.0.8}/agno/models/ollama/chat.py +24 -1
  11. {agno-2.0.7 → agno-2.0.8}/agno/models/openai/chat.py +2 -7
  12. {agno-2.0.7 → agno-2.0.8}/agno/models/openai/responses.py +21 -17
  13. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/agui/agui.py +2 -2
  14. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/agui/utils.py +81 -18
  15. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/slack/slack.py +2 -2
  16. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/whatsapp/whatsapp.py +2 -2
  17. {agno-2.0.7 → agno-2.0.8}/agno/os/utils.py +8 -0
  18. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/default.py +3 -1
  19. {agno-2.0.7 → agno-2.0.8}/agno/session/agent.py +8 -5
  20. {agno-2.0.7 → agno-2.0.8}/agno/session/team.py +14 -10
  21. {agno-2.0.7 → agno-2.0.8}/agno/team/team.py +218 -104
  22. {agno-2.0.7 → agno-2.0.8}/agno/tools/function.py +43 -4
  23. {agno-2.0.7 → agno-2.0.8}/agno/tools/mcp.py +60 -37
  24. {agno-2.0.7 → agno-2.0.8}/agno/utils/gemini.py +147 -19
  25. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/claude.py +9 -0
  26. {agno-2.0.7 → agno-2.0.8}/agno/utils/print_response/agent.py +16 -0
  27. {agno-2.0.7 → agno-2.0.8}/agno/utils/print_response/team.py +16 -0
  28. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/base.py +2 -2
  29. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/langchaindb/langchaindb.py +5 -7
  30. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/llamaindex/llamaindexdb.py +25 -6
  31. {agno-2.0.7 → agno-2.0.8}/agno/workflow/workflow.py +31 -15
  32. {agno-2.0.7 → agno-2.0.8}/agno.egg-info/PKG-INFO +1 -1
  33. {agno-2.0.7 → agno-2.0.8}/agno.egg-info/SOURCES.txt +2 -0
  34. {agno-2.0.7 → agno-2.0.8}/pyproject.toml +1 -1
  35. {agno-2.0.7 → agno-2.0.8}/LICENSE +0 -0
  36. {agno-2.0.7 → agno-2.0.8}/README.md +0 -0
  37. {agno-2.0.7 → agno-2.0.8}/agno/__init__.py +0 -0
  38. {agno-2.0.7 → agno-2.0.8}/agno/agent/__init__.py +0 -0
  39. {agno-2.0.7 → agno-2.0.8}/agno/api/__init__.py +0 -0
  40. {agno-2.0.7 → agno-2.0.8}/agno/api/agent.py +0 -0
  41. {agno-2.0.7 → agno-2.0.8}/agno/api/api.py +0 -0
  42. {agno-2.0.7 → agno-2.0.8}/agno/api/evals.py +0 -0
  43. {agno-2.0.7 → agno-2.0.8}/agno/api/os.py +0 -0
  44. {agno-2.0.7 → agno-2.0.8}/agno/api/routes.py +0 -0
  45. {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/__init__.py +0 -0
  46. {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/agent.py +0 -0
  47. {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/evals.py +0 -0
  48. {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/os.py +0 -0
  49. {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/response.py +0 -0
  50. {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/team.py +0 -0
  51. {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/utils.py +0 -0
  52. {agno-2.0.7 → agno-2.0.8}/agno/api/schemas/workflows.py +0 -0
  53. {agno-2.0.7 → agno-2.0.8}/agno/api/settings.py +0 -0
  54. {agno-2.0.7 → agno-2.0.8}/agno/api/team.py +0 -0
  55. {agno-2.0.7 → agno-2.0.8}/agno/api/workflow.py +0 -0
  56. {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/base.py +0 -0
  57. {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/s3/__init__.py +0 -0
  58. {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/s3/api_client.py +0 -0
  59. {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/s3/bucket.py +0 -0
  60. {agno-2.0.7 → agno-2.0.8}/agno/cloud/aws/s3/object.py +0 -0
  61. {agno-2.0.7 → agno-2.0.8}/agno/db/__init__.py +0 -0
  62. {agno-2.0.7 → agno-2.0.8}/agno/db/base.py +0 -0
  63. {agno-2.0.7 → agno-2.0.8}/agno/db/dynamo/__init__.py +0 -0
  64. {agno-2.0.7 → agno-2.0.8}/agno/db/dynamo/dynamo.py +0 -0
  65. {agno-2.0.7 → agno-2.0.8}/agno/db/dynamo/schemas.py +0 -0
  66. {agno-2.0.7 → agno-2.0.8}/agno/db/dynamo/utils.py +0 -0
  67. {agno-2.0.7 → agno-2.0.8}/agno/db/firestore/__init__.py +0 -0
  68. {agno-2.0.7 → agno-2.0.8}/agno/db/firestore/firestore.py +0 -0
  69. {agno-2.0.7 → agno-2.0.8}/agno/db/firestore/schemas.py +0 -0
  70. {agno-2.0.7 → agno-2.0.8}/agno/db/firestore/utils.py +0 -0
  71. {agno-2.0.7 → agno-2.0.8}/agno/db/gcs_json/__init__.py +0 -0
  72. {agno-2.0.7 → agno-2.0.8}/agno/db/gcs_json/gcs_json_db.py +0 -0
  73. {agno-2.0.7 → agno-2.0.8}/agno/db/gcs_json/utils.py +0 -0
  74. {agno-2.0.7 → agno-2.0.8}/agno/db/in_memory/__init__.py +0 -0
  75. {agno-2.0.7 → agno-2.0.8}/agno/db/in_memory/in_memory_db.py +0 -0
  76. {agno-2.0.7 → agno-2.0.8}/agno/db/in_memory/utils.py +0 -0
  77. {agno-2.0.7 → agno-2.0.8}/agno/db/json/__init__.py +0 -0
  78. {agno-2.0.7 → agno-2.0.8}/agno/db/json/json_db.py +0 -0
  79. {agno-2.0.7 → agno-2.0.8}/agno/db/json/utils.py +0 -0
  80. {agno-2.0.7 → agno-2.0.8}/agno/db/migrations/__init__.py +0 -0
  81. {agno-2.0.7 → agno-2.0.8}/agno/db/mongo/__init__.py +0 -0
  82. {agno-2.0.7 → agno-2.0.8}/agno/db/mongo/mongo.py +0 -0
  83. {agno-2.0.7 → agno-2.0.8}/agno/db/mongo/schemas.py +0 -0
  84. {agno-2.0.7 → agno-2.0.8}/agno/db/mongo/utils.py +0 -0
  85. {agno-2.0.7 → agno-2.0.8}/agno/db/mysql/__init__.py +0 -0
  86. {agno-2.0.7 → agno-2.0.8}/agno/db/mysql/mysql.py +0 -0
  87. {agno-2.0.7 → agno-2.0.8}/agno/db/mysql/schemas.py +0 -0
  88. {agno-2.0.7 → agno-2.0.8}/agno/db/mysql/utils.py +0 -0
  89. {agno-2.0.7 → agno-2.0.8}/agno/db/postgres/__init__.py +0 -0
  90. {agno-2.0.7 → agno-2.0.8}/agno/db/postgres/postgres.py +0 -0
  91. {agno-2.0.7 → agno-2.0.8}/agno/db/postgres/schemas.py +0 -0
  92. {agno-2.0.7 → agno-2.0.8}/agno/db/postgres/utils.py +0 -0
  93. {agno-2.0.7 → agno-2.0.8}/agno/db/redis/__init__.py +0 -0
  94. {agno-2.0.7 → agno-2.0.8}/agno/db/redis/redis.py +0 -0
  95. {agno-2.0.7 → agno-2.0.8}/agno/db/redis/schemas.py +0 -0
  96. {agno-2.0.7 → agno-2.0.8}/agno/db/redis/utils.py +0 -0
  97. {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/__init__.py +0 -0
  98. {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/evals.py +0 -0
  99. {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/knowledge.py +0 -0
  100. {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/memory.py +0 -0
  101. {agno-2.0.7 → agno-2.0.8}/agno/db/schemas/metrics.py +0 -0
  102. {agno-2.0.7 → agno-2.0.8}/agno/db/singlestore/__init__.py +0 -0
  103. {agno-2.0.7 → agno-2.0.8}/agno/db/singlestore/schemas.py +0 -0
  104. {agno-2.0.7 → agno-2.0.8}/agno/db/singlestore/singlestore.py +0 -0
  105. {agno-2.0.7 → agno-2.0.8}/agno/db/singlestore/utils.py +0 -0
  106. {agno-2.0.7 → agno-2.0.8}/agno/db/sqlite/__init__.py +0 -0
  107. {agno-2.0.7 → agno-2.0.8}/agno/db/sqlite/schemas.py +0 -0
  108. {agno-2.0.7 → agno-2.0.8}/agno/db/sqlite/sqlite.py +0 -0
  109. {agno-2.0.7 → agno-2.0.8}/agno/db/sqlite/utils.py +0 -0
  110. {agno-2.0.7 → agno-2.0.8}/agno/db/utils.py +0 -0
  111. {agno-2.0.7 → agno-2.0.8}/agno/debug.py +0 -0
  112. {agno-2.0.7 → agno-2.0.8}/agno/eval/__init__.py +0 -0
  113. {agno-2.0.7 → agno-2.0.8}/agno/eval/accuracy.py +0 -0
  114. {agno-2.0.7 → agno-2.0.8}/agno/eval/performance.py +0 -0
  115. {agno-2.0.7 → agno-2.0.8}/agno/eval/reliability.py +0 -0
  116. {agno-2.0.7 → agno-2.0.8}/agno/eval/utils.py +0 -0
  117. {agno-2.0.7 → agno-2.0.8}/agno/exceptions.py +0 -0
  118. {agno-2.0.7 → agno-2.0.8}/agno/integrations/__init__.py +0 -0
  119. {agno-2.0.7 → agno-2.0.8}/agno/integrations/discord/__init__.py +0 -0
  120. {agno-2.0.7 → agno-2.0.8}/agno/integrations/discord/client.py +0 -0
  121. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/__init__.py +0 -0
  122. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/__init__.py +0 -0
  123. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/agentic.py +0 -0
  124. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/document.py +0 -0
  125. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/fixed.py +0 -0
  126. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/markdown.py +0 -0
  127. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/recursive.py +0 -0
  128. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/row.py +0 -0
  129. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/semantic.py +0 -0
  130. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/chunking/strategy.py +0 -0
  131. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/content.py +0 -0
  132. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/document/__init__.py +0 -0
  133. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/document/base.py +0 -0
  134. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/__init__.py +0 -0
  135. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/aws_bedrock.py +0 -0
  136. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/azure_openai.py +0 -0
  137. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/base.py +0 -0
  138. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/cohere.py +0 -0
  139. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/fastembed.py +0 -0
  140. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/fireworks.py +0 -0
  141. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/google.py +0 -0
  142. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/huggingface.py +0 -0
  143. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/jina.py +0 -0
  144. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/langdb.py +0 -0
  145. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/mistral.py +0 -0
  146. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/nebius.py +0 -0
  147. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/ollama.py +0 -0
  148. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/openai.py +0 -0
  149. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/together.py +0 -0
  150. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/embedder/voyageai.py +0 -0
  151. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/__init__.py +0 -0
  152. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/arxiv_reader.py +0 -0
  153. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/base.py +0 -0
  154. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/csv_reader.py +0 -0
  155. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/docx_reader.py +0 -0
  156. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/firecrawl_reader.py +0 -0
  157. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/json_reader.py +0 -0
  158. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/markdown_reader.py +0 -0
  159. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/pdf_reader.py +0 -0
  160. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/reader_factory.py +0 -0
  161. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/s3_reader.py +0 -0
  162. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/text_reader.py +0 -0
  163. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/web_search_reader.py +0 -0
  164. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/website_reader.py +0 -0
  165. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/wikipedia_reader.py +0 -0
  166. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reader/youtube_reader.py +0 -0
  167. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/remote_content/__init__.py +0 -0
  168. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/remote_content/remote_content.py +0 -0
  169. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/__init__.py +0 -0
  170. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/base.py +0 -0
  171. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/cohere.py +0 -0
  172. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/infinity.py +0 -0
  173. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  174. {agno-2.0.7 → agno-2.0.8}/agno/knowledge/utils.py +0 -0
  175. {agno-2.0.7 → agno-2.0.8}/agno/media.py +0 -0
  176. {agno-2.0.7 → agno-2.0.8}/agno/memory/__init__.py +0 -0
  177. {agno-2.0.7 → agno-2.0.8}/agno/memory/manager.py +0 -0
  178. {agno-2.0.7 → agno-2.0.8}/agno/models/__init__.py +0 -0
  179. {agno-2.0.7 → agno-2.0.8}/agno/models/aimlapi/__init__.py +0 -0
  180. {agno-2.0.7 → agno-2.0.8}/agno/models/aimlapi/aimlapi.py +0 -0
  181. {agno-2.0.7 → agno-2.0.8}/agno/models/anthropic/__init__.py +0 -0
  182. {agno-2.0.7 → agno-2.0.8}/agno/models/anthropic/claude.py +0 -0
  183. {agno-2.0.7 → agno-2.0.8}/agno/models/aws/__init__.py +0 -0
  184. {agno-2.0.7 → agno-2.0.8}/agno/models/aws/bedrock.py +0 -0
  185. {agno-2.0.7 → agno-2.0.8}/agno/models/aws/claude.py +0 -0
  186. {agno-2.0.7 → agno-2.0.8}/agno/models/azure/__init__.py +0 -0
  187. {agno-2.0.7 → agno-2.0.8}/agno/models/azure/ai_foundry.py +0 -0
  188. {agno-2.0.7 → agno-2.0.8}/agno/models/azure/openai_chat.py +0 -0
  189. {agno-2.0.7 → agno-2.0.8}/agno/models/base.py +0 -0
  190. {agno-2.0.7 → agno-2.0.8}/agno/models/cerebras/__init__.py +0 -0
  191. {agno-2.0.7 → agno-2.0.8}/agno/models/cerebras/cerebras.py +0 -0
  192. {agno-2.0.7 → agno-2.0.8}/agno/models/cerebras/cerebras_openai.py +0 -0
  193. {agno-2.0.7 → agno-2.0.8}/agno/models/cohere/__init__.py +0 -0
  194. {agno-2.0.7 → agno-2.0.8}/agno/models/cohere/chat.py +0 -0
  195. {agno-2.0.7 → agno-2.0.8}/agno/models/dashscope/__init__.py +0 -0
  196. {agno-2.0.7 → agno-2.0.8}/agno/models/dashscope/dashscope.py +0 -0
  197. {agno-2.0.7 → agno-2.0.8}/agno/models/deepinfra/__init__.py +0 -0
  198. {agno-2.0.7 → agno-2.0.8}/agno/models/deepinfra/deepinfra.py +0 -0
  199. {agno-2.0.7 → agno-2.0.8}/agno/models/deepseek/__init__.py +0 -0
  200. {agno-2.0.7 → agno-2.0.8}/agno/models/deepseek/deepseek.py +0 -0
  201. {agno-2.0.7 → agno-2.0.8}/agno/models/defaults.py +0 -0
  202. {agno-2.0.7 → agno-2.0.8}/agno/models/fireworks/__init__.py +0 -0
  203. {agno-2.0.7 → agno-2.0.8}/agno/models/fireworks/fireworks.py +0 -0
  204. {agno-2.0.7 → agno-2.0.8}/agno/models/google/__init__.py +0 -0
  205. {agno-2.0.7 → agno-2.0.8}/agno/models/groq/__init__.py +0 -0
  206. {agno-2.0.7 → agno-2.0.8}/agno/models/groq/groq.py +0 -0
  207. {agno-2.0.7 → agno-2.0.8}/agno/models/huggingface/__init__.py +0 -0
  208. {agno-2.0.7 → agno-2.0.8}/agno/models/huggingface/huggingface.py +0 -0
  209. {agno-2.0.7 → agno-2.0.8}/agno/models/ibm/__init__.py +0 -0
  210. {agno-2.0.7 → agno-2.0.8}/agno/models/ibm/watsonx.py +0 -0
  211. {agno-2.0.7 → agno-2.0.8}/agno/models/internlm/__init__.py +0 -0
  212. {agno-2.0.7 → agno-2.0.8}/agno/models/internlm/internlm.py +0 -0
  213. {agno-2.0.7 → agno-2.0.8}/agno/models/langdb/__init__.py +0 -0
  214. {agno-2.0.7 → agno-2.0.8}/agno/models/langdb/langdb.py +0 -0
  215. {agno-2.0.7 → agno-2.0.8}/agno/models/litellm/__init__.py +0 -0
  216. {agno-2.0.7 → agno-2.0.8}/agno/models/litellm/chat.py +0 -0
  217. {agno-2.0.7 → agno-2.0.8}/agno/models/litellm/litellm_openai.py +0 -0
  218. {agno-2.0.7 → agno-2.0.8}/agno/models/llama_cpp/__init__.py +0 -0
  219. {agno-2.0.7 → agno-2.0.8}/agno/models/llama_cpp/llama_cpp.py +0 -0
  220. {agno-2.0.7 → agno-2.0.8}/agno/models/lmstudio/__init__.py +0 -0
  221. {agno-2.0.7 → agno-2.0.8}/agno/models/lmstudio/lmstudio.py +0 -0
  222. {agno-2.0.7 → agno-2.0.8}/agno/models/message.py +0 -0
  223. {agno-2.0.7 → agno-2.0.8}/agno/models/meta/__init__.py +0 -0
  224. {agno-2.0.7 → agno-2.0.8}/agno/models/meta/llama.py +0 -0
  225. {agno-2.0.7 → agno-2.0.8}/agno/models/meta/llama_openai.py +0 -0
  226. {agno-2.0.7 → agno-2.0.8}/agno/models/metrics.py +0 -0
  227. {agno-2.0.7 → agno-2.0.8}/agno/models/mistral/__init__.py +0 -0
  228. {agno-2.0.7 → agno-2.0.8}/agno/models/mistral/mistral.py +0 -0
  229. {agno-2.0.7 → agno-2.0.8}/agno/models/nebius/__init__.py +0 -0
  230. {agno-2.0.7 → agno-2.0.8}/agno/models/nebius/nebius.py +0 -0
  231. {agno-2.0.7 → agno-2.0.8}/agno/models/nexus/__init__.py +0 -0
  232. {agno-2.0.7 → agno-2.0.8}/agno/models/nexus/nexus.py +0 -0
  233. {agno-2.0.7 → agno-2.0.8}/agno/models/nvidia/__init__.py +0 -0
  234. {agno-2.0.7 → agno-2.0.8}/agno/models/nvidia/nvidia.py +0 -0
  235. {agno-2.0.7 → agno-2.0.8}/agno/models/ollama/__init__.py +0 -0
  236. {agno-2.0.7 → agno-2.0.8}/agno/models/openai/__init__.py +0 -0
  237. {agno-2.0.7 → agno-2.0.8}/agno/models/openai/like.py +0 -0
  238. {agno-2.0.7 → agno-2.0.8}/agno/models/openrouter/__init__.py +0 -0
  239. {agno-2.0.7 → agno-2.0.8}/agno/models/openrouter/openrouter.py +0 -0
  240. {agno-2.0.7 → agno-2.0.8}/agno/models/perplexity/__init__.py +0 -0
  241. {agno-2.0.7 → agno-2.0.8}/agno/models/perplexity/perplexity.py +0 -0
  242. {agno-2.0.7 → agno-2.0.8}/agno/models/portkey/__init__.py +0 -0
  243. {agno-2.0.7 → agno-2.0.8}/agno/models/portkey/portkey.py +0 -0
  244. {agno-2.0.7 → agno-2.0.8}/agno/models/response.py +0 -0
  245. {agno-2.0.7 → agno-2.0.8}/agno/models/sambanova/__init__.py +0 -0
  246. {agno-2.0.7 → agno-2.0.8}/agno/models/sambanova/sambanova.py +0 -0
  247. {agno-2.0.7 → agno-2.0.8}/agno/models/siliconflow/__init__.py +0 -0
  248. {agno-2.0.7 → agno-2.0.8}/agno/models/siliconflow/siliconflow.py +0 -0
  249. {agno-2.0.7 → agno-2.0.8}/agno/models/together/__init__.py +0 -0
  250. {agno-2.0.7 → agno-2.0.8}/agno/models/together/together.py +0 -0
  251. {agno-2.0.7 → agno-2.0.8}/agno/models/utils.py +0 -0
  252. {agno-2.0.7 → agno-2.0.8}/agno/models/vercel/__init__.py +0 -0
  253. {agno-2.0.7 → agno-2.0.8}/agno/models/vercel/v0.py +0 -0
  254. {agno-2.0.7 → agno-2.0.8}/agno/models/vllm/__init__.py +0 -0
  255. {agno-2.0.7 → agno-2.0.8}/agno/models/vllm/vllm.py +0 -0
  256. {agno-2.0.7 → agno-2.0.8}/agno/models/xai/__init__.py +0 -0
  257. {agno-2.0.7 → agno-2.0.8}/agno/models/xai/xai.py +0 -0
  258. {agno-2.0.7 → agno-2.0.8}/agno/os/__init__.py +0 -0
  259. {agno-2.0.7 → agno-2.0.8}/agno/os/app.py +0 -0
  260. {agno-2.0.7 → agno-2.0.8}/agno/os/auth.py +0 -0
  261. {agno-2.0.7 → agno-2.0.8}/agno/os/config.py +0 -0
  262. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/__init__.py +0 -0
  263. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/agui/__init__.py +0 -0
  264. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/agui/router.py +0 -0
  265. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/base.py +0 -0
  266. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/slack/__init__.py +0 -0
  267. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/slack/router.py +0 -0
  268. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/slack/security.py +0 -0
  269. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  270. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/whatsapp/router.py +0 -0
  271. {agno-2.0.7 → agno-2.0.8}/agno/os/interfaces/whatsapp/security.py +0 -0
  272. {agno-2.0.7 → agno-2.0.8}/agno/os/mcp.py +0 -0
  273. {agno-2.0.7 → agno-2.0.8}/agno/os/router.py +0 -0
  274. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/__init__.py +0 -0
  275. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/evals/__init__.py +0 -0
  276. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/evals/evals.py +0 -0
  277. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/evals/schemas.py +0 -0
  278. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/evals/utils.py +0 -0
  279. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/health.py +0 -0
  280. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/home.py +0 -0
  281. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/knowledge/__init__.py +0 -0
  282. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/knowledge/knowledge.py +0 -0
  283. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/knowledge/schemas.py +0 -0
  284. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/memory/__init__.py +0 -0
  285. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/memory/memory.py +0 -0
  286. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/memory/schemas.py +0 -0
  287. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/metrics/__init__.py +0 -0
  288. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/metrics/metrics.py +0 -0
  289. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/metrics/schemas.py +0 -0
  290. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/session/__init__.py +0 -0
  291. {agno-2.0.7 → agno-2.0.8}/agno/os/routers/session/session.py +0 -0
  292. {agno-2.0.7 → agno-2.0.8}/agno/os/schema.py +0 -0
  293. {agno-2.0.7 → agno-2.0.8}/agno/os/settings.py +0 -0
  294. {agno-2.0.7 → agno-2.0.8}/agno/py.typed +0 -0
  295. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/__init__.py +0 -0
  296. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/azure_ai_foundry.py +0 -0
  297. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/deepseek.py +0 -0
  298. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/groq.py +0 -0
  299. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/helpers.py +0 -0
  300. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/ollama.py +0 -0
  301. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/openai.py +0 -0
  302. {agno-2.0.7 → agno-2.0.8}/agno/reasoning/step.py +0 -0
  303. {agno-2.0.7 → agno-2.0.8}/agno/run/__init__.py +0 -0
  304. {agno-2.0.7 → agno-2.0.8}/agno/run/agent.py +0 -0
  305. {agno-2.0.7 → agno-2.0.8}/agno/run/base.py +0 -0
  306. {agno-2.0.7 → agno-2.0.8}/agno/run/cancel.py +0 -0
  307. {agno-2.0.7 → agno-2.0.8}/agno/run/messages.py +0 -0
  308. {agno-2.0.7 → agno-2.0.8}/agno/run/team.py +0 -0
  309. {agno-2.0.7 → agno-2.0.8}/agno/run/workflow.py +0 -0
  310. {agno-2.0.7 → agno-2.0.8}/agno/session/__init__.py +0 -0
  311. {agno-2.0.7 → agno-2.0.8}/agno/session/summary.py +0 -0
  312. {agno-2.0.7 → agno-2.0.8}/agno/session/workflow.py +0 -0
  313. {agno-2.0.7 → agno-2.0.8}/agno/team/__init__.py +0 -0
  314. {agno-2.0.7 → agno-2.0.8}/agno/tools/__init__.py +0 -0
  315. {agno-2.0.7 → agno-2.0.8}/agno/tools/agentql.py +0 -0
  316. {agno-2.0.7 → agno-2.0.8}/agno/tools/airflow.py +0 -0
  317. {agno-2.0.7 → agno-2.0.8}/agno/tools/api.py +0 -0
  318. {agno-2.0.7 → agno-2.0.8}/agno/tools/apify.py +0 -0
  319. {agno-2.0.7 → agno-2.0.8}/agno/tools/arxiv.py +0 -0
  320. {agno-2.0.7 → agno-2.0.8}/agno/tools/aws_lambda.py +0 -0
  321. {agno-2.0.7 → agno-2.0.8}/agno/tools/aws_ses.py +0 -0
  322. {agno-2.0.7 → agno-2.0.8}/agno/tools/baidusearch.py +0 -0
  323. {agno-2.0.7 → agno-2.0.8}/agno/tools/bitbucket.py +0 -0
  324. {agno-2.0.7 → agno-2.0.8}/agno/tools/brandfetch.py +0 -0
  325. {agno-2.0.7 → agno-2.0.8}/agno/tools/bravesearch.py +0 -0
  326. {agno-2.0.7 → agno-2.0.8}/agno/tools/brightdata.py +0 -0
  327. {agno-2.0.7 → agno-2.0.8}/agno/tools/browserbase.py +0 -0
  328. {agno-2.0.7 → agno-2.0.8}/agno/tools/calcom.py +0 -0
  329. {agno-2.0.7 → agno-2.0.8}/agno/tools/calculator.py +0 -0
  330. {agno-2.0.7 → agno-2.0.8}/agno/tools/cartesia.py +0 -0
  331. {agno-2.0.7 → agno-2.0.8}/agno/tools/clickup.py +0 -0
  332. {agno-2.0.7 → agno-2.0.8}/agno/tools/confluence.py +0 -0
  333. {agno-2.0.7 → agno-2.0.8}/agno/tools/crawl4ai.py +0 -0
  334. {agno-2.0.7 → agno-2.0.8}/agno/tools/csv_toolkit.py +0 -0
  335. {agno-2.0.7 → agno-2.0.8}/agno/tools/dalle.py +0 -0
  336. {agno-2.0.7 → agno-2.0.8}/agno/tools/daytona.py +0 -0
  337. {agno-2.0.7 → agno-2.0.8}/agno/tools/decorator.py +0 -0
  338. {agno-2.0.7 → agno-2.0.8}/agno/tools/desi_vocal.py +0 -0
  339. {agno-2.0.7 → agno-2.0.8}/agno/tools/discord.py +0 -0
  340. {agno-2.0.7 → agno-2.0.8}/agno/tools/docker.py +0 -0
  341. {agno-2.0.7 → agno-2.0.8}/agno/tools/duckdb.py +0 -0
  342. {agno-2.0.7 → agno-2.0.8}/agno/tools/duckduckgo.py +0 -0
  343. {agno-2.0.7 → agno-2.0.8}/agno/tools/e2b.py +0 -0
  344. {agno-2.0.7 → agno-2.0.8}/agno/tools/eleven_labs.py +0 -0
  345. {agno-2.0.7 → agno-2.0.8}/agno/tools/email.py +0 -0
  346. {agno-2.0.7 → agno-2.0.8}/agno/tools/evm.py +0 -0
  347. {agno-2.0.7 → agno-2.0.8}/agno/tools/exa.py +0 -0
  348. {agno-2.0.7 → agno-2.0.8}/agno/tools/fal.py +0 -0
  349. {agno-2.0.7 → agno-2.0.8}/agno/tools/file.py +0 -0
  350. {agno-2.0.7 → agno-2.0.8}/agno/tools/file_generation.py +0 -0
  351. {agno-2.0.7 → agno-2.0.8}/agno/tools/financial_datasets.py +0 -0
  352. {agno-2.0.7 → agno-2.0.8}/agno/tools/firecrawl.py +0 -0
  353. {agno-2.0.7 → agno-2.0.8}/agno/tools/giphy.py +0 -0
  354. {agno-2.0.7 → agno-2.0.8}/agno/tools/github.py +0 -0
  355. {agno-2.0.7 → agno-2.0.8}/agno/tools/gmail.py +0 -0
  356. {agno-2.0.7 → agno-2.0.8}/agno/tools/google_bigquery.py +0 -0
  357. {agno-2.0.7 → agno-2.0.8}/agno/tools/google_maps.py +0 -0
  358. {agno-2.0.7 → agno-2.0.8}/agno/tools/googlecalendar.py +0 -0
  359. {agno-2.0.7 → agno-2.0.8}/agno/tools/googlesearch.py +0 -0
  360. {agno-2.0.7 → agno-2.0.8}/agno/tools/googlesheets.py +0 -0
  361. {agno-2.0.7 → agno-2.0.8}/agno/tools/hackernews.py +0 -0
  362. {agno-2.0.7 → agno-2.0.8}/agno/tools/jina.py +0 -0
  363. {agno-2.0.7 → agno-2.0.8}/agno/tools/jira.py +0 -0
  364. {agno-2.0.7 → agno-2.0.8}/agno/tools/knowledge.py +0 -0
  365. {agno-2.0.7 → agno-2.0.8}/agno/tools/linear.py +0 -0
  366. {agno-2.0.7 → agno-2.0.8}/agno/tools/linkup.py +0 -0
  367. {agno-2.0.7 → agno-2.0.8}/agno/tools/local_file_system.py +0 -0
  368. {agno-2.0.7 → agno-2.0.8}/agno/tools/lumalab.py +0 -0
  369. {agno-2.0.7 → agno-2.0.8}/agno/tools/mem0.py +0 -0
  370. {agno-2.0.7 → agno-2.0.8}/agno/tools/memori.py +0 -0
  371. {agno-2.0.7 → agno-2.0.8}/agno/tools/memory.py +0 -0
  372. {agno-2.0.7 → agno-2.0.8}/agno/tools/mlx_transcribe.py +0 -0
  373. {agno-2.0.7 → agno-2.0.8}/agno/tools/models/__init__.py +0 -0
  374. {agno-2.0.7 → agno-2.0.8}/agno/tools/models/azure_openai.py +0 -0
  375. {agno-2.0.7 → agno-2.0.8}/agno/tools/models/gemini.py +0 -0
  376. {agno-2.0.7 → agno-2.0.8}/agno/tools/models/groq.py +0 -0
  377. {agno-2.0.7 → agno-2.0.8}/agno/tools/models/morph.py +0 -0
  378. {agno-2.0.7 → agno-2.0.8}/agno/tools/models/nebius.py +0 -0
  379. {agno-2.0.7 → agno-2.0.8}/agno/tools/models_labs.py +0 -0
  380. {agno-2.0.7 → agno-2.0.8}/agno/tools/moviepy_video.py +0 -0
  381. {agno-2.0.7 → agno-2.0.8}/agno/tools/neo4j.py +0 -0
  382. {agno-2.0.7 → agno-2.0.8}/agno/tools/newspaper.py +0 -0
  383. {agno-2.0.7 → agno-2.0.8}/agno/tools/newspaper4k.py +0 -0
  384. {agno-2.0.7 → agno-2.0.8}/agno/tools/openai.py +0 -0
  385. {agno-2.0.7 → agno-2.0.8}/agno/tools/openbb.py +0 -0
  386. {agno-2.0.7 → agno-2.0.8}/agno/tools/opencv.py +0 -0
  387. {agno-2.0.7 → agno-2.0.8}/agno/tools/openweather.py +0 -0
  388. {agno-2.0.7 → agno-2.0.8}/agno/tools/oxylabs.py +0 -0
  389. {agno-2.0.7 → agno-2.0.8}/agno/tools/pandas.py +0 -0
  390. {agno-2.0.7 → agno-2.0.8}/agno/tools/postgres.py +0 -0
  391. {agno-2.0.7 → agno-2.0.8}/agno/tools/pubmed.py +0 -0
  392. {agno-2.0.7 → agno-2.0.8}/agno/tools/python.py +0 -0
  393. {agno-2.0.7 → agno-2.0.8}/agno/tools/reasoning.py +0 -0
  394. {agno-2.0.7 → agno-2.0.8}/agno/tools/reddit.py +0 -0
  395. {agno-2.0.7 → agno-2.0.8}/agno/tools/replicate.py +0 -0
  396. {agno-2.0.7 → agno-2.0.8}/agno/tools/resend.py +0 -0
  397. {agno-2.0.7 → agno-2.0.8}/agno/tools/scrapegraph.py +0 -0
  398. {agno-2.0.7 → agno-2.0.8}/agno/tools/searxng.py +0 -0
  399. {agno-2.0.7 → agno-2.0.8}/agno/tools/serpapi.py +0 -0
  400. {agno-2.0.7 → agno-2.0.8}/agno/tools/serper.py +0 -0
  401. {agno-2.0.7 → agno-2.0.8}/agno/tools/shell.py +0 -0
  402. {agno-2.0.7 → agno-2.0.8}/agno/tools/slack.py +0 -0
  403. {agno-2.0.7 → agno-2.0.8}/agno/tools/sleep.py +0 -0
  404. {agno-2.0.7 → agno-2.0.8}/agno/tools/spider.py +0 -0
  405. {agno-2.0.7 → agno-2.0.8}/agno/tools/sql.py +0 -0
  406. {agno-2.0.7 → agno-2.0.8}/agno/tools/streamlit/__init__.py +0 -0
  407. {agno-2.0.7 → agno-2.0.8}/agno/tools/streamlit/components.py +0 -0
  408. {agno-2.0.7 → agno-2.0.8}/agno/tools/tavily.py +0 -0
  409. {agno-2.0.7 → agno-2.0.8}/agno/tools/telegram.py +0 -0
  410. {agno-2.0.7 → agno-2.0.8}/agno/tools/todoist.py +0 -0
  411. {agno-2.0.7 → agno-2.0.8}/agno/tools/tool_registry.py +0 -0
  412. {agno-2.0.7 → agno-2.0.8}/agno/tools/toolkit.py +0 -0
  413. {agno-2.0.7 → agno-2.0.8}/agno/tools/trafilatura.py +0 -0
  414. {agno-2.0.7 → agno-2.0.8}/agno/tools/trello.py +0 -0
  415. {agno-2.0.7 → agno-2.0.8}/agno/tools/twilio.py +0 -0
  416. {agno-2.0.7 → agno-2.0.8}/agno/tools/user_control_flow.py +0 -0
  417. {agno-2.0.7 → agno-2.0.8}/agno/tools/valyu.py +0 -0
  418. {agno-2.0.7 → agno-2.0.8}/agno/tools/visualization.py +0 -0
  419. {agno-2.0.7 → agno-2.0.8}/agno/tools/webbrowser.py +0 -0
  420. {agno-2.0.7 → agno-2.0.8}/agno/tools/webex.py +0 -0
  421. {agno-2.0.7 → agno-2.0.8}/agno/tools/website.py +0 -0
  422. {agno-2.0.7 → agno-2.0.8}/agno/tools/webtools.py +0 -0
  423. {agno-2.0.7 → agno-2.0.8}/agno/tools/whatsapp.py +0 -0
  424. {agno-2.0.7 → agno-2.0.8}/agno/tools/wikipedia.py +0 -0
  425. {agno-2.0.7 → agno-2.0.8}/agno/tools/workflow.py +0 -0
  426. {agno-2.0.7 → agno-2.0.8}/agno/tools/x.py +0 -0
  427. {agno-2.0.7 → agno-2.0.8}/agno/tools/yfinance.py +0 -0
  428. {agno-2.0.7 → agno-2.0.8}/agno/tools/youtube.py +0 -0
  429. {agno-2.0.7 → agno-2.0.8}/agno/tools/zendesk.py +0 -0
  430. {agno-2.0.7 → agno-2.0.8}/agno/tools/zep.py +0 -0
  431. {agno-2.0.7 → agno-2.0.8}/agno/tools/zoom.py +0 -0
  432. {agno-2.0.7 → agno-2.0.8}/agno/utils/__init__.py +0 -0
  433. {agno-2.0.7 → agno-2.0.8}/agno/utils/audio.py +0 -0
  434. {agno-2.0.7 → agno-2.0.8}/agno/utils/certs.py +0 -0
  435. {agno-2.0.7 → agno-2.0.8}/agno/utils/code_execution.py +0 -0
  436. {agno-2.0.7 → agno-2.0.8}/agno/utils/common.py +0 -0
  437. {agno-2.0.7 → agno-2.0.8}/agno/utils/dttm.py +0 -0
  438. {agno-2.0.7 → agno-2.0.8}/agno/utils/enum.py +0 -0
  439. {agno-2.0.7 → agno-2.0.8}/agno/utils/env.py +0 -0
  440. {agno-2.0.7 → agno-2.0.8}/agno/utils/events.py +0 -0
  441. {agno-2.0.7 → agno-2.0.8}/agno/utils/format_str.py +0 -0
  442. {agno-2.0.7 → agno-2.0.8}/agno/utils/functions.py +0 -0
  443. {agno-2.0.7 → agno-2.0.8}/agno/utils/http.py +0 -0
  444. {agno-2.0.7 → agno-2.0.8}/agno/utils/json_schema.py +0 -0
  445. {agno-2.0.7 → agno-2.0.8}/agno/utils/knowledge.py +0 -0
  446. {agno-2.0.7 → agno-2.0.8}/agno/utils/location.py +0 -0
  447. {agno-2.0.7 → agno-2.0.8}/agno/utils/log.py +0 -0
  448. {agno-2.0.7 → agno-2.0.8}/agno/utils/mcp.py +0 -0
  449. {agno-2.0.7 → agno-2.0.8}/agno/utils/media.py +0 -0
  450. {agno-2.0.7 → agno-2.0.8}/agno/utils/merge_dict.py +0 -0
  451. {agno-2.0.7 → agno-2.0.8}/agno/utils/message.py +0 -0
  452. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/__init__.py +0 -0
  453. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/ai_foundry.py +0 -0
  454. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/aws_claude.py +0 -0
  455. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/cohere.py +0 -0
  456. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/llama.py +0 -0
  457. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/mistral.py +0 -0
  458. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/openai_responses.py +0 -0
  459. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/schema_utils.py +0 -0
  460. {agno-2.0.7 → agno-2.0.8}/agno/utils/models/watsonx.py +0 -0
  461. {agno-2.0.7 → agno-2.0.8}/agno/utils/openai.py +0 -0
  462. {agno-2.0.7 → agno-2.0.8}/agno/utils/pickle.py +0 -0
  463. {agno-2.0.7 → agno-2.0.8}/agno/utils/pprint.py +0 -0
  464. {agno-2.0.7 → agno-2.0.8}/agno/utils/print_response/__init__.py +0 -0
  465. {agno-2.0.7 → agno-2.0.8}/agno/utils/print_response/workflow.py +0 -0
  466. {agno-2.0.7 → agno-2.0.8}/agno/utils/prompts.py +0 -0
  467. {agno-2.0.7 → agno-2.0.8}/agno/utils/reasoning.py +0 -0
  468. {agno-2.0.7 → agno-2.0.8}/agno/utils/response.py +0 -0
  469. {agno-2.0.7 → agno-2.0.8}/agno/utils/response_iterator.py +0 -0
  470. {agno-2.0.7 → agno-2.0.8}/agno/utils/safe_formatter.py +0 -0
  471. {agno-2.0.7 → agno-2.0.8}/agno/utils/shell.py +0 -0
  472. {agno-2.0.7 → agno-2.0.8}/agno/utils/streamlit.py +0 -0
  473. {agno-2.0.7 → agno-2.0.8}/agno/utils/string.py +0 -0
  474. {agno-2.0.7 → agno-2.0.8}/agno/utils/team.py +0 -0
  475. {agno-2.0.7 → agno-2.0.8}/agno/utils/timer.py +0 -0
  476. {agno-2.0.7 → agno-2.0.8}/agno/utils/tools.py +0 -0
  477. {agno-2.0.7 → agno-2.0.8}/agno/utils/web.py +0 -0
  478. {agno-2.0.7 → agno-2.0.8}/agno/utils/whatsapp.py +0 -0
  479. {agno-2.0.7 → agno-2.0.8}/agno/utils/yaml_io.py +0 -0
  480. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/__init__.py +0 -0
  481. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/cassandra/__init__.py +0 -0
  482. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/cassandra/cassandra.py +0 -0
  483. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  484. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/cassandra/index.py +0 -0
  485. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/chroma/__init__.py +0 -0
  486. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/chroma/chromadb.py +0 -0
  487. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/clickhouse/__init__.py +0 -0
  488. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  489. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/clickhouse/index.py +0 -0
  490. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/couchbase/__init__.py +0 -0
  491. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/couchbase/couchbase.py +0 -0
  492. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/distance.py +0 -0
  493. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/lancedb/__init__.py +0 -0
  494. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/lancedb/lance_db.py +0 -0
  495. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/langchaindb/__init__.py +0 -0
  496. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/lightrag/__init__.py +0 -0
  497. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/lightrag/lightrag.py +0 -0
  498. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/llamaindex/__init__.py +0 -0
  499. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/milvus/__init__.py +0 -0
  500. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/milvus/milvus.py +0 -0
  501. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/mongodb/__init__.py +0 -0
  502. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/mongodb/mongodb.py +0 -0
  503. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pgvector/__init__.py +0 -0
  504. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pgvector/index.py +0 -0
  505. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pgvector/pgvector.py +0 -0
  506. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pineconedb/__init__.py +0 -0
  507. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  508. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/qdrant/__init__.py +0 -0
  509. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/qdrant/qdrant.py +0 -0
  510. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/search.py +0 -0
  511. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/singlestore/__init__.py +0 -0
  512. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/singlestore/index.py +0 -0
  513. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/singlestore/singlestore.py +0 -0
  514. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/surrealdb/__init__.py +0 -0
  515. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  516. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/upstashdb/__init__.py +0 -0
  517. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  518. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/weaviate/__init__.py +0 -0
  519. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/weaviate/index.py +0 -0
  520. {agno-2.0.7 → agno-2.0.8}/agno/vectordb/weaviate/weaviate.py +0 -0
  521. {agno-2.0.7 → agno-2.0.8}/agno/workflow/__init__.py +0 -0
  522. {agno-2.0.7 → agno-2.0.8}/agno/workflow/condition.py +0 -0
  523. {agno-2.0.7 → agno-2.0.8}/agno/workflow/loop.py +0 -0
  524. {agno-2.0.7 → agno-2.0.8}/agno/workflow/parallel.py +0 -0
  525. {agno-2.0.7 → agno-2.0.8}/agno/workflow/router.py +0 -0
  526. {agno-2.0.7 → agno-2.0.8}/agno/workflow/step.py +0 -0
  527. {agno-2.0.7 → agno-2.0.8}/agno/workflow/steps.py +0 -0
  528. {agno-2.0.7 → agno-2.0.8}/agno/workflow/types.py +0 -0
  529. {agno-2.0.7 → agno-2.0.8}/agno.egg-info/dependency_links.txt +0 -0
  530. {agno-2.0.7 → agno-2.0.8}/agno.egg-info/requires.txt +0 -0
  531. {agno-2.0.7 → agno-2.0.8}/agno.egg-info/top_level.txt +0 -0
  532. {agno-2.0.7 → agno-2.0.8}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.0.7
3
+ Version: 2.0.8
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
@@ -30,6 +30,7 @@ from pydantic import BaseModel
30
30
  from agno.db.base import BaseDb, SessionType, UserMemory
31
31
  from agno.exceptions import ModelProviderError, RunCancelledException, StopAgentRun
32
32
  from agno.knowledge.knowledge import Knowledge
33
+ from agno.knowledge.types import KnowledgeFilter
33
34
  from agno.media import Audio, File, Image, Video
34
35
  from agno.memory import MemoryManager
35
36
  from agno.models.base import Model
@@ -455,6 +456,11 @@ class Agent:
455
456
  self.add_history_to_context = add_history_to_context
456
457
  self.num_history_runs = num_history_runs
457
458
 
459
+ if add_history_to_context and not db:
460
+ log_warning(
461
+ "add_history_to_context is True, but no database has been assigned to the agent. History will not be added to the context."
462
+ )
463
+
458
464
  self.store_media = store_media
459
465
 
460
466
  self.knowledge = knowledge
@@ -711,6 +717,14 @@ class Agent:
711
717
  # Determine the session_state
712
718
  if session_state is None:
713
719
  session_state = self.session_state or {}
720
+ else:
721
+ # If run session_state is provided, merge agent defaults under it
722
+ # This ensures run state takes precedence over agent defaults
723
+ if self.session_state:
724
+ base_state = self.session_state.copy()
725
+ merge_dictionaries(base_state, session_state)
726
+ session_state.clear()
727
+ session_state.update(base_state)
714
728
 
715
729
  if user_id is not None:
716
730
  session_state["current_user_id"] = user_id
@@ -1177,6 +1191,7 @@ class Agent:
1177
1191
  run_response=run_response,
1178
1192
  session=agent_session,
1179
1193
  session_state=session_state,
1194
+ dependencies=run_dependencies,
1180
1195
  user_id=user_id,
1181
1196
  async_mode=False,
1182
1197
  knowledge_filters=effective_filters,
@@ -1809,6 +1824,7 @@ class Agent:
1809
1824
  run_response=run_response,
1810
1825
  session=agent_session,
1811
1826
  session_state=session_state,
1827
+ dependencies=run_dependencies,
1812
1828
  user_id=user_id,
1813
1829
  async_mode=True,
1814
1830
  knowledge_filters=effective_filters,
@@ -3345,6 +3361,7 @@ class Agent:
3345
3361
  run_response.content = model_response.content
3346
3362
  run_response.content_type = "str"
3347
3363
 
3364
+ # Process reasoning content
3348
3365
  if model_response_event.reasoning_content is not None:
3349
3366
  model_response.reasoning_content = (
3350
3367
  model_response.reasoning_content or ""
@@ -3358,12 +3375,12 @@ class Agent:
3358
3375
  model_response.reasoning_content += model_response_event.redacted_reasoning_content
3359
3376
  run_response.reasoning_content = model_response.reasoning_content
3360
3377
 
3378
+ # Handle provider data (one chunk)
3361
3379
  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
3380
+ run_response.model_provider_data = model_response_event.provider_data
3364
3381
 
3382
+ # Handle citations (one chunk)
3365
3383
  if model_response_event.citations is not None:
3366
- # We get citations in one chunk
3367
3384
  run_response.citations = model_response_event.citations
3368
3385
 
3369
3386
  # Only yield if we have content to show
@@ -3790,29 +3807,21 @@ class Agent:
3790
3807
 
3791
3808
  # If any of the tools has "agent" as parameter, set _rebuild_tools to True
3792
3809
  for tool in agent_tools:
3810
+ param_names = {"agent", "session_state", "team", "images", "videos", "audios", "files"}
3811
+
3793
3812
  if isinstance(tool, Function):
3794
- if "agent" in tool.parameters:
3795
- self._rebuild_tools = True
3796
- break
3797
- if "team" in tool.parameters:
3813
+ if param_names & set(tool.parameters):
3798
3814
  self._rebuild_tools = True
3799
3815
  break
3800
- if isinstance(tool, Toolkit):
3816
+ elif isinstance(tool, Toolkit):
3801
3817
  for func in tool.functions.values():
3802
- if "agent" in func.parameters:
3818
+ if param_names & set(func.parameters):
3803
3819
  self._rebuild_tools = True
3804
3820
  break
3805
- if "team" in func.parameters:
3806
- self._rebuild_tools = True
3807
- break
3808
- if callable(tool):
3821
+ elif callable(tool):
3809
3822
  from inspect import signature
3810
3823
 
3811
- sig = signature(tool)
3812
- if "agent" in sig.parameters:
3813
- self._rebuild_tools = True
3814
- break
3815
- if "team" in sig.parameters:
3824
+ if param_names & set(signature(tool).parameters):
3816
3825
  self._rebuild_tools = True
3817
3826
  break
3818
3827
 
@@ -4007,6 +4016,7 @@ class Agent:
4007
4016
  run_response: RunOutput,
4008
4017
  session: AgentSession,
4009
4018
  session_state: Optional[Dict[str, Any]] = None,
4019
+ dependencies: Optional[Dict[str, Any]] = None,
4010
4020
  user_id: Optional[str] = None,
4011
4021
  async_mode: bool = False,
4012
4022
  knowledge_filters: Optional[Dict[str, Any]] = None,
@@ -4116,6 +4126,7 @@ class Agent:
4116
4126
 
4117
4127
  for func in self._functions_for_model.values():
4118
4128
  func._session_state = session_state
4129
+ func._dependencies = dependencies
4119
4130
  func._images = joint_images
4120
4131
  func._files = joint_files
4121
4132
  func._audios = joint_audios
@@ -4244,7 +4255,8 @@ class Agent:
4244
4255
  def _update_session_state(self, session: AgentSession, session_state: Dict[str, Any]):
4245
4256
  """Load the existing Agent from an AgentSession (from the database)"""
4246
4257
 
4247
- # Get the session_state from the database and update the current session_state
4258
+ # Get the session_state from the database and merge with proper precedence
4259
+ # At this point session_state contains: agent_defaults + run_params
4248
4260
  if session.session_data is not None and "session_state" in session.session_data:
4249
4261
  session_state_from_db = session.session_data.get("session_state")
4250
4262
 
@@ -4253,10 +4265,11 @@ class Agent:
4253
4265
  and isinstance(session_state_from_db, dict)
4254
4266
  and len(session_state_from_db) > 0
4255
4267
  ):
4256
- # This updates session_state_from_db
4257
- # If there are conflicting keys, values from provided session_state will take precedence
4258
- merge_dictionaries(session_state_from_db, session_state)
4259
- session_state = session_state_from_db
4268
+ # This preserves precedence: run_params > db_state > agent_defaults
4269
+ merged_state = session_state_from_db.copy()
4270
+ merge_dictionaries(merged_state, session_state)
4271
+ session_state.clear()
4272
+ session_state.update(merged_state)
4260
4273
 
4261
4274
  # Update the session_state in the session
4262
4275
  if session.session_data is not None:
@@ -4933,7 +4946,7 @@ class Agent:
4933
4946
  system_message_content += f"{get_response_model_format_prompt(self.output_schema)}"
4934
4947
 
4935
4948
  # 3.3.15 Add the session state to the system message
4936
- if self.add_session_state_to_context and session_state is not None:
4949
+ if add_session_state_to_context and session_state is not None:
4937
4950
  system_message_content += self._get_formatted_session_state_for_system_message(session_state)
4938
4951
 
4939
4952
  # Return the system message
@@ -5204,9 +5217,16 @@ class Agent:
5204
5217
  if add_history_to_context:
5205
5218
  from copy import deepcopy
5206
5219
 
5220
+ # Only skip messages from history when system_message_role is NOT a standard conversation role.
5221
+ # Standard conversation roles ("user", "assistant", "tool") should never be filtered
5222
+ # to preserve conversation continuity.
5223
+ skip_role = (
5224
+ self.system_message_role if self.system_message_role not in ["user", "assistant", "tool"] else None
5225
+ )
5226
+
5207
5227
  history: List[Message] = session.get_messages_from_last_n_runs(
5208
5228
  last_n=self.num_history_runs,
5209
- skip_role=self.system_message_role,
5229
+ skip_role=skip_role,
5210
5230
  agent_id=self.id if self.team_id is not None else None,
5211
5231
  )
5212
5232
 
@@ -5924,6 +5944,7 @@ class Agent:
5924
5944
  min_steps=self.reasoning_min_steps,
5925
5945
  max_steps=self.reasoning_max_steps,
5926
5946
  tools=self.tools,
5947
+ tool_call_limit=self.tool_call_limit,
5927
5948
  use_json_mode=self.use_json_mode,
5928
5949
  telemetry=self.telemetry,
5929
5950
  debug_mode=self.debug_mode,
@@ -6149,6 +6170,7 @@ class Agent:
6149
6170
  min_steps=self.reasoning_min_steps,
6150
6171
  max_steps=self.reasoning_max_steps,
6151
6172
  tools=self.tools,
6173
+ tool_call_limit=self.tool_call_limit,
6152
6174
  use_json_mode=self.use_json_mode,
6153
6175
  telemetry=self.telemetry,
6154
6176
  debug_mode=self.debug_mode,
@@ -6720,17 +6742,18 @@ class Agent:
6720
6742
  ) -> Function:
6721
6743
  """Factory function to create a search_knowledge_base function with filters."""
6722
6744
 
6723
- def search_knowledge_base(query: str, filters: Optional[Dict[str, Any]] = None) -> str:
6745
+ def search_knowledge_base(query: str, filters: Optional[List[KnowledgeFilter]] = None) -> str:
6724
6746
  """Use this function to search the knowledge base for information about a query.
6725
6747
 
6726
6748
  Args:
6727
6749
  query: The query to search for.
6728
- filters: The filters to apply to the search. This is a dictionary of key-value pairs.
6750
+ filters (optional): The filters to apply to the search. This is a list of KnowledgeFilter objects.
6729
6751
 
6730
6752
  Returns:
6731
6753
  str: A string containing the response from the knowledge base.
6732
6754
  """
6733
- search_filters = get_agentic_or_user_search_filters(filters, knowledge_filters)
6755
+ filters_dict = {filt.key: filt.value for filt in filters} if filters else None
6756
+ search_filters = get_agentic_or_user_search_filters(filters_dict, knowledge_filters)
6734
6757
 
6735
6758
  # Get the relevant documents from the knowledge base, passing filters
6736
6759
  retrieval_timer = Timer()
@@ -6753,17 +6776,18 @@ class Agent:
6753
6776
  return "No documents found"
6754
6777
  return self._convert_documents_to_string(docs_from_knowledge)
6755
6778
 
6756
- async def asearch_knowledge_base(query: str, filters: Optional[Dict[str, Any]] = None) -> str:
6779
+ async def asearch_knowledge_base(query: str, filters: Optional[List[KnowledgeFilter]] = None) -> str:
6757
6780
  """Use this function to search the knowledge base for information about a query asynchronously.
6758
6781
 
6759
6782
  Args:
6760
6783
  query: The query to search for.
6761
- filters: The filters to apply to the search. This is a dictionary of key-value pairs.
6784
+ filters (optional): The filters to apply to the search. This is a list of KnowledgeFilter objects.
6762
6785
 
6763
6786
  Returns:
6764
6787
  str: A string containing the response from the knowledge base.
6765
6788
  """
6766
- search_filters = get_agentic_or_user_search_filters(filters, knowledge_filters)
6789
+ filters_dict = {filt.key: filt.value for filt in filters} if filters else None
6790
+ search_filters = get_agentic_or_user_search_filters(filters_dict, knowledge_filters)
6767
6791
 
6768
6792
  retrieval_timer = Timer()
6769
6793
  retrieval_timer.start()
@@ -6894,21 +6918,21 @@ class Agent:
6894
6918
  stream: Optional[bool] = None,
6895
6919
  stream_intermediate_steps: Optional[bool] = None,
6896
6920
  markdown: Optional[bool] = None,
6921
+ knowledge_filters: Optional[Dict[str, Any]] = None,
6922
+ add_history_to_context: Optional[bool] = None,
6923
+ add_dependencies_to_context: Optional[bool] = None,
6924
+ dependencies: Optional[Dict[str, Any]] = None,
6925
+ add_session_state_to_context: Optional[bool] = None,
6926
+ metadata: Optional[Dict[str, Any]] = None,
6927
+ debug_mode: Optional[bool] = None,
6897
6928
  show_message: bool = True,
6898
6929
  show_reasoning: bool = True,
6899
6930
  show_full_reasoning: bool = False,
6900
6931
  console: Optional[Any] = None,
6901
6932
  # Add tags to include in markdown content
6902
6933
  tags_to_include_in_markdown: Optional[Set[str]] = None,
6903
- knowledge_filters: Optional[Dict[str, Any]] = None,
6904
- add_history_to_context: Optional[bool] = None,
6905
- dependencies: Optional[Dict[str, Any]] = None,
6906
- metadata: Optional[Dict[str, Any]] = None,
6907
- debug_mode: Optional[bool] = None,
6908
6934
  **kwargs: Any,
6909
6935
  ) -> None:
6910
- add_history = add_history_to_context if add_history_to_context is not None else self.add_history_to_context
6911
-
6912
6936
  if not tags_to_include_in_markdown:
6913
6937
  tags_to_include_in_markdown = {"think", "thinking"}
6914
6938
 
@@ -6945,8 +6969,10 @@ class Agent:
6945
6969
  show_full_reasoning=show_full_reasoning,
6946
6970
  tags_to_include_in_markdown=tags_to_include_in_markdown,
6947
6971
  console=console,
6948
- add_history_to_context=add_history,
6972
+ add_history_to_context=add_history_to_context,
6949
6973
  dependencies=dependencies,
6974
+ add_dependencies_to_context=add_dependencies_to_context,
6975
+ add_session_state_to_context=add_session_state_to_context,
6950
6976
  metadata=metadata,
6951
6977
  **kwargs,
6952
6978
  )
@@ -6971,8 +6997,10 @@ class Agent:
6971
6997
  show_full_reasoning=show_full_reasoning,
6972
6998
  tags_to_include_in_markdown=tags_to_include_in_markdown,
6973
6999
  console=console,
6974
- add_history_to_context=add_history,
7000
+ add_history_to_context=add_history_to_context,
6975
7001
  dependencies=dependencies,
7002
+ add_dependencies_to_context=add_dependencies_to_context,
7003
+ add_session_state_to_context=add_session_state_to_context,
6976
7004
  metadata=metadata,
6977
7005
  **kwargs,
6978
7006
  )
@@ -6991,21 +7019,21 @@ class Agent:
6991
7019
  stream: Optional[bool] = None,
6992
7020
  stream_intermediate_steps: Optional[bool] = None,
6993
7021
  markdown: Optional[bool] = None,
7022
+ knowledge_filters: Optional[Dict[str, Any]] = None,
7023
+ add_history_to_context: Optional[bool] = None,
7024
+ dependencies: Optional[Dict[str, Any]] = None,
7025
+ add_dependencies_to_context: Optional[bool] = None,
7026
+ add_session_state_to_context: Optional[bool] = None,
7027
+ metadata: Optional[Dict[str, Any]] = None,
7028
+ debug_mode: Optional[bool] = None,
6994
7029
  show_message: bool = True,
6995
7030
  show_reasoning: bool = True,
6996
7031
  show_full_reasoning: bool = False,
6997
7032
  console: Optional[Any] = None,
6998
7033
  # Add tags to include in markdown content
6999
7034
  tags_to_include_in_markdown: Optional[Set[str]] = None,
7000
- knowledge_filters: Optional[Dict[str, Any]] = None,
7001
- add_history_to_context: Optional[bool] = None,
7002
- dependencies: Optional[Dict[str, Any]] = None,
7003
- metadata: Optional[Dict[str, Any]] = None,
7004
- debug_mode: Optional[bool] = None,
7005
7035
  **kwargs: Any,
7006
7036
  ) -> None:
7007
- add_history = add_history_to_context if add_history_to_context is not None else self.add_history_to_context
7008
-
7009
7037
  if not tags_to_include_in_markdown:
7010
7038
  tags_to_include_in_markdown = {"think", "thinking"}
7011
7039
 
@@ -7041,8 +7069,10 @@ class Agent:
7041
7069
  show_full_reasoning=show_full_reasoning,
7042
7070
  tags_to_include_in_markdown=tags_to_include_in_markdown,
7043
7071
  console=console,
7044
- add_history_to_context=add_history,
7072
+ add_history_to_context=add_history_to_context,
7045
7073
  dependencies=dependencies,
7074
+ add_dependencies_to_context=add_dependencies_to_context,
7075
+ add_session_state_to_context=add_session_state_to_context,
7046
7076
  metadata=metadata,
7047
7077
  **kwargs,
7048
7078
  )
@@ -7066,8 +7096,10 @@ class Agent:
7066
7096
  show_full_reasoning=show_full_reasoning,
7067
7097
  tags_to_include_in_markdown=tags_to_include_in_markdown,
7068
7098
  console=console,
7069
- add_history_to_context=add_history,
7099
+ add_history_to_context=add_history_to_context,
7070
7100
  dependencies=dependencies,
7101
+ add_dependencies_to_context=add_dependencies_to_context,
7102
+ add_session_state_to_context=add_session_state_to_context,
7071
7103
  metadata=metadata,
7072
7104
  **kwargs,
7073
7105
  )
@@ -47,10 +47,10 @@ def convert_v1_metrics_to_v2(metrics_dict: Dict[str, Any]) -> Dict[str, Any]:
47
47
 
48
48
 
49
49
  def convert_any_metrics_in_data(data: Any) -> Any:
50
- """Recursively find and convert any metrics dictionaries in the data structure."""
50
+ """Recursively find and convert any metrics dictionaries and handle v1 to v2 field conversion."""
51
51
  if isinstance(data, dict):
52
- # First filter out deprecated v1 fields
53
- data = filter_deprecated_v1_fields(data)
52
+ # First apply v1 to v2 field conversion (handles extra_data extraction, thinking/reasoning_content consolidation, etc.)
53
+ data = convert_v1_fields_to_v2(data)
54
54
 
55
55
  # Check if this looks like a metrics dictionary
56
56
  if _is_metrics_dict(data):
@@ -114,11 +114,11 @@ def _is_metrics_dict(data: Dict[str, Any]) -> bool:
114
114
 
115
115
 
116
116
  def convert_session_data_comprehensively(session_data: Optional[Dict[str, Any]]) -> Optional[Dict[str, Any]]:
117
- """Comprehensively convert any metrics found anywhere in session_data from v1 to v2 format."""
117
+ """Comprehensively convert session data from v1 to v2 format, including metrics conversion and field mapping."""
118
118
  if not session_data:
119
119
  return session_data
120
120
 
121
- # Use the recursive converter to find and fix all metrics
121
+ # Use the recursive converter to handle all v1 to v2 conversions (metrics, field mapping, extra_data extraction, etc.)
122
122
  return convert_any_metrics_in_data(session_data)
123
123
 
124
124
 
@@ -145,21 +145,150 @@ def safe_get_runs_from_memory(memory_data: Any) -> Any:
145
145
  return None
146
146
 
147
147
 
148
- def filter_deprecated_v1_fields(data: Dict[str, Any]) -> Dict[str, Any]:
149
- """Remove v1-only fields that don't exist in v2 models."""
148
+ def convert_v1_media_to_v2(media_data: Dict[str, Any]) -> Dict[str, Any]:
149
+ """Convert v1 media objects to v2 format."""
150
+ if not isinstance(media_data, dict):
151
+ return media_data
152
+
153
+ # Create a copy to avoid modifying the original
154
+ v2_media = media_data.copy()
155
+
156
+ # Add id if missing (required in v2)
157
+ if "id" not in v2_media or v2_media["id"] is None:
158
+ from uuid import uuid4
159
+
160
+ v2_media["id"] = str(uuid4())
161
+
162
+ # Handle VideoArtifact → Video conversion
163
+ if "eta" in v2_media or "length" in v2_media:
164
+ # Convert length to duration if it's numeric
165
+ length = v2_media.pop("length", None)
166
+ if length and isinstance(length, (int, float)):
167
+ v2_media["duration"] = length
168
+ elif length and isinstance(length, str):
169
+ try:
170
+ v2_media["duration"] = float(length)
171
+ except ValueError:
172
+ pass # Keep as is if not convertible
173
+
174
+ # Handle AudioArtifact → Audio conversion
175
+ if "base64_audio" in v2_media:
176
+ # Map base64_audio to content
177
+ base64_audio = v2_media.pop("base64_audio", None)
178
+ if base64_audio:
179
+ v2_media["content"] = base64_audio
180
+
181
+ # Handle AudioResponse content conversion (base64 string to bytes if needed)
182
+ if "transcript" in v2_media and "content" in v2_media:
183
+ content = v2_media.get("content")
184
+ if content and isinstance(content, str):
185
+ # Try to decode base64 content to bytes for v2
186
+ try:
187
+ import base64
188
+
189
+ v2_media["content"] = base64.b64decode(content)
190
+ except Exception:
191
+ # If not valid base64, keep as string
192
+ pass
193
+
194
+ # Ensure format and mime_type are set appropriately
195
+ if "format" in v2_media and "mime_type" not in v2_media:
196
+ format_val = v2_media["format"]
197
+ if format_val:
198
+ # Set mime_type based on format for common types
199
+ mime_type_map = {
200
+ "mp4": "video/mp4",
201
+ "mov": "video/quicktime",
202
+ "avi": "video/x-msvideo",
203
+ "webm": "video/webm",
204
+ "mp3": "audio/mpeg",
205
+ "wav": "audio/wav",
206
+ "ogg": "audio/ogg",
207
+ "png": "image/png",
208
+ "jpg": "image/jpeg",
209
+ "jpeg": "image/jpeg",
210
+ "gif": "image/gif",
211
+ "webp": "image/webp",
212
+ }
213
+ if format_val.lower() in mime_type_map:
214
+ v2_media["mime_type"] = mime_type_map[format_val.lower()]
215
+
216
+ return v2_media
217
+
218
+
219
+ def convert_v1_fields_to_v2(data: Dict[str, Any]) -> Dict[str, Any]:
220
+ """Convert v1 fields to v2 format with proper field mapping and extraction."""
150
221
  if not isinstance(data, dict):
151
222
  return data
152
223
 
153
- # Fields that existed in v1 but were removed in v2
224
+ # Create a copy to avoid modifying the original
225
+ v2_data = data.copy()
226
+
227
+ # Fields that should be completely ignored/removed in v2
154
228
  deprecated_fields = {
155
229
  "team_session_id", # RunOutput v1 field, removed in v2
156
230
  "formatted_tool_calls", # RunOutput v1 field, removed in v2
231
+ "event", # Remove event field
232
+ "events", # Remove events field
157
233
  # Add other deprecated fields here as needed
158
234
  }
159
235
 
160
- # Create a copy and remove deprecated fields
161
- filtered_data = {k: v for k, v in data.items() if k not in deprecated_fields}
162
- return filtered_data
236
+ # Extract and map fields from extra_data before removing it
237
+ extra_data = v2_data.get("extra_data")
238
+ if extra_data and isinstance(extra_data, dict):
239
+ # Map extra_data fields to their v2 locations
240
+ if "add_messages" in extra_data:
241
+ v2_data["additional_input"] = extra_data["add_messages"]
242
+ if "references" in extra_data:
243
+ v2_data["references"] = extra_data["references"]
244
+ if "reasoning_steps" in extra_data:
245
+ v2_data["reasoning_steps"] = extra_data["reasoning_steps"]
246
+ if "reasoning_content" in extra_data:
247
+ # reasoning_content from extra_data also goes to reasoning_content
248
+ v2_data["reasoning_content"] = extra_data["reasoning_content"]
249
+ if "reasoning_messages" in extra_data:
250
+ v2_data["reasoning_messages"] = extra_data["reasoning_messages"]
251
+
252
+ # Handle thinking and reasoning_content consolidation
253
+ # Both thinking and reasoning_content from v1 should become reasoning_content in v2
254
+ thinking = v2_data.get("thinking")
255
+ reasoning_content = v2_data.get("reasoning_content")
256
+
257
+ # Consolidate thinking and reasoning_content into reasoning_content
258
+ if thinking and reasoning_content:
259
+ # Both exist, combine them (thinking first, then reasoning_content)
260
+ v2_data["reasoning_content"] = f"{thinking}\n{reasoning_content}"
261
+ elif thinking and not reasoning_content:
262
+ # Only thinking exists, move it to reasoning_content
263
+ v2_data["reasoning_content"] = thinking
264
+ # If only reasoning_content exists, keep it as is
265
+
266
+ # Remove thinking field since it's now consolidated into reasoning_content
267
+ if "thinking" in v2_data:
268
+ del v2_data["thinking"]
269
+
270
+ # Handle media object conversions
271
+ media_fields = ["images", "videos", "audio", "response_audio"]
272
+ for field in media_fields:
273
+ if field in v2_data and v2_data[field]:
274
+ if isinstance(v2_data[field], list):
275
+ # Handle list of media objects
276
+ v2_data[field] = [
277
+ convert_v1_media_to_v2(item) if isinstance(item, dict) else item for item in v2_data[field]
278
+ ]
279
+ elif isinstance(v2_data[field], dict):
280
+ # Handle single media object
281
+ v2_data[field] = convert_v1_media_to_v2(v2_data[field])
282
+
283
+ # Remove extra_data after extraction
284
+ if "extra_data" in v2_data:
285
+ del v2_data["extra_data"]
286
+
287
+ # Remove other deprecated fields
288
+ for field in deprecated_fields:
289
+ v2_data.pop(field, None)
290
+
291
+ return v2_data
163
292
 
164
293
 
165
294
  def migrate(
@@ -27,9 +27,9 @@ class SentenceTransformerEmbedder(Embedder):
27
27
 
28
28
  def get_embedding(self, text: Union[str, List[str]]) -> List[float]:
29
29
  if not self.sentence_transformer_client:
30
- model = SentenceTransformer(model_name_or_path=self.id)
31
- else:
32
- model = self.sentence_transformer_client
30
+ self.sentence_transformer_client = SentenceTransformer(model_name_or_path=self.id)
31
+
32
+ model = self.sentence_transformer_client
33
33
  embedding = model.encode(text, prompt=self.prompt, normalize_embeddings=self.normalize_embeddings)
34
34
  try:
35
35
  if isinstance(embedding, np.ndarray):