agno 2.0.0rc1__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 (527) hide show
  1. {agno-2.0.0rc1 → agno-2.0.0rc2}/PKG-INFO +1 -1
  2. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/agent/agent.py +32 -14
  3. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/mongo/mongo.py +8 -3
  4. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/eval/accuracy.py +12 -5
  5. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/strategy.py +14 -14
  6. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/knowledge.py +156 -120
  7. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/arxiv_reader.py +5 -5
  8. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/csv_reader.py +6 -77
  9. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/docx_reader.py +5 -5
  10. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/firecrawl_reader.py +5 -5
  11. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/json_reader.py +5 -5
  12. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/markdown_reader.py +31 -9
  13. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/pdf_reader.py +10 -123
  14. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/reader_factory.py +65 -72
  15. agno-2.0.0rc2/agno/knowledge/reader/s3_reader.py +101 -0
  16. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/text_reader.py +5 -5
  17. agno-2.0.0rc2/agno/knowledge/reader/url_reader.py +128 -0
  18. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/web_search_reader.py +6 -29
  19. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/website_reader.py +5 -5
  20. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/wikipedia_reader.py +5 -5
  21. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/youtube_reader.py +6 -6
  22. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/utils.py +10 -10
  23. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/aws/bedrock.py +3 -7
  24. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/base.py +37 -6
  25. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/app.py +32 -24
  26. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/mcp.py +39 -59
  27. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/router.py +547 -16
  28. agno-2.0.0rc2/agno/os/routers/evals/evals.py +393 -0
  29. agno-2.0.0rc2/agno/os/routers/knowledge/knowledge.py +850 -0
  30. agno-2.0.0rc2/agno/os/routers/memory/memory.py +410 -0
  31. agno-2.0.0rc2/agno/os/routers/metrics/metrics.py +178 -0
  32. agno-2.0.0rc2/agno/os/routers/session/session.py +536 -0
  33. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/schema.py +55 -2
  34. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/run/agent.py +9 -0
  35. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/run/team.py +93 -2
  36. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/run/workflow.py +25 -12
  37. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/team/team.py +861 -1051
  38. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/mcp.py +1 -2
  39. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/log.py +52 -2
  40. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/mcp.py +55 -3
  41. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/claude.py +0 -8
  42. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/print_response/team.py +177 -73
  43. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/streamlit.py +27 -0
  44. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/workflow.py +9 -0
  45. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno.egg-info/PKG-INFO +1 -1
  46. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno.egg-info/SOURCES.txt +0 -1
  47. {agno-2.0.0rc1 → agno-2.0.0rc2}/pyproject.toml +1 -1
  48. agno-2.0.0rc1/agno/knowledge/reader/gcs_reader.py +0 -67
  49. agno-2.0.0rc1/agno/knowledge/reader/s3_reader.py +0 -171
  50. agno-2.0.0rc1/agno/knowledge/reader/url_reader.py +0 -84
  51. agno-2.0.0rc1/agno/os/routers/evals/evals.py +0 -208
  52. agno-2.0.0rc1/agno/os/routers/knowledge/knowledge.py +0 -436
  53. agno-2.0.0rc1/agno/os/routers/memory/memory.py +0 -188
  54. agno-2.0.0rc1/agno/os/routers/metrics/metrics.py +0 -60
  55. agno-2.0.0rc1/agno/os/routers/session/session.py +0 -168
  56. {agno-2.0.0rc1 → agno-2.0.0rc2}/LICENSE +0 -0
  57. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/__init__.py +0 -0
  58. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/agent/__init__.py +0 -0
  59. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/__init__.py +0 -0
  60. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/agent.py +0 -0
  61. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/api.py +0 -0
  62. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/evals.py +0 -0
  63. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/os.py +0 -0
  64. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/routes.py +0 -0
  65. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/schemas/__init__.py +0 -0
  66. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/schemas/agent.py +0 -0
  67. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/schemas/evals.py +0 -0
  68. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/schemas/os.py +0 -0
  69. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/schemas/response.py +0 -0
  70. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/schemas/team.py +0 -0
  71. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/schemas/utils.py +0 -0
  72. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/schemas/workflows.py +0 -0
  73. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/settings.py +0 -0
  74. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/team.py +0 -0
  75. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/api/workflow.py +0 -0
  76. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/cloud/aws/base.py +0 -0
  77. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/cloud/aws/s3/__init__.py +0 -0
  78. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/cloud/aws/s3/api_client.py +0 -0
  79. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/cloud/aws/s3/bucket.py +0 -0
  80. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/cloud/aws/s3/object.py +0 -0
  81. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/__init__.py +0 -0
  82. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/base.py +0 -0
  83. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/dynamo/__init__.py +0 -0
  84. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/dynamo/dynamo.py +0 -0
  85. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/dynamo/schemas.py +0 -0
  86. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/dynamo/utils.py +0 -0
  87. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/firestore/__init__.py +0 -0
  88. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/firestore/firestore.py +0 -0
  89. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/firestore/schemas.py +0 -0
  90. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/firestore/utils.py +0 -0
  91. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/gcs_json/__init__.py +0 -0
  92. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/gcs_json/gcs_json_db.py +0 -0
  93. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/gcs_json/utils.py +0 -0
  94. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/in_memory/__init__.py +0 -0
  95. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/in_memory/in_memory_db.py +0 -0
  96. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/in_memory/utils.py +0 -0
  97. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/json/__init__.py +0 -0
  98. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/json/json_db.py +0 -0
  99. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/json/utils.py +0 -0
  100. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/migrations/__init__.py +0 -0
  101. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/migrations/v1_to_v2.py +0 -0
  102. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/mongo/__init__.py +0 -0
  103. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/mongo/schemas.py +0 -0
  104. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/mongo/utils.py +0 -0
  105. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/mysql/__init__.py +0 -0
  106. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/mysql/mysql.py +0 -0
  107. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/mysql/schemas.py +0 -0
  108. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/mysql/utils.py +0 -0
  109. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/postgres/__init__.py +0 -0
  110. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/postgres/postgres.py +0 -0
  111. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/postgres/schemas.py +0 -0
  112. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/postgres/utils.py +0 -0
  113. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/redis/__init__.py +0 -0
  114. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/redis/redis.py +0 -0
  115. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/redis/schemas.py +0 -0
  116. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/redis/utils.py +0 -0
  117. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/schemas/__init__.py +0 -0
  118. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/schemas/evals.py +0 -0
  119. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/schemas/knowledge.py +0 -0
  120. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/schemas/memory.py +0 -0
  121. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/schemas/metrics.py +0 -0
  122. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/singlestore/__init__.py +0 -0
  123. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/singlestore/schemas.py +0 -0
  124. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/singlestore/singlestore.py +0 -0
  125. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/singlestore/utils.py +0 -0
  126. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/sqlite/__init__.py +0 -0
  127. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/sqlite/schemas.py +0 -0
  128. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/sqlite/sqlite.py +0 -0
  129. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/sqlite/utils.py +0 -0
  130. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/db/utils.py +0 -0
  131. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/debug.py +0 -0
  132. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/eval/__init__.py +0 -0
  133. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/eval/performance.py +0 -0
  134. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/eval/reliability.py +0 -0
  135. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/eval/utils.py +0 -0
  136. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/exceptions.py +0 -0
  137. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/integrations/__init__.py +0 -0
  138. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/integrations/discord/__init__.py +0 -0
  139. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/integrations/discord/client.py +0 -0
  140. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/__init__.py +0 -0
  141. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/__init__.py +0 -0
  142. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/agentic.py +0 -0
  143. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/document.py +0 -0
  144. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/fixed.py +0 -0
  145. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/markdown.py +0 -0
  146. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/recursive.py +0 -0
  147. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/row.py +0 -0
  148. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/chunking/semantic.py +0 -0
  149. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/content.py +0 -0
  150. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/document/__init__.py +0 -0
  151. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/document/base.py +0 -0
  152. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/__init__.py +0 -0
  153. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/aws_bedrock.py +0 -0
  154. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/azure_openai.py +0 -0
  155. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/base.py +0 -0
  156. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/cohere.py +0 -0
  157. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/fastembed.py +0 -0
  158. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/fireworks.py +0 -0
  159. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/google.py +0 -0
  160. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/huggingface.py +0 -0
  161. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/jina.py +0 -0
  162. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/langdb.py +0 -0
  163. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/mistral.py +0 -0
  164. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/nebius.py +0 -0
  165. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/ollama.py +0 -0
  166. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/openai.py +0 -0
  167. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/sentence_transformer.py +0 -0
  168. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/together.py +0 -0
  169. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/embedder/voyageai.py +0 -0
  170. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/__init__.py +0 -0
  171. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reader/base.py +0 -0
  172. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/remote_content/__init__.py +0 -0
  173. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/remote_content/remote_content.py +0 -0
  174. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reranker/__init__.py +0 -0
  175. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reranker/base.py +0 -0
  176. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reranker/cohere.py +0 -0
  177. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reranker/infinity.py +0 -0
  178. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  179. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/knowledge/types.py +0 -0
  180. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/media.py +0 -0
  181. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/memory/__init__.py +0 -0
  182. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/memory/manager.py +0 -0
  183. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/__init__.py +0 -0
  184. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/aimlapi/__init__.py +0 -0
  185. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/aimlapi/aimlapi.py +0 -0
  186. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/anthropic/__init__.py +0 -0
  187. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/anthropic/claude.py +0 -0
  188. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/aws/__init__.py +0 -0
  189. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/aws/claude.py +0 -0
  190. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/azure/__init__.py +0 -0
  191. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/azure/ai_foundry.py +0 -0
  192. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/azure/openai_chat.py +0 -0
  193. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/cerebras/__init__.py +0 -0
  194. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/cerebras/cerebras.py +0 -0
  195. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/cerebras/cerebras_openai.py +0 -0
  196. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/cohere/__init__.py +0 -0
  197. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/cohere/chat.py +0 -0
  198. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/dashscope/__init__.py +0 -0
  199. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/dashscope/dashscope.py +0 -0
  200. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/deepinfra/__init__.py +0 -0
  201. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/deepinfra/deepinfra.py +0 -0
  202. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/deepseek/__init__.py +0 -0
  203. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/deepseek/deepseek.py +0 -0
  204. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/defaults.py +0 -0
  205. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/fireworks/__init__.py +0 -0
  206. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/fireworks/fireworks.py +0 -0
  207. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/google/__init__.py +0 -0
  208. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/google/gemini.py +0 -0
  209. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/groq/__init__.py +0 -0
  210. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/groq/groq.py +0 -0
  211. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/huggingface/__init__.py +0 -0
  212. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/huggingface/huggingface.py +0 -0
  213. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/ibm/__init__.py +0 -0
  214. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/ibm/watsonx.py +0 -0
  215. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/internlm/__init__.py +0 -0
  216. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/internlm/internlm.py +0 -0
  217. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/langdb/__init__.py +0 -0
  218. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/langdb/langdb.py +0 -0
  219. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/litellm/__init__.py +0 -0
  220. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/litellm/chat.py +0 -0
  221. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/litellm/litellm_openai.py +0 -0
  222. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/lmstudio/__init__.py +0 -0
  223. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/lmstudio/lmstudio.py +0 -0
  224. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/message.py +0 -0
  225. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/meta/__init__.py +0 -0
  226. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/meta/llama.py +0 -0
  227. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/meta/llama_openai.py +0 -0
  228. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/metrics.py +0 -0
  229. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/mistral/__init__.py +0 -0
  230. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/mistral/mistral.py +0 -0
  231. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/nebius/__init__.py +0 -0
  232. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/nebius/nebius.py +0 -0
  233. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/nvidia/__init__.py +0 -0
  234. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/nvidia/nvidia.py +0 -0
  235. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/ollama/__init__.py +0 -0
  236. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/ollama/chat.py +0 -0
  237. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/openai/__init__.py +0 -0
  238. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/openai/chat.py +0 -0
  239. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/openai/like.py +0 -0
  240. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/openai/responses.py +0 -0
  241. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/openrouter/__init__.py +0 -0
  242. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/openrouter/openrouter.py +0 -0
  243. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/perplexity/__init__.py +0 -0
  244. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/perplexity/perplexity.py +0 -0
  245. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/portkey/__init__.py +0 -0
  246. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/portkey/portkey.py +0 -0
  247. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/response.py +0 -0
  248. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/sambanova/__init__.py +0 -0
  249. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/sambanova/sambanova.py +0 -0
  250. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/together/__init__.py +0 -0
  251. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/together/together.py +0 -0
  252. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/utils.py +0 -0
  253. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/vercel/__init__.py +0 -0
  254. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/vercel/v0.py +0 -0
  255. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/vllm/__init__.py +0 -0
  256. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/vllm/vllm.py +0 -0
  257. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/xai/__init__.py +0 -0
  258. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/models/xai/xai.py +0 -0
  259. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/__init__.py +0 -0
  260. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/auth.py +0 -0
  261. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/config.py +0 -0
  262. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/__init__.py +0 -0
  263. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/agui/__init__.py +0 -0
  264. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/agui/agui.py +0 -0
  265. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/agui/router.py +0 -0
  266. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/agui/utils.py +0 -0
  267. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/base.py +0 -0
  268. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/slack/__init__.py +0 -0
  269. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/slack/router.py +0 -0
  270. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/slack/security.py +0 -0
  271. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/slack/slack.py +0 -0
  272. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  273. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/router.py +0 -0
  274. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/security.py +0 -0
  275. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
  276. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/__init__.py +0 -0
  277. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/evals/__init__.py +0 -0
  278. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/evals/schemas.py +0 -0
  279. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/evals/utils.py +0 -0
  280. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/knowledge/__init__.py +0 -0
  281. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/knowledge/schemas.py +0 -0
  282. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/memory/__init__.py +0 -0
  283. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/memory/schemas.py +0 -0
  284. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/metrics/__init__.py +0 -0
  285. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/metrics/schemas.py +0 -0
  286. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/routers/session/__init__.py +0 -0
  287. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/settings.py +0 -0
  288. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/os/utils.py +0 -0
  289. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/py.typed +0 -0
  290. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/__init__.py +0 -0
  291. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/azure_ai_foundry.py +0 -0
  292. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/deepseek.py +0 -0
  293. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/default.py +0 -0
  294. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/groq.py +0 -0
  295. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/helpers.py +0 -0
  296. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/ollama.py +0 -0
  297. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/openai.py +0 -0
  298. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/reasoning/step.py +0 -0
  299. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/run/__init__.py +0 -0
  300. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/run/base.py +0 -0
  301. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/run/cancel.py +0 -0
  302. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/run/messages.py +0 -0
  303. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/session/__init__.py +0 -0
  304. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/session/agent.py +0 -0
  305. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/session/summary.py +0 -0
  306. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/session/team.py +0 -0
  307. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/session/workflow.py +0 -0
  308. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/team/__init__.py +0 -0
  309. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/__init__.py +0 -0
  310. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/agentql.py +0 -0
  311. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/airflow.py +0 -0
  312. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/api.py +0 -0
  313. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/apify.py +0 -0
  314. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/arxiv.py +0 -0
  315. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/aws_lambda.py +0 -0
  316. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/aws_ses.py +0 -0
  317. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/baidusearch.py +0 -0
  318. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/bitbucket.py +0 -0
  319. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/brandfetch.py +0 -0
  320. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/bravesearch.py +0 -0
  321. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/brightdata.py +0 -0
  322. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/browserbase.py +0 -0
  323. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/calcom.py +0 -0
  324. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/calculator.py +0 -0
  325. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/cartesia.py +0 -0
  326. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/clickup.py +0 -0
  327. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/confluence.py +0 -0
  328. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/crawl4ai.py +0 -0
  329. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/csv_toolkit.py +0 -0
  330. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/dalle.py +0 -0
  331. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/daytona.py +0 -0
  332. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/decorator.py +0 -0
  333. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/desi_vocal.py +0 -0
  334. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/discord.py +0 -0
  335. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/docker.py +0 -0
  336. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/duckdb.py +0 -0
  337. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/duckduckgo.py +0 -0
  338. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/e2b.py +0 -0
  339. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/eleven_labs.py +0 -0
  340. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/email.py +0 -0
  341. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/evm.py +0 -0
  342. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/exa.py +0 -0
  343. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/fal.py +0 -0
  344. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/file.py +0 -0
  345. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/financial_datasets.py +0 -0
  346. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/firecrawl.py +0 -0
  347. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/function.py +0 -0
  348. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/giphy.py +0 -0
  349. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/github.py +0 -0
  350. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/gmail.py +0 -0
  351. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/google_bigquery.py +0 -0
  352. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/google_maps.py +0 -0
  353. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/googlecalendar.py +0 -0
  354. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/googlesearch.py +0 -0
  355. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/googlesheets.py +0 -0
  356. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/hackernews.py +0 -0
  357. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/jina.py +0 -0
  358. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/jira.py +0 -0
  359. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/knowledge.py +0 -0
  360. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/linear.py +0 -0
  361. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/linkup.py +0 -0
  362. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/local_file_system.py +0 -0
  363. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/lumalab.py +0 -0
  364. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/mem0.py +0 -0
  365. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/memori.py +0 -0
  366. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/mlx_transcribe.py +0 -0
  367. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/models/__init__.py +0 -0
  368. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/models/azure_openai.py +0 -0
  369. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/models/gemini.py +0 -0
  370. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/models/groq.py +0 -0
  371. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/models/morph.py +0 -0
  372. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/models/nebius.py +0 -0
  373. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/models_labs.py +0 -0
  374. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/moviepy_video.py +0 -0
  375. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/neo4j.py +0 -0
  376. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/newspaper.py +0 -0
  377. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/newspaper4k.py +0 -0
  378. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/openai.py +0 -0
  379. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/openbb.py +0 -0
  380. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/opencv.py +0 -0
  381. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/openweather.py +0 -0
  382. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/oxylabs.py +0 -0
  383. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/pandas.py +0 -0
  384. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/postgres.py +0 -0
  385. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/pubmed.py +0 -0
  386. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/python.py +0 -0
  387. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/reasoning.py +0 -0
  388. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/reddit.py +0 -0
  389. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/replicate.py +0 -0
  390. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/resend.py +0 -0
  391. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/scrapegraph.py +0 -0
  392. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/searxng.py +0 -0
  393. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/serpapi.py +0 -0
  394. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/serper.py +0 -0
  395. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/shell.py +0 -0
  396. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/slack.py +0 -0
  397. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/sleep.py +0 -0
  398. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/spider.py +0 -0
  399. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/sql.py +0 -0
  400. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/streamlit/__init__.py +0 -0
  401. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/streamlit/components.py +0 -0
  402. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/tavily.py +0 -0
  403. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/telegram.py +0 -0
  404. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/todoist.py +0 -0
  405. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/tool_registry.py +0 -0
  406. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/toolkit.py +0 -0
  407. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/trafilatura.py +0 -0
  408. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/trello.py +0 -0
  409. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/twilio.py +0 -0
  410. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/user_control_flow.py +0 -0
  411. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/valyu.py +0 -0
  412. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/visualization.py +0 -0
  413. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/webbrowser.py +0 -0
  414. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/webex.py +0 -0
  415. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/website.py +0 -0
  416. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/webtools.py +0 -0
  417. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/whatsapp.py +0 -0
  418. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/wikipedia.py +0 -0
  419. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/x.py +0 -0
  420. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/yfinance.py +0 -0
  421. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/youtube.py +0 -0
  422. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/zendesk.py +0 -0
  423. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/zep.py +0 -0
  424. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/tools/zoom.py +0 -0
  425. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/__init__.py +0 -0
  426. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/audio.py +0 -0
  427. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/certs.py +0 -0
  428. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/code_execution.py +0 -0
  429. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/common.py +0 -0
  430. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/dttm.py +0 -0
  431. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/enum.py +0 -0
  432. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/env.py +0 -0
  433. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/events.py +0 -0
  434. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/format_str.py +0 -0
  435. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/functions.py +0 -0
  436. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/gemini.py +0 -0
  437. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/http.py +0 -0
  438. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/json_schema.py +0 -0
  439. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/knowledge.py +0 -0
  440. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/location.py +0 -0
  441. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/media.py +0 -0
  442. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/merge_dict.py +0 -0
  443. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/message.py +0 -0
  444. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/__init__.py +0 -0
  445. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/ai_foundry.py +0 -0
  446. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/aws_claude.py +0 -0
  447. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/cohere.py +0 -0
  448. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/llama.py +0 -0
  449. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/mistral.py +0 -0
  450. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/openai_responses.py +0 -0
  451. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/schema_utils.py +0 -0
  452. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/models/watsonx.py +0 -0
  453. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/openai.py +0 -0
  454. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/pickle.py +0 -0
  455. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/pprint.py +0 -0
  456. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/print_response/__init__.py +0 -0
  457. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/print_response/agent.py +0 -0
  458. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/print_response/workflow.py +0 -0
  459. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/prompts.py +0 -0
  460. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/reasoning.py +0 -0
  461. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/response.py +0 -0
  462. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/response_iterator.py +0 -0
  463. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/safe_formatter.py +0 -0
  464. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/shell.py +0 -0
  465. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/string.py +0 -0
  466. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/team.py +0 -0
  467. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/timer.py +0 -0
  468. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/tools.py +0 -0
  469. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/web.py +0 -0
  470. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/whatsapp.py +0 -0
  471. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/utils/yaml_io.py +0 -0
  472. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/__init__.py +0 -0
  473. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/base.py +0 -0
  474. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/cassandra/__init__.py +0 -0
  475. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/cassandra/cassandra.py +0 -0
  476. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  477. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/cassandra/index.py +0 -0
  478. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/chroma/__init__.py +0 -0
  479. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/chroma/chromadb.py +0 -0
  480. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/__init__.py +0 -0
  481. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  482. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/clickhouse/index.py +0 -0
  483. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/couchbase/__init__.py +0 -0
  484. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/couchbase/couchbase.py +0 -0
  485. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/distance.py +0 -0
  486. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/lancedb/__init__.py +0 -0
  487. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/lancedb/lance_db.py +0 -0
  488. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/langchaindb/__init__.py +0 -0
  489. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/langchaindb/langchaindb.py +0 -0
  490. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/lightrag/__init__.py +0 -0
  491. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/lightrag/lightrag.py +0 -0
  492. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/llamaindex/__init__.py +0 -0
  493. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
  494. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/milvus/__init__.py +0 -0
  495. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/milvus/milvus.py +0 -0
  496. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/mongodb/__init__.py +0 -0
  497. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/mongodb/mongodb.py +0 -0
  498. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/pgvector/__init__.py +0 -0
  499. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/pgvector/index.py +0 -0
  500. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/pgvector/pgvector.py +0 -0
  501. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/pineconedb/__init__.py +0 -0
  502. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  503. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/qdrant/__init__.py +0 -0
  504. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/qdrant/qdrant.py +0 -0
  505. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/search.py +0 -0
  506. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/singlestore/__init__.py +0 -0
  507. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/singlestore/index.py +0 -0
  508. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/singlestore/singlestore.py +0 -0
  509. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/surrealdb/__init__.py +0 -0
  510. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  511. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/upstashdb/__init__.py +0 -0
  512. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  513. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/weaviate/__init__.py +0 -0
  514. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/weaviate/index.py +0 -0
  515. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/vectordb/weaviate/weaviate.py +0 -0
  516. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/__init__.py +0 -0
  517. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/condition.py +0 -0
  518. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/loop.py +0 -0
  519. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/parallel.py +0 -0
  520. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/router.py +0 -0
  521. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/step.py +0 -0
  522. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/steps.py +0 -0
  523. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno/workflow/types.py +0 -0
  524. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno.egg-info/dependency_links.txt +0 -0
  525. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno.egg-info/requires.txt +0 -0
  526. {agno-2.0.0rc1 → agno-2.0.0rc2}/agno.egg-info/top_level.txt +0 -0
  527. {agno-2.0.0rc1 → 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.0rc1
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
@@ -129,10 +129,10 @@ class Agent:
129
129
  session_id: Optional[str] = None
130
130
  # Default session state (stored in the database to persist across runs)
131
131
  session_state: Optional[Dict[str, Any]] = None
132
- # If True, the agent can update the session state
133
- enable_agentic_state: bool = False
134
- # If True, add the session state to the user prompt
132
+ # Set to True to add the session_state to the context
135
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
136
136
  # If True, cache the current Agent session in memory for faster access
137
137
  cache_session: bool = False
138
138
 
@@ -321,8 +321,6 @@ class Agent:
321
321
  # --- If this Agent is part of a workflow ---
322
322
  # Optional workflow ID. Indicates this agent is part of a workflow.
323
323
  workflow_id: Optional[str] = None
324
- # Set when this agent is part of a workflow.
325
- workflow_session_id: Optional[str] = None
326
324
 
327
325
  # Metadata stored with this agent
328
326
  metadata: Optional[Dict[str, Any]] = None
@@ -345,7 +343,6 @@ class Agent:
345
343
  id: Optional[str] = None,
346
344
  introduction: Optional[str] = None,
347
345
  user_id: Optional[str] = None,
348
- app_id: Optional[str] = None,
349
346
  session_id: Optional[str] = None,
350
347
  session_state: Optional[Dict[str, Any]] = None,
351
348
  add_session_state_to_context: bool = False,
@@ -429,7 +426,6 @@ class Agent:
429
426
  self.id = id
430
427
  self.introduction = introduction
431
428
  self.user_id = user_id
432
- self.app_id = app_id
433
429
 
434
430
  self.session_id = session_id
435
431
  self.session_state = session_state
@@ -593,6 +589,15 @@ class Agent:
593
589
  if isinstance(input, Message):
594
590
  input = input.content # type: ignore
595
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
+
596
601
  # Case 1: Message is already a BaseModel instance
597
602
  if isinstance(input, BaseModel):
598
603
  if isinstance(input, self.input_schema):
@@ -3231,6 +3236,12 @@ class Agent:
3231
3236
  if isinstance(model_response_event, tuple(get_args(RunOutputEvent))) or isinstance(
3232
3237
  model_response_event, tuple(get_args(TeamRunOutputEvent))
3233
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
+
3234
3245
  # We just bubble the event up
3235
3246
  yield self._handle_event(model_response_event, run_response) # type: ignore
3236
3247
  else:
@@ -4365,7 +4376,7 @@ class Agent:
4365
4376
 
4366
4377
  return agent_session
4367
4378
 
4368
- 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")
4369
4380
  return None
4370
4381
 
4371
4382
  def save_session(self, session: AgentSession) -> None:
@@ -6841,6 +6852,7 @@ class Agent:
6841
6852
 
6842
6853
  if self.output_schema is not None:
6843
6854
  markdown = False
6855
+ markdown = False
6844
6856
 
6845
6857
  if stream is None:
6846
6858
  stream = self.stream or False
@@ -7172,10 +7184,12 @@ class Agent:
7172
7184
  image_artifacts = []
7173
7185
  for img in images:
7174
7186
  try:
7187
+ artifact_id = img.id if hasattr(img, "id") and img.id else str(uuid4())
7188
+
7175
7189
  if img.url:
7176
- image_artifacts.append(ImageArtifact(id=str(uuid4()), url=img.url))
7190
+ image_artifacts.append(ImageArtifact(id=artifact_id, url=img.url))
7177
7191
  elif img.content:
7178
- image_artifacts.append(ImageArtifact(id=str(uuid4()), content=img.content))
7192
+ image_artifacts.append(ImageArtifact(id=artifact_id, content=img.content))
7179
7193
  except Exception as e:
7180
7194
  log_warning(f"Error creating ImageArtifact: {e}")
7181
7195
  continue
@@ -7185,10 +7199,12 @@ class Agent:
7185
7199
  video_artifacts = []
7186
7200
  for vid in videos:
7187
7201
  try:
7202
+ artifact_id = vid.id if hasattr(vid, "id") and vid.id else str(uuid4())
7203
+
7188
7204
  if vid.url:
7189
- video_artifacts.append(VideoArtifact(id=str(uuid4()), url=vid.url))
7205
+ video_artifacts.append(VideoArtifact(id=artifact_id, url=vid.url))
7190
7206
  elif vid.content:
7191
- video_artifacts.append(VideoArtifact(id=str(uuid4()), content=vid.content))
7207
+ video_artifacts.append(VideoArtifact(id=artifact_id, content=vid.content))
7192
7208
  except Exception as e:
7193
7209
  log_warning(f"Error creating VideoArtifact: {e}")
7194
7210
  continue
@@ -7198,10 +7214,12 @@ class Agent:
7198
7214
  audio_artifacts = []
7199
7215
  for aud in audios:
7200
7216
  try:
7217
+ artifact_id = aud.id if hasattr(aud, "id") and aud.id else str(uuid4())
7218
+
7201
7219
  if aud.url:
7202
- audio_artifacts.append(AudioArtifact(id=str(uuid4()), url=aud.url))
7220
+ audio_artifacts.append(AudioArtifact(id=artifact_id, url=aud.url))
7203
7221
  elif aud.content:
7204
- audio_artifacts.append(AudioArtifact(id=str(uuid4()), content=aud.content))
7222
+ audio_artifacts.append(AudioArtifact(id=artifact_id, content=aud.content))
7205
7223
  except Exception as e:
7206
7224
  log_warning(f"Error creating AudioArtifact: {e}")
7207
7225
  continue
@@ -672,7 +672,9 @@ class MongoDb(BaseDb):
672
672
  if result is None or not deserialize:
673
673
  return result
674
674
 
675
- return UserMemory.from_dict(result)
675
+ # Remove MongoDB's _id field before creating UserMemory object
676
+ result_filtered = {k: v for k, v in result.items() if k != "_id"}
677
+ return UserMemory.from_dict(result_filtered)
676
678
 
677
679
  except Exception as e:
678
680
  log_error(f"Exception reading from collection: {e}")
@@ -750,7 +752,8 @@ class MongoDb(BaseDb):
750
752
  if not deserialize:
751
753
  return records, total_count
752
754
 
753
- return [UserMemory.from_dict(record) for record in records]
755
+ # Remove MongoDB's _id field before creating UserMemory objects
756
+ return [UserMemory.from_dict({k: v for k, v in record.items() if k != "_id"}) for record in records]
754
757
 
755
758
  except Exception as e:
756
759
  log_error(f"Exception reading from collection: {e}")
@@ -861,7 +864,9 @@ class MongoDb(BaseDb):
861
864
  if not deserialize:
862
865
  return update_doc
863
866
 
864
- return UserMemory.from_dict(update_doc)
867
+ # Remove MongoDB's _id field before creating UserMemory object
868
+ update_doc_filtered = {k: v for k, v in update_doc.items() if k != "_id"}
869
+ return UserMemory.from_dict(update_doc_filtered)
865
870
 
866
871
  except Exception as e:
867
872
  log_error(f"Exception upserting user memory: {e}")
@@ -97,11 +97,18 @@ class AccuracyResult:
97
97
  title_justify="center",
98
98
  )
99
99
  summary_table.add_row("Number of Runs", f"{len(self.results)}")
100
- summary_table.add_row("Average Score", f"{self.avg_score:.2f}")
101
- summary_table.add_row("Mean Score", f"{self.mean_score:.2f}")
102
- summary_table.add_row("Minimum Score", f"{self.min_score:.2f}")
103
- summary_table.add_row("Maximum Score", f"{self.max_score:.2f}")
104
- summary_table.add_row("Standard Deviation", f"{self.std_dev_score:.2f}")
100
+
101
+ if self.avg_score is not None:
102
+ summary_table.add_row("Average Score", f"{self.avg_score:.2f}")
103
+ if self.mean_score is not None:
104
+ summary_table.add_row("Mean Score", f"{self.mean_score:.2f}")
105
+ if self.min_score is not None:
106
+ summary_table.add_row("Minimum Score", f"{self.min_score:.2f}")
107
+ if self.max_score is not None:
108
+ summary_table.add_row("Maximum Score", f"{self.max_score:.2f}")
109
+ if self.std_dev_score is not None:
110
+ summary_table.add_row("Standard Deviation", f"{self.std_dev_score:.2f}")
111
+
105
112
  console.print(summary_table)
106
113
 
107
114
  def print_results(self, console: Optional["Console"] = None):
@@ -35,13 +35,13 @@ class ChunkingStrategy(ABC):
35
35
  class ChunkingStrategyType(str, Enum):
36
36
  """Enumeration of available chunking strategies."""
37
37
 
38
- AGENTIC_CHUNKING = "AgenticChunking"
39
- DOCUMENT_CHUNKING = "DocumentChunking"
40
- RECURSIVE_CHUNKING = "RecursiveChunking"
41
- SEMANTIC_CHUNKING = "SemanticChunking"
42
- FIXED_SIZE_CHUNKING = "FixedSizeChunking"
43
- ROW_CHUNKING = "RowChunking"
44
- MARKDOWN_CHUNKING = "MarkdownChunking"
38
+ AGENTIC_CHUNKER = "AgenticChunker"
39
+ DOCUMENT_CHUNKER = "DocumentChunker"
40
+ RECURSIVE_CHUNKER = "RecursiveChunker"
41
+ SEMANTIC_CHUNKER = "SemanticChunker"
42
+ FIXED_SIZE_CHUNKER = "FixedSizeChunker"
43
+ ROW_CHUNKER = "RowChunker"
44
+ MARKDOWN_CHUNKER = "MarkdownChunker"
45
45
 
46
46
  @classmethod
47
47
  def from_string(cls, strategy_name: str) -> "ChunkingStrategyType":
@@ -63,13 +63,13 @@ class ChunkingStrategyFactory:
63
63
  def create_strategy(cls, strategy_type: ChunkingStrategyType, **kwargs) -> ChunkingStrategy:
64
64
  """Create an instance of the chunking strategy with the given parameters."""
65
65
  strategy_map = {
66
- ChunkingStrategyType.AGENTIC_CHUNKING: cls._create_agentic_chunking,
67
- ChunkingStrategyType.DOCUMENT_CHUNKING: cls._create_document_chunking,
68
- ChunkingStrategyType.RECURSIVE_CHUNKING: cls._create_recursive_chunking,
69
- ChunkingStrategyType.SEMANTIC_CHUNKING: cls._create_semantic_chunking,
70
- ChunkingStrategyType.FIXED_SIZE_CHUNKING: cls._create_fixed_chunking,
71
- ChunkingStrategyType.ROW_CHUNKING: cls._create_row_chunking,
72
- ChunkingStrategyType.MARKDOWN_CHUNKING: cls._create_markdown_chunking,
66
+ ChunkingStrategyType.AGENTIC_CHUNKER: cls._create_agentic_chunking,
67
+ ChunkingStrategyType.DOCUMENT_CHUNKER: cls._create_document_chunking,
68
+ ChunkingStrategyType.RECURSIVE_CHUNKER: cls._create_recursive_chunking,
69
+ ChunkingStrategyType.SEMANTIC_CHUNKER: cls._create_semantic_chunking,
70
+ ChunkingStrategyType.FIXED_SIZE_CHUNKER: cls._create_fixed_chunking,
71
+ ChunkingStrategyType.ROW_CHUNKER: cls._create_row_chunking,
72
+ ChunkingStrategyType.MARKDOWN_CHUNKER: cls._create_markdown_chunking,
73
73
  }
74
74
  return strategy_map[strategy_type](**kwargs)
75
75
 
@@ -5,16 +5,21 @@ import time
5
5
  from dataclasses import dataclass
6
6
  from enum import Enum
7
7
  from functools import cached_property
8
+ from io import BytesIO
9
+ from os.path import basename
8
10
  from pathlib import Path
9
11
  from typing import Any, Dict, List, Optional, Set, Tuple, Union, cast, overload
10
12
  from uuid import uuid4
11
13
 
14
+ from httpx import AsyncClient
15
+
12
16
  from agno.db.base import BaseDb
13
17
  from agno.db.schemas.knowledge import KnowledgeRow
14
18
  from agno.knowledge.content import Content, ContentAuth, ContentStatus, FileData
15
19
  from agno.knowledge.document import Document
16
20
  from agno.knowledge.reader import Reader, ReaderFactory
17
21
  from agno.knowledge.remote_content.remote_content import GCSContent, RemoteContent, S3Content
22
+ from agno.utils.http import async_fetch_with_retry
18
23
  from agno.utils.log import log_debug, log_error, log_info, log_warning
19
24
  from agno.vectordb import VectorDb
20
25
 
@@ -421,20 +426,31 @@ class Knowledge:
421
426
  upsert: bool,
422
427
  skip_if_exists: bool,
423
428
  ):
