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