agno 2.0.5__tar.gz → 2.0.6__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.5 → agno-2.0.6}/PKG-INFO +4 -1
  2. {agno-2.0.5 → agno-2.0.6}/agno/agent/agent.py +53 -17
  3. {agno-2.0.5 → agno-2.0.6}/agno/db/dynamo/dynamo.py +7 -5
  4. {agno-2.0.5 → agno-2.0.6}/agno/db/firestore/firestore.py +4 -2
  5. {agno-2.0.5 → agno-2.0.6}/agno/db/gcs_json/gcs_json_db.py +4 -2
  6. {agno-2.0.5 → agno-2.0.6}/agno/db/json/json_db.py +8 -4
  7. {agno-2.0.5 → agno-2.0.6}/agno/db/mongo/mongo.py +6 -4
  8. {agno-2.0.5 → agno-2.0.6}/agno/db/mysql/mysql.py +2 -1
  9. {agno-2.0.5 → agno-2.0.6}/agno/db/postgres/postgres.py +2 -1
  10. {agno-2.0.5 → agno-2.0.6}/agno/db/redis/redis.py +1 -1
  11. {agno-2.0.5 → agno-2.0.6}/agno/db/singlestore/singlestore.py +2 -2
  12. {agno-2.0.5 → agno-2.0.6}/agno/db/sqlite/sqlite.py +1 -1
  13. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/openai.py +19 -11
  14. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/knowledge.py +4 -3
  15. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/website_reader.py +33 -16
  16. {agno-2.0.5 → agno-2.0.6}/agno/media.py +70 -0
  17. {agno-2.0.5 → agno-2.0.6}/agno/models/aimlapi/aimlapi.py +2 -2
  18. {agno-2.0.5 → agno-2.0.6}/agno/models/base.py +31 -4
  19. {agno-2.0.5 → agno-2.0.6}/agno/models/cerebras/cerebras_openai.py +2 -2
  20. {agno-2.0.5 → agno-2.0.6}/agno/models/deepinfra/deepinfra.py +2 -2
  21. {agno-2.0.5 → agno-2.0.6}/agno/models/deepseek/deepseek.py +2 -2
  22. {agno-2.0.5 → agno-2.0.6}/agno/models/fireworks/fireworks.py +2 -2
  23. {agno-2.0.5 → agno-2.0.6}/agno/models/internlm/internlm.py +2 -2
  24. {agno-2.0.5 → agno-2.0.6}/agno/models/langdb/langdb.py +4 -4
  25. {agno-2.0.5 → agno-2.0.6}/agno/models/litellm/litellm_openai.py +2 -2
  26. {agno-2.0.5 → agno-2.0.6}/agno/models/message.py +26 -0
  27. {agno-2.0.5 → agno-2.0.6}/agno/models/meta/llama_openai.py +2 -2
  28. {agno-2.0.5 → agno-2.0.6}/agno/models/nebius/nebius.py +2 -2
  29. agno-2.0.6/agno/models/nexus/__init__.py +3 -0
  30. agno-2.0.6/agno/models/nexus/nexus.py +25 -0
  31. {agno-2.0.5 → agno-2.0.6}/agno/models/nvidia/nvidia.py +2 -2
  32. {agno-2.0.5 → agno-2.0.6}/agno/models/openrouter/openrouter.py +2 -2
  33. {agno-2.0.5 → agno-2.0.6}/agno/models/perplexity/perplexity.py +2 -2
  34. {agno-2.0.5 → agno-2.0.6}/agno/models/portkey/portkey.py +3 -3
  35. {agno-2.0.5 → agno-2.0.6}/agno/models/response.py +2 -1
  36. {agno-2.0.5 → agno-2.0.6}/agno/models/sambanova/sambanova.py +2 -2
  37. {agno-2.0.5 → agno-2.0.6}/agno/models/together/together.py +2 -2
  38. {agno-2.0.5 → agno-2.0.6}/agno/models/vercel/v0.py +2 -2
  39. {agno-2.0.5 → agno-2.0.6}/agno/models/xai/xai.py +2 -2
  40. {agno-2.0.5 → agno-2.0.6}/agno/os/router.py +3 -1
  41. {agno-2.0.5 → agno-2.0.6}/agno/os/utils.py +1 -1
  42. {agno-2.0.5 → agno-2.0.6}/agno/run/agent.py +16 -0
  43. {agno-2.0.5 → agno-2.0.6}/agno/run/team.py +15 -0
  44. {agno-2.0.5 → agno-2.0.6}/agno/run/workflow.py +10 -0
  45. {agno-2.0.5 → agno-2.0.6}/agno/team/team.py +37 -7
  46. {agno-2.0.5 → agno-2.0.6}/agno/tools/e2b.py +14 -7
  47. agno-2.0.6/agno/tools/file_generation.py +350 -0
  48. {agno-2.0.5 → agno-2.0.6}/agno/tools/function.py +2 -0
  49. {agno-2.0.5 → agno-2.0.6}/agno/utils/gemini.py +24 -4
  50. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/chroma/chromadb.py +66 -25
  51. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/lancedb/lance_db.py +15 -4
  52. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/milvus/milvus.py +6 -0
  53. {agno-2.0.5 → agno-2.0.6}/agno/workflow/workflow.py +4 -0
  54. {agno-2.0.5 → agno-2.0.6}/agno.egg-info/PKG-INFO +4 -1
  55. {agno-2.0.5 → agno-2.0.6}/agno.egg-info/SOURCES.txt +3 -0
  56. {agno-2.0.5 → agno-2.0.6}/agno.egg-info/requires.txt +4 -0
  57. {agno-2.0.5 → agno-2.0.6}/pyproject.toml +4 -1
  58. {agno-2.0.5 → agno-2.0.6}/LICENSE +0 -0
  59. {agno-2.0.5 → agno-2.0.6}/README.md +0 -0
  60. {agno-2.0.5 → agno-2.0.6}/agno/__init__.py +0 -0
  61. {agno-2.0.5 → agno-2.0.6}/agno/agent/__init__.py +0 -0
  62. {agno-2.0.5 → agno-2.0.6}/agno/api/__init__.py +0 -0
  63. {agno-2.0.5 → agno-2.0.6}/agno/api/agent.py +0 -0
  64. {agno-2.0.5 → agno-2.0.6}/agno/api/api.py +0 -0
  65. {agno-2.0.5 → agno-2.0.6}/agno/api/evals.py +0 -0
  66. {agno-2.0.5 → agno-2.0.6}/agno/api/os.py +0 -0
  67. {agno-2.0.5 → agno-2.0.6}/agno/api/routes.py +0 -0
  68. {agno-2.0.5 → agno-2.0.6}/agno/api/schemas/__init__.py +0 -0
  69. {agno-2.0.5 → agno-2.0.6}/agno/api/schemas/agent.py +0 -0
  70. {agno-2.0.5 → agno-2.0.6}/agno/api/schemas/evals.py +0 -0
  71. {agno-2.0.5 → agno-2.0.6}/agno/api/schemas/os.py +0 -0
  72. {agno-2.0.5 → agno-2.0.6}/agno/api/schemas/response.py +0 -0
  73. {agno-2.0.5 → agno-2.0.6}/agno/api/schemas/team.py +0 -0
  74. {agno-2.0.5 → agno-2.0.6}/agno/api/schemas/utils.py +0 -0
  75. {agno-2.0.5 → agno-2.0.6}/agno/api/schemas/workflows.py +0 -0
  76. {agno-2.0.5 → agno-2.0.6}/agno/api/settings.py +0 -0
  77. {agno-2.0.5 → agno-2.0.6}/agno/api/team.py +0 -0
  78. {agno-2.0.5 → agno-2.0.6}/agno/api/workflow.py +0 -0
  79. {agno-2.0.5 → agno-2.0.6}/agno/cloud/aws/base.py +0 -0
  80. {agno-2.0.5 → agno-2.0.6}/agno/cloud/aws/s3/__init__.py +0 -0
  81. {agno-2.0.5 → agno-2.0.6}/agno/cloud/aws/s3/api_client.py +0 -0
  82. {agno-2.0.5 → agno-2.0.6}/agno/cloud/aws/s3/bucket.py +0 -0
  83. {agno-2.0.5 → agno-2.0.6}/agno/cloud/aws/s3/object.py +0 -0
  84. {agno-2.0.5 → agno-2.0.6}/agno/db/__init__.py +0 -0
  85. {agno-2.0.5 → agno-2.0.6}/agno/db/base.py +0 -0
  86. {agno-2.0.5 → agno-2.0.6}/agno/db/dynamo/__init__.py +0 -0
  87. {agno-2.0.5 → agno-2.0.6}/agno/db/dynamo/schemas.py +0 -0
  88. {agno-2.0.5 → agno-2.0.6}/agno/db/dynamo/utils.py +0 -0
  89. {agno-2.0.5 → agno-2.0.6}/agno/db/firestore/__init__.py +0 -0
  90. {agno-2.0.5 → agno-2.0.6}/agno/db/firestore/schemas.py +0 -0
  91. {agno-2.0.5 → agno-2.0.6}/agno/db/firestore/utils.py +0 -0
  92. {agno-2.0.5 → agno-2.0.6}/agno/db/gcs_json/__init__.py +0 -0
  93. {agno-2.0.5 → agno-2.0.6}/agno/db/gcs_json/utils.py +0 -0
  94. {agno-2.0.5 → agno-2.0.6}/agno/db/in_memory/__init__.py +0 -0
  95. {agno-2.0.5 → agno-2.0.6}/agno/db/in_memory/in_memory_db.py +0 -0
  96. {agno-2.0.5 → agno-2.0.6}/agno/db/in_memory/utils.py +0 -0
  97. {agno-2.0.5 → agno-2.0.6}/agno/db/json/__init__.py +0 -0
  98. {agno-2.0.5 → agno-2.0.6}/agno/db/json/utils.py +0 -0
  99. {agno-2.0.5 → agno-2.0.6}/agno/db/migrations/__init__.py +0 -0
  100. {agno-2.0.5 → agno-2.0.6}/agno/db/migrations/v1_to_v2.py +0 -0
  101. {agno-2.0.5 → agno-2.0.6}/agno/db/mongo/__init__.py +0 -0
  102. {agno-2.0.5 → agno-2.0.6}/agno/db/mongo/schemas.py +0 -0
  103. {agno-2.0.5 → agno-2.0.6}/agno/db/mongo/utils.py +0 -0
  104. {agno-2.0.5 → agno-2.0.6}/agno/db/mysql/__init__.py +0 -0
  105. {agno-2.0.5 → agno-2.0.6}/agno/db/mysql/schemas.py +0 -0
  106. {agno-2.0.5 → agno-2.0.6}/agno/db/mysql/utils.py +0 -0
  107. {agno-2.0.5 → agno-2.0.6}/agno/db/postgres/__init__.py +0 -0
  108. {agno-2.0.5 → agno-2.0.6}/agno/db/postgres/schemas.py +0 -0
  109. {agno-2.0.5 → agno-2.0.6}/agno/db/postgres/utils.py +0 -0
  110. {agno-2.0.5 → agno-2.0.6}/agno/db/redis/__init__.py +0 -0
  111. {agno-2.0.5 → agno-2.0.6}/agno/db/redis/schemas.py +0 -0
  112. {agno-2.0.5 → agno-2.0.6}/agno/db/redis/utils.py +0 -0
  113. {agno-2.0.5 → agno-2.0.6}/agno/db/schemas/__init__.py +0 -0
  114. {agno-2.0.5 → agno-2.0.6}/agno/db/schemas/evals.py +0 -0
  115. {agno-2.0.5 → agno-2.0.6}/agno/db/schemas/knowledge.py +0 -0
  116. {agno-2.0.5 → agno-2.0.6}/agno/db/schemas/memory.py +0 -0
  117. {agno-2.0.5 → agno-2.0.6}/agno/db/schemas/metrics.py +0 -0
  118. {agno-2.0.5 → agno-2.0.6}/agno/db/singlestore/__init__.py +0 -0
  119. {agno-2.0.5 → agno-2.0.6}/agno/db/singlestore/schemas.py +0 -0
  120. {agno-2.0.5 → agno-2.0.6}/agno/db/singlestore/utils.py +0 -0
  121. {agno-2.0.5 → agno-2.0.6}/agno/db/sqlite/__init__.py +0 -0
  122. {agno-2.0.5 → agno-2.0.6}/agno/db/sqlite/schemas.py +0 -0
  123. {agno-2.0.5 → agno-2.0.6}/agno/db/sqlite/utils.py +0 -0
  124. {agno-2.0.5 → agno-2.0.6}/agno/db/utils.py +0 -0
  125. {agno-2.0.5 → agno-2.0.6}/agno/debug.py +0 -0
  126. {agno-2.0.5 → agno-2.0.6}/agno/eval/__init__.py +0 -0
  127. {agno-2.0.5 → agno-2.0.6}/agno/eval/accuracy.py +0 -0
  128. {agno-2.0.5 → agno-2.0.6}/agno/eval/performance.py +0 -0
  129. {agno-2.0.5 → agno-2.0.6}/agno/eval/reliability.py +0 -0
  130. {agno-2.0.5 → agno-2.0.6}/agno/eval/utils.py +0 -0
  131. {agno-2.0.5 → agno-2.0.6}/agno/exceptions.py +0 -0
  132. {agno-2.0.5 → agno-2.0.6}/agno/integrations/__init__.py +0 -0
  133. {agno-2.0.5 → agno-2.0.6}/agno/integrations/discord/__init__.py +0 -0
  134. {agno-2.0.5 → agno-2.0.6}/agno/integrations/discord/client.py +0 -0
  135. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/__init__.py +0 -0
  136. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/__init__.py +0 -0
  137. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/agentic.py +0 -0
  138. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/document.py +0 -0
  139. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/fixed.py +0 -0
  140. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/markdown.py +0 -0
  141. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/recursive.py +0 -0
  142. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/row.py +0 -0
  143. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/semantic.py +0 -0
  144. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/chunking/strategy.py +0 -0
  145. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/content.py +0 -0
  146. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/document/__init__.py +0 -0
  147. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/document/base.py +0 -0
  148. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/__init__.py +0 -0
  149. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/aws_bedrock.py +0 -0
  150. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/azure_openai.py +0 -0
  151. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/base.py +0 -0
  152. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/cohere.py +0 -0
  153. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/fastembed.py +0 -0
  154. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/fireworks.py +0 -0
  155. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/google.py +0 -0
  156. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/huggingface.py +0 -0
  157. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/jina.py +0 -0
  158. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/langdb.py +0 -0
  159. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/mistral.py +0 -0
  160. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/nebius.py +0 -0
  161. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/ollama.py +0 -0
  162. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/sentence_transformer.py +0 -0
  163. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/together.py +0 -0
  164. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/embedder/voyageai.py +0 -0
  165. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/__init__.py +0 -0
  166. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/arxiv_reader.py +0 -0
  167. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/base.py +0 -0
  168. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/csv_reader.py +0 -0
  169. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/docx_reader.py +0 -0
  170. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/firecrawl_reader.py +0 -0
  171. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/json_reader.py +0 -0
  172. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/markdown_reader.py +0 -0
  173. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/pdf_reader.py +0 -0
  174. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/reader_factory.py +0 -0
  175. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/s3_reader.py +0 -0
  176. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/text_reader.py +0 -0
  177. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/web_search_reader.py +0 -0
  178. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/wikipedia_reader.py +0 -0
  179. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reader/youtube_reader.py +0 -0
  180. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/remote_content/__init__.py +0 -0
  181. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/remote_content/remote_content.py +0 -0
  182. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reranker/__init__.py +0 -0
  183. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reranker/base.py +0 -0
  184. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reranker/cohere.py +0 -0
  185. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reranker/infinity.py +0 -0
  186. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/reranker/sentence_transformer.py +0 -0
  187. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/types.py +0 -0
  188. {agno-2.0.5 → agno-2.0.6}/agno/knowledge/utils.py +0 -0
  189. {agno-2.0.5 → agno-2.0.6}/agno/memory/__init__.py +0 -0
  190. {agno-2.0.5 → agno-2.0.6}/agno/memory/manager.py +0 -0
  191. {agno-2.0.5 → agno-2.0.6}/agno/models/__init__.py +0 -0
  192. {agno-2.0.5 → agno-2.0.6}/agno/models/aimlapi/__init__.py +0 -0
  193. {agno-2.0.5 → agno-2.0.6}/agno/models/anthropic/__init__.py +0 -0
  194. {agno-2.0.5 → agno-2.0.6}/agno/models/anthropic/claude.py +0 -0
  195. {agno-2.0.5 → agno-2.0.6}/agno/models/aws/__init__.py +0 -0
  196. {agno-2.0.5 → agno-2.0.6}/agno/models/aws/bedrock.py +0 -0
  197. {agno-2.0.5 → agno-2.0.6}/agno/models/aws/claude.py +0 -0
  198. {agno-2.0.5 → agno-2.0.6}/agno/models/azure/__init__.py +0 -0
  199. {agno-2.0.5 → agno-2.0.6}/agno/models/azure/ai_foundry.py +0 -0
  200. {agno-2.0.5 → agno-2.0.6}/agno/models/azure/openai_chat.py +0 -0
  201. {agno-2.0.5 → agno-2.0.6}/agno/models/cerebras/__init__.py +0 -0
  202. {agno-2.0.5 → agno-2.0.6}/agno/models/cerebras/cerebras.py +0 -0
  203. {agno-2.0.5 → agno-2.0.6}/agno/models/cohere/__init__.py +0 -0
  204. {agno-2.0.5 → agno-2.0.6}/agno/models/cohere/chat.py +0 -0
  205. {agno-2.0.5 → agno-2.0.6}/agno/models/dashscope/__init__.py +0 -0
  206. {agno-2.0.5 → agno-2.0.6}/agno/models/dashscope/dashscope.py +0 -0
  207. {agno-2.0.5 → agno-2.0.6}/agno/models/deepinfra/__init__.py +0 -0
  208. {agno-2.0.5 → agno-2.0.6}/agno/models/deepseek/__init__.py +0 -0
  209. {agno-2.0.5 → agno-2.0.6}/agno/models/defaults.py +0 -0
  210. {agno-2.0.5 → agno-2.0.6}/agno/models/fireworks/__init__.py +0 -0
  211. {agno-2.0.5 → agno-2.0.6}/agno/models/google/__init__.py +0 -0
  212. {agno-2.0.5 → agno-2.0.6}/agno/models/google/gemini.py +0 -0
  213. {agno-2.0.5 → agno-2.0.6}/agno/models/groq/__init__.py +0 -0
  214. {agno-2.0.5 → agno-2.0.6}/agno/models/groq/groq.py +0 -0
  215. {agno-2.0.5 → agno-2.0.6}/agno/models/huggingface/__init__.py +0 -0
  216. {agno-2.0.5 → agno-2.0.6}/agno/models/huggingface/huggingface.py +0 -0
  217. {agno-2.0.5 → agno-2.0.6}/agno/models/ibm/__init__.py +0 -0
  218. {agno-2.0.5 → agno-2.0.6}/agno/models/ibm/watsonx.py +0 -0
  219. {agno-2.0.5 → agno-2.0.6}/agno/models/internlm/__init__.py +0 -0
  220. {agno-2.0.5 → agno-2.0.6}/agno/models/langdb/__init__.py +0 -0
  221. {agno-2.0.5 → agno-2.0.6}/agno/models/litellm/__init__.py +0 -0
  222. {agno-2.0.5 → agno-2.0.6}/agno/models/litellm/chat.py +0 -0
  223. {agno-2.0.5 → agno-2.0.6}/agno/models/lmstudio/__init__.py +0 -0
  224. {agno-2.0.5 → agno-2.0.6}/agno/models/lmstudio/lmstudio.py +0 -0
  225. {agno-2.0.5 → agno-2.0.6}/agno/models/meta/__init__.py +0 -0
  226. {agno-2.0.5 → agno-2.0.6}/agno/models/meta/llama.py +0 -0
  227. {agno-2.0.5 → agno-2.0.6}/agno/models/metrics.py +0 -0
  228. {agno-2.0.5 → agno-2.0.6}/agno/models/mistral/__init__.py +0 -0
  229. {agno-2.0.5 → agno-2.0.6}/agno/models/mistral/mistral.py +0 -0
  230. {agno-2.0.5 → agno-2.0.6}/agno/models/nebius/__init__.py +0 -0
  231. {agno-2.0.5 → agno-2.0.6}/agno/models/nvidia/__init__.py +0 -0
  232. {agno-2.0.5 → agno-2.0.6}/agno/models/ollama/__init__.py +0 -0
  233. {agno-2.0.5 → agno-2.0.6}/agno/models/ollama/chat.py +0 -0
  234. {agno-2.0.5 → agno-2.0.6}/agno/models/openai/__init__.py +0 -0
  235. {agno-2.0.5 → agno-2.0.6}/agno/models/openai/chat.py +0 -0
  236. {agno-2.0.5 → agno-2.0.6}/agno/models/openai/like.py +0 -0
  237. {agno-2.0.5 → agno-2.0.6}/agno/models/openai/responses.py +0 -0
  238. {agno-2.0.5 → agno-2.0.6}/agno/models/openrouter/__init__.py +0 -0
  239. {agno-2.0.5 → agno-2.0.6}/agno/models/perplexity/__init__.py +0 -0
  240. {agno-2.0.5 → agno-2.0.6}/agno/models/portkey/__init__.py +0 -0
  241. {agno-2.0.5 → agno-2.0.6}/agno/models/sambanova/__init__.py +0 -0
  242. {agno-2.0.5 → agno-2.0.6}/agno/models/siliconflow/__init__.py +0 -0
  243. {agno-2.0.5 → agno-2.0.6}/agno/models/siliconflow/siliconflow.py +0 -0
  244. {agno-2.0.5 → agno-2.0.6}/agno/models/together/__init__.py +0 -0
  245. {agno-2.0.5 → agno-2.0.6}/agno/models/utils.py +0 -0
  246. {agno-2.0.5 → agno-2.0.6}/agno/models/vercel/__init__.py +0 -0
  247. {agno-2.0.5 → agno-2.0.6}/agno/models/vllm/__init__.py +0 -0
  248. {agno-2.0.5 → agno-2.0.6}/agno/models/vllm/vllm.py +0 -0
  249. {agno-2.0.5 → agno-2.0.6}/agno/models/xai/__init__.py +0 -0
  250. {agno-2.0.5 → agno-2.0.6}/agno/os/__init__.py +0 -0
  251. {agno-2.0.5 → agno-2.0.6}/agno/os/app.py +0 -0
  252. {agno-2.0.5 → agno-2.0.6}/agno/os/auth.py +0 -0
  253. {agno-2.0.5 → agno-2.0.6}/agno/os/config.py +0 -0
  254. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/__init__.py +0 -0
  255. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/agui/__init__.py +0 -0
  256. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/agui/agui.py +0 -0
  257. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/agui/router.py +0 -0
  258. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/agui/utils.py +0 -0
  259. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/base.py +0 -0
  260. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/slack/__init__.py +0 -0
  261. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/slack/router.py +0 -0
  262. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/slack/security.py +0 -0
  263. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/slack/slack.py +0 -0
  264. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/whatsapp/__init__.py +0 -0
  265. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/whatsapp/router.py +0 -0
  266. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/whatsapp/security.py +0 -0
  267. {agno-2.0.5 → agno-2.0.6}/agno/os/interfaces/whatsapp/whatsapp.py +0 -0
  268. {agno-2.0.5 → agno-2.0.6}/agno/os/mcp.py +0 -0
  269. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/__init__.py +0 -0
  270. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/evals/__init__.py +0 -0
  271. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/evals/evals.py +0 -0
  272. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/evals/schemas.py +0 -0
  273. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/evals/utils.py +0 -0
  274. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/health.py +0 -0
  275. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/home.py +0 -0
  276. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/knowledge/__init__.py +0 -0
  277. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/knowledge/knowledge.py +0 -0
  278. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/knowledge/schemas.py +0 -0
  279. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/memory/__init__.py +0 -0
  280. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/memory/memory.py +0 -0
  281. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/memory/schemas.py +0 -0
  282. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/metrics/__init__.py +0 -0
  283. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/metrics/metrics.py +0 -0
  284. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/metrics/schemas.py +0 -0
  285. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/session/__init__.py +0 -0
  286. {agno-2.0.5 → agno-2.0.6}/agno/os/routers/session/session.py +0 -0
  287. {agno-2.0.5 → agno-2.0.6}/agno/os/schema.py +0 -0
  288. {agno-2.0.5 → agno-2.0.6}/agno/os/settings.py +0 -0
  289. {agno-2.0.5 → agno-2.0.6}/agno/py.typed +0 -0
  290. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/__init__.py +0 -0
  291. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/azure_ai_foundry.py +0 -0
  292. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/deepseek.py +0 -0
  293. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/default.py +0 -0
  294. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/groq.py +0 -0
  295. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/helpers.py +0 -0
  296. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/ollama.py +0 -0
  297. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/openai.py +0 -0
  298. {agno-2.0.5 → agno-2.0.6}/agno/reasoning/step.py +0 -0
  299. {agno-2.0.5 → agno-2.0.6}/agno/run/__init__.py +0 -0
  300. {agno-2.0.5 → agno-2.0.6}/agno/run/base.py +0 -0
  301. {agno-2.0.5 → agno-2.0.6}/agno/run/cancel.py +0 -0
  302. {agno-2.0.5 → agno-2.0.6}/agno/run/messages.py +0 -0
  303. {agno-2.0.5 → agno-2.0.6}/agno/session/__init__.py +0 -0
  304. {agno-2.0.5 → agno-2.0.6}/agno/session/agent.py +0 -0
  305. {agno-2.0.5 → agno-2.0.6}/agno/session/summary.py +0 -0
  306. {agno-2.0.5 → agno-2.0.6}/agno/session/team.py +0 -0
  307. {agno-2.0.5 → agno-2.0.6}/agno/session/workflow.py +0 -0
  308. {agno-2.0.5 → agno-2.0.6}/agno/team/__init__.py +0 -0
  309. {agno-2.0.5 → agno-2.0.6}/agno/tools/__init__.py +0 -0
  310. {agno-2.0.5 → agno-2.0.6}/agno/tools/agentql.py +0 -0
  311. {agno-2.0.5 → agno-2.0.6}/agno/tools/airflow.py +0 -0
  312. {agno-2.0.5 → agno-2.0.6}/agno/tools/api.py +0 -0
  313. {agno-2.0.5 → agno-2.0.6}/agno/tools/apify.py +0 -0
  314. {agno-2.0.5 → agno-2.0.6}/agno/tools/arxiv.py +0 -0
  315. {agno-2.0.5 → agno-2.0.6}/agno/tools/aws_lambda.py +0 -0
  316. {agno-2.0.5 → agno-2.0.6}/agno/tools/aws_ses.py +0 -0
  317. {agno-2.0.5 → agno-2.0.6}/agno/tools/baidusearch.py +0 -0
  318. {agno-2.0.5 → agno-2.0.6}/agno/tools/bitbucket.py +0 -0
  319. {agno-2.0.5 → agno-2.0.6}/agno/tools/brandfetch.py +0 -0
  320. {agno-2.0.5 → agno-2.0.6}/agno/tools/bravesearch.py +0 -0
  321. {agno-2.0.5 → agno-2.0.6}/agno/tools/brightdata.py +0 -0
  322. {agno-2.0.5 → agno-2.0.6}/agno/tools/browserbase.py +0 -0
  323. {agno-2.0.5 → agno-2.0.6}/agno/tools/calcom.py +0 -0
  324. {agno-2.0.5 → agno-2.0.6}/agno/tools/calculator.py +0 -0
  325. {agno-2.0.5 → agno-2.0.6}/agno/tools/cartesia.py +0 -0
  326. {agno-2.0.5 → agno-2.0.6}/agno/tools/clickup.py +0 -0
  327. {agno-2.0.5 → agno-2.0.6}/agno/tools/confluence.py +0 -0
  328. {agno-2.0.5 → agno-2.0.6}/agno/tools/crawl4ai.py +0 -0
  329. {agno-2.0.5 → agno-2.0.6}/agno/tools/csv_toolkit.py +0 -0
  330. {agno-2.0.5 → agno-2.0.6}/agno/tools/dalle.py +0 -0
  331. {agno-2.0.5 → agno-2.0.6}/agno/tools/daytona.py +0 -0
  332. {agno-2.0.5 → agno-2.0.6}/agno/tools/decorator.py +0 -0
  333. {agno-2.0.5 → agno-2.0.6}/agno/tools/desi_vocal.py +0 -0
  334. {agno-2.0.5 → agno-2.0.6}/agno/tools/discord.py +0 -0
  335. {agno-2.0.5 → agno-2.0.6}/agno/tools/docker.py +0 -0
  336. {agno-2.0.5 → agno-2.0.6}/agno/tools/duckdb.py +0 -0
  337. {agno-2.0.5 → agno-2.0.6}/agno/tools/duckduckgo.py +0 -0
  338. {agno-2.0.5 → agno-2.0.6}/agno/tools/eleven_labs.py +0 -0
  339. {agno-2.0.5 → agno-2.0.6}/agno/tools/email.py +0 -0
  340. {agno-2.0.5 → agno-2.0.6}/agno/tools/evm.py +0 -0
  341. {agno-2.0.5 → agno-2.0.6}/agno/tools/exa.py +0 -0
  342. {agno-2.0.5 → agno-2.0.6}/agno/tools/fal.py +0 -0
  343. {agno-2.0.5 → agno-2.0.6}/agno/tools/file.py +0 -0
  344. {agno-2.0.5 → agno-2.0.6}/agno/tools/financial_datasets.py +0 -0
  345. {agno-2.0.5 → agno-2.0.6}/agno/tools/firecrawl.py +0 -0
  346. {agno-2.0.5 → agno-2.0.6}/agno/tools/giphy.py +0 -0
  347. {agno-2.0.5 → agno-2.0.6}/agno/tools/github.py +0 -0
  348. {agno-2.0.5 → agno-2.0.6}/agno/tools/gmail.py +0 -0
  349. {agno-2.0.5 → agno-2.0.6}/agno/tools/google_bigquery.py +0 -0
  350. {agno-2.0.5 → agno-2.0.6}/agno/tools/google_maps.py +0 -0
  351. {agno-2.0.5 → agno-2.0.6}/agno/tools/googlecalendar.py +0 -0
  352. {agno-2.0.5 → agno-2.0.6}/agno/tools/googlesearch.py +0 -0
  353. {agno-2.0.5 → agno-2.0.6}/agno/tools/googlesheets.py +0 -0
  354. {agno-2.0.5 → agno-2.0.6}/agno/tools/hackernews.py +0 -0
  355. {agno-2.0.5 → agno-2.0.6}/agno/tools/jina.py +0 -0
  356. {agno-2.0.5 → agno-2.0.6}/agno/tools/jira.py +0 -0
  357. {agno-2.0.5 → agno-2.0.6}/agno/tools/knowledge.py +0 -0
  358. {agno-2.0.5 → agno-2.0.6}/agno/tools/linear.py +0 -0
  359. {agno-2.0.5 → agno-2.0.6}/agno/tools/linkup.py +0 -0
  360. {agno-2.0.5 → agno-2.0.6}/agno/tools/local_file_system.py +0 -0
  361. {agno-2.0.5 → agno-2.0.6}/agno/tools/lumalab.py +0 -0
  362. {agno-2.0.5 → agno-2.0.6}/agno/tools/mcp.py +0 -0
  363. {agno-2.0.5 → agno-2.0.6}/agno/tools/mem0.py +0 -0
  364. {agno-2.0.5 → agno-2.0.6}/agno/tools/memori.py +0 -0
  365. {agno-2.0.5 → agno-2.0.6}/agno/tools/memory.py +0 -0
  366. {agno-2.0.5 → agno-2.0.6}/agno/tools/mlx_transcribe.py +0 -0
  367. {agno-2.0.5 → agno-2.0.6}/agno/tools/models/__init__.py +0 -0
  368. {agno-2.0.5 → agno-2.0.6}/agno/tools/models/azure_openai.py +0 -0
  369. {agno-2.0.5 → agno-2.0.6}/agno/tools/models/gemini.py +0 -0
  370. {agno-2.0.5 → agno-2.0.6}/agno/tools/models/groq.py +0 -0
  371. {agno-2.0.5 → agno-2.0.6}/agno/tools/models/morph.py +0 -0
  372. {agno-2.0.5 → agno-2.0.6}/agno/tools/models/nebius.py +0 -0
  373. {agno-2.0.5 → agno-2.0.6}/agno/tools/models_labs.py +0 -0
  374. {agno-2.0.5 → agno-2.0.6}/agno/tools/moviepy_video.py +0 -0
  375. {agno-2.0.5 → agno-2.0.6}/agno/tools/neo4j.py +0 -0
  376. {agno-2.0.5 → agno-2.0.6}/agno/tools/newspaper.py +0 -0
  377. {agno-2.0.5 → agno-2.0.6}/agno/tools/newspaper4k.py +0 -0
  378. {agno-2.0.5 → agno-2.0.6}/agno/tools/openai.py +0 -0
  379. {agno-2.0.5 → agno-2.0.6}/agno/tools/openbb.py +0 -0
  380. {agno-2.0.5 → agno-2.0.6}/agno/tools/opencv.py +0 -0
  381. {agno-2.0.5 → agno-2.0.6}/agno/tools/openweather.py +0 -0
  382. {agno-2.0.5 → agno-2.0.6}/agno/tools/oxylabs.py +0 -0
  383. {agno-2.0.5 → agno-2.0.6}/agno/tools/pandas.py +0 -0
  384. {agno-2.0.5 → agno-2.0.6}/agno/tools/postgres.py +0 -0
  385. {agno-2.0.5 → agno-2.0.6}/agno/tools/pubmed.py +0 -0
  386. {agno-2.0.5 → agno-2.0.6}/agno/tools/python.py +0 -0
  387. {agno-2.0.5 → agno-2.0.6}/agno/tools/reasoning.py +0 -0
  388. {agno-2.0.5 → agno-2.0.6}/agno/tools/reddit.py +0 -0
  389. {agno-2.0.5 → agno-2.0.6}/agno/tools/replicate.py +0 -0
  390. {agno-2.0.5 → agno-2.0.6}/agno/tools/resend.py +0 -0
  391. {agno-2.0.5 → agno-2.0.6}/agno/tools/scrapegraph.py +0 -0
  392. {agno-2.0.5 → agno-2.0.6}/agno/tools/searxng.py +0 -0
  393. {agno-2.0.5 → agno-2.0.6}/agno/tools/serpapi.py +0 -0
  394. {agno-2.0.5 → agno-2.0.6}/agno/tools/serper.py +0 -0
  395. {agno-2.0.5 → agno-2.0.6}/agno/tools/shell.py +0 -0
  396. {agno-2.0.5 → agno-2.0.6}/agno/tools/slack.py +0 -0
  397. {agno-2.0.5 → agno-2.0.6}/agno/tools/sleep.py +0 -0
  398. {agno-2.0.5 → agno-2.0.6}/agno/tools/spider.py +0 -0
  399. {agno-2.0.5 → agno-2.0.6}/agno/tools/sql.py +0 -0
  400. {agno-2.0.5 → agno-2.0.6}/agno/tools/streamlit/__init__.py +0 -0
  401. {agno-2.0.5 → agno-2.0.6}/agno/tools/streamlit/components.py +0 -0
  402. {agno-2.0.5 → agno-2.0.6}/agno/tools/tavily.py +0 -0
  403. {agno-2.0.5 → agno-2.0.6}/agno/tools/telegram.py +0 -0
  404. {agno-2.0.5 → agno-2.0.6}/agno/tools/todoist.py +0 -0
  405. {agno-2.0.5 → agno-2.0.6}/agno/tools/tool_registry.py +0 -0
  406. {agno-2.0.5 → agno-2.0.6}/agno/tools/toolkit.py +0 -0
  407. {agno-2.0.5 → agno-2.0.6}/agno/tools/trafilatura.py +0 -0
  408. {agno-2.0.5 → agno-2.0.6}/agno/tools/trello.py +0 -0
  409. {agno-2.0.5 → agno-2.0.6}/agno/tools/twilio.py +0 -0
  410. {agno-2.0.5 → agno-2.0.6}/agno/tools/user_control_flow.py +0 -0
  411. {agno-2.0.5 → agno-2.0.6}/agno/tools/valyu.py +0 -0
  412. {agno-2.0.5 → agno-2.0.6}/agno/tools/visualization.py +0 -0
  413. {agno-2.0.5 → agno-2.0.6}/agno/tools/webbrowser.py +0 -0
  414. {agno-2.0.5 → agno-2.0.6}/agno/tools/webex.py +0 -0
  415. {agno-2.0.5 → agno-2.0.6}/agno/tools/website.py +0 -0
  416. {agno-2.0.5 → agno-2.0.6}/agno/tools/webtools.py +0 -0
  417. {agno-2.0.5 → agno-2.0.6}/agno/tools/whatsapp.py +0 -0
  418. {agno-2.0.5 → agno-2.0.6}/agno/tools/wikipedia.py +0 -0
  419. {agno-2.0.5 → agno-2.0.6}/agno/tools/workflow.py +0 -0
  420. {agno-2.0.5 → agno-2.0.6}/agno/tools/x.py +0 -0
  421. {agno-2.0.5 → agno-2.0.6}/agno/tools/yfinance.py +0 -0
  422. {agno-2.0.5 → agno-2.0.6}/agno/tools/youtube.py +0 -0
  423. {agno-2.0.5 → agno-2.0.6}/agno/tools/zendesk.py +0 -0
  424. {agno-2.0.5 → agno-2.0.6}/agno/tools/zep.py +0 -0
  425. {agno-2.0.5 → agno-2.0.6}/agno/tools/zoom.py +0 -0
  426. {agno-2.0.5 → agno-2.0.6}/agno/utils/__init__.py +0 -0
  427. {agno-2.0.5 → agno-2.0.6}/agno/utils/audio.py +0 -0
  428. {agno-2.0.5 → agno-2.0.6}/agno/utils/certs.py +0 -0
  429. {agno-2.0.5 → agno-2.0.6}/agno/utils/code_execution.py +0 -0
  430. {agno-2.0.5 → agno-2.0.6}/agno/utils/common.py +0 -0
  431. {agno-2.0.5 → agno-2.0.6}/agno/utils/dttm.py +0 -0
  432. {agno-2.0.5 → agno-2.0.6}/agno/utils/enum.py +0 -0
  433. {agno-2.0.5 → agno-2.0.6}/agno/utils/env.py +0 -0
  434. {agno-2.0.5 → agno-2.0.6}/agno/utils/events.py +0 -0
  435. {agno-2.0.5 → agno-2.0.6}/agno/utils/format_str.py +0 -0
  436. {agno-2.0.5 → agno-2.0.6}/agno/utils/functions.py +0 -0
  437. {agno-2.0.5 → agno-2.0.6}/agno/utils/http.py +0 -0
  438. {agno-2.0.5 → agno-2.0.6}/agno/utils/json_schema.py +0 -0
  439. {agno-2.0.5 → agno-2.0.6}/agno/utils/knowledge.py +0 -0
  440. {agno-2.0.5 → agno-2.0.6}/agno/utils/location.py +0 -0
  441. {agno-2.0.5 → agno-2.0.6}/agno/utils/log.py +0 -0
  442. {agno-2.0.5 → agno-2.0.6}/agno/utils/mcp.py +0 -0
  443. {agno-2.0.5 → agno-2.0.6}/agno/utils/media.py +0 -0
  444. {agno-2.0.5 → agno-2.0.6}/agno/utils/merge_dict.py +0 -0
  445. {agno-2.0.5 → agno-2.0.6}/agno/utils/message.py +0 -0
  446. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/__init__.py +0 -0
  447. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/ai_foundry.py +0 -0
  448. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/aws_claude.py +0 -0
  449. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/claude.py +0 -0
  450. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/cohere.py +0 -0
  451. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/llama.py +0 -0
  452. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/mistral.py +0 -0
  453. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/openai_responses.py +0 -0
  454. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/schema_utils.py +0 -0
  455. {agno-2.0.5 → agno-2.0.6}/agno/utils/models/watsonx.py +0 -0
  456. {agno-2.0.5 → agno-2.0.6}/agno/utils/openai.py +0 -0
  457. {agno-2.0.5 → agno-2.0.6}/agno/utils/pickle.py +0 -0
  458. {agno-2.0.5 → agno-2.0.6}/agno/utils/pprint.py +0 -0
  459. {agno-2.0.5 → agno-2.0.6}/agno/utils/print_response/__init__.py +0 -0
  460. {agno-2.0.5 → agno-2.0.6}/agno/utils/print_response/agent.py +0 -0
  461. {agno-2.0.5 → agno-2.0.6}/agno/utils/print_response/team.py +0 -0
  462. {agno-2.0.5 → agno-2.0.6}/agno/utils/print_response/workflow.py +0 -0
  463. {agno-2.0.5 → agno-2.0.6}/agno/utils/prompts.py +0 -0
  464. {agno-2.0.5 → agno-2.0.6}/agno/utils/reasoning.py +0 -0
  465. {agno-2.0.5 → agno-2.0.6}/agno/utils/response.py +0 -0
  466. {agno-2.0.5 → agno-2.0.6}/agno/utils/response_iterator.py +0 -0
  467. {agno-2.0.5 → agno-2.0.6}/agno/utils/safe_formatter.py +0 -0
  468. {agno-2.0.5 → agno-2.0.6}/agno/utils/shell.py +0 -0
  469. {agno-2.0.5 → agno-2.0.6}/agno/utils/streamlit.py +0 -0
  470. {agno-2.0.5 → agno-2.0.6}/agno/utils/string.py +0 -0
  471. {agno-2.0.5 → agno-2.0.6}/agno/utils/team.py +0 -0
  472. {agno-2.0.5 → agno-2.0.6}/agno/utils/timer.py +0 -0
  473. {agno-2.0.5 → agno-2.0.6}/agno/utils/tools.py +0 -0
  474. {agno-2.0.5 → agno-2.0.6}/agno/utils/web.py +0 -0
  475. {agno-2.0.5 → agno-2.0.6}/agno/utils/whatsapp.py +0 -0
  476. {agno-2.0.5 → agno-2.0.6}/agno/utils/yaml_io.py +0 -0
  477. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/__init__.py +0 -0
  478. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/base.py +0 -0
  479. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/cassandra/__init__.py +0 -0
  480. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/cassandra/cassandra.py +0 -0
  481. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/cassandra/extra_param_mixin.py +0 -0
  482. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/cassandra/index.py +0 -0
  483. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/chroma/__init__.py +0 -0
  484. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/clickhouse/__init__.py +0 -0
  485. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/clickhouse/clickhousedb.py +0 -0
  486. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/clickhouse/index.py +0 -0
  487. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/couchbase/__init__.py +0 -0
  488. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/couchbase/couchbase.py +0 -0
  489. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/distance.py +0 -0
  490. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/lancedb/__init__.py +0 -0
  491. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/langchaindb/__init__.py +0 -0
  492. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/langchaindb/langchaindb.py +0 -0
  493. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/lightrag/__init__.py +0 -0
  494. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/lightrag/lightrag.py +0 -0
  495. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/llamaindex/__init__.py +0 -0
  496. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/llamaindex/llamaindexdb.py +0 -0
  497. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/milvus/__init__.py +0 -0
  498. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/mongodb/__init__.py +0 -0
  499. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/mongodb/mongodb.py +0 -0
  500. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/pgvector/__init__.py +0 -0
  501. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/pgvector/index.py +0 -0
  502. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/pgvector/pgvector.py +0 -0
  503. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/pineconedb/__init__.py +0 -0
  504. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/pineconedb/pineconedb.py +0 -0
  505. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/qdrant/__init__.py +0 -0
  506. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/qdrant/qdrant.py +0 -0
  507. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/search.py +0 -0
  508. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/singlestore/__init__.py +0 -0
  509. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/singlestore/index.py +0 -0
  510. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/singlestore/singlestore.py +0 -0
  511. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/surrealdb/__init__.py +0 -0
  512. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/surrealdb/surrealdb.py +0 -0
  513. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/upstashdb/__init__.py +0 -0
  514. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/upstashdb/upstashdb.py +0 -0
  515. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/weaviate/__init__.py +0 -0
  516. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/weaviate/index.py +0 -0
  517. {agno-2.0.5 → agno-2.0.6}/agno/vectordb/weaviate/weaviate.py +0 -0
  518. {agno-2.0.5 → agno-2.0.6}/agno/workflow/__init__.py +0 -0
  519. {agno-2.0.5 → agno-2.0.6}/agno/workflow/condition.py +0 -0
  520. {agno-2.0.5 → agno-2.0.6}/agno/workflow/loop.py +0 -0
  521. {agno-2.0.5 → agno-2.0.6}/agno/workflow/parallel.py +0 -0
  522. {agno-2.0.5 → agno-2.0.6}/agno/workflow/router.py +0 -0
  523. {agno-2.0.5 → agno-2.0.6}/agno/workflow/step.py +0 -0
  524. {agno-2.0.5 → agno-2.0.6}/agno/workflow/steps.py +0 -0
  525. {agno-2.0.5 → agno-2.0.6}/agno/workflow/types.py +0 -0
  526. {agno-2.0.5 → agno-2.0.6}/agno.egg-info/dependency_links.txt +0 -0
  527. {agno-2.0.5 → agno-2.0.6}/agno.egg-info/top_level.txt +0 -0
  528. {agno-2.0.5 → agno-2.0.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agno
3
- Version: 2.0.5
3
+ Version: 2.0.6
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
@@ -161,6 +161,8 @@ Requires-Dist: opencv-python; extra == "opencv"
161
161
  Provides-Extra: psycopg
162
162
  Requires-Dist: psycopg-binary; extra == "psycopg"
163
163
  Requires-Dist: psycopg; extra == "psycopg"
164
+ Provides-Extra: reportlab
165
+ Requires-Dist: reportlab; extra == "reportlab"
164
166
  Provides-Extra: todoist
165
167
  Requires-Dist: todoist-api-python; extra == "todoist"
166
168
  Provides-Extra: valyu
@@ -306,6 +308,7 @@ Requires-Dist: agno[mem0]; extra == "tools"
306
308
  Requires-Dist: agno[memori]; extra == "tools"
307
309
  Requires-Dist: agno[google_bigquery]; extra == "tools"
308
310
  Requires-Dist: agno[psycopg]; extra == "tools"
311
+ Requires-Dist: agno[reportlab]; extra == "tools"
309
312
  Requires-Dist: agno[trafilatura]; extra == "tools"
310
313
  Requires-Dist: agno[neo4j]; extra == "tools"
311
314
  Provides-Extra: storage
@@ -371,7 +371,7 @@ class Agent:
371
371
  knowledge_retriever: Optional[Callable[..., Optional[List[Union[Dict, str]]]]] = None,
372
372
  references_format: Literal["json", "yaml"] = "json",
373
373
  metadata: Optional[Dict[str, Any]] = None,
374
- tools: Optional[List[Union[Toolkit, Callable, Function, Dict]]] = None,
374
+ tools: Optional[Sequence[Union[Toolkit, Callable, Function, Dict]]] = None,
375
375
  tool_call_limit: Optional[int] = None,
376
376
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
377
377
  tool_hooks: Optional[List[Callable]] = None,
@@ -466,7 +466,7 @@ class Agent:
466
466
 
467
467
  self.metadata = metadata
468
468
 
469
- self.tools = tools
469
+ self.tools = list(tools) if tools else []
470
470
  self.tool_call_limit = tool_call_limit
471
471
  self.tool_choice = tool_choice
472
472
  self.tool_hooks = tool_hooks
@@ -681,8 +681,8 @@ class Agent:
681
681
  self.tools.append(tool)
682
682
  self._rebuild_tools = True
683
683
 
684
- def set_tools(self, tools: List[Union[Toolkit, Callable, Function, Dict]]):
685
- self.tools = tools
684
+ def set_tools(self, tools: Sequence[Union[Toolkit, Callable, Function, Dict]]):
685
+ self.tools = list(tools) if tools else []
686
686
  self._rebuild_tools = True
687
687
 
688
688
  def _initialize_session(
@@ -1080,13 +1080,17 @@ class Agent:
1080
1080
  # Initialize the Agent
1081
1081
  self.initialize_agent(debug_mode=debug_mode)
1082
1082
 
1083
- image_artifacts, video_artifacts, audio_artifacts = self._validate_media_object_id(
1084
- images=images, videos=videos, audios=audio
1083
+ image_artifacts, video_artifacts, audio_artifacts, file_artifacts = self._validate_media_object_id(
1084
+ images=images, videos=videos, audios=audio, files=files
1085
1085
  )
1086
1086
 
1087
1087
  # Create RunInput to capture the original user input
1088
1088
  run_input = RunInput(
1089
- input_content=input, images=image_artifacts, videos=video_artifacts, audios=audio_artifacts, files=files
1089
+ input_content=input,
1090
+ images=image_artifacts,
1091
+ videos=video_artifacts,
1092
+ audios=audio_artifacts,
1093
+ files=file_artifacts,
1090
1094
  )
1091
1095
 
1092
1096
  # Read existing session from database
@@ -1713,13 +1717,17 @@ class Agent:
1713
1717
  # Initialize the Agent
1714
1718
  self.initialize_agent(debug_mode=debug_mode)
1715
1719
 
1716
- image_artifacts, video_artifacts, audio_artifacts = self._validate_media_object_id(
1717
- images=images, videos=videos, audios=audio
1720
+ image_artifacts, video_artifacts, audio_artifacts, file_artifacts = self._validate_media_object_id(
1721
+ images=images, videos=videos, audios=audio, files=files
1718
1722
  )
1719
1723
 
1720
1724
  # Create RunInput to capture the original user input
1721
1725
  run_input = RunInput(
1722
- input_content=input, images=image_artifacts, videos=video_artifacts, audios=audio_artifacts, files=files
1726
+ input_content=input,
1727
+ images=image_artifacts,
1728
+ videos=video_artifacts,
1729
+ audios=audio_artifacts,
1730
+ files=file_artifacts,
1723
1731
  )
1724
1732
 
1725
1733
  # Read existing session from storage
@@ -3063,6 +3071,10 @@ class Agent:
3063
3071
  for audio in model_response.audios:
3064
3072
  self._add_audio(audio, run_response) # Generated audio go to run_response.audio
3065
3073
 
3074
+ if model_response.files is not None:
3075
+ for file in model_response.files:
3076
+ self._add_file(file, run_response) # Generated files go to run_response.files
3077
+
3066
3078
  def _update_run_response(self, model_response: ModelResponse, run_response: RunOutput, run_messages: RunMessages):
3067
3079
  # Handle structured outputs
3068
3080
  if self.output_schema is not None and model_response.parsed is not None:
@@ -3125,7 +3137,8 @@ class Agent:
3125
3137
  """Calculate session metrics"""
3126
3138
  session_metrics = self._get_session_metrics(session=session)
3127
3139
  # Add the metrics for the current run to the session metrics
3128
- session_metrics += run_response.metrics
3140
+ if run_response.metrics is not None:
3141
+ session_metrics += run_response.metrics
3129
3142
  session_metrics.time_to_first_token = None
3130
3143
  if session.session_data is not None:
3131
3144
  session.session_data["session_metrics"] = session_metrics
@@ -3800,7 +3813,7 @@ class Agent:
3800
3813
  self._rebuild_tools = True
3801
3814
  if self.search_session_history:
3802
3815
  agent_tools.append(
3803
- self._get_previous_sessions_messages_function(num_history_sessions=self.num_history_sessions)
3816
+ self._get_previous_sessions_messages_function(num_history_sessions=self.num_history_sessions, user_id=user_id)
3804
3817
  )
3805
3818
  self._rebuild_tools = True
3806
3819
 
@@ -4948,7 +4961,7 @@ class Agent:
4948
4961
  # 1. If build_user_context is False or message is a list, return the message as is.
4949
4962
  if not self.build_user_context:
4950
4963
  return Message(
4951
- role=self.user_message_role,
4964
+ role=self.user_message_role or "user",
4952
4965
  content=input,
4953
4966
  images=None if not self.send_media_to_model else images,
4954
4967
  audio=None if not self.send_media_to_model else audio,
@@ -4961,7 +4974,7 @@ class Agent:
4961
4974
  # If we have any media, return a message with empty content
4962
4975
  if images is not None or audio is not None or videos is not None or files is not None:
4963
4976
  return Message(
4964
- role=self.user_message_role,
4977
+ role=self.user_message_role or "user",
4965
4978
  content="",
4966
4979
  images=None if not self.send_media_to_model else images,
4967
4980
  audio=None if not self.send_media_to_model else audio,
@@ -5716,6 +5729,13 @@ class Agent:
5716
5729
  run_response.audio = []
5717
5730
  run_response.audio.append(audio)
5718
5731
 
5732
+ def _add_file(self, file: File, run_response: RunOutput) -> None:
5733
+ """Add file to both the agent's stateful storage and the current run response"""
5734
+ # Add to run response
5735
+ if run_response.files is None:
5736
+ run_response.files = []
5737
+ run_response.files.append(file)
5738
+
5719
5739
  ###########################################################################
5720
5740
  # Reasoning
5721
5741
  ###########################################################################
@@ -6779,11 +6799,14 @@ class Agent:
6779
6799
  )
6780
6800
  return "Successfully added to knowledge base"
6781
6801
 
6782
- def _get_previous_sessions_messages_function(self, num_history_sessions: Optional[int] = 2) -> Callable:
6802
+ def _get_previous_sessions_messages_function(
6803
+ self, num_history_sessions: Optional[int] = 2, user_id: Optional[str] = None
6804
+ ) -> Callable:
6783
6805
  """Factory function to create a get_previous_session_messages function.
6784
6806
 
6785
6807
  Args:
6786
6808
  num_history_sessions: The last n sessions to be taken from db
6809
+ user_id: The user ID to filter sessions by
6787
6810
 
6788
6811
  Returns:
6789
6812
  Callable: A function that retrieves messages from previous sessions
@@ -6802,7 +6825,9 @@ class Agent:
6802
6825
  if self.db is None:
6803
6826
  return "Previous session messages not available"
6804
6827
 
6805
- selected_sessions = self.db.get_sessions(session_type=SessionType.AGENT, limit=num_history_sessions)
6828
+ selected_sessions = self.db.get_sessions(
6829
+ session_type=SessionType.AGENT, limit=num_history_sessions, user_id=user_id
6830
+ )
6806
6831
 
6807
6832
  all_messages = []
6808
6833
  seen_message_pairs = set()
@@ -7199,6 +7224,7 @@ class Agent:
7199
7224
  images: Optional[Sequence[Image]] = None,
7200
7225
  videos: Optional[Sequence[Video]] = None,
7201
7226
  audios: Optional[Sequence[Audio]] = None,
7227
+ files: Optional[Sequence[File]] = None,
7202
7228
  ) -> tuple:
7203
7229
  """Convert raw Image/Video/Audio objects - now unified, so just return as-is."""
7204
7230
  # With unified classes, no conversion needed - just ensure IDs are set
@@ -7233,7 +7259,17 @@ class Agent:
7233
7259
  aud.id = str(uuid4())
7234
7260
  audio_list.append(aud)
7235
7261
 
7236
- return image_list, video_list, audio_list
7262
+ file_list = None
7263
+ if files:
7264
+ file_list = []
7265
+ for file in files:
7266
+ if not file.id:
7267
+ from uuid import uuid4
7268
+
7269
+ file.id = str(uuid4())
7270
+ file_list.append(file)
7271
+
7272
+ return image_list, video_list, audio_list, file_list
7237
7273
 
7238
7274
  def cli_app(
7239
7275
  self,
@@ -181,7 +181,7 @@ class DynamoDb(BaseDb):
181
181
 
182
182
  # --- Sessions ---
183
183
 
184
- def delete_session(self, session_id: Optional[str] = None, session_type: Optional[SessionType] = None) -> bool:
184
+ def delete_session(self, session_id: Optional[str] = None) -> bool:
185
185
  """
186
186
  Delete a session from the database.
187
187
 
@@ -236,7 +236,7 @@ class DynamoDb(BaseDb):
236
236
  def get_session(
237
237
  self,
238
238
  session_id: str,
239
- session_type: Optional[SessionType] = None,
239
+ session_type: SessionType,
240
240
  user_id: Optional[str] = None,
241
241
  deserialize: Optional[bool] = True,
242
242
  ) -> Optional[Union[Session, Dict[str, Any]]]:
@@ -245,7 +245,7 @@ class DynamoDb(BaseDb):
245
245
 
246
246
  Args:
247
247
  session_id (str): The ID of the session to get.
248
- session_type (Optional[SessionType]): The type of session to get.
248
+ session_type (SessionType): The type of session to get.
249
249
  user_id (Optional[str]): The ID of the user to get the session for.
250
250
  deserialize (Optional[bool]): Whether to deserialize the session.
251
251
 
@@ -268,7 +268,7 @@ class DynamoDb(BaseDb):
268
268
 
269
269
  session = deserialize_from_dynamodb_item(item)
270
270
 
271
- if session_type and session.get("session_type") != session_type.value:
271
+ if session.get("session_type") != session_type.value:
272
272
  return None
273
273
  if user_id and session.get("user_id") != user_id:
274
274
  return None
@@ -283,8 +283,10 @@ class DynamoDb(BaseDb):
283
283
  return AgentSession.from_dict(session)
284
284
  elif session_type == SessionType.TEAM:
285
285
  return TeamSession.from_dict(session)
286
- else:
286
+ elif session_type == SessionType.WORKFLOW:
287
287
  return WorkflowSession.from_dict(session)
288
+ else:
289
+ raise ValueError(f"Invalid session type: {session_type}")
288
290
 
289
291
  except Exception as e:
290
292
  log_error(f"Failed to get session {session_id}: {e}")
@@ -242,8 +242,8 @@ class FirestoreDb(BaseDb):
242
242
 
243
243
  Args:
244
244
  session_id (str): The ID of the session to get.
245
+ session_type (SessionType): The type of session to get.
245
246
  user_id (Optional[str]): The ID of the user to get the session for.
246
- session_type (Optional[SessionType]): The type of session to get.
247
247
  deserialize (Optional[bool]): Whether to serialize the session. Defaults to True.
248
248
 
249
249
  Returns:
@@ -281,8 +281,10 @@ class FirestoreDb(BaseDb):
281
281
  return AgentSession.from_dict(session)
282
282
  elif session_type == SessionType.TEAM:
283
283
  return TeamSession.from_dict(session)
284
- else:
284
+ elif session_type == SessionType.WORKFLOW:
285
285
  return WorkflowSession.from_dict(session)
286
+ else:
287
+ raise ValueError(f"Invalid session type: {session_type}")
286
288
 
287
289
  except Exception as e:
288
290
  log_error(f"Exception reading session: {e}")
@@ -185,7 +185,7 @@ class GcsJsonDb(BaseDb):
185
185
  def get_session(
186
186
  self,
187
187
  session_id: str,
188
- session_type: Optional[SessionType] = None,
188
+ session_type: SessionType,
189
189
  user_id: Optional[str] = None,
190
190
  deserialize: Optional[bool] = True,
191
191
  ) -> Optional[Union[AgentSession, TeamSession, WorkflowSession, Dict[str, Any]]]:
@@ -193,7 +193,7 @@ class GcsJsonDb(BaseDb):
193
193
 
194
194
  Args:
195
195
  session_id (str): The ID of the session to read.
196
- session_type (Optional[SessionType]): The type of the session to read.
196
+ session_type (SessionType): The type of the session to read.
197
197
  user_id (Optional[str]): The ID of the user to read the session for.
198
198
  deserialize (Optional[bool]): Whether to deserialize the session.
199
199
 
@@ -226,6 +226,8 @@ class GcsJsonDb(BaseDb):
226
226
  return TeamSession.from_dict(session_data)
227
227
  elif session_type == SessionType.WORKFLOW:
228
228
  return WorkflowSession.from_dict(session_data)
229
+ else:
230
+ raise ValueError(f"Invalid session type: {session_type}")
229
231
 
230
232
  return None
231
233
 
@@ -168,7 +168,7 @@ class JsonDb(BaseDb):
168
168
  def get_session(
169
169
  self,
170
170
  session_id: str,
171
- session_type: Optional[SessionType] = None,
171
+ session_type: SessionType,
172
172
  user_id: Optional[str] = None,
173
173
  deserialize: Optional[bool] = True,
174
174
  ) -> Optional[Union[AgentSession, TeamSession, WorkflowSession, Dict[str, Any]]]:
@@ -176,7 +176,7 @@ class JsonDb(BaseDb):
176
176
 
177
177
  Args:
178
178
  session_id (str): The ID of the session to read.
179
- session_type (Optional[SessionType]): The type of the session to read.
179
+ session_type (SessionType): The type of the session to read.
180
180
  user_id (Optional[str]): The ID of the user to read the session for.
181
181
  deserialize (Optional[bool]): Whether to deserialize the session.
182
182
 
@@ -208,8 +208,10 @@ class JsonDb(BaseDb):
208
208
  return AgentSession.from_dict(session)
209
209
  elif session_type == SessionType.TEAM:
210
210
  return TeamSession.from_dict(session)
211
- else:
211
+ elif session_type == SessionType.WORKFLOW:
212
212
  return WorkflowSession.from_dict(session)
213
+ else:
214
+ raise ValueError(f"Invalid session type: {session_type}")
213
215
 
214
216
  return None
215
217
 
@@ -338,8 +340,10 @@ class JsonDb(BaseDb):
338
340
  return AgentSession.from_dict(session)
339
341
  elif session_type == SessionType.TEAM:
340
342
  return TeamSession.from_dict(session)
341
- else:
343
+ elif session_type == SessionType.WORKFLOW:
342
344
  return WorkflowSession.from_dict(session)
345
+ else:
346
+ raise ValueError(f"Invalid session type: {session_type}")
343
347
 
344
348
  return None
345
349
 
@@ -253,8 +253,8 @@ class MongoDb(BaseDb):
253
253
 
254
254
  Args:
255
255
  session_id (str): The ID of the session to get.
256
+ session_type (SessionType): The type of session to get.
256
257
  user_id (Optional[str]): The ID of the user to get the session for.
257
- session_type (Optional[SessionType]): The type of session to get.
258
258
  deserialize (Optional[bool]): Whether to serialize the session. Defaults to True.
259
259
 
260
260
  Returns:
@@ -285,12 +285,14 @@ class MongoDb(BaseDb):
285
285
  if not deserialize:
286
286
  return session
287
287
 
288
- if session_type == SessionType.AGENT.value:
288
+ if session_type == SessionType.AGENT:
289
289
  return AgentSession.from_dict(session)
290
- elif session_type == SessionType.TEAM.value:
290
+ elif session_type == SessionType.TEAM:
291
291
  return TeamSession.from_dict(session)
292
- else:
292
+ elif session_type == SessionType.WORKFLOW:
293
293
  return WorkflowSession.from_dict(session)
294
+ else:
295
+ raise ValueError(f"Invalid session type: {session_type}")
294
296
 
295
297
  except Exception as e:
296
298
  log_error(f"Exception reading session: {e}")
@@ -350,8 +350,8 @@ class MySQLDb(BaseDb):
350
350
 
351
351
  Args:
352
352
  session_id (str): ID of the session to read.
353
+ session_type (SessionType): Type of session to get.
353
354
  user_id (Optional[str]): User ID to filter by. Defaults to None.
354
- session_type (Optional[SessionType]): Type of session to read. Defaults to None.
355
355
  deserialize (Optional[bool]): Whether to serialize the session. Defaults to True.
356
356
 
357
357
  Returns:
@@ -415,6 +415,7 @@ class MySQLDb(BaseDb):
415
415
  Get all sessions in the given table. Can filter by user_id and entity_id.
416
416
 
417
417
  Args:
418
+ session_type (Optional[SessionType]): The type of sessions to get.
418
419
  user_id (Optional[str]): The ID of the user to filter by.
419
420
  entity_id (Optional[str]): The ID of the agent / workflow to filter by.
420
421
  start_timestamp (Optional[int]): The start timestamp to filter by.
@@ -345,8 +345,8 @@ class PostgresDb(BaseDb):
345
345
 
346
346
  Args:
347
347
  session_id (str): ID of the session to read.
348
+ session_type (SessionType): Type of session to get.
348
349
  user_id (Optional[str]): User ID to filter by. Defaults to None.
349
- session_type (Optional[SessionType]): Type of session to read. Defaults to None.
350
350
  deserialize (Optional[bool]): Whether to serialize the session. Defaults to True.
351
351
 
352
352
  Returns:
@@ -410,6 +410,7 @@ class PostgresDb(BaseDb):
410
410
  Get all sessions in the given table. Can filter by user_id and entity_id.
411
411
 
412
412
  Args:
413
+ session_type (Optional[SessionType]): The type of session to get.
413
414
  user_id (Optional[str]): The ID of the user to filter by.
414
415
  entity_id (Optional[str]): The ID of the agent / workflow to filter by.
415
416
  start_timestamp (Optional[int]): The start timestamp to filter by.
@@ -300,8 +300,8 @@ class RedisDb(BaseDb):
300
300
 
301
301
  Args:
302
302
  session_id (str): The ID of the session to get.
303
+ session_type (SessionType): The type of session to get.
303
304
  user_id (Optional[str]): The ID of the user to filter by.
304
- session_type (Optional[SessionType]): The type of session to filter by.
305
305
 
306
306
  Returns:
307
307
  Optional[Union[AgentSession, TeamSession, WorkflowSession]]: The session if found, None otherwise.
@@ -431,8 +431,8 @@ class SingleStoreDb(BaseDb):
431
431
 
432
432
  Args:
433
433
  session_id (str): ID of the session to read.
434
+ session_type (SessionType): Type of session to get.
434
435
  user_id (Optional[str]): User ID to filter by. Defaults to None.
435
- session_type (Optional[SessionType]): Type of session to read. Defaults to None.
436
436
  deserialize (Optional[bool]): Whether to serialize the session. Defaults to True.
437
437
 
438
438
  Returns:
@@ -496,7 +496,7 @@ class SingleStoreDb(BaseDb):
496
496
  Get all sessions in the given table. Can filter by user_id and entity_id.
497
497
 
498
498
  Args:
499
- session_type (Optional[SessionType]): The type of session to filter by. Defaults to None.
499
+ session_type (Optional[SessionType]): The type of session to filter by.
500
500
  user_id (Optional[str]): The ID of the user to filter by.
501
501
  component_id (Optional[str]): The ID of the agent / workflow to filter by.
502
502
  session_name (Optional[str]): The name of the session to filter by.
@@ -333,8 +333,8 @@ class SqliteDb(BaseDb):
333
333
 
334
334
  Args:
335
335
  session_id (str): ID of the session to read.
336
+ session_type (SessionType): Type of session to get.
336
337
  user_id (Optional[str]): User ID to filter by. Defaults to None.
337
- session_type (Optional[SessionType]): Type of session to read. Defaults to None.
338
338
  deserialize (Optional[bool]): Whether to serialize the session. Defaults to True.
339
339
 
340
340
  Returns:
@@ -78,21 +78,25 @@ class OpenAIEmbedder(Embedder):
78
78
  return self.client.embeddings.create(**_request_params)
79
79
 
80
80
  def get_embedding(self, text: str) -> List[float]:
81
- response: CreateEmbeddingResponse = self.response(text=text)
82
81
  try:
82
+ response: CreateEmbeddingResponse = self.response(text=text)
83
83
  return response.data[0].embedding
84
84
  except Exception as e:
85
85
  logger.warning(e)
86
86
  return []
87
87
 
88
88
  def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
89
- response: CreateEmbeddingResponse = self.response(text=text)
89
+ try:
90
+ response: CreateEmbeddingResponse = self.response(text=text)
90
91
 
91
- embedding = response.data[0].embedding
92
- usage = response.usage
93
- if usage:
94
- return embedding, usage.model_dump()
95
- return embedding, None
92
+ embedding = response.data[0].embedding
93
+ usage = response.usage
94
+ if usage:
95
+ return embedding, usage.model_dump()
96
+ return embedding, None
97
+ except Exception as e:
98
+ logger.warning(e)
99
+ return [], None
96
100
 
97
101
  async def async_get_embedding(self, text: str) -> List[float]:
98
102
  req: Dict[str, Any] = {
@@ -127,10 +131,14 @@ class OpenAIEmbedder(Embedder):
127
131
  if self.request_params:
128
132
  req.update(self.request_params)
129
133
 
130
- response = await self.aclient.embeddings.create(**req)
131
- embedding = response.data[0].embedding
132
- usage = response.usage
133
- return embedding, usage.model_dump() if usage else None
134
+ try:
135
+ response = await self.aclient.embeddings.create(**req)
136
+ embedding = response.data[0].embedding
137
+ usage = response.usage
138
+ return embedding, usage.model_dump() if usage else None
139
+ except Exception as e:
140
+ logger.warning(e)
141
+ return [], None
134
142
 
135
143
  def get_embeddings_batch(self, texts: List[str], batch_size: int = 100) -> List[List[float]]:
136
144
  """
@@ -74,6 +74,8 @@ class Knowledge:
74
74
  async def add_contents_async(self, *args, **kwargs) -> None:
75
75
  if args and isinstance(args[0], list):
76
76
  arguments = args[0]
77
+ upsert = kwargs.get("upsert", False)
78
+ skip_if_exists = kwargs.get("skip_if_exists", False)
77
79
  for argument in arguments:
78
80
  await self.add_content_async(
79
81
  name=argument.get("name"),
@@ -85,8 +87,8 @@ class Knowledge:
85
87
  reader=argument.get("reader"),
86
88
  include=argument.get("include"),
87
89
  exclude=argument.get("exclude"),
88
- upsert=argument.get("upsert", False),
89
- skip_if_exists=argument.get("skip_if_exists", False),
90
+ upsert=argument.get("upsert", upsert),
91
+ skip_if_exists=argument.get("skip_if_exists", skip_if_exists),
90
92
  remote_content=argument.get("remote_content", None),
91
93
  )
92
94
 
@@ -102,7 +104,6 @@ class Knowledge:
102
104
  upsert = kwargs.get("upsert", False)
103
105
  skip_if_exists = kwargs.get("skip_if_exists", False)
104
106
  remote_content = kwargs.get("remote_content", None)
105
-
106
107
  for path in paths:
107
108
  await self.add_content_async(
108
109
  name=name,
@@ -106,23 +106,35 @@ class WebsiteReader(Reader):
106
106
  """
107
107
  Check if the tag matches any of the relevant tags or class names
108
108
  """
109
- if tag.name in ["article", "main"]:
109
+ if not isinstance(tag, Tag):
110
+ return False
111
+
112
+ if tag.name in ["article", "main", "section"]:
113
+ return True
114
+
115
+ classes = tag.get("class", [])
116
+ content_classes = ["content", "main-content", "post-content", "entry-content", "article-body"]
117
+ if any(cls in content_classes for cls in classes):
110
118
  return True
111
- if any(cls in ["content", "main-content", "post-content"] for cls in tag.get("class", [])): # type: ignore
119
+
120
+ # Check for common content IDs
121
+ tag_id = tag.get("id", "")
122
+ if tag_id in ["content", "main", "article"]:
112
123
  return True
124
+
113
125
  return False
114
126
 
115
- # Use a single call to 'find' with a custom function to match tags or classes
127
+ # Try to find main content element
116
128
  element = soup.find(match)
117
129
  if element:
130
+ # Remove common unwanted elements from the found content
131
+ for unwanted in element.find_all(["script", "style", "nav", "header", "footer"]):
132
+ unwanted.decompose()
118
133
  return element.get_text(strip=True, separator=" ")
119
134
 
120
- # If we only have a div without specific content classes, return empty string
121
- if soup.find("div") and not any(
122
- soup.find(class_=class_name) for class_name in ["content", "main-content", "post-content"]
123
- ):
124
- return ""
125
-
135
+ # Fallback: get full page content
136
+ for unwanted in soup.find_all(["script", "style", "nav", "header", "footer"]):
137
+ unwanted.decompose()
126
138
  return soup.get_text(strip=True, separator=" ")
127
139
 
128
140
  def crawl(self, url: str, starting_depth: int = 1) -> Dict[str, str]:
@@ -164,7 +176,7 @@ class WebsiteReader(Reader):
164
176
  if (
165
177
  current_url in self._visited
166
178
  or not urlparse(current_url).netloc.endswith(primary_domain)
167
- or current_depth > self.max_depth
179
+ or (current_depth > self.max_depth and current_url != url)
168
180
  or num_links >= self.max_links
169
181
  ):
170
182
  continue
@@ -174,13 +186,14 @@ class WebsiteReader(Reader):
174
186
 
175
187
  try:
176
188
  log_debug(f"Crawling: {current_url}")
189
+
177
190
  response = (
178
- httpx.get(current_url, timeout=self.timeout, proxy=self.proxy)
191
+ httpx.get(current_url, timeout=self.timeout, proxy=self.proxy, follow_redirects=True)
179
192
  if self.proxy
180
- else httpx.get(current_url, timeout=self.timeout)
193
+ else httpx.get(current_url, timeout=self.timeout, follow_redirects=True)
181
194
  )
182
-
183
195
  response.raise_for_status()
196
+
184
197
  soup = BeautifulSoup(response.content, "html.parser")
185
198
 
186
199
  # Extract main content
@@ -213,9 +226,13 @@ class WebsiteReader(Reader):
213
226
 
214
227
  except httpx.HTTPStatusError as e:
215
228
  # Log HTTP status errors but continue crawling other pages
216
- logger.warning(f"HTTP status error while crawling {current_url}: {e}")
217
- # For the initial URL, we should raise the error
218
- if current_url == url and not crawler_result:
229
+ # Skip redirect errors (3xx) as they should be handled by follow_redirects
230
+ if e.response.status_code >= 300 and e.response.status_code < 400:
231
+ logger.debug(f"Redirect encountered for {current_url}, skipping: {e}")
232
+ else:
233
+ logger.warning(f"HTTP status error while crawling {current_url}: {e}")
234
+ # For the initial URL, we should raise the error only if it's not a redirect
235
+ if current_url == url and not crawler_result and not (300 <= e.response.status_code < 400):
219
236
  raise
220
237
  except httpx.RequestError as e:
221
238
  # Log request errors but continue crawling other pages