429
+ """Load the content in the contextual URL
430
+
431
+ 1. Set content hash
432
+ 2. Validate the URL
433
+ 3. Read the content
434
+ 4. Prepare and insert the content in the vector database
435
+ """
424
436
  log_info(f"Adding content from URL {content.url}")
425
437
  content.file_type = "url"
426
438
 
439
+ if not content.url:
440
+ raise ValueError("No url provided")
441
+
427
442
  if self.vector_db.__class__.__name__ == "LightRag":
428
443
  await self._process_lightrag_content(content, KnowledgeContentOrigin.URL)
429
444
  return
430
445
 
446
+ # 1. Set content hash
431
447
  content.content_hash = self._build_content_hash(content)
432
448
  if self.vector_db and self.vector_db.content_hash_exists(content.content_hash) and skip_if_exists:
433
449
  log_info(f"Content {content.content_hash} already exists, skipping")
434
450
  return
435
451
  self._add_to_contents_db(content)
436
452
 
437
- # Validate URL
453
+ # 2. Validate URL
438
454
  try:
439
455
  from urllib.parse import urlparse
440
456
 
@@ -450,61 +466,47 @@ class Knowledge:
450
466
  self._update_content(content)
451
467
  log_warning(f"Invalid URL: {content.url} - {str(e)}")
