agno 1.8.1__py3-none-any.whl → 2.0.0__py3-none-any.whl

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 (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1416 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1551 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/knowledge/arxiv.py DELETED
@@ -1,33 +0,0 @@
1
- from typing import AsyncIterator, Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.document.reader.arxiv_reader import ArxivReader
5
- from agno.knowledge.agent import AgentKnowledge
6
-
7
-
8
- class ArxivKnowledgeBase(AgentKnowledge):
9
- queries: List[str] = []
10
- reader: ArxivReader = ArxivReader()
11
-
12
- @property
13
- def document_lists(self) -> Iterator[List[Document]]:
14
- """Iterate over urls and yield lists of documents.
15
- Each object yielded by the iterator is a list of documents.
16
-
17
- Returns:
18
- Iterator[List[Document]]: Iterator yielding list of documents
19
- """
20
-
21
- for _query in self.queries:
22
- yield self.reader.read(query=_query)
23
-
24
- @property
25
- async def async_document_lists(self) -> AsyncIterator[List[Document]]:
26
- """Iterate over queries and yield lists of documents asynchronously.
27
- Each object yielded by the iterator is a list of documents.
28
-
29
- Returns:
30
- AsyncIterator[List[Document]]: Async iterator yielding list of documents
31
- """
32
- for _query in self.queries:
33
- yield await self.reader.async_read(query=_query)
@@ -1,36 +0,0 @@
1
- from typing import AsyncIterator, Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.knowledge.agent import AgentKnowledge
5
- from agno.utils.log import log_debug
6
-
7
-
8
- class CombinedKnowledgeBase(AgentKnowledge):
9
- sources: List[AgentKnowledge] = []
10
-
11
- @property
12
- def document_lists(self) -> Iterator[List[Document]]:
13
- """Iterate over knowledge bases and yield lists of documents.
14
- Each object yielded by the iterator is a list of documents.
15
-
16
- Returns:
17
- Iterator[List[Document]]: Iterator yielding list of documents
18
- """
19
-
20
- for kb in self.sources:
21
- log_debug(f"Loading documents from {kb.__class__.__name__}")
22
- yield from kb.document_lists
23
-
24
- @property
25
- async def async_document_lists(self) -> AsyncIterator[List[Document]]:
26
- """Iterate over knowledge bases and yield lists of documents.
27
- Each object yielded by the iterator is a list of documents.
28
-
29
- Returns:
30
- Iterator[List[Document]]: Iterator yielding list of documents
31
- """
32
-
33
- for kb in self.sources:
34
- log_debug(f"Loading documents from {kb.__class__.__name__}")
35
- async for document in kb.async_document_lists: # type: ignore
36
- yield document
agno/knowledge/csv.py DELETED
@@ -1,144 +0,0 @@
1
- from pathlib import Path
2
- from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Union
3
-
4
- from pydantic import Field
5
-
6
- from agno.document import Document
7
- from agno.document.reader.csv_reader import CSVReader
8
- from agno.knowledge.agent import AgentKnowledge
9
- from agno.utils.log import log_info, logger
10
-
11
-
12
- class CSVKnowledgeBase(AgentKnowledge):
13
- path: Optional[Union[str, Path, List[Dict[str, Union[str, Dict[str, Any]]]]]] = None
14
- formats: List[str] = [".csv"]
15
- exclude_files: List[str] = Field(default_factory=list)
16
- reader: CSVReader = CSVReader()
17
-
18
- @property
19
- def document_lists(self) -> Iterator[List[Document]]:
20
- """Iterate over CSV files and yield lists of documents."""
21
- if self.path is None:
22
- raise ValueError("Path is not set")
23
-
24
- if isinstance(self.path, list):
25
- for item in self.path:
26
- if isinstance(item, dict) and "path" in item:
27
- # Handle path with metadata
28
- file_path = item["path"]
29
- config = item.get("metadata", {})
30
- _csv_path = Path(file_path) # type: ignore
31
- if self._is_valid_csv(_csv_path):
32
- documents = self.reader.read(file=_csv_path)
33
- if config:
34
- for doc in documents:
35
- log_info(f"Adding metadata {config} to document: {doc.name}")
36
- doc.meta_data.update(config) # type: ignore
37
- yield documents
38
- else:
39
- # Handle single path
40
- _csv_path = Path(self.path)
41
- if _csv_path.is_dir():
42
- for _csv in _csv_path.glob("**/*.csv"):
43
- if _csv.name not in self.exclude_files:
44
- yield self.reader.read(file=_csv)
45
- elif self._is_valid_csv(_csv_path):
46
- yield self.reader.read(file=_csv_path)
47
-
48
- def _is_valid_csv(self, path: Path) -> bool:
49
- """Helper to check if path is a valid CSV file."""
50
- return path.exists() and path.is_file() and path.suffix == ".csv" and path.name not in self.exclude_files
51
-
52
- @property
53
- async def async_document_lists(self) -> AsyncIterator[List[Document]]:
54
- """Iterate over CSV files and yield lists of documents asynchronously."""
55
- if self.path is None:
56
- raise ValueError("Path is not set")
57
-
58
- if isinstance(self.path, list):
59
- for item in self.path:
60
- if isinstance(item, dict) and "path" in item:
61
- # Handle path with metadata
62
- file_path = item["path"]
63
- config = item.get("metadata", {})
64
- _csv_path = Path(file_path) # type: ignore
65
- if self._is_valid_csv(_csv_path):
66
- documents = await self.reader.async_read(file=_csv_path)
67
- if config:
68
- for doc in documents:
69
- log_info(f"Adding metadata {config} to document: {doc.name}")
70
- doc.meta_data.update(config) # type: ignore
71
- yield documents
72
- else:
73
- # Handle single path
74
- _csv_path = Path(self.path)
75
- if _csv_path.is_dir():
76
- for _csv in _csv_path.glob("**/*.csv"):
77
- if _csv.name not in self.exclude_files:
78
- yield await self.reader.async_read(file=_csv)
79
- elif self._is_valid_csv(_csv_path):
80
- yield await self.reader.async_read(file=_csv_path)
81
-
82
- def load_document(
83
- self,
84
- path: Union[str, Path],
85
- metadata: Optional[Dict[str, Any]] = None,
86
- recreate: bool = False,
87
- upsert: bool = False,
88
- skip_existing: bool = True,
89
- ) -> None:
90
- """Load documents from a single CSV file with specific metadata into the vector DB."""
91
-
92
- _file_path = Path(path) if isinstance(path, str) else path
93
-
94
- # Validate file and prepare collection in one step
95
- if not self.prepare_load(_file_path, self.formats, metadata, recreate):
96
- return
97
-
98
- # Read documents
99
- try:
100
- documents = self.reader.read(file=_file_path)
101
- except Exception as e:
102
- logger.exception(f"Failed to read documents from file {_file_path}: {e}")
103
- return
104
-
105
- # Process documents
106
- self.process_documents(
107
- documents=documents,
108
- metadata=metadata,
109
- upsert=upsert,
110
- skip_existing=skip_existing,
111
- source_info=str(_file_path),
112
- )
113
-
114
- async def aload_document(
115
- self,
116
- path: Union[str, Path],
117
- metadata: Optional[Dict[str, Any]] = None,
118
- recreate: bool = False,
119
- upsert: bool = False,
120
- skip_existing: bool = True,
121
- ) -> None:
122
- """Load documents from a single CSV file with specific metadata into the vector DB."""
123
-
124
- _file_path = Path(path) if isinstance(path, str) else path
125
-
126
- # Validate file and prepare collection in one step
127
- if not await self.aprepare_load(_file_path, self.formats, metadata, recreate):
128
- return
129
-
130
- # Read documents
131
- try:
132
- documents = await self.reader.async_read(file=_file_path)
133
- except Exception as e:
134
- logger.exception(f"Failed to read documents from file {_file_path}: {e}")
135
- return
136
-
137
- # Process documents
138
- await self.aprocess_documents(
139
- documents=documents,
140
- metadata=metadata,
141
- upsert=upsert,
142
- skip_existing=skip_existing,
143
- source_info=str(_file_path),
144
- )
agno/knowledge/csv_url.py DELETED
@@ -1,124 +0,0 @@
1
- from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Union
2
-
3
- from agno.document import Document
4
- from agno.document.reader.csv_reader import CSVUrlReader
5
- from agno.knowledge.agent import AgentKnowledge
6
- from agno.utils.log import log_info, logger
7
-
8
-
9
- class CSVUrlKnowledgeBase(AgentKnowledge):
10
- urls: Optional[Union[List[str], List[Dict[str, Union[str, Dict[str, Any]]]]]] = None
11
- formats: List[str] = [".csv"]
12
- reader: CSVUrlReader = CSVUrlReader()
13
-
14
- @property
15
- def document_lists(self) -> Iterator[List[Document]]:
16
- """Iterate over CSV URLs and yield lists of documents."""
17
- if self.urls is None:
18
- raise ValueError("URLs are not set")
19
-
20
- for item in self.urls:
21
- if isinstance(item, dict) and "url" in item:
22
- # Handle URL with metadata
23
- url = item["url"]
24
- if isinstance(url, str): # Type guard
25
- config = item.get("metadata", {})
26
- if self._is_valid_csv_url(url):
27
- documents = self.reader.read(url=url)
28
- if config and isinstance(config, dict):
29
- for doc in documents:
30
- log_info(f"Adding metadata {config} to document: {doc.name}")
31
- doc.meta_data.update(config) # type: ignore
32
- yield documents
33
- elif isinstance(item, str):
34
- # Handle plain URL string
35
- if self._is_valid_csv_url(item):
36
- yield self.reader.read(url=item)
37
-
38
- def _is_valid_csv_url(self, url: str) -> bool:
39
- """Helper to check if URL is a valid CSV URL."""
40
- return url.endswith(".csv")
41
-
42
- @property
43
- async def async_document_lists(self) -> AsyncIterator[List[Document]]:
44
- """Iterate over CSV URLs and yield lists of documents asynchronously."""
45
- if self.urls is None:
46
- raise ValueError("URLs are not set")
47
-
48
- for item in self.urls:
49
- if isinstance(item, dict) and "url" in item:
50
- # Handle URL with metadata
51
- url = item["url"]
52
- if isinstance(url, str): # Type guard
53
- config = item.get("metadata", {})
54
- if self._is_valid_csv_url(url):
55
- documents = await self.reader.async_read(url=url)
56
- if config and isinstance(config, dict):
57
- for doc in documents:
58
- log_info(f"Adding metadata {config} to document: {doc.name}")
59
- doc.meta_data.update(config) # type: ignore
60
- yield documents
61
- elif isinstance(item, str):
62
- # Handle plain URL string
63
- if self._is_valid_csv_url(item):
64
- yield await self.reader.async_read(url=item)
65
-
66
- def load_document(
67
- self,
68
- url: str,
69
- metadata: Optional[Dict[str, Any]] = None,
70
- recreate: bool = False,
71
- upsert: bool = False,
72
- skip_existing: bool = True,
73
- ) -> None:
74
- """Load documents from a single CSV URL with specific metadata into the vector DB."""
75
-
76
- # Validate URL and prepare collection in one step
77
- if not self.prepare_load(url, self.formats, metadata, recreate, is_url=True): # type: ignore
78
- return
79
-
80
- # Read documents
81
- try:
82
- documents = self.reader.read(url=url)
83
- except Exception as e:
84
- logger.exception(f"Failed to read documents from URL {url}: {e}")
85
- return
86
-
87
- # Process documents
88
- self.process_documents(
89
- documents=documents,
90
- metadata=metadata,
91
- upsert=upsert,
92
- skip_existing=skip_existing,
93
- source_info=url,
94
- )
95
-
96
- async def aload_document(
97
- self,
98
- url: str,
99
- metadata: Optional[Dict[str, Any]] = None,
100
- recreate: bool = False,
101
- upsert: bool = False,
102
- skip_existing: bool = True,
103
- ) -> None:
104
- """Load documents from a single CSV URL with specific metadata into the vector DB."""
105
-
106
- # Validate URL and prepare collection in one step
107
- if not await self.aprepare_load(url, self.formats, metadata, recreate, is_url=True): # type: ignore
108
- return
109
-
110
- # Read documents
111
- try:
112
- documents = await self.reader.async_read(url=url)
113
- except Exception as e:
114
- logger.exception(f"Failed to read documents from URL {url}: {e}")
115
- return
116
-
117
- # Process documents
118
- await self.aprocess_documents(
119
- documents=documents,
120
- metadata=metadata,
121
- upsert=upsert,
122
- skip_existing=skip_existing,
123
- source_info=url,
124
- )
@@ -1,223 +0,0 @@
1
- from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Union
2
-
3
- from agno.document import Document
4
- from agno.knowledge.agent import AgentKnowledge
5
- from agno.utils.log import log_info, logger
6
-
7
-
8
- class DocumentKnowledgeBase(AgentKnowledge):
9
- documents: Optional[Union[List[Document], List[Dict[str, Any]]]] = None
10
-
11
- @property
12
- def document_lists(self) -> Iterator[List[Document]]:
13
- """Iterate over documents and yield lists of documents.
14
- Each object yielded by the iterator is a list of documents.
15
-
16
- Returns:
17
- Iterator[List[Document]]: Iterator yielding list of documents
18
- """
19
- if self.documents is None:
20
- # Return empty iterator when no documents are set
21
- return
22
-
23
- for item in self.documents:
24
- if isinstance(item, dict) and "document" in item:
25
- # Handle document with metadata
26
- document: Document = item["document"]
27
- config = item.get("metadata", {})
28
- if config:
29
- log_info(f"Adding metadata {config} to document: {document.name}")
30
- # Create a copy of the document with updated metadata
31
- updated_document = Document(
32
- content=document.content,
33
- id=document.id,
34
- name=document.name,
35
- meta_data={**document.meta_data, **config},
36
- embedder=document.embedder,
37
- embedding=document.embedding,
38
- usage=document.usage,
39
- reranking_score=document.reranking_score,
40
- )
41
- yield [updated_document]
42
- else:
43
- yield [document]
44
- elif isinstance(item, Document):
45
- # Handle direct document
46
- yield [item]
47
- else:
48
- raise ValueError(f"Invalid document format: {type(item)}")
49
-
50
- @property
51
- async def async_document_lists(self) -> AsyncIterator[List[Document]]:
52
- """Iterate over documents and yield lists of documents asynchronously.
53
- Each object yielded by the iterator is a list of documents.
54
-
55
- Returns:
56
- AsyncIterator[List[Document]]: Iterator yielding list of documents
57
- """
58
- if self.documents is None:
59
- # Return empty iterator when no documents are set
60
- return
61
-
62
- for item in self.documents:
63
- if isinstance(item, dict) and "document" in item:
64
- # Handle document with metadata
65
- document: Document = item["document"]
66
- config = item.get("metadata", {})
67
- if config:
68
- log_info(f"Adding metadata {config} to document: {document.name}")
69
- # Create a copy of the document with updated metadata
70
- updated_document = Document(
71
- content=document.content,
72
- id=document.id,
73
- name=document.name,
74
- meta_data={**document.meta_data, **config},
75
- embedder=document.embedder,
76
- embedding=document.embedding,
77
- usage=document.usage,
78
- reranking_score=document.reranking_score,
79
- )
80
- yield [updated_document]
81
- else:
82
- yield [document]
83
- elif isinstance(item, Document):
84
- # Handle direct document
85
- yield [item]
86
- else:
87
- raise ValueError(f"Invalid document format: {type(item)}")
88
-
89
- def _prepare_document_load(
90
- self,
91
- metadata: Optional[Dict[str, Any]] = None,
92
- recreate: bool = False,
93
- ) -> bool:
94
- """Prepare collection for loading documents (no file validation needed).
95
- Args:
96
- metadata (Optional[Dict[str, Any]]): Metadata to track
97
- recreate (bool): Whether to recreate the collection
98
- Returns:
99
- bool: True if preparation succeeded, False otherwise
100
- """
101
- # 1. Track metadata
102
- if metadata:
103
- self._track_metadata_structure(metadata)
104
-
105
- # 2. Prepare vector DB
106
- if self.vector_db is None:
107
- logger.warning("Cannot load document: No vector db provided.")
108
- return False
109
-
110
- # Recreate collection if requested
111
- if recreate:
112
- self.vector_db.drop()
113
-
114
- # Create collection if it doesn't exist
115
- if not self.vector_db.exists():
116
- self.vector_db.create()
117
-
118
- return True
119
-
120
- async def _aprepare_document_load(
121
- self,
122
- metadata: Optional[Dict[str, Any]] = None,
123
- recreate: bool = False,
124
- ) -> bool:
125
- """Prepare collection for loading documents asynchronously (no file validation needed).
126
- Args:
127
- metadata (Optional[Dict[str, Any]]): Metadata to track
128
- recreate (bool): Whether to recreate the collection
129
- Returns:
130
- bool: True if preparation succeeded, False otherwise
131
- """
132
- # 1. Track metadata
133
- if metadata:
134
- self._track_metadata_structure(metadata)
135
-
136
- # 2. Prepare vector DB
137
- if self.vector_db is None:
138
- logger.warning("Cannot load document: No vector db provided.")
139
- return False
140
-
141
- # Recreate collection if requested
142
- if recreate:
143
- await self.vector_db.async_drop()
144
-
145
- # Create collection if it doesn't exist
146
- if not await self.vector_db.async_exists():
147
- await self.vector_db.async_create()
148
-
149
- return True
150
-
151
- def load_document(
152
- self,
153
- document: Document,
154
- metadata: Optional[Dict[str, Any]] = None,
155
- recreate: bool = False,
156
- upsert: bool = False,
157
- skip_existing: bool = True,
158
- ) -> None:
159
- """Load a single document with specific metadata into the vector DB."""
160
-
161
- # Use our document-specific preparation method
162
- if not self._prepare_document_load(metadata, recreate):
163
- return
164
-
165
- # Apply metadata if provided
166
- if metadata:
167
- # Create a copy of the document with updated metadata
168
- document = Document(
169
- content=document.content,
170
- id=document.id,
171
- name=document.name,
172
- meta_data={**document.meta_data, **metadata},
173
- embedder=document.embedder,
174
- embedding=document.embedding,
175
- usage=document.usage,
176
- reranking_score=document.reranking_score,
177
- )
178
-
179
- # Process documents
180
- self.process_documents(
181
- documents=[document],
182
- metadata=metadata,
183
- upsert=upsert,
184
- skip_existing=skip_existing,
185
- source_info=f"document: {document.name or document.id}",
186
- )
187
-
188
- async def aload_document(
189
- self,
190
- document: Document,
191
- metadata: Optional[Dict[str, Any]] = None,
192
- recreate: bool = False,
193
- upsert: bool = False,
194
- skip_existing: bool = True,
195
- ) -> None:
196
- """Load a single document with specific metadata into the vector DB asynchronously."""
197
-
198
- # Use our document-specific preparation method
199
- if not await self._aprepare_document_load(metadata, recreate):
200
- return
201
-
202
- # Apply metadata if provided
203
- if metadata:
204
- # Create a copy of the document with updated metadata
205
- document = Document(
206
- content=document.content,
207
- id=document.id,
208
- name=document.name,
209
- meta_data={**document.meta_data, **metadata},
210
- embedder=document.embedder,
211
- embedding=document.embedding,
212
- usage=document.usage,
213
- reranking_score=document.reranking_score,
214
- )
215
-
216
- # Process documents
217
- await self.aprocess_documents(
218
- documents=[document],
219
- metadata=metadata,
220
- upsert=upsert,
221
- skip_existing=skip_existing,
222
- source_info=f"document: {document.name or document.id}",
223
- )