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