452
468
 
453
- # Determine file type from URL
454
- url_path = Path(parsed_url.path) # type: ignore
455
- file_extension = url_path.suffix.lower()
456
- read_documents = []
457
- try:
458
- if content.url.endswith("llms-full.txt") or content.url.endswith("llms.txt"): # type: ignore
459
- log_info("Detected llms, using url reader")
460
- reader = content.reader or self.url_reader
461
- if reader is not None:
462
- # TODO: We will refactor this to eventually pass authorization to all readers
463
- import inspect
469
+ # 3. Fetch and load content
470
+ async with AsyncClient() as client:
471
+ response = await async_fetch_with_retry(content.url, client=client)
472
+ bytes_content = BytesIO(response.content)
464
473
 
465
- read_signature = inspect.signature(reader.read)
466
- if "password" in read_signature.parameters and content.auth and content.auth.password:
467
- read_documents = reader.read(content.url, name=content.name, password=content.auth.password)
468
- else:
469
- read_documents = reader.read(content.url, name=content.name)
470
-
471
- elif file_extension and file_extension is not None:
472
- log_info(f"Detected file type: {file_extension} from URL: {content.url}")
473
- if content.reader:
474
- reader = content.reader
475
- else:
476
- reader = self._select_url_file_reader(file_extension)
477
- if reader is not None:
478
- log_info(f"Selected reader: {reader.__class__.__name__}")
479
- # TODO: We will refactor this to eventually pass authorization to all readers
480
- import inspect
481
-
482
- read_signature = inspect.signature(reader.read)
483
- if "password" in read_signature.parameters and content.auth and content.auth.password:
484
- read_documents = reader.read(content.url, name=content.name, password=content.auth.password)
485
- else:
486
- read_documents = reader.read(content.url, name=content.name)
487
- else:
488
- log_info(f"No reader found for file extension: {file_extension}")
474
+ # 4. Select reader
475
+ # If a reader was provided by the user, use it
476
+ reader = content.reader
477
+ name = content.name
478
+ # Else select based on file extension
479
+ if reader is None:
480
+ url_path = Path(parsed_url.path)
481
+ file_extension = url_path.suffix.lower()
482
+ if file_extension == ".csv":
483
+ name = basename(parsed_url.path) or "data.csv"
484
+ reader = self.csv_reader
485
+ elif file_extension == ".pdf":
486
+ reader = self.pdf_reader
487
+ elif file_extension == ".docx":
488
+ reader = self.docx_reader
489
+ elif file_extension == ".json":
490
+ reader = self.json_reader
491
+ elif file_extension == ".markdown":
492
+ reader = self.markdown_reader
489
493
  else:
