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
@@ -0,0 +1,374 @@
1
+ import asyncio
2
+ from typing import Any, Dict, List, Optional
3
+
4
+ import httpx
5
+
6
+ from agno.knowledge.document import Document
7
+ from agno.utils.log import log_debug, log_error, log_info, log_warning
8
+ from agno.vectordb.base import VectorDb
9
+
10
+ DEFAULT_SERVER_URL = "http://localhost:9621"
11
+
12
+
13
+ class LightRag(VectorDb):
14
+ """
15
+ LightRAG VectorDB implementation
16
+ """
17
+
18
+ def __init__(
19
+ self,
20
+ server_url: str = DEFAULT_SERVER_URL,
21
+ api_key: Optional[str] = None,
22
+ auth_header_name: str = "X-API-KEY",
23
+ auth_header_format: str = "{api_key}",
24
+ ):
25
+ self.server_url = server_url
26
+ self.api_key = api_key
27
+ self.auth_header_name = auth_header_name
28
+ self.auth_header_format = auth_header_format
29
+
30
+ def _get_headers(self) -> Dict[str, str]:
31
+ """Get headers with optional API key authentication."""
32
+ headers = {"Content-Type": "application/json"}
33
+ if self.api_key:
34
+ headers[self.auth_header_name] = self.auth_header_format.format(api_key=self.api_key)
35
+ return headers
36
+
37
+ def _get_auth_headers(self) -> Dict[str, str]:
38
+ """Get minimal headers with just authentication (for file uploads)."""
39
+ headers = {}
40
+ if self.api_key:
41
+ headers[self.auth_header_name] = self.auth_header_format.format(api_key=self.api_key)
42
+ return headers
43
+
44
+ def create(self) -> None:
45
+ """Create the vector database"""
46
+ pass
47
+
48
+ async def async_create(self) -> None:
49
+ """Async create the vector database"""
50
+ pass
51
+
52
+ def name_exists(self, name: str) -> bool:
53
+ """Check if a document with the given name exists"""
54
+ return False
55
+
56
+ async def async_name_exists(self, name: str) -> bool:
57
+ """Async check if a document with the given name exists"""
58
+ return False
59
+
60
+ def id_exists(self, id: str) -> bool:
61
+ """Check if a document with the given ID exists"""
62
+ return False
63
+
64
+ def content_hash_exists(self, content_hash: str) -> bool:
65
+ """Check if content with the given hash exists"""
66
+ return False
67
+
68
+ def insert(self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
69
+ """Insert documents into the vector database"""
70
+ pass
71
+
72
+ async def async_insert(
73
+ self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None
74
+ ) -> None:
75
+ """Async insert documents into the vector database"""
76
+ pass
77
+
78
+ def upsert(self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
79
+ """Upsert documents into the vector database"""
80
+ pass
81
+
82
+ def delete_by_content_id(self, content_id: str) -> None:
83
+ """Delete documents by content ID"""
84
+ pass
85
+
86
+ async def async_upsert(self, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
87
+ """Async upsert documents into the vector database"""
88
+ pass
89
+
90
+ def search(self, query: str, limit: int = 5, filters: Optional[Dict[str, Any]] = None) -> List[Document]:
91
+ result = asyncio.run(self.async_search(query, limit=limit, filters=filters))
92
+ return result if result is not None else []
93
+
94
+ async def async_search(
95
+ self, query: str, limit: Optional[int] = None, filters: Optional[Dict[str, Any]] = None
96
+ ) -> Optional[List[Document]]:
97
+ mode: str = "hybrid" # Default mode, can be "local", "global", or "hybrid"
98
+ try:
99
+ async with httpx.AsyncClient(timeout=30.0) as client:
100
+ response = await client.post(
101
+ f"{self.server_url}/query",
102
+ json={"query": query, "mode": "hybrid"},
103
+ headers=self._get_headers(),
104
+ )
105
+
106
+ response.raise_for_status()
107
+ result = response.json()
108
+
109
+ return self._format_lightrag_response(result, query, mode)
110
+
111
+ except httpx.RequestError as e:
112
+ log_error(f"HTTP Request Error: {type(e).__name__}: {str(e)}")
113
+ return []
114
+ except httpx.HTTPStatusError as e:
115
+ log_error(f"HTTP Status Error: {e.response.status_code} - {e.response.text}")
116
+ return []
117
+ except Exception as e:
118
+ log_error(f"Unexpected error during LightRAG server search: {type(e).__name__}: {str(e)}")
119
+ import traceback
120
+
121
+ log_error(f"Full traceback: {traceback.format_exc()}")
122
+ return None
123
+
124
+ def drop(self) -> None:
125
+ """Drop the vector database"""
126
+ asyncio.run(self.async_drop())
127
+
128
+ async def async_drop(self) -> None:
129
+ """Async drop the vector database"""
130
+ async with httpx.AsyncClient(timeout=30.0) as client:
131
+ await client.delete(f"{self.server_url}/documents", headers=self._get_headers())
132
+
133
+ async with httpx.AsyncClient(timeout=30.0) as client:
134
+ await client.post(
135
+ f"{self.server_url}/documents/clear_cache",
136
+ json={"modes": ["default", "naive"]},
137
+ headers=self._get_headers(),
138
+ )
139
+
140
+ def exists(self) -> bool:
141
+ """Check if the vector database exists"""
142
+ return False
143
+
144
+ async def async_exists(self) -> bool:
145
+ """Async check if the vector database exists"""
146
+ return False
147
+
148
+ def delete(self) -> bool:
149
+ """Delete all documents from the vector database"""
150
+ return False
151
+
152
+ def delete_by_id(self, id: str) -> bool:
153
+ """Delete documents by ID"""
154
+ return False
155
+
156
+ def delete_by_name(self, name: str) -> bool:
157
+ """Delete documents by name"""
158
+ return False
159
+
160
+ def delete_by_metadata(self, metadata: Dict[str, Any]) -> bool:
161
+ """Delete documents by metadata"""
162
+ return False
163
+
164
+ def delete_by_external_id(self, external_id: str) -> bool:
165
+ """Delete documents by external ID (sync wrapper)"""
166
+ import asyncio
167
+
168
+ try:
169
+ return asyncio.run(self.async_delete_by_external_id(external_id))
170
+ except Exception as e:
171
+ log_error(f"Error in sync delete_by_external_id: {e}")
172
+ return False
173
+
174
+ async def async_delete_by_external_id(self, external_id: str) -> bool:
175
+ """Delete documents by external ID"""
176
+ try:
177
+ payload = {"doc_ids": [external_id], "delete_file": False}
178
+
179
+ async with httpx.AsyncClient() as client:
180
+ response = await client.request(
181
+ method="DELETE",
182
+ url=f"{self.server_url}/documents/delete_document",
183
+ headers=self._get_headers(),
184
+ json=payload,
185
+ )
186
+ response.raise_for_status()
187
+ return True
188
+ except Exception as e:
189
+ log_error(f"Error deleting document {external_id}: {e}")
190
+ return False
191
+
192
+ # We use this method when content is coming from unsupported file types that LightRAG can't process
193
+ # For these we process the content in Agno and then insert it into LightRAG using text
194
+ async def _insert_text(self, text: str) -> Dict[str, Any]:
195
+ """Insert text into the LightRAG server."""
196
+
197
+ async with httpx.AsyncClient() as client:
198
+ response = await client.post(
199
+ f"{self.server_url}/documents/text",
200
+ json={"text": text},
201
+ headers=self._get_headers(),
202
+ )
203
+ response.raise_for_status()
204
+ result = response.json()
205
+ log_debug(f"Text insertion result: {result}")
206
+ return result
207
+
208
+ async def insert_file_bytes(
209
+ self,
210
+ file_content: bytes,
211
+ filename: Optional[str] = None,
212
+ content_type: Optional[str] = None,
213
+ send_metadata: bool = False,
214
+ skip_if_exists: bool = False,
215
+ ) -> Optional[str]:
216
+ """Insert file from raw bytes into the LightRAG server."""
217
+
218
+ if not file_content:
219
+ log_warning("File content is empty.")
220
+ return None
221
+
222
+ if send_metadata and filename and content_type:
223
+ # Send with filename and content type (full UploadFile format)
224
+ files = {"file": (filename, file_content, content_type)}
225
+ else:
226
+ files = {"file": file_content} # type: ignore
227
+
228
+ async with httpx.AsyncClient() as client:
229
+ response = await client.post(
230
+ f"{self.server_url}/documents/upload",
231
+ files=files,
232
+ headers=self._get_auth_headers(),
233
+ )
234
+ response.raise_for_status()
235
+ result = response.json()
236
+ log_info(f"File insertion result: {result}")
237
+ track_id = result["track_id"]
238
+ log_info(f"Track ID: {track_id}")
239
+ result = await self._get_document_id(track_id) # type: ignore
240
+ log_info(f"Document ID: {result}")
241
+
242
+ return result
243
+
244
+ async def insert_text(self, file_source: str, text: str) -> Optional[str]:
245
+ """Insert text into the LightRAG server."""
246
+ import httpx
247
+
248
+ async with httpx.AsyncClient() as client:
249
+ response = await client.post(
250
+ f"{self.server_url}/documents/text",
251
+ json={"file_source": file_source, "text": text},
252
+ headers=self._get_headers(),
253
+ )
254
+ response.raise_for_status()
255
+ result = response.json()
256
+
257
+ log_info(f"Text insertion result: {result}")
258
+ track_id = result["track_id"]
259
+ log_info(f"Track ID: {track_id}")
260
+ result = await self._get_document_id(track_id) # type: ignore
261
+ log_info(f"Document ID: {result}")
262
+
263
+ return result
264
+
265
+ async def _get_document_id(self, track_id: str) -> Optional[str]:
266
+ """Get the document ID from the upload ID."""
267
+ async with httpx.AsyncClient() as client:
268
+ response = await client.get(
269
+ f"{self.server_url}/documents/track_status/{track_id}",
270
+ headers=self._get_headers(),
271
+ )
272
+ response.raise_for_status()
273
+ result = response.json()
274
+
275
+ log_debug(f"Document ID result: {result}")
276
+
277
+ # Extract document ID from the documents array
278
+ if "documents" in result and len(result["documents"]) > 0:
279
+ document_id = result["documents"][0]["id"]
280
+ return document_id
281
+ else:
282
+ log_error(f"No documents found in track response: {result}")
283
+ return None
284
+
285
+ def _is_valid_url(self, url: str) -> bool:
286
+ """Helper to check if URL is valid."""
287
+ # TODO: Define supported extensions or implement proper URL validation
288
+ return True
289
+
290
+ async def lightrag_knowledge_retriever(
291
+ self,
292
+ query: str,
293
+ ) -> Optional[List[Document]]:
294
+ """
295
+ Custom knowledge retriever function to search the LightRAG server for relevant documents.
296
+
297
+ Args:
298
+ query: The search query string
299
+ num_documents: Number of documents to retrieve (currently unused by LightRAG)
300
+ mode: Query mode - "local", "global", or "hybrid"
301
+ lightrag_server_url: URL of the LightRAG server
302
+
303
+ Returns:
304
+ List of retrieved documents or None if search fails
305
+ """
306
+
307
+ mode: str = "hybrid" # Default mode, can be "local", "global", or "hybrid"
308
+
309
+ try:
310
+ import httpx
311
+
312
+ async with httpx.AsyncClient(timeout=30.0) as client:
313
+ response = await client.post(
314
+ f"{self.server_url}/query",
315
+ json={"query": query, "mode": "hybrid"},
316
+ headers=self._get_headers(),
317
+ )
318
+
319
+ response.raise_for_status()
320
+ result = response.json()
321
+
322
+ return self._format_lightrag_response(result, query, mode)
323
+
324
+ except httpx.RequestError as e:
325
+ log_error(f"HTTP Request Error: {type(e).__name__}: {str(e)}")
326
+ return None
327
+ except httpx.HTTPStatusError as e:
328
+ log_error(f"HTTP Status Error: {e.response.status_code} - {e.response.text}")
329
+ return None
330
+ except Exception as e:
331
+ log_error(f"Unexpected error during LightRAG server search: {type(e).__name__}: {str(e)}")
332
+ import traceback
333
+
334
+ log_error(f"Full traceback: {traceback.format_exc()}")
335
+ return None
336
+
337
+ def _format_lightrag_response(self, result: Any, query: str, mode: str) -> List[Document]:
338
+ """Format LightRAG server response to expected document format."""
339
+ # LightRAG server returns a dict with 'response' key, but we expect a list of documents
340
+ # Convert the response to the expected format
341
+ if isinstance(result, dict) and "response" in result:
342
+ # Wrap the response in a Document object
343
+ return [
344
+ Document(content=result["response"], meta_data={"source": "lightrag", "query": query, "mode": mode})
345
+ ]
346
+ elif isinstance(result, list):
347
+ # Convert list items to Document objects
348
+ documents = []
349
+ for item in result:
350
+ if isinstance(item, dict) and "content" in item:
351
+ documents.append(
352
+ Document(
353
+ content=item["content"],
354
+ meta_data=item.get("metadata", {"source": "lightrag", "query": query, "mode": mode}),
355
+ )
356
+ )
357
+ else:
358
+ documents.append(
359
+ Document(content=str(item), meta_data={"source": "lightrag", "query": query, "mode": mode})
360
+ )
361
+ return documents
362
+ else:
363
+ # If it's a string or other format, wrap it in a Document
364
+ return [Document(content=str(result), meta_data={"source": "lightrag", "query": query, "mode": mode})]
365
+
366
+ def update_metadata(self, content_id: str, metadata: Dict[str, Any]) -> None:
367
+ """
368
+ Update metadata is not supported for LightRag as it manages its own graph structure.
369
+
370
+ Args:
371
+ content_id (str): The content ID to update
372
+ metadata (Dict[str, Any]): The metadata to update
373
+ """
374
+ raise NotImplementedError("update_metadata not supported for LightRag - use LightRag's native methods")
@@ -0,0 +1,127 @@
1
+ from typing import Any, Callable, Dict, List, Optional
2
+
3
+ from agno.knowledge.document import Document
4
+ from agno.utils.log import logger
5
+ from agno.vectordb.base import VectorDb
6
+
7
+ try:
8
+ from llama_index.core.retrievers import BaseRetriever
9
+ from llama_index.core.schema import NodeWithScore
10
+ except ImportError:
11
+ raise ImportError(
12
+ "The `llama-index-core` package is not installed. Please install it via `pip install llama-index-core`."
13
+ )
14
+
15
+
16
+ class LlamaIndexVectorDb(VectorDb):
17
+ knowledge_retriever: BaseRetriever
18
+ loader: Optional[Callable] = None
19
+
20
+ def create(self) -> None:
21
+ raise NotImplementedError
22
+
23
+ async def async_create(self) -> None:
24
+ raise NotImplementedError
25
+
26
+ def name_exists(self, name: str) -> bool:
27
+ raise NotImplementedError
28
+
29
+ def async_name_exists(self, name: str) -> bool:
30
+ raise NotImplementedError
31
+
32
+ def id_exists(self, id: str) -> bool:
33
+ raise NotImplementedError
34
+
35
+ def content_hash_exists(self, content_hash: str) -> bool:
36
+ raise NotImplementedError
37
+
38
+ def insert(self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
39
+ logger.warning("LlamaIndexVectorDb.insert() not supported - please check the vectorstore manually.")
40
+ raise NotImplementedError
41
+
42
+ async def async_insert(
43
+ self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None
44
+ ) -> None:
45
+ logger.warning("LlamaIndexVectorDb.async_insert() not supported - please check the vectorstore manually.")
46
+ raise NotImplementedError
47
+
48
+ def upsert(self, content_hash: str, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
49
+ logger.warning("LlamaIndexVectorDb.upsert() not supported - please check the vectorstore manually.")
50
+ raise NotImplementedError
51
+
52
+ async def async_upsert(self, documents: List[Document], filters: Optional[Dict[str, Any]] = None) -> None:
53
+ logger.warning("LlamaIndexVectorDb.async_upsert() not supported - please check the vectorstore manually.")
54
+ raise NotImplementedError
55
+
56
+ def search(
57
+ self, query: str, num_documents: Optional[int] = None, filters: Optional[Dict[str, Any]] = None
58
+ ) -> List[Document]:
59
+ """
60
+ Returns relevant documents matching the query.
61
+
62
+ Args:
63
+ query (str): The query string to search for.
64
+ num_documents (Optional[int]): The maximum number of documents to return. Defaults to None.
65
+ filters (Optional[Dict[str, Any]]): Filters to apply to the search. Defaults to None.
66
+
67
+ Returns:
68
+ List[Document]: A list of relevant documents matching the query.
69
+ Raises:
70
+ ValueError: If the knowledge retriever is not of type BaseRetriever.
71
+ """
72
+ if not isinstance(self.knowledge_retriever, BaseRetriever):
73
+ raise ValueError(f"Knowledge retriever is not of type BaseRetriever: {self.knowledge_retriever}")
74
+
75
+ lc_documents: List[NodeWithScore] = self.knowledge_retriever.retrieve(query)
76
+ if num_documents is not None:
77
+ lc_documents = lc_documents[:num_documents]
78
+ documents = []
79
+ for lc_doc in lc_documents:
80
+ documents.append(
81
+ Document(
82
+ content=lc_doc.text,
83
+ meta_data=lc_doc.metadata,
84
+ )
85
+ )
86
+ return documents
87
+
88
+ async def async_search(
89
+ self, query: str, limit: int = 5, filters: Optional[Dict[str, Any]] = None
90
+ ) -> List[Document]:
91
+ return self.search(query, limit, filters)
92
+
93
+ def drop(self) -> None:
94
+ raise NotImplementedError
95
+
96
+ async def async_drop(self) -> None:
97
+ raise NotImplementedError
98
+
99
+ async def async_exists(self) -> bool:
100
+ raise NotImplementedError
101
+
102
+ def delete(self) -> bool:
103
+ raise NotImplementedError
104
+
105
+ def delete_by_id(self, id: str) -> bool:
106
+ raise NotImplementedError
107
+
108
+ def delete_by_name(self, name: str) -> bool:
109
+ raise NotImplementedError
110
+
111
+ def delete_by_metadata(self, metadata: Dict[str, Any]) -> bool:
112
+ raise NotImplementedError
113
+
114
+ def exists(self) -> bool:
115
+ logger.warning("LlamaIndexKnowledgeBase.exists() not supported - please check the vectorstore manually.")
116
+ return True
117
+
118
+ def update_metadata(self, content_id: str, metadata: Dict[str, Any]) -> None:
119
+ """
120
+ Update the metadata for documents with the given content_id.
121
+ Not implemented for LlamaIndex wrapper.
122
+
123
+ Args:
124
+ content_id (str): The content ID to update
125
+ metadata (Dict[str, Any]): The metadata to update
126
+ """
127
+ raise NotImplementedError("update_metadata not supported for LlamaIndex vectorstores")