agno 2.0.0a1__tar.gz → 2.0.0rc2__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 (528) hide show
  1. {agno-2.0.0a1 → agno-2.0.0rc2}/PKG-INFO +1 -1
  2. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/agent/agent.py +416 -41
  3. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/agent.py +2 -2
  4. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/evals.py +2 -2
  5. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/os.py +1 -1
  6. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/settings.py +2 -2
  7. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/team.py +2 -2
  8. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/dynamo/dynamo.py +0 -6
  9. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/firestore/firestore.py +0 -6
  10. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/in_memory/in_memory_db.py +0 -6
  11. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/json/json_db.py +0 -6
  12. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mongo/mongo.py +8 -9
  13. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mysql/utils.py +0 -1
  14. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/postgres/postgres.py +0 -10
  15. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/postgres/utils.py +0 -1
  16. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/redis/redis.py +0 -4
  17. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/singlestore/singlestore.py +0 -10
  18. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/singlestore/utils.py +0 -1
  19. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/sqlite/sqlite.py +0 -4
  20. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/sqlite/utils.py +0 -1
  21. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/accuracy.py +12 -5
  22. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/integrations/discord/client.py +5 -1
  23. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/strategy.py +14 -14
  24. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/aws_bedrock.py +2 -2
  25. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/knowledge.py +156 -120
  26. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/arxiv_reader.py +5 -5
  27. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/csv_reader.py +6 -77
  28. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/docx_reader.py +5 -5
  29. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/firecrawl_reader.py +5 -5
  30. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/json_reader.py +5 -5
  31. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/markdown_reader.py +31 -9
  32. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/pdf_reader.py +10 -123
  33. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/reader_factory.py +65 -72
  34. agno-2.0.0rc2/agno/knowledge/reader/s3_reader.py +101 -0
  35. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/text_reader.py +5 -5
  36. agno-2.0.0rc2/agno/knowledge/reader/url_reader.py +128 -0
  37. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/web_search_reader.py +6 -29
  38. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/website_reader.py +5 -5
  39. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/wikipedia_reader.py +5 -5
  40. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/youtube_reader.py +6 -6
  41. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/utils.py +10 -10
  42. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/anthropic/claude.py +2 -49
  43. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aws/bedrock.py +3 -7
  44. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/base.py +37 -6
  45. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/message.py +7 -6
  46. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/app.py +168 -64
  47. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/agui/agui.py +1 -1
  48. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/agui/utils.py +16 -9
  49. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/slack/slack.py +2 -3
  50. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/whatsapp.py +2 -3
  51. agno-2.0.0rc2/agno/os/mcp.py +235 -0
  52. agno-2.0.0rc2/agno/os/router.py +1400 -0
  53. agno-2.0.0rc2/agno/os/routers/evals/evals.py +393 -0
  54. agno-2.0.0rc2/agno/os/routers/knowledge/knowledge.py +850 -0
  55. agno-2.0.0rc2/agno/os/routers/memory/memory.py +410 -0
  56. agno-2.0.0rc2/agno/os/routers/metrics/metrics.py +178 -0
  57. agno-2.0.0rc2/agno/os/routers/session/session.py +536 -0
  58. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/schema.py +55 -2
  59. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/settings.py +0 -1
  60. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/agent.py +96 -2
  61. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/cancel.py +0 -2
  62. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/team.py +93 -2
  63. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/workflow.py +25 -12
  64. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/team/team.py +863 -1053
  65. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/function.py +65 -7
  66. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/linear.py +1 -1
  67. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/mcp.py +1 -2
  68. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/gemini.py +31 -1
  69. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/log.py +52 -2
  70. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/mcp.py +55 -3
  71. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/claude.py +41 -0
  72. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/print_response/team.py +177 -73
  73. agno-2.0.0rc2/agno/utils/streamlit.py +481 -0
  74. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/workflow.py +17 -1
  75. {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/PKG-INFO +1 -1
  76. {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/SOURCES.txt +2 -1
  77. {agno-2.0.0a1 → agno-2.0.0rc2}/pyproject.toml +2 -1
  78. agno-2.0.0a1/agno/knowledge/reader/gcs_reader.py +0 -67
  79. agno-2.0.0a1/agno/knowledge/reader/s3_reader.py +0 -171
  80. agno-2.0.0a1/agno/knowledge/reader/url_reader.py +0 -84
  81. agno-2.0.0a1/agno/os/router.py +0 -843
  82. agno-2.0.0a1/agno/os/routers/evals/evals.py +0 -204
  83. agno-2.0.0a1/agno/os/routers/knowledge/knowledge.py +0 -413
  84. agno-2.0.0a1/agno/os/routers/memory/memory.py +0 -179
  85. agno-2.0.0a1/agno/os/routers/metrics/metrics.py +0 -58
  86. agno-2.0.0a1/agno/os/routers/session/session.py +0 -163
  87. {agno-2.0.0a1 → agno-2.0.0rc2}/LICENSE +0 -0
  88. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/__init__.py +0 -0
  89. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/agent/__init__.py +0 -0
  90. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/__init__.py +0 -0
  91. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/api.py +0 -0
  92. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/routes.py +0 -0
  93. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/__init__.py +0 -0
  94. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/agent.py +0 -0
  95. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/evals.py +0 -0
  96. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/os.py +0 -0
  97. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/response.py +0 -0
  98. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/team.py +0 -0
  99. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/utils.py +0 -0
  100. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/schemas/workflows.py +0 -0
  101. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/api/workflow.py +0 -0
  102. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/base.py +0 -0
  103. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/s3/__init__.py +0 -0
  104. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/s3/api_client.py +0 -0
  105. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/s3/bucket.py +0 -0
  106. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/cloud/aws/s3/object.py +0 -0
  107. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/__init__.py +0 -0
  108. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/base.py +0 -0
  109. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/dynamo/__init__.py +0 -0
  110. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/dynamo/schemas.py +0 -0
  111. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/dynamo/utils.py +0 -0
  112. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/firestore/__init__.py +0 -0
  113. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/firestore/schemas.py +0 -0
  114. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/firestore/utils.py +0 -0
  115. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/gcs_json/__init__.py +0 -0
  116. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/gcs_json/gcs_json_db.py +0 -0
  117. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/gcs_json/utils.py +0 -0
  118. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/in_memory/__init__.py +0 -0
  119. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/in_memory/utils.py +0 -0
  120. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/json/__init__.py +0 -0
  121. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/json/utils.py +0 -0
  122. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/migrations/__init__.py +0 -0
  123. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/migrations/v1_to_v2.py +0 -0
  124. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mongo/__init__.py +0 -0
  125. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mongo/schemas.py +0 -0
  126. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mongo/utils.py +0 -0
  127. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mysql/__init__.py +0 -0
  128. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mysql/mysql.py +0 -0
  129. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/mysql/schemas.py +0 -0
  130. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/postgres/__init__.py +0 -0
  131. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/postgres/schemas.py +0 -0
  132. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/redis/__init__.py +0 -0
  133. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/redis/schemas.py +0 -0
  134. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/redis/utils.py +0 -0
  135. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/__init__.py +0 -0
  136. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/evals.py +0 -0
  137. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/knowledge.py +0 -0
  138. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/memory.py +0 -0
  139. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/schemas/metrics.py +0 -0
  140. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/singlestore/__init__.py +0 -0
  141. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/singlestore/schemas.py +0 -0
  142. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/sqlite/__init__.py +0 -0
  143. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/sqlite/schemas.py +0 -0
  144. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/db/utils.py +0 -0
  145. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/debug.py +0 -0
  146. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/__init__.py +0 -0
  147. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/performance.py +0 -0
  148. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/reliability.py +0 -0
  149. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/eval/utils.py +0 -0
  150. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/exceptions.py +0 -0
  151. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/integrations/__init__.py +0 -0
  152. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/integrations/discord/__init__.py +0 -0
  153. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/__init__.py +0 -0
  154. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/__init__.py +0 -0
  155. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/agentic.py +0 -0
  156. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/document.py +0 -0
  157. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/fixed.py +0 -0
  158. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/markdown.py +0 -0
  159. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/recursive.py +0 -0
  160. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/row.py +0 -0
  161. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/chunking/semantic.py +0 -0
  162. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/content.py +0 -0
  163. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/document/__init__.py +0 -0
  164. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/document/base.py +0 -0
  165. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/__init__.py +0 -0
  166. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/azure_openai.py +0 -0
  167. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/base.py +0 -0
  168. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/cohere.py +0 -0
  169. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/fastembed.py +0 -0
  170. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/fireworks.py +0 -0
  171. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/google.py +0 -0
  172. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/huggingface.py +0 -0
  173. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/jina.py +0 -0
  174. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/langdb.py +0 -0
  175. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/mistral.py +0 -0
  176. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/nebius.py +0 -0
  177. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/ollama.py +0 -0
  178. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/openai.py +0 -0
  179. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/sentence_transformer.py +0 -0
  180. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/together.py +0 -0
  181. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/embedder/voyageai.py +0 -0
  182. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/__init__.py +0 -0
  183. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reader/base.py +0 -0
  184. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/remote_content/__init__.py +0 -0
  185. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/remote_content/remote_content.py +0 -0
  186. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/__init__.py +0 -0
  187. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/base.py +0 -0
  188. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/cohere.py +0 -0
  189. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/infinity.py +0 -0
  190. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  191. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/knowledge/types.py +0 -0
  192. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/media.py +0 -0
  193. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/memory/__init__.py +0 -0
  194. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/memory/manager.py +0 -0
  195. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/__init__.py +0 -0
  196. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aimlapi/__init__.py +0 -0
  197. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aimlapi/aimlapi.py +0 -0
  198. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/anthropic/__init__.py +0 -0
  199. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aws/__init__.py +0 -0
  200. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/aws/claude.py +0 -0
  201. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/azure/__init__.py +0 -0
  202. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/azure/ai_foundry.py +0 -0
  203. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/azure/openai_chat.py +0 -0
  204. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cerebras/__init__.py +0 -0
  205. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cerebras/cerebras.py +0 -0
  206. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cerebras/cerebras_openai.py +0 -0
  207. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cohere/__init__.py +0 -0
  208. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/cohere/chat.py +0 -0
  209. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/dashscope/__init__.py +0 -0
  210. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/dashscope/dashscope.py +0 -0
  211. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/deepinfra/__init__.py +0 -0
  212. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/deepinfra/deepinfra.py +0 -0
  213. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/deepseek/__init__.py +0 -0
  214. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/deepseek/deepseek.py +0 -0
  215. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/defaults.py +0 -0
  216. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/fireworks/__init__.py +0 -0
  217. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/fireworks/fireworks.py +0 -0
  218. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/google/__init__.py +0 -0
  219. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/google/gemini.py +0 -0
  220. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/groq/__init__.py +0 -0
  221. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/groq/groq.py +0 -0
  222. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/huggingface/__init__.py +0 -0
  223. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/huggingface/huggingface.py +0 -0
  224. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/ibm/__init__.py +0 -0
  225. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/ibm/watsonx.py +0 -0
  226. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/internlm/__init__.py +0 -0
  227. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/internlm/internlm.py +0 -0
  228. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/langdb/__init__.py +0 -0
  229. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/langdb/langdb.py +0 -0
  230. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/litellm/__init__.py +0 -0
  231. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/litellm/chat.py +0 -0
  232. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/litellm/litellm_openai.py +0 -0
  233. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/lmstudio/__init__.py +0 -0
  234. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/lmstudio/lmstudio.py +0 -0
  235. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/meta/__init__.py +0 -0
  236. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/meta/llama.py +0 -0
  237. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/meta/llama_openai.py +0 -0
  238. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/metrics.py +0 -0
  239. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/mistral/__init__.py +0 -0
  240. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/mistral/mistral.py +0 -0
  241. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/nebius/__init__.py +0 -0
  242. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/nebius/nebius.py +0 -0
  243. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/nvidia/__init__.py +0 -0
  244. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/nvidia/nvidia.py +0 -0
  245. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/ollama/__init__.py +0 -0
  246. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/ollama/chat.py +0 -0
  247. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openai/__init__.py +0 -0
  248. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openai/chat.py +0 -0
  249. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openai/like.py +0 -0
  250. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openai/responses.py +0 -0
  251. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openrouter/__init__.py +0 -0
  252. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/openrouter/openrouter.py +0 -0
  253. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/perplexity/__init__.py +0 -0
  254. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/perplexity/perplexity.py +0 -0
  255. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/portkey/__init__.py +0 -0
  256. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/portkey/portkey.py +0 -0
  257. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/response.py +0 -0
  258. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/sambanova/__init__.py +0 -0
  259. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/sambanova/sambanova.py +0 -0
  260. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/together/__init__.py +0 -0
  261. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/together/together.py +0 -0
  262. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/utils.py +0 -0
  263. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/vercel/__init__.py +0 -0
  264. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/vercel/v0.py +0 -0
  265. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/vllm/__init__.py +0 -0
  266. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/vllm/vllm.py +0 -0
  267. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/xai/__init__.py +0 -0
  268. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/models/xai/xai.py +0 -0
  269. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/__init__.py +0 -0
  270. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/auth.py +0 -0
  271. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/config.py +0 -0
  272. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/__init__.py +0 -0
  273. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/agui/__init__.py +0 -0
  274. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/agui/router.py +0 -0
  275. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/base.py +0 -0
  276. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/slack/__init__.py +0 -0
  277. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/slack/router.py +0 -0
  278. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/slack/security.py +0 -0
  279. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  280. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/router.py +0 -0
  281. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/security.py +0 -0
  282. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/__init__.py +0 -0
  283. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/evals/__init__.py +0 -0
  284. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/evals/schemas.py +0 -0
  285. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/evals/utils.py +0 -0
  286. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/knowledge/__init__.py +0 -0
  287. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/knowledge/schemas.py +0 -0
  288. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/memory/__init__.py +0 -0
  289. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/memory/schemas.py +0 -0
  290. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/metrics/__init__.py +0 -0
  291. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/metrics/schemas.py +0 -0
  292. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/routers/session/__init__.py +0 -0
  293. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/os/utils.py +0 -0
  294. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/py.typed +0 -0
  295. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/__init__.py +0 -0
  296. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/azure_ai_foundry.py +0 -0
  297. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/deepseek.py +0 -0
  298. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/default.py +0 -0
  299. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/groq.py +0 -0
  300. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/helpers.py +0 -0
  301. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/ollama.py +0 -0
  302. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/openai.py +0 -0
  303. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/reasoning/step.py +0 -0
  304. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/__init__.py +0 -0
  305. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/base.py +0 -0
  306. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/run/messages.py +0 -0
  307. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/__init__.py +0 -0
  308. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/agent.py +0 -0
  309. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/summary.py +0 -0
  310. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/team.py +0 -0
  311. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/session/workflow.py +0 -0
  312. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/team/__init__.py +0 -0
  313. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/__init__.py +0 -0
  314. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/agentql.py +0 -0
  315. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/airflow.py +0 -0
  316. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/api.py +0 -0
  317. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/apify.py +0 -0
  318. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/arxiv.py +0 -0
  319. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/aws_lambda.py +0 -0
  320. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/aws_ses.py +0 -0
  321. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/baidusearch.py +0 -0
  322. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/bitbucket.py +0 -0
  323. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/brandfetch.py +0 -0
  324. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/bravesearch.py +0 -0
  325. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/brightdata.py +0 -0
  326. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/browserbase.py +0 -0
  327. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/calcom.py +0 -0
  328. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/calculator.py +0 -0
  329. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/cartesia.py +0 -0
  330. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/clickup.py +0 -0
  331. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/confluence.py +0 -0
  332. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/crawl4ai.py +0 -0
  333. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/csv_toolkit.py +0 -0
  334. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/dalle.py +0 -0
  335. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/daytona.py +0 -0
  336. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/decorator.py +0 -0
  337. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/desi_vocal.py +0 -0
  338. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/discord.py +0 -0
  339. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/docker.py +0 -0
  340. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/duckdb.py +0 -0
  341. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/duckduckgo.py +0 -0
  342. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/e2b.py +0 -0
  343. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/eleven_labs.py +0 -0
  344. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/email.py +0 -0
  345. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/evm.py +0 -0
  346. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/exa.py +0 -0
  347. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/fal.py +0 -0
  348. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/file.py +0 -0
  349. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/financial_datasets.py +0 -0
  350. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/firecrawl.py +0 -0
  351. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/giphy.py +0 -0
  352. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/github.py +0 -0
  353. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/gmail.py +0 -0
  354. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/google_bigquery.py +0 -0
  355. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/google_maps.py +0 -0
  356. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/googlecalendar.py +0 -0
  357. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/googlesearch.py +0 -0
  358. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/googlesheets.py +0 -0
  359. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/hackernews.py +0 -0
  360. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/jina.py +0 -0
  361. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/jira.py +0 -0
  362. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/knowledge.py +0 -0
  363. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/linkup.py +0 -0
  364. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/local_file_system.py +0 -0
  365. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/lumalab.py +0 -0
  366. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/mem0.py +0 -0
  367. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/memori.py +0 -0
  368. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/mlx_transcribe.py +0 -0
  369. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/__init__.py +0 -0
  370. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/azure_openai.py +0 -0
  371. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/gemini.py +0 -0
  372. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/groq.py +0 -0
  373. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/morph.py +0 -0
  374. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models/nebius.py +0 -0
  375. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/models_labs.py +0 -0
  376. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/moviepy_video.py +0 -0
  377. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/neo4j.py +0 -0
  378. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/newspaper.py +0 -0
  379. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/newspaper4k.py +0 -0
  380. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/openai.py +0 -0
  381. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/openbb.py +0 -0
  382. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/opencv.py +0 -0
  383. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/openweather.py +0 -0
  384. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/oxylabs.py +0 -0
  385. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/pandas.py +0 -0
  386. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/postgres.py +0 -0
  387. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/pubmed.py +0 -0
  388. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/python.py +0 -0
  389. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/reasoning.py +0 -0
  390. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/reddit.py +0 -0
  391. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/replicate.py +0 -0
  392. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/resend.py +0 -0
  393. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/scrapegraph.py +0 -0
  394. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/searxng.py +0 -0
  395. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/serpapi.py +0 -0
  396. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/serper.py +0 -0
  397. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/shell.py +0 -0
  398. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/slack.py +0 -0
  399. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/sleep.py +0 -0
  400. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/spider.py +0 -0
  401. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/sql.py +0 -0
  402. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/streamlit/__init__.py +0 -0
  403. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/streamlit/components.py +0 -0
  404. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/tavily.py +0 -0
  405. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/telegram.py +0 -0
  406. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/todoist.py +0 -0
  407. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/tool_registry.py +0 -0
  408. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/toolkit.py +0 -0
  409. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/trafilatura.py +0 -0
  410. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/trello.py +0 -0
  411. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/twilio.py +0 -0
  412. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/user_control_flow.py +0 -0
  413. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/valyu.py +0 -0
  414. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/visualization.py +0 -0
  415. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/webbrowser.py +0 -0
  416. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/webex.py +0 -0
  417. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/website.py +0 -0
  418. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/webtools.py +0 -0
  419. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/whatsapp.py +0 -0
  420. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/wikipedia.py +0 -0
  421. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/x.py +0 -0
  422. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/yfinance.py +0 -0
  423. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/youtube.py +0 -0
  424. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/zendesk.py +0 -0
  425. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/zep.py +0 -0
  426. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/tools/zoom.py +0 -0
  427. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/__init__.py +0 -0
  428. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/audio.py +0 -0
  429. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/certs.py +0 -0
  430. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/code_execution.py +0 -0
  431. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/common.py +0 -0
  432. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/dttm.py +0 -0
  433. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/enum.py +0 -0
  434. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/env.py +0 -0
  435. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/events.py +0 -0
  436. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/format_str.py +0 -0
  437. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/functions.py +0 -0
  438. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/http.py +0 -0
  439. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/json_schema.py +0 -0
  440. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/knowledge.py +0 -0
  441. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/location.py +0 -0
  442. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/media.py +0 -0
  443. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/merge_dict.py +0 -0
  444. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/message.py +0 -0
  445. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/__init__.py +0 -0
  446. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/ai_foundry.py +0 -0
  447. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/aws_claude.py +0 -0
  448. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/cohere.py +0 -0
  449. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/llama.py +0 -0
  450. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/mistral.py +0 -0
  451. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/openai_responses.py +0 -0
  452. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/schema_utils.py +0 -0
  453. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/models/watsonx.py +0 -0
  454. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/openai.py +0 -0
  455. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/pickle.py +0 -0
  456. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/pprint.py +0 -0
  457. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/print_response/__init__.py +0 -0
  458. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/print_response/agent.py +0 -0
  459. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/print_response/workflow.py +0 -0
  460. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/prompts.py +0 -0
  461. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/reasoning.py +0 -0
  462. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/response.py +0 -0
  463. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/response_iterator.py +0 -0
  464. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/safe_formatter.py +0 -0
  465. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/shell.py +0 -0
  466. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/string.py +0 -0
  467. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/team.py +0 -0
  468. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/timer.py +0 -0
  469. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/tools.py +0 -0
  470. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/web.py +0 -0
  471. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/whatsapp.py +0 -0
  472. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/utils/yaml_io.py +0 -0
  473. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/__init__.py +0 -0
  474. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/base.py +0 -0
  475. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/cassandra/__init__.py +0 -0
  476. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/cassandra/cassandra.py +0 -0
  477. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  478. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/cassandra/index.py +0 -0
  479. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/chroma/__init__.py +0 -0
  480. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/chroma/chromadb.py +0 -0
  481. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/__init__.py +0 -0
  482. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  483. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/index.py +0 -0
  484. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/couchbase/__init__.py +0 -0
  485. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/couchbase/couchbase.py +0 -0
  486. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/distance.py +0 -0
  487. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/lancedb/__init__.py +0 -0
  488. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/lancedb/lance_db.py +0 -0
  489. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/langchaindb/__init__.py +0 -0
  490. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/langchaindb/langchaindb.py +0 -0
  491. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/lightrag/__init__.py +0 -0
  492. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/lightrag/lightrag.py +0 -0
  493. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/llamaindex/__init__.py +0 -0
  494. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
  495. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/milvus/__init__.py +0 -0
  496. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/milvus/milvus.py +0 -0
  497. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/mongodb/__init__.py +0 -0
  498. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/mongodb/mongodb.py +0 -0
  499. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pgvector/__init__.py +0 -0
  500. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pgvector/index.py +0 -0
  501. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pgvector/pgvector.py +0 -0
  502. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pineconedb/__init__.py +0 -0
  503. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  504. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/qdrant/__init__.py +0 -0
  505. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/qdrant/qdrant.py +0 -0
  506. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/search.py +0 -0
  507. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/singlestore/__init__.py +0 -0
  508. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/singlestore/index.py +0 -0
  509. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/singlestore/singlestore.py +0 -0
  510. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/surrealdb/__init__.py +0 -0
  511. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  512. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/upstashdb/__init__.py +0 -0
  513. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  514. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/weaviate/__init__.py +0 -0
  515. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/weaviate/index.py +0 -0
  516. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/vectordb/weaviate/weaviate.py +0 -0
  517. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/__init__.py +0 -0
  518. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/condition.py +0 -0
  519. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/loop.py +0 -0
  520. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/parallel.py +0 -0
  521. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/router.py +0 -0
  522. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/step.py +0 -0
  523. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/steps.py +0 -0
  524. {agno-2.0.0a1 → agno-2.0.0rc2}/agno/workflow/types.py +0 -0
  525. {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/dependency_links.txt +0 -0
  526. {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/requires.txt +0 -0
  527. {agno-2.0.0a1 → agno-2.0.0rc2}/agno.egg-info/top_level.txt +0 -0
  528. {agno-2.0.0a1 → agno-2.0.0rc2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.0.0a1
3
+ Version: 2.0.0rc2
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
@@ -23,7 +23,7 @@ from typing import (
23
23
  get_args,
24
24
  overload,
25
25
  )
26
- from uuid import NAMESPACE_DNS, uuid4, uuid5
26
+ from uuid import uuid4
27
27
 
28
28
  from pydantic import BaseModel
29
29
 
@@ -39,6 +39,7 @@ from agno.models.response import ModelResponse, ModelResponseEvent, ToolExecutio
39
39
  from agno.reasoning.step import NextAction, ReasoningStep, ReasoningSteps
40
40
  from agno.run.agent import (
41
41
  RunEvent,
42
+ RunInput,
42
43
  RunOutput,
43
44
  RunOutputEvent,
44
45
  )
@@ -128,10 +129,10 @@ class Agent:
128
129
  session_id: Optional[str] = None
129
130
  # Default session state (stored in the database to persist across runs)
130
131
  session_state: Optional[Dict[str, Any]] = None
131
- # If True, the agent can update the session state
132
- enable_agentic_state: bool = False
133
- # If True, add the session state to the user prompt
132
+ # Set to True to add the session_state to the context
134
133
  add_session_state_to_context: bool = False
134
+ # Set to True to give the agent tools to update the session_state dynamically
135
+ enable_agentic_state: bool = False
135
136
  # If True, cache the current Agent session in memory for faster access
136
137
  cache_session: bool = False
137
138
 
@@ -222,6 +223,10 @@ class Agent:
222
223
  update_knowledge: bool = False
223
224
  # Add a tool that allows the Model to get the tool call history.
224
225
  read_tool_call_history: bool = False
226
+ # If False, media (images, videos, audio, files) is only available to tools and not sent to the LLM
227
+ send_media_to_model: bool = True
228
+ # If True, store media in run output
229
+ store_media: bool = True
225
230
 
226
231
  # --- System message settings ---
227
232
  # Provide the system message as a string or function
@@ -316,8 +321,6 @@ class Agent:
316
321
  # --- If this Agent is part of a workflow ---
317
322
  # Optional workflow ID. Indicates this agent is part of a workflow.
318
323
  workflow_id: Optional[str] = None
319
- # Set when this agent is part of a workflow.
320
- workflow_session_id: Optional[str] = None
321
324
 
322
325
  # Metadata stored with this agent
323
326
  metadata: Optional[Dict[str, Any]] = None
@@ -340,7 +343,6 @@ class Agent:
340
343
  id: Optional[str] = None,
341
344
  introduction: Optional[str] = None,
342
345
  user_id: Optional[str] = None,
343
- app_id: Optional[str] = None,
344
346
  session_id: Optional[str] = None,
345
347
  session_state: Optional[Dict[str, Any]] = None,
346
348
  add_session_state_to_context: bool = False,
@@ -360,6 +362,7 @@ class Agent:
360
362
  session_summary_manager: Optional[SessionSummaryManager] = None,
361
363
  add_history_to_context: bool = False,
362
364
  num_history_runs: int = 3,
365
+ store_media: bool = True,
363
366
  knowledge: Optional[Knowledge] = None,
364
367
  knowledge_filters: Optional[Dict[str, Any]] = None,
365
368
  enable_agentic_knowledge_filters: Optional[bool] = None,
@@ -380,6 +383,7 @@ class Agent:
380
383
  search_knowledge: bool = True,
381
384
  update_knowledge: bool = False,
382
385
  read_tool_call_history: bool = False,
386
+ send_media_to_model: bool = True,
383
387
  system_message: Optional[Union[str, Callable, Message]] = None,
384
388
  system_message_role: str = "system",
385
389
  build_context: bool = True,
@@ -422,7 +426,6 @@ class Agent:
422
426
  self.id = id
423
427
  self.introduction = introduction
424
428
  self.user_id = user_id
425
- self.app_id = app_id
426
429
 
427
430
  self.session_id = session_id
428
431
  self.session_state = session_state
@@ -450,6 +453,8 @@ class Agent:
450
453
  self.add_history_to_context = add_history_to_context
451
454
  self.num_history_runs = num_history_runs
452
455
 
456
+ self.store_media = store_media
457
+
453
458
  self.knowledge = knowledge
454
459
  self.knowledge_filters = knowledge_filters
455
460
  self.enable_agentic_knowledge_filters = enable_agentic_knowledge_filters
@@ -474,7 +479,7 @@ class Agent:
474
479
  self.search_knowledge = search_knowledge
475
480
  self.update_knowledge = update_knowledge
476
481
  self.read_tool_call_history = read_tool_call_history
477
-
482
+ self.send_media_to_model = send_media_to_model
478
483
  self.system_message = system_message
479
484
  self.system_message_role = system_message_role
480
485
  self.build_context = build_context
@@ -539,7 +544,7 @@ class Agent:
539
544
  def set_id(self) -> None:
540
545
  if self.id is None:
541
546
  if self.name is not None:
542
- self.id = str(uuid5(NAMESPACE_DNS, self.name))
547
+ self.id = self.name.lower().replace(" ", "-")
543
548
  else:
544
549
  self.id = str(uuid4())
545
550
 
@@ -584,6 +589,15 @@ class Agent:
584
589
  if isinstance(input, Message):
585
590
  input = input.content # type: ignore
586
591
 
592
+ # If input is a string, convert it to a dict
593
+ if isinstance(input, str):
594
+ import json
595
+
596
+ try:
597
+ input = json.loads(input)
598
+ except Exception as e:
599
+ raise ValueError(f"Failed to parse input. Is it a valid JSON string?: {e}")
600
+
587
601
  # Case 1: Message is already a BaseModel instance
588
602
  if isinstance(input, BaseModel):
589
603
  if isinstance(input, self.input_schema):
@@ -760,6 +774,11 @@ class Agent:
760
774
  # 3. Update the RunOutput with the model response
761
775
  self._update_run_response(model_response=model_response, run_response=run_response, run_messages=run_messages)
762
776
 
777
+ if self.store_media:
778
+ self._store_media(run_response, model_response)
779
+ else:
780
+ self._scrub_media_from_run_output(run_response)
781
+
763
782
  # We should break out of the run function
764
783
  if any(tool_call.is_paused for tool_call in run_response.tools or []):
765
784
  return self._handle_agent_run_paused(
@@ -1059,6 +1078,15 @@ class Agent:
1059
1078
  # Initialize the Agent
1060
1079
  self.initialize_agent(debug_mode=debug_mode)
1061
1080
 
1081
+ image_artifacts, video_artifacts, audio_artifacts = self._convert_media_to_artifacts(
1082
+ images=images, videos=videos, audios=audio
1083
+ )
1084
+
1085
+ # Create RunInput to capture the original user input
1086
+ run_input = RunInput(
1087
+ input_content=input, images=image_artifacts, videos=video_artifacts, audios=audio_artifacts, files=files
1088
+ )
1089
+
1062
1090
  # Read existing session from database
1063
1091
  agent_session = self._read_or_create_session(session_id=session_id, user_id=user_id)
1064
1092
  self._update_metadata(session=agent_session)
@@ -1128,6 +1156,7 @@ class Agent:
1128
1156
  agent_id=self.id,
1129
1157
  agent_name=self.name,
1130
1158
  metadata=metadata,
1159
+ input=run_input,
1131
1160
  )
1132
1161
 
1133
1162
  run_response.model = self.model.id if self.model is not None else None
@@ -1305,6 +1334,11 @@ class Agent:
1305
1334
  # 3. Update the RunOutput with the model response
1306
1335
  self._update_run_response(model_response=model_response, run_response=run_response, run_messages=run_messages)
1307
1336
 
1337
+ if self.store_media:
1338
+ self._store_media(run_response, model_response)
1339
+ else:
1340
+ self._scrub_media_from_run_output(run_response)
1341
+
1308
1342
  # We should break out of the run function
1309
1343
  if any(tool_call.is_paused for tool_call in run_response.tools or []):
1310
1344
  return self._handle_agent_run_paused(
@@ -1613,6 +1647,15 @@ class Agent:
1613
1647
  # Initialize the Agent
1614
1648
  self.initialize_agent(debug_mode=debug_mode)
1615
1649
 
1650
+ image_artifacts, video_artifacts, audio_artifacts = self._convert_media_to_artifacts(
1651
+ images=images, videos=videos, audios=audio
1652
+ )
1653
+
1654
+ # Create RunInput to capture the original user input
1655
+ run_input = RunInput(
1656
+ input_content=input, images=image_artifacts, videos=video_artifacts, audios=audio_artifacts, files=files
1657
+ )
1658
+
1616
1659
  # Read existing session from storage
1617
1660
  agent_session = self._read_or_create_session(session_id=session_id, user_id=user_id)
1618
1661
  self._update_metadata(session=agent_session)
@@ -1679,6 +1722,7 @@ class Agent:
1679
1722
  agent_id=self.id,
1680
1723
  agent_name=self.name,
1681
1724
  metadata=metadata,
1725
+ input=run_input,
1682
1726
  )
1683
1727
 
1684
1728
  run_response.model = self.model.id if self.model is not None else None
@@ -2942,6 +2986,21 @@ class Agent:
2942
2986
  _t.requires_user_input = False
2943
2987
  _t.answered = True
2944
2988
 
2989
+ def _store_media(self, run_response: RunOutput, model_response: ModelResponse):
2990
+ """Store media from model response in run_response for persistence"""
2991
+ # Handle generated media fields from ModelResponse (generated media)
2992
+ if model_response.images is not None:
2993
+ for image in model_response.images:
2994
+ self._add_image(image, run_response) # Generated images go to run_response.images
2995
+
2996
+ if model_response.videos is not None:
2997
+ for video in model_response.videos:
2998
+ self._add_video(video, run_response) # Generated videos go to run_response.videos
2999
+
3000
+ if model_response.audios is not None:
3001
+ for audio in model_response.audios:
3002
+ self._add_audio(audio, run_response) # Generated audio go to run_response.audio
3003
+
2945
3004
  def _update_run_response(self, model_response: ModelResponse, run_response: RunOutput, run_messages: RunMessages):
2946
3005
  # Handle structured outputs
2947
3006
  if self.output_schema is not None and model_response.parsed is not None:
@@ -2984,19 +3043,6 @@ class Agent:
2984
3043
  run_response=run_response, tool_name=tool_name, tool_args=tool_args
2985
3044
  )
2986
3045
 
2987
- # Handle unified media fields from ModelResponse
2988
- if model_response.images is not None:
2989
- for image in model_response.images:
2990
- self._add_image(image, run_response)
2991
-
2992
- if model_response.videos is not None:
2993
- for video in model_response.videos:
2994
- self._add_video(video, run_response)
2995
-
2996
- if model_response.audios is not None:
2997
- for audio in model_response.audios:
2998
- self._add_audio(audio, run_response)
2999
-
3000
3046
  # Update the run_response audio with the model response audio
3001
3047
  if model_response.audio is not None:
3002
3048
  run_response.response_audio = model_response.audio
@@ -3190,6 +3236,12 @@ class Agent:
3190
3236
  if isinstance(model_response_event, tuple(get_args(RunOutputEvent))) or isinstance(
3191
3237
  model_response_event, tuple(get_args(TeamRunOutputEvent))
3192
3238
  ):
3239
+ if model_response_event.event == RunEvent.custom_event: # type: ignore
3240
+ model_response_event.agent_id = self.id # type: ignore
3241
+ model_response_event.agent_name = self.name # type: ignore
3242
+ model_response_event.session_id = session.session_id # type: ignore
3243
+ model_response_event.run_id = run_response.run_id # type: ignore
3244
+
3193
3245
  # We just bubble the event up
3194
3246
  yield self._handle_event(model_response_event, run_response) # type: ignore
3195
3247
  else:
@@ -3704,6 +3756,209 @@ class Agent:
3704
3756
 
3705
3757
  return agent_tools
3706
3758
 
3759
+ def _collect_joint_images(
3760
+ self,
3761
+ run_input: Optional[RunInput] = None,
3762
+ session: Optional[AgentSession] = None,
3763
+ ) -> Optional[Sequence[Image]]:
3764
+ """Collect images from input, session history, and current run response."""
3765
+ joint_images = []
3766
+
3767
+ # 1. Add images from current input
3768
+ if run_input and run_input.images:
3769
+ for artifact in run_input.images:
3770
+ try:
3771
+ if artifact.url:
3772
+ joint_images.append(Image(url=artifact.url))
3773
+ elif artifact.content:
3774
+ joint_images.append(Image(content=artifact.content))
3775
+ except Exception as e:
3776
+ log_warning(f"Error converting ImageArtifact to Image: {e}")
3777
+ continue
3778
+ log_debug(f"Added {len(run_input.images)} input images to joint list")
3779
+
3780
+ # 2. Add images from session history (from both input and generated sources)
3781
+ try:
3782
+ if session and session.runs:
3783
+ for historical_run in session.runs:
3784
+ # Add generated images from previous runs
3785
+ if historical_run.images:
3786
+ for artifact in historical_run.images:
3787
+ try:
3788
+ if artifact.url:
3789
+ joint_images.append(Image(url=artifact.url))
3790
+ elif artifact.content:
3791
+ joint_images.append(Image(content=artifact.content))
3792
+ except Exception as e:
3793
+ log_warning(f"Error converting historical ImageArtifact to Image: {e}")
3794
+ continue
3795
+ log_debug(
3796
+ f"Added {len(historical_run.images)} generated images from historical run {historical_run.run_id}"
3797
+ )
3798
+
3799
+ # Add input images from previous runs
3800
+ if historical_run.input and historical_run.input.images:
3801
+ for artifact in historical_run.input.images:
3802
+ try:
3803
+ if artifact.url:
3804
+ joint_images.append(Image(url=artifact.url))
3805
+ elif artifact.content:
3806
+ joint_images.append(Image(content=artifact.content))
3807
+ except Exception as e:
3808
+ log_warning(f"Error converting input ImageArtifact to Image: {e}")
3809
+ continue
3810
+ log_debug(
3811
+ f"Added {len(historical_run.input.images)} input images from historical run {historical_run.run_id}"
3812
+ )
3813
+ except Exception as e:
3814
+ log_debug(f"Could not access session history for images: {e}")
3815
+
3816
+ if joint_images:
3817
+ log_debug(f"Images Available to Model: {len(joint_images)} images")
3818
+ return joint_images if joint_images else None
3819
+
3820
+ def _collect_joint_videos(
3821
+ self,
3822
+ run_input: Optional[RunInput] = None,
3823
+ session: Optional[AgentSession] = None,
3824
+ ) -> Optional[Sequence[Video]]:
3825
+ """Collect videos from input, session history, and current run response."""
3826
+ joint_videos = []
3827
+
3828
+ # 1. Add videos from current input
3829
+ if run_input and run_input.videos:
3830
+ for artifact in run_input.videos:
3831
+ try:
3832
+ if artifact.url:
3833
+ joint_videos.append(Video(url=artifact.url))
3834
+ elif artifact.content:
3835
+ joint_videos.append(Video(content=artifact.content))
3836
+ except Exception as e:
3837
+ log_warning(f"Error converting VideoArtifact to Video: {e}")
3838
+ continue
3839
+ log_debug(f"Added {len(run_input.videos)} input videos to joint list")
3840
+
3841
+ # 2. Add videos from session history (from both input and generated sources)
3842
+ try:
3843
+ if session and session.runs:
3844
+ for historical_run in session.runs:
3845
+ # Add generated videos from previous runs
3846
+ if historical_run.videos:
3847
+ for artifact in historical_run.videos:
3848
+ try:
3849
+ if artifact.url:
3850
+ joint_videos.append(Video(url=artifact.url))
3851
+ elif artifact.content:
3852
+ joint_videos.append(Video(content=artifact.content))
3853
+ except Exception as e:
3854
+ log_warning(f"Error converting historical VideoArtifact to Video: {e}")
3855
+ continue
3856
+ log_debug(
3857
+ f"Added {len(historical_run.videos)} generated videos from historical run {historical_run.run_id}"
3858
+ )
3859
+
3860
+ # Add input videos from previous runs
3861
+ if historical_run.input and historical_run.input.videos:
3862
+ for artifact in historical_run.input.videos:
3863
+ try:
3864
+ if artifact.url:
3865
+ joint_videos.append(Video(url=artifact.url))
3866
+ elif artifact.content:
3867
+ joint_videos.append(Video(content=artifact.content))
3868
+ except Exception as e:
3869
+ log_warning(f"Error converting input VideoArtifact to Video: {e}")
3870
+ continue
3871
+ log_debug(
3872
+ f"Added {len(historical_run.input.videos)} input videos from historical run {historical_run.run_id}"
3873
+ )
3874
+ except Exception as e:
3875
+ log_debug(f"Could not access session history for videos: {e}")
3876
+
3877
+ if joint_videos:
3878
+ log_debug(f"Videos Available to Model: {len(joint_videos)} videos")
3879
+ return joint_videos if joint_videos else None
3880
+
3881
+ def _collect_joint_audios(
3882
+ self,
3883
+ run_input: Optional[RunInput] = None,
3884
+ session: Optional[AgentSession] = None,
3885
+ ) -> Optional[Sequence[Audio]]:
3886
+ """Collect audios from input, session history, and current run response."""
3887
+ joint_audios = []
3888
+
3889
+ # 1. Add audios from current input
3890
+ if run_input and run_input.audios:
3891
+ for artifact in run_input.audios:
3892
+ try:
3893
+ if artifact.url:
3894
+ joint_audios.append(Audio(url=artifact.url))
3895
+ elif artifact.base64_audio:
3896
+ joint_audios.append(Audio(content=artifact.base64_audio))
3897
+ except Exception as e:
3898
+ log_warning(f"Error converting AudioArtifact to Audio: {e}")
3899
+ continue
3900
+ log_debug(f"Added {len(run_input.audios)} input audios to joint list")
3901
+
3902
+ # 2. Add audios from session history (from both input and generated sources)
3903
+ try:
3904
+ if session and session.runs:
3905
+ for historical_run in session.runs:
3906
+ # Add generated audios from previous runs
3907
+ if historical_run.audio:
3908
+ for artifact in historical_run.audio:
3909
+ try:
3910
+ if artifact.url:
3911
+ joint_audios.append(Audio(url=artifact.url))
3912
+ elif artifact.base64_audio:
3913
+ joint_audios.append(Audio(content=artifact.base64_audio))
3914
+ except Exception as e:
3915
+ log_warning(f"Error converting historical AudioArtifact to Audio: {e}")
3916
+ continue
3917
+ log_debug(
3918
+ f"Added {len(historical_run.audio)} generated audios from historical run {historical_run.run_id}"
3919
+ )
3920
+
3921
+ # Add input audios from previous runs
3922
+ if historical_run.input and historical_run.input.audios:
3923
+ for artifact in historical_run.input.audios:
3924
+ try:
3925
+ if artifact.url:
3926
+ joint_audios.append(Audio(url=artifact.url))
3927
+ elif artifact.base64_audio:
3928
+ joint_audios.append(Audio(content=artifact.base64_audio))
3929
+ except Exception as e:
3930
+ log_warning(f"Error converting input AudioArtifact to Audio: {e}")
3931
+ continue
3932
+ log_debug(
3933
+ f"Added {len(historical_run.input.audios)} input audios from historical run {historical_run.run_id}"
3934
+ )
3935
+ except Exception as e:
3936
+ log_debug(f"Could not access session history for audios: {e}")
3937
+
3938
+ if joint_audios:
3939
+ log_debug(f"Audios Available to Model: {len(joint_audios)} audios")
3940
+ return joint_audios if joint_audios else None
3941
+
3942
+ def _collect_joint_files(
3943
+ self,
3944
+ run_input: Optional[RunInput] = None,
3945
+ ) -> Optional[Sequence[File]]:
3946
+ """Collect files from input and session history."""
3947
+ from agno.utils.log import log_debug
3948
+
3949
+ joint_files: List[File] = []
3950
+
3951
+ # 1. Add files from current input
3952
+ if run_input and run_input.files:
3953
+ joint_files.extend(run_input.files)
3954
+
3955
+ # TODO: Files aren't stored in session history yet and dont have a FileArtifact
3956
+
3957
+ if joint_files:
3958
+ log_debug(f"Files Available to Model: {len(joint_files)} files")
3959
+
3960
+ return joint_files if joint_files else None
3961
+
3707
3962
  def _determine_tools_for_model(
3708
3963
  self,
3709
3964
  model: Model,
@@ -3802,8 +4057,27 @@ class Agent:
3802
4057
 
3803
4058
  # Update the session state for the functions
3804
4059
  if self._functions_for_model:
4060
+ from inspect import signature
4061
+
4062
+ # Check if any functions need media before collecting
4063
+ needs_media = any(
4064
+ any(param in signature(func.entrypoint).parameters for param in ["images", "videos", "audios", "files"])
4065
+ for func in self._functions_for_model.values()
4066
+ if func.entrypoint is not None
4067
+ )
4068
+
4069
+ # Only collect media if functions actually need them
4070
+ joint_images = self._collect_joint_images(run_response.input, session) if needs_media else None
4071
+ joint_files = self._collect_joint_files(run_response.input) if needs_media else None
4072
+ joint_audios = self._collect_joint_audios(run_response.input, session) if needs_media else None
4073
+ joint_videos = self._collect_joint_videos(run_response.input, session) if needs_media else None
4074
+
3805
4075
  for func in self._functions_for_model.values():
3806
4076
  func._session_state = session_state
4077
+ func._images = joint_images
4078
+ func._files = joint_files
4079
+ func._audios = joint_audios
4080
+ func._videos = joint_videos
3807
4081
 
3808
4082
  def _model_should_return_structured_output(self):
3809
4083
  self.model = cast(Model, self.model)
@@ -4102,7 +4376,7 @@ class Agent:
4102
4376
 
4103
4377
  return agent_session
4104
4378
 
4105
- log_warning(f"AgentSession {session_id_to_load} not found in db")
4379
+ log_debug(f"AgentSession {session_id_to_load} not found in db")
4106
4380
  return None
4107
4381
 
4108
4382
  def save_session(self, session: AgentSession) -> None:
@@ -4656,10 +4930,10 @@ class Agent:
4656
4930
  return Message(
4657
4931
  role=self.user_message_role,
4658
4932
  content=input,
4659
- images=images,
4660
- audio=audio,
4661
- videos=videos,
4662
- files=files,
4933
+ images=None if not self.send_media_to_model else images,
4934
+ audio=None if not self.send_media_to_model else audio,
4935
+ videos=None if not self.send_media_to_model else videos,
4936
+ files=None if not self.send_media_to_model else files,
4663
4937
  **kwargs,
4664
4938
  )
4665
4939
  # 2. Build the user message for the Agent
@@ -4669,10 +4943,10 @@ class Agent:
4669
4943
  return Message(
4670
4944
  role=self.user_message_role,
4671
4945
  content="",
4672
- images=images,
4673
- audio=audio,
4674
- videos=videos,
4675
- files=files,
4946
+ images=None if not self.send_media_to_model else images,
4947
+ audio=None if not self.send_media_to_model else audio,
4948
+ videos=None if not self.send_media_to_model else videos,
4949
+ files=None if not self.send_media_to_model else files,
4676
4950
  **kwargs,
4677
4951
  )
4678
4952
  else:
@@ -4691,10 +4965,10 @@ class Agent:
4691
4965
  return Message(
4692
4966
  role=self.user_message_role,
4693
4967
  content=message_content,
4694
- images=images,
4695
- audio=audio,
4696
- videos=videos,
4697
- files=files,
4968
+ images=None if not self.send_media_to_model else images,
4969
+ audio=None if not self.send_media_to_model else audio,
4970
+ videos=None if not self.send_media_to_model else videos,
4971
+ files=None if not self.send_media_to_model else files,
4698
4972
  **kwargs,
4699
4973
  )
4700
4974
 
@@ -4785,10 +5059,10 @@ class Agent:
4785
5059
  return Message(
4786
5060
  role=self.user_message_role,
4787
5061
  content=user_msg_content,
4788
- audio=audio,
4789
- images=images,
4790
- videos=videos,
4791
- files=files,
5062
+ audio=None if not self.send_media_to_model else audio,
5063
+ images=None if not self.send_media_to_model else images,
5064
+ videos=None if not self.send_media_to_model else videos,
5065
+ files=None if not self.send_media_to_model else files,
4792
5066
  **kwargs,
4793
5067
  )
4794
5068
 
@@ -4836,7 +5110,7 @@ class Agent:
4836
5110
  )
4837
5111
  """
4838
5112
 
4839
- # Initialize the RunMessages object
5113
+ # Initialize the RunMessages object (no media here - that's in RunInput now)
4840
5114
  run_messages = RunMessages()
4841
5115
 
4842
5116
  # 1. Add system message to run_messages
@@ -6578,6 +6852,7 @@ class Agent:
6578
6852
 
6579
6853
  if self.output_schema is not None:
6580
6854
  markdown = False
6855
+ markdown = False
6581
6856
 
6582
6857
  if stream is None:
6583
6858
  stream = self.stream or False
@@ -6851,6 +7126,106 @@ class Agent:
6851
7126
 
6852
7127
  return effective_filters
6853
7128
 
7129
+ def _scrub_media_from_run_output(self, run_response: RunOutput) -> None:
7130
+ """
7131
+ Completely remove all media from RunOutput when store_media=False.
7132
+ This includes media in input, output artifacts, and all messages.
7133
+ """
7134
+ # 1. Scrub RunInput media
7135
+ if run_response.input is not None:
7136
+ run_response.input.images = []
7137
+ run_response.input.videos = []
7138
+ run_response.input.audios = []
7139
+ run_response.input.files = []
7140
+
7141
+ # 2. RunOutput artifact media are skipped since we don't store them when store_media=False
7142
+
7143
+ # 3. Scrub media from all messages
7144
+ if run_response.messages:
7145
+ for message in run_response.messages:
7146
+ self._scrub_media_from_message(message)
7147
+
7148
+ # 4. Scrub media from additional_input messages if any
7149
+ if run_response.additional_input:
7150
+ for message in run_response.additional_input:
7151
+ self._scrub_media_from_message(message)
7152
+
7153
+ # 5. Scrub media from reasoning_messages if any
7154
+ if run_response.reasoning_messages:
7155
+ for message in run_response.reasoning_messages:
7156
+ self._scrub_media_from_message(message)
7157
+
7158
+ def _scrub_media_from_message(self, message: Message) -> None:
7159
+ """Remove all media from a Message object."""
7160
+ # Input media
7161
+ message.images = None
7162
+ message.videos = None
7163
+ message.audio = None
7164
+ message.files = None
7165
+
7166
+ # Output media
7167
+ message.audio_output = None
7168
+ message.image_output = None
7169
+ message.video_output = None
7170
+
7171
+ def _convert_media_to_artifacts(
7172
+ self,
7173
+ images: Optional[Sequence[Image]] = None,
7174
+ videos: Optional[Sequence[Video]] = None,
7175
+ audios: Optional[Sequence[Audio]] = None,
7176
+ ) -> tuple:
7177
+ """Convert raw Image/Video/Audio objects to ImageArtifact/VideoArtifact/AudioArtifact objects."""
7178
+ from uuid import uuid4
7179
+
7180
+ from agno.media import AudioArtifact, ImageArtifact, VideoArtifact
7181
+
7182
+ image_artifacts = None
7183
+ if images:
7184
+ image_artifacts = []
7185
+ for img in images:
7186
+ try:
7187
+ artifact_id = img.id if hasattr(img, "id") and img.id else str(uuid4())
7188
+
7189
+ if img.url:
7190
+ image_artifacts.append(ImageArtifact(id=artifact_id, url=img.url))
7191
+ elif img.content:
7192
+ image_artifacts.append(ImageArtifact(id=artifact_id, content=img.content))
7193
+ except Exception as e:
7194
+ log_warning(f"Error creating ImageArtifact: {e}")
7195
+ continue
7196
+
7197
+ video_artifacts = None
7198
+ if videos:
7199
+ video_artifacts = []
7200
+ for vid in videos:
7201
+ try:
7202
+ artifact_id = vid.id if hasattr(vid, "id") and vid.id else str(uuid4())
7203
+
7204
+ if vid.url:
7205
+ video_artifacts.append(VideoArtifact(id=artifact_id, url=vid.url))
7206
+ elif vid.content:
7207
+ video_artifacts.append(VideoArtifact(id=artifact_id, content=vid.content))
7208
+ except Exception as e:
7209
+ log_warning(f"Error creating VideoArtifact: {e}")
7210
+ continue
7211
+
7212
+ audio_artifacts = None
7213
+ if audios:
7214
+ audio_artifacts = []
7215
+ for aud in audios:
7216
+ try:
7217
+ artifact_id = aud.id if hasattr(aud, "id") and aud.id else str(uuid4())
7218
+
7219
+ if aud.url:
7220
+ audio_artifacts.append(AudioArtifact(id=artifact_id, url=aud.url))
7221
+ elif aud.content:
7222
+ audio_artifacts.append(AudioArtifact(id=artifact_id, content=aud.content))
7223
+ except Exception as e:
7224
+ log_warning(f"Error creating AudioArtifact: {e}")
7225
+ continue
7226
+
7227
+ return image_artifacts, video_artifacts, audio_artifacts
7228
+
6854
7229
  def cli_app(
6855
7230
  self,
6856
7231
  input: Optional[str] = None,