490
- log_info(f"No file extension found for URL: {content.url}, determining website type")
491
- if content.reader:
492
- reader = content.reader
493
- else:
494
- reader = self._select_url_reader(content.url) # type: ignore
495
- if reader is not None:
496
- log_info(f"Selected reader: {reader.__class__.__name__}")
497
- # TODO: We will refactor this to eventually pass authorization to all readers
498
- import inspect
494
+ reader = self.text_reader
499
495
 
500
- read_signature = inspect.signature(reader.read)
501
- if "password" in read_signature.parameters and content.auth and content.auth.password:
502
- read_documents = reader.read(content.url, name=content.name, password=content.auth.password)
503
- else:
504
- read_documents = reader.read(content.url, name=content.name)
496
+ # 5. Read content
497
+ try:
498
+ read_documents = []
499
+ if reader is not None:
500
+ # TODO: We will refactor this to eventually pass authorization to all readers
501
+ import inspect
502
+
503
+ read_signature = inspect.signature(reader.read)
504
+ if reader.__class__.__name__ == "YouTubeReader":
505
+ read_documents = reader.read(content.url, name=name)
506
+ elif "password" in read_signature.parameters and content.auth and content.auth.password:
507
+ read_documents = reader.read(bytes_content, name=name, password=content.auth.password)
505
508
  else:
506
- log_info(f"No reader found for URL: {content.url}")
507
-
509
+ read_documents = reader.read(bytes_content, name=name)
508
510
  except Exception as e:
509
511
  log_error(f"Error reading URL: {content.url} - {str(e)}")
510
512
  content.status = ContentStatus.FAILED
@@ -512,13 +514,17 @@ class Knowledge:
512
514
  self._update_content(content)
513
515
  return
514
516
 
517
+ # 6. Chunk documents if needed
518
+ if reader and not reader.chunk:
519
+ read_documents = await reader.chunk_documents_async(read_documents)
520
+
521
+ # 7. Prepare and insert the content in the vector database
515
522
  file_size = 0
516
523
  if read_documents:
517
524
  for read_document in read_documents:
518
525
  if read_document.size:
519
526
  file_size += read_document.size
520
527
  read_document.content_id = content.id
521
-
522
528
  await self._handle_vector_db_insert(content, read_documents, upsert)
523
529
 
524
530
  async def _load_from_content(
@@ -699,21 +705,23 @@ class Knowledge:
699
705
  log_warning(f"Unsupported remote content type: {type(remote_content)}")
700
706
 
701
707
  async def _load_from_s3(self, content: Content, upsert: bool, skip_if_exists: bool):
702
- from agno.aws.resource.s3.object import S3Object # type: ignore
703
-
704
- if content.reader is None:
705
- reader = self.s3_reader
706
- else:
707
- reader = content.reader
708
-
709
- if reader is None:
710
- log_warning("No reader provided for content")
711
- return
708
+ """Load the contextual S3 content.
709
+
710
+ 1. Identify objects to read
711
+ 2. Setup Content object
712
+ 3. Hash content and add it to the contents database
713
+ 4. Select reader
714
+ 5. Fetch and load the content
715
+ 6. Read the content
716
+ 7. Prepare and insert the content in the vector database
717
+ 8. Remove temporary file if needed
718
+ """
719
+ from agno.cloud.aws.s3.object import S3Object
712
720
 
713
721
  remote_content: S3Content = cast(S3Content, content.remote_content)
714
722
 
723
+ # 1. Identify objects to read
715
724
  objects_to_read: List[S3Object] = []
716
-
717
725
  if remote_content.bucket is not None:
718
726
  if remote_content.key is not None:
719
727
  _object = S3Object(bucket_name=remote_content.bucket.name, name=remote_content.key)
@@ -725,10 +733,11 @@ class Knowledge:
725
733
  else:
726
734
  objects_to_read.extend(remote_content.bucket.get_objects())
727
735
 
728
- for object in objects_to_read:
736
+ for s3_object in objects_to_read:
737
+ # 2. Setup Content object
729
738
  id = str(uuid4())
730
739
  content_name = content.name or ""
731
- content_name += "_" + (object.name or "")
740
+ content_name += "_" + (s3_object.name or "")
732
741
  content_entry = Content(
733
742
  id=id,
734
743
  name=content_name,
@@ -738,63 +747,123 @@ class Knowledge:
738
747
  file_type="s3",
739
748
  )
740
749
 
750
+ # 3. Hash content and add it to the contents database
741
751
  content_hash = self._build_content_hash(content_entry)
742
752
  if self.vector_db and self.vector_db.content_hash_exists(content_hash) and skip_if_exists:
743
753
  log_info(f"Content {content_hash} already exists, skipping")
744
754
  continue
745
-
746
755
  self._add_to_contents_db(content_entry)
747
756
 
748
- read_documents = reader.read(content_entry.name, object)
757
+ # 4. Select reader
758
+ reader = content.reader
759
+ if reader is None:
760
+ if s3_object.uri.endswith(".pdf"):
761
+ reader = self.pdf_reader
762
+ elif s3_object.uri.endswith(".csv"):
763
+ reader = self.csv_reader
764
+ elif s3_object.uri.endswith(".docx"):
765
+ reader = self.docx_reader
766
+ elif s3_object.uri.endswith(".json"):
767
+ reader = self.json_reader
768
+ elif s3_object.uri.endswith(".markdown"):
769
+ reader = self.markdown_reader
770
+ else:
771
+ reader = self.text_reader
772
+ reader = cast(Reader, reader)
773
+
774
+ # 5. Fetch and load the content
775
+ temporary_file = None
776
+ obj_name = content_name or s3_object.name.split("/")[-1]
777
+ readable_content: Optional[Union[BytesIO, Path]] = None
778
+ if s3_object.uri.endswith(".pdf"):
779
+ readable_content = BytesIO(s3_object.get_resource().get()["Body"].read())
780
+ else:
781
+ temporary_file = Path("storage").joinpath(obj_name)
782
+ readable_content = temporary_file
783
+ s3_object.download(readable_content) # type: ignore
784
+
785
+ # 6. Read the content
786
+ read_documents = reader.read(readable_content, name=obj_name)
749
787
 
788
+ # 7. Prepare and insert the content in the vector database
750
789
  for read_document in read_documents:
751
790
  read_document.content_id = content.id
752
-
753
791
  await self._handle_vector_db_insert(content_entry, read_documents, upsert)
754
792
 
755
- async def _load_from_gcs(self, content: Content, upsert: bool, skip_if_exists: bool):
756
- if content.reader is None:
757
- reader = self.gcs_reader
758
- else:
759
- reader = content.reader
760
-
761
- if reader is None:
762
- log_warning("No reader provided for content")
763
- return
793
+ # 8. Remove temporary file if needed
794
+ if temporary_file:
795
+ temporary_file.unlink()
764
796
 
797
+ async def _load_from_gcs(self, content: Content, upsert: bool, skip_if_exists: bool):
798
+ """Load the contextual GCS content.
799
+
800
+ 1. Identify objects to read
801
+ 2. Setup Content object
802
+ 3. Hash content and add it to the contents database
803
+ 4. Select reader
804
+ 5. Fetch and load the content
805
+ 6. Read the content
806
+ 7. Prepare and insert the content in the vector database
807
+ """
765
808
  remote_content: GCSContent = cast(GCSContent, content.remote_content)
766
- objects_to_read = []
767
809
 
810
+ # 1. Identify objects to read
811
+ objects_to_read = []
768
812
  if remote_content.blob_name is not None:
769
- objects_to_read.append(remote_content.bucket.blob(remote_content.blob_name))
813
+ objects_to_read.append(remote_content.bucket.blob(remote_content.blob_name)) # type: ignore
770
814
  elif remote_content.prefix is not None:
771
- objects_to_read.extend(remote_content.bucket.list_blobs(prefix=remote_content.prefix))
815
+ objects_to_read.extend(remote_content.bucket.list_blobs(prefix=remote_content.prefix)) # type: ignore
772
816
  else:
773
- objects_to_read.extend(remote_content.bucket.list_blobs())
817
+ objects_to_read.extend(remote_content.bucket.list_blobs()) # type: ignore
774
818
 
775
- for object in objects_to_read:
819
+ for gcs_object in objects_to_read:
820
+ # 2. Setup Content object
776
821
  id = str(uuid4())
822
+ name = (content.name or "content") + "_" + gcs_object.name
777
823
  content_entry = Content(
778
824
  id=id,
779
- name=(content.name or "content") + "_" + object.name,
825
+ name=name,
780
826
  description=content.description,
781
827
  status=ContentStatus.PROCESSING,
782
828
  metadata=content.metadata,
783
829
  file_type="gcs",
784
830
  )
785
831
 
832
+ # 3. Hash content and add it to the contents database
786
833
  content_hash = self._build_content_hash(content_entry)
787
834
  if self.vector_db and self.vector_db.content_hash_exists(content_hash) and skip_if_exists:
788
835
  log_info(f"Content {content_hash} already exists, skipping")
789
836
  continue
790
837
 
838
+ # 4. Add it to the contents database
791
839
  self._add_to_contents_db(content_entry)
792
840
 
793
- read_documents = reader.read(content_entry.name, object)
841
+ # 5. Select reader
842
+ reader = content.reader
843
+ if reader is None:
844
+ if gcs_object.name.endswith(".pdf"):
845
+ reader = self.pdf_reader
846
+ elif gcs_object.name.endswith(".csv"):
847
+ reader = self.csv_reader
848
+ elif gcs_object.name.endswith(".docx"):
849
+ reader = self.docx_reader
850
+ elif gcs_object.name.endswith(".json"):
851
+ reader = self.json_reader
852
+ elif gcs_object.name.endswith(".markdown"):
853
+ reader = self.markdown_reader
854
+ else:
855
+ reader = self.text_reader
856
+ reader = cast(Reader, reader)
857
+
858
+ # 5. Fetch and load the content
859
+ readable_content = BytesIO(gcs_object.download_as_bytes())
860
+
861
+ # 6. Read the content
862
+ read_documents = reader.read(readable_content, name=name)
794
863
 
864
+ # 7. Prepare and insert the content in the vector database
795
865
  for read_document in read_documents:
796
866
  read_document.content_id = content.id
797
-
798
867
  await self._handle_vector_db_insert(content_entry, read_documents, upsert)
799
868
 
800
869
  async def _handle_vector_db_insert(self, content, read_documents, upsert):
@@ -1006,7 +1075,7 @@ class Knowledge:
1006
1075
  elif content_type == KnowledgeContentOrigin.URL:
1007
1076
  log_info(f"Uploading file to LightRAG from URL: {content.url}")
1008
1077
  try:
1009
- reader = self.url_reader
1078
+ reader = content.reader or self.website_reader
1010
1079
  if reader is None:
1011
1080
  log_error("No URL reader available")
1012
1081
  content.status = ContentStatus.FAILED
@@ -1354,14 +1423,6 @@ class Knowledge:
1354
1423
  log_info(f"Selecting reader for extension: {extension}")
1355
1424
  return ReaderFactory.get_reader_for_extension(extension)
1356
1425
 
1357
- def _select_url_reader(self, url: str) -> Reader:
1358
- """Select the appropriate reader for a URL."""
1359
- return ReaderFactory.get_reader_for_url(url)
1360
-
1361
- def _select_url_file_reader(self, extension: str) -> Reader:
1362
- """Select the appropriate reader for a URL file extension."""
1363
- return ReaderFactory.get_reader_for_url_file(extension)
1364
-
1365
1426
  def get_filters(self) -> List[str]:
1366
1427
  return [
1367
1428
  "filter_tag_1",
@@ -1484,32 +1545,7 @@ class Knowledge:
1484
1545
  """Firecrawl reader - lazy loaded via factory."""
1485
1546
  return self._get_reader("firecrawl")
1486
1547
 
1487
- @property
1488
- def url_reader(self) -> Optional[Reader]:
1489
- """URL reader - lazy loaded via factory."""
1490
- return self._get_reader("url")
1491
-
1492
- @property
1493
- def pdf_url_reader(self) -> Optional[Reader]:
1494
- """PDF URL reader - lazy loaded via factory."""
1495
- return self._get_reader("pdf_url")
1496
-
1497
1548
  @property
1498
1549
  def youtube_reader(self) -> Optional[Reader]:
1499
1550
  """YouTube reader - lazy loaded via factory."""
1500
1551
  return self._get_reader("youtube")
1501
-
1502
- @property
1503
- def csv_url_reader(self) -> Optional[Reader]:
1504
- """CSV URL reader - lazy loaded via factory."""
1505
- return self._get_reader("csv_url")
1506
-
1507
- @property
1508
- def s3_reader(self) -> Optional[Reader]:
1509
- """S3 reader - lazy loaded via factory."""
1510
- return self._get_reader("s3")
1511
-
1512
- @property
1513
- def gcs_reader(self) -> Optional[Reader]:
1514
- """GCS reader - lazy loaded via factory."""
1515
- return self._get_reader("gcs")