agno 0.1.2__py3-none-any.whl → 2.3.13__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 (723) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +44 -5
  3. agno/agent/agent.py +10531 -2975
  4. agno/api/agent.py +14 -53
  5. agno/api/api.py +7 -46
  6. agno/api/evals.py +22 -0
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -25
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +6 -9
  11. agno/api/schemas/evals.py +16 -0
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +10 -10
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +16 -0
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +22 -26
  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/compression/__init__.py +3 -0
  25. agno/compression/manager.py +247 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +946 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2781 -0
  33. agno/db/dynamo/schemas.py +442 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +2379 -0
  37. agno/db/firestore/schemas.py +181 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1791 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1312 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1777 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/manager.py +199 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/migrations/versions/v2_3_0.py +938 -0
  51. agno/db/mongo/__init__.py +17 -0
  52. agno/db/mongo/async_mongo.py +2760 -0
  53. agno/db/mongo/mongo.py +2597 -0
  54. agno/db/mongo/schemas.py +119 -0
  55. agno/db/mongo/utils.py +276 -0
  56. agno/db/mysql/__init__.py +4 -0
  57. agno/db/mysql/async_mysql.py +2912 -0
  58. agno/db/mysql/mysql.py +2923 -0
  59. agno/db/mysql/schemas.py +186 -0
  60. agno/db/mysql/utils.py +488 -0
  61. agno/db/postgres/__init__.py +4 -0
  62. agno/db/postgres/async_postgres.py +2579 -0
  63. agno/db/postgres/postgres.py +2870 -0
  64. agno/db/postgres/schemas.py +187 -0
  65. agno/db/postgres/utils.py +442 -0
  66. agno/db/redis/__init__.py +3 -0
  67. agno/db/redis/redis.py +2141 -0
  68. agno/db/redis/schemas.py +159 -0
  69. agno/db/redis/utils.py +346 -0
  70. agno/db/schemas/__init__.py +4 -0
  71. agno/db/schemas/culture.py +120 -0
  72. agno/db/schemas/evals.py +34 -0
  73. agno/db/schemas/knowledge.py +40 -0
  74. agno/db/schemas/memory.py +61 -0
  75. agno/db/singlestore/__init__.py +3 -0
  76. agno/db/singlestore/schemas.py +179 -0
  77. agno/db/singlestore/singlestore.py +2877 -0
  78. agno/db/singlestore/utils.py +384 -0
  79. agno/db/sqlite/__init__.py +4 -0
  80. agno/db/sqlite/async_sqlite.py +2911 -0
  81. agno/db/sqlite/schemas.py +181 -0
  82. agno/db/sqlite/sqlite.py +2908 -0
  83. agno/db/sqlite/utils.py +429 -0
  84. agno/db/surrealdb/__init__.py +3 -0
  85. agno/db/surrealdb/metrics.py +292 -0
  86. agno/db/surrealdb/models.py +334 -0
  87. agno/db/surrealdb/queries.py +71 -0
  88. agno/db/surrealdb/surrealdb.py +1908 -0
  89. agno/db/surrealdb/utils.py +147 -0
  90. agno/db/utils.py +118 -0
  91. agno/eval/__init__.py +24 -0
  92. agno/eval/accuracy.py +666 -276
  93. agno/eval/agent_as_judge.py +861 -0
  94. agno/eval/base.py +29 -0
  95. agno/eval/performance.py +779 -0
  96. agno/eval/reliability.py +241 -62
  97. agno/eval/utils.py +120 -0
  98. agno/exceptions.py +143 -1
  99. agno/filters.py +354 -0
  100. agno/guardrails/__init__.py +6 -0
  101. agno/guardrails/base.py +19 -0
  102. agno/guardrails/openai.py +144 -0
  103. agno/guardrails/pii.py +94 -0
  104. agno/guardrails/prompt_injection.py +52 -0
  105. agno/hooks/__init__.py +3 -0
  106. agno/hooks/decorator.py +164 -0
  107. agno/integrations/discord/__init__.py +3 -0
  108. agno/integrations/discord/client.py +203 -0
  109. agno/knowledge/__init__.py +5 -1
  110. agno/{document → knowledge}/chunking/agentic.py +22 -14
  111. agno/{document → knowledge}/chunking/document.py +2 -2
  112. agno/{document → knowledge}/chunking/fixed.py +7 -6
  113. agno/knowledge/chunking/markdown.py +151 -0
  114. agno/{document → knowledge}/chunking/recursive.py +15 -3
  115. agno/knowledge/chunking/row.py +39 -0
  116. agno/knowledge/chunking/semantic.py +91 -0
  117. agno/knowledge/chunking/strategy.py +165 -0
  118. agno/knowledge/content.py +74 -0
  119. agno/knowledge/document/__init__.py +5 -0
  120. agno/{document → knowledge/document}/base.py +12 -2
  121. agno/knowledge/embedder/__init__.py +5 -0
  122. agno/knowledge/embedder/aws_bedrock.py +343 -0
  123. agno/knowledge/embedder/azure_openai.py +210 -0
  124. agno/{embedder → knowledge/embedder}/base.py +8 -0
  125. agno/knowledge/embedder/cohere.py +323 -0
  126. agno/knowledge/embedder/fastembed.py +62 -0
  127. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  128. agno/knowledge/embedder/google.py +258 -0
  129. agno/knowledge/embedder/huggingface.py +94 -0
  130. agno/knowledge/embedder/jina.py +182 -0
  131. agno/knowledge/embedder/langdb.py +22 -0
  132. agno/knowledge/embedder/mistral.py +206 -0
  133. agno/knowledge/embedder/nebius.py +13 -0
  134. agno/knowledge/embedder/ollama.py +154 -0
  135. agno/knowledge/embedder/openai.py +195 -0
  136. agno/knowledge/embedder/sentence_transformer.py +63 -0
  137. agno/{embedder → knowledge/embedder}/together.py +1 -1
  138. agno/knowledge/embedder/vllm.py +262 -0
  139. agno/knowledge/embedder/voyageai.py +165 -0
  140. agno/knowledge/knowledge.py +3006 -0
  141. agno/knowledge/reader/__init__.py +7 -0
  142. agno/knowledge/reader/arxiv_reader.py +81 -0
  143. agno/knowledge/reader/base.py +95 -0
  144. agno/knowledge/reader/csv_reader.py +164 -0
  145. agno/knowledge/reader/docx_reader.py +82 -0
  146. agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
  147. agno/knowledge/reader/firecrawl_reader.py +201 -0
  148. agno/knowledge/reader/json_reader.py +88 -0
  149. agno/knowledge/reader/markdown_reader.py +137 -0
  150. agno/knowledge/reader/pdf_reader.py +431 -0
  151. agno/knowledge/reader/pptx_reader.py +101 -0
  152. agno/knowledge/reader/reader_factory.py +313 -0
  153. agno/knowledge/reader/s3_reader.py +89 -0
  154. agno/knowledge/reader/tavily_reader.py +193 -0
  155. agno/knowledge/reader/text_reader.py +127 -0
  156. agno/knowledge/reader/web_search_reader.py +325 -0
  157. agno/knowledge/reader/website_reader.py +455 -0
  158. agno/knowledge/reader/wikipedia_reader.py +91 -0
  159. agno/knowledge/reader/youtube_reader.py +78 -0
  160. agno/knowledge/remote_content/remote_content.py +88 -0
  161. agno/knowledge/reranker/__init__.py +3 -0
  162. agno/{reranker → knowledge/reranker}/base.py +1 -1
  163. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  164. agno/knowledge/reranker/infinity.py +195 -0
  165. agno/knowledge/reranker/sentence_transformer.py +54 -0
  166. agno/knowledge/types.py +39 -0
  167. agno/knowledge/utils.py +234 -0
  168. agno/media.py +439 -95
  169. agno/memory/__init__.py +16 -3
  170. agno/memory/manager.py +1474 -123
  171. agno/memory/strategies/__init__.py +15 -0
  172. agno/memory/strategies/base.py +66 -0
  173. agno/memory/strategies/summarize.py +196 -0
  174. agno/memory/strategies/types.py +37 -0
  175. agno/models/aimlapi/__init__.py +5 -0
  176. agno/models/aimlapi/aimlapi.py +62 -0
  177. agno/models/anthropic/__init__.py +4 -0
  178. agno/models/anthropic/claude.py +960 -496
  179. agno/models/aws/__init__.py +15 -0
  180. agno/models/aws/bedrock.py +686 -451
  181. agno/models/aws/claude.py +190 -183
  182. agno/models/azure/__init__.py +18 -1
  183. agno/models/azure/ai_foundry.py +489 -0
  184. agno/models/azure/openai_chat.py +89 -40
  185. agno/models/base.py +2477 -550
  186. agno/models/cerebras/__init__.py +12 -0
  187. agno/models/cerebras/cerebras.py +565 -0
  188. agno/models/cerebras/cerebras_openai.py +131 -0
  189. agno/models/cohere/__init__.py +4 -0
  190. agno/models/cohere/chat.py +306 -492
  191. agno/models/cometapi/__init__.py +5 -0
  192. agno/models/cometapi/cometapi.py +74 -0
  193. agno/models/dashscope/__init__.py +5 -0
  194. agno/models/dashscope/dashscope.py +90 -0
  195. agno/models/deepinfra/__init__.py +5 -0
  196. agno/models/deepinfra/deepinfra.py +45 -0
  197. agno/models/deepseek/__init__.py +4 -0
  198. agno/models/deepseek/deepseek.py +110 -9
  199. agno/models/fireworks/__init__.py +4 -0
  200. agno/models/fireworks/fireworks.py +19 -22
  201. agno/models/google/__init__.py +3 -7
  202. agno/models/google/gemini.py +1717 -662
  203. agno/models/google/utils.py +22 -0
  204. agno/models/groq/__init__.py +4 -0
  205. agno/models/groq/groq.py +391 -666
  206. agno/models/huggingface/__init__.py +4 -0
  207. agno/models/huggingface/huggingface.py +266 -538
  208. agno/models/ibm/__init__.py +5 -0
  209. agno/models/ibm/watsonx.py +432 -0
  210. agno/models/internlm/__init__.py +3 -0
  211. agno/models/internlm/internlm.py +20 -3
  212. agno/models/langdb/__init__.py +1 -0
  213. agno/models/langdb/langdb.py +60 -0
  214. agno/models/litellm/__init__.py +14 -0
  215. agno/models/litellm/chat.py +503 -0
  216. agno/models/litellm/litellm_openai.py +42 -0
  217. agno/models/llama_cpp/__init__.py +5 -0
  218. agno/models/llama_cpp/llama_cpp.py +22 -0
  219. agno/models/lmstudio/__init__.py +5 -0
  220. agno/models/lmstudio/lmstudio.py +25 -0
  221. agno/models/message.py +361 -39
  222. agno/models/meta/__init__.py +12 -0
  223. agno/models/meta/llama.py +502 -0
  224. agno/models/meta/llama_openai.py +79 -0
  225. agno/models/metrics.py +120 -0
  226. agno/models/mistral/__init__.py +4 -0
  227. agno/models/mistral/mistral.py +293 -393
  228. agno/models/nebius/__init__.py +3 -0
  229. agno/models/nebius/nebius.py +53 -0
  230. agno/models/nexus/__init__.py +3 -0
  231. agno/models/nexus/nexus.py +22 -0
  232. agno/models/nvidia/__init__.py +4 -0
  233. agno/models/nvidia/nvidia.py +22 -3
  234. agno/models/ollama/__init__.py +4 -2
  235. agno/models/ollama/chat.py +257 -492
  236. agno/models/openai/__init__.py +7 -0
  237. agno/models/openai/chat.py +725 -770
  238. agno/models/openai/like.py +16 -2
  239. agno/models/openai/responses.py +1121 -0
  240. agno/models/openrouter/__init__.py +4 -0
  241. agno/models/openrouter/openrouter.py +62 -5
  242. agno/models/perplexity/__init__.py +5 -0
  243. agno/models/perplexity/perplexity.py +203 -0
  244. agno/models/portkey/__init__.py +3 -0
  245. agno/models/portkey/portkey.py +82 -0
  246. agno/models/requesty/__init__.py +5 -0
  247. agno/models/requesty/requesty.py +69 -0
  248. agno/models/response.py +177 -7
  249. agno/models/sambanova/__init__.py +4 -0
  250. agno/models/sambanova/sambanova.py +23 -4
  251. agno/models/siliconflow/__init__.py +5 -0
  252. agno/models/siliconflow/siliconflow.py +42 -0
  253. agno/models/together/__init__.py +4 -0
  254. agno/models/together/together.py +21 -164
  255. agno/models/utils.py +266 -0
  256. agno/models/vercel/__init__.py +3 -0
  257. agno/models/vercel/v0.py +43 -0
  258. agno/models/vertexai/__init__.py +0 -1
  259. agno/models/vertexai/claude.py +190 -0
  260. agno/models/vllm/__init__.py +3 -0
  261. agno/models/vllm/vllm.py +83 -0
  262. agno/models/xai/__init__.py +2 -0
  263. agno/models/xai/xai.py +111 -7
  264. agno/os/__init__.py +3 -0
  265. agno/os/app.py +1027 -0
  266. agno/os/auth.py +244 -0
  267. agno/os/config.py +126 -0
  268. agno/os/interfaces/__init__.py +1 -0
  269. agno/os/interfaces/a2a/__init__.py +3 -0
  270. agno/os/interfaces/a2a/a2a.py +42 -0
  271. agno/os/interfaces/a2a/router.py +249 -0
  272. agno/os/interfaces/a2a/utils.py +924 -0
  273. agno/os/interfaces/agui/__init__.py +3 -0
  274. agno/os/interfaces/agui/agui.py +47 -0
  275. agno/os/interfaces/agui/router.py +147 -0
  276. agno/os/interfaces/agui/utils.py +574 -0
  277. agno/os/interfaces/base.py +25 -0
  278. agno/os/interfaces/slack/__init__.py +3 -0
  279. agno/os/interfaces/slack/router.py +148 -0
  280. agno/os/interfaces/slack/security.py +30 -0
  281. agno/os/interfaces/slack/slack.py +47 -0
  282. agno/os/interfaces/whatsapp/__init__.py +3 -0
  283. agno/os/interfaces/whatsapp/router.py +210 -0
  284. agno/os/interfaces/whatsapp/security.py +55 -0
  285. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  286. agno/os/mcp.py +293 -0
  287. agno/os/middleware/__init__.py +9 -0
  288. agno/os/middleware/jwt.py +797 -0
  289. agno/os/router.py +258 -0
  290. agno/os/routers/__init__.py +3 -0
  291. agno/os/routers/agents/__init__.py +3 -0
  292. agno/os/routers/agents/router.py +599 -0
  293. agno/os/routers/agents/schema.py +261 -0
  294. agno/os/routers/evals/__init__.py +3 -0
  295. agno/os/routers/evals/evals.py +450 -0
  296. agno/os/routers/evals/schemas.py +174 -0
  297. agno/os/routers/evals/utils.py +231 -0
  298. agno/os/routers/health.py +31 -0
  299. agno/os/routers/home.py +52 -0
  300. agno/os/routers/knowledge/__init__.py +3 -0
  301. agno/os/routers/knowledge/knowledge.py +1008 -0
  302. agno/os/routers/knowledge/schemas.py +178 -0
  303. agno/os/routers/memory/__init__.py +3 -0
  304. agno/os/routers/memory/memory.py +661 -0
  305. agno/os/routers/memory/schemas.py +88 -0
  306. agno/os/routers/metrics/__init__.py +3 -0
  307. agno/os/routers/metrics/metrics.py +190 -0
  308. agno/os/routers/metrics/schemas.py +47 -0
  309. agno/os/routers/session/__init__.py +3 -0
  310. agno/os/routers/session/session.py +997 -0
  311. agno/os/routers/teams/__init__.py +3 -0
  312. agno/os/routers/teams/router.py +512 -0
  313. agno/os/routers/teams/schema.py +257 -0
  314. agno/os/routers/traces/__init__.py +3 -0
  315. agno/os/routers/traces/schemas.py +414 -0
  316. agno/os/routers/traces/traces.py +499 -0
  317. agno/os/routers/workflows/__init__.py +3 -0
  318. agno/os/routers/workflows/router.py +624 -0
  319. agno/os/routers/workflows/schema.py +75 -0
  320. agno/os/schema.py +534 -0
  321. agno/os/scopes.py +469 -0
  322. agno/{playground → os}/settings.py +7 -15
  323. agno/os/utils.py +973 -0
  324. agno/reasoning/anthropic.py +80 -0
  325. agno/reasoning/azure_ai_foundry.py +67 -0
  326. agno/reasoning/deepseek.py +63 -0
  327. agno/reasoning/default.py +97 -0
  328. agno/reasoning/gemini.py +73 -0
  329. agno/reasoning/groq.py +71 -0
  330. agno/reasoning/helpers.py +24 -1
  331. agno/reasoning/ollama.py +67 -0
  332. agno/reasoning/openai.py +86 -0
  333. agno/reasoning/step.py +2 -1
  334. agno/reasoning/vertexai.py +76 -0
  335. agno/run/__init__.py +6 -0
  336. agno/run/agent.py +822 -0
  337. agno/run/base.py +247 -0
  338. agno/run/cancel.py +81 -0
  339. agno/run/requirement.py +181 -0
  340. agno/run/team.py +767 -0
  341. agno/run/workflow.py +708 -0
  342. agno/session/__init__.py +10 -0
  343. agno/session/agent.py +260 -0
  344. agno/session/summary.py +265 -0
  345. agno/session/team.py +342 -0
  346. agno/session/workflow.py +501 -0
  347. agno/table.py +10 -0
  348. agno/team/__init__.py +37 -0
  349. agno/team/team.py +9536 -0
  350. agno/tools/__init__.py +7 -0
  351. agno/tools/agentql.py +120 -0
  352. agno/tools/airflow.py +22 -12
  353. agno/tools/api.py +122 -0
  354. agno/tools/apify.py +276 -83
  355. agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
  356. agno/tools/aws_lambda.py +28 -7
  357. agno/tools/aws_ses.py +66 -0
  358. agno/tools/baidusearch.py +11 -4
  359. agno/tools/bitbucket.py +292 -0
  360. agno/tools/brandfetch.py +213 -0
  361. agno/tools/bravesearch.py +106 -0
  362. agno/tools/brightdata.py +367 -0
  363. agno/tools/browserbase.py +209 -0
  364. agno/tools/calcom.py +32 -23
  365. agno/tools/calculator.py +24 -37
  366. agno/tools/cartesia.py +187 -0
  367. agno/tools/{clickup_tool.py → clickup.py} +17 -28
  368. agno/tools/confluence.py +91 -26
  369. agno/tools/crawl4ai.py +139 -43
  370. agno/tools/csv_toolkit.py +28 -22
  371. agno/tools/dalle.py +36 -22
  372. agno/tools/daytona.py +475 -0
  373. agno/tools/decorator.py +169 -14
  374. agno/tools/desi_vocal.py +23 -11
  375. agno/tools/discord.py +32 -29
  376. agno/tools/docker.py +716 -0
  377. agno/tools/duckdb.py +76 -81
  378. agno/tools/duckduckgo.py +43 -40
  379. agno/tools/e2b.py +703 -0
  380. agno/tools/eleven_labs.py +65 -54
  381. agno/tools/email.py +13 -5
  382. agno/tools/evm.py +129 -0
  383. agno/tools/exa.py +324 -42
  384. agno/tools/fal.py +39 -35
  385. agno/tools/file.py +196 -30
  386. agno/tools/file_generation.py +356 -0
  387. agno/tools/financial_datasets.py +288 -0
  388. agno/tools/firecrawl.py +108 -33
  389. agno/tools/function.py +960 -122
  390. agno/tools/giphy.py +34 -12
  391. agno/tools/github.py +1294 -97
  392. agno/tools/gmail.py +922 -0
  393. agno/tools/google_bigquery.py +117 -0
  394. agno/tools/google_drive.py +271 -0
  395. agno/tools/google_maps.py +253 -0
  396. agno/tools/googlecalendar.py +607 -107
  397. agno/tools/googlesheets.py +377 -0
  398. agno/tools/hackernews.py +20 -12
  399. agno/tools/jina.py +24 -14
  400. agno/tools/jira.py +48 -19
  401. agno/tools/knowledge.py +218 -0
  402. agno/tools/linear.py +82 -43
  403. agno/tools/linkup.py +58 -0
  404. agno/tools/local_file_system.py +15 -7
  405. agno/tools/lumalab.py +41 -26
  406. agno/tools/mcp/__init__.py +10 -0
  407. agno/tools/mcp/mcp.py +331 -0
  408. agno/tools/mcp/multi_mcp.py +347 -0
  409. agno/tools/mcp/params.py +24 -0
  410. agno/tools/mcp_toolbox.py +284 -0
  411. agno/tools/mem0.py +193 -0
  412. agno/tools/memory.py +419 -0
  413. agno/tools/mlx_transcribe.py +11 -9
  414. agno/tools/models/azure_openai.py +190 -0
  415. agno/tools/models/gemini.py +203 -0
  416. agno/tools/models/groq.py +158 -0
  417. agno/tools/models/morph.py +186 -0
  418. agno/tools/models/nebius.py +124 -0
  419. agno/tools/models_labs.py +163 -82
  420. agno/tools/moviepy_video.py +18 -13
  421. agno/tools/nano_banana.py +151 -0
  422. agno/tools/neo4j.py +134 -0
  423. agno/tools/newspaper.py +15 -4
  424. agno/tools/newspaper4k.py +19 -6
  425. agno/tools/notion.py +204 -0
  426. agno/tools/openai.py +181 -17
  427. agno/tools/openbb.py +27 -20
  428. agno/tools/opencv.py +321 -0
  429. agno/tools/openweather.py +233 -0
  430. agno/tools/oxylabs.py +385 -0
  431. agno/tools/pandas.py +25 -15
  432. agno/tools/parallel.py +314 -0
  433. agno/tools/postgres.py +238 -185
  434. agno/tools/pubmed.py +125 -13
  435. agno/tools/python.py +48 -35
  436. agno/tools/reasoning.py +283 -0
  437. agno/tools/reddit.py +207 -29
  438. agno/tools/redshift.py +406 -0
  439. agno/tools/replicate.py +69 -26
  440. agno/tools/resend.py +11 -6
  441. agno/tools/scrapegraph.py +179 -19
  442. agno/tools/searxng.py +23 -31
  443. agno/tools/serpapi.py +15 -10
  444. agno/tools/serper.py +255 -0
  445. agno/tools/shell.py +23 -12
  446. agno/tools/shopify.py +1519 -0
  447. agno/tools/slack.py +56 -14
  448. agno/tools/sleep.py +8 -6
  449. agno/tools/spider.py +35 -11
  450. agno/tools/spotify.py +919 -0
  451. agno/tools/sql.py +34 -19
  452. agno/tools/tavily.py +158 -8
  453. agno/tools/telegram.py +18 -8
  454. agno/tools/todoist.py +218 -0
  455. agno/tools/toolkit.py +134 -9
  456. agno/tools/trafilatura.py +388 -0
  457. agno/tools/trello.py +25 -28
  458. agno/tools/twilio.py +18 -9
  459. agno/tools/user_control_flow.py +78 -0
  460. agno/tools/valyu.py +228 -0
  461. agno/tools/visualization.py +467 -0
  462. agno/tools/webbrowser.py +28 -0
  463. agno/tools/webex.py +76 -0
  464. agno/tools/website.py +23 -19
  465. agno/tools/webtools.py +45 -0
  466. agno/tools/whatsapp.py +286 -0
  467. agno/tools/wikipedia.py +28 -19
  468. agno/tools/workflow.py +285 -0
  469. agno/tools/{twitter.py → x.py} +142 -46
  470. agno/tools/yfinance.py +41 -39
  471. agno/tools/youtube.py +34 -17
  472. agno/tools/zendesk.py +15 -5
  473. agno/tools/zep.py +454 -0
  474. agno/tools/zoom.py +86 -37
  475. agno/tracing/__init__.py +12 -0
  476. agno/tracing/exporter.py +157 -0
  477. agno/tracing/schemas.py +276 -0
  478. agno/tracing/setup.py +111 -0
  479. agno/utils/agent.py +938 -0
  480. agno/utils/audio.py +37 -1
  481. agno/utils/certs.py +27 -0
  482. agno/utils/code_execution.py +11 -0
  483. agno/utils/common.py +103 -20
  484. agno/utils/cryptography.py +22 -0
  485. agno/utils/dttm.py +33 -0
  486. agno/utils/events.py +700 -0
  487. agno/utils/functions.py +107 -37
  488. agno/utils/gemini.py +426 -0
  489. agno/utils/hooks.py +171 -0
  490. agno/utils/http.py +185 -0
  491. agno/utils/json_schema.py +159 -37
  492. agno/utils/knowledge.py +36 -0
  493. agno/utils/location.py +19 -0
  494. agno/utils/log.py +221 -8
  495. agno/utils/mcp.py +214 -0
  496. agno/utils/media.py +335 -14
  497. agno/utils/merge_dict.py +22 -1
  498. agno/utils/message.py +77 -2
  499. agno/utils/models/ai_foundry.py +50 -0
  500. agno/utils/models/claude.py +373 -0
  501. agno/utils/models/cohere.py +94 -0
  502. agno/utils/models/llama.py +85 -0
  503. agno/utils/models/mistral.py +100 -0
  504. agno/utils/models/openai_responses.py +140 -0
  505. agno/utils/models/schema_utils.py +153 -0
  506. agno/utils/models/watsonx.py +41 -0
  507. agno/utils/openai.py +257 -0
  508. agno/utils/pickle.py +1 -1
  509. agno/utils/pprint.py +124 -8
  510. agno/utils/print_response/agent.py +930 -0
  511. agno/utils/print_response/team.py +1914 -0
  512. agno/utils/print_response/workflow.py +1668 -0
  513. agno/utils/prompts.py +111 -0
  514. agno/utils/reasoning.py +108 -0
  515. agno/utils/response.py +163 -0
  516. agno/utils/serialize.py +32 -0
  517. agno/utils/shell.py +4 -4
  518. agno/utils/streamlit.py +487 -0
  519. agno/utils/string.py +204 -51
  520. agno/utils/team.py +139 -0
  521. agno/utils/timer.py +9 -2
  522. agno/utils/tokens.py +657 -0
  523. agno/utils/tools.py +19 -1
  524. agno/utils/whatsapp.py +305 -0
  525. agno/utils/yaml_io.py +3 -3
  526. agno/vectordb/__init__.py +2 -0
  527. agno/vectordb/base.py +87 -9
  528. agno/vectordb/cassandra/__init__.py +5 -1
  529. agno/vectordb/cassandra/cassandra.py +383 -27
  530. agno/vectordb/chroma/__init__.py +4 -0
  531. agno/vectordb/chroma/chromadb.py +748 -83
  532. agno/vectordb/clickhouse/__init__.py +7 -1
  533. agno/vectordb/clickhouse/clickhousedb.py +554 -53
  534. agno/vectordb/couchbase/__init__.py +3 -0
  535. agno/vectordb/couchbase/couchbase.py +1446 -0
  536. agno/vectordb/lancedb/__init__.py +5 -0
  537. agno/vectordb/lancedb/lance_db.py +730 -98
  538. agno/vectordb/langchaindb/__init__.py +5 -0
  539. agno/vectordb/langchaindb/langchaindb.py +163 -0
  540. agno/vectordb/lightrag/__init__.py +5 -0
  541. agno/vectordb/lightrag/lightrag.py +388 -0
  542. agno/vectordb/llamaindex/__init__.py +3 -0
  543. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  544. agno/vectordb/milvus/__init__.py +3 -0
  545. agno/vectordb/milvus/milvus.py +966 -78
  546. agno/vectordb/mongodb/__init__.py +9 -1
  547. agno/vectordb/mongodb/mongodb.py +1175 -172
  548. agno/vectordb/pgvector/__init__.py +8 -0
  549. agno/vectordb/pgvector/pgvector.py +599 -115
  550. agno/vectordb/pineconedb/__init__.py +5 -1
  551. agno/vectordb/pineconedb/pineconedb.py +406 -43
  552. agno/vectordb/qdrant/__init__.py +4 -0
  553. agno/vectordb/qdrant/qdrant.py +914 -61
  554. agno/vectordb/redis/__init__.py +9 -0
  555. agno/vectordb/redis/redisdb.py +682 -0
  556. agno/vectordb/singlestore/__init__.py +8 -1
  557. agno/vectordb/singlestore/singlestore.py +771 -0
  558. agno/vectordb/surrealdb/__init__.py +3 -0
  559. agno/vectordb/surrealdb/surrealdb.py +663 -0
  560. agno/vectordb/upstashdb/__init__.py +5 -0
  561. agno/vectordb/upstashdb/upstashdb.py +718 -0
  562. agno/vectordb/weaviate/__init__.py +8 -0
  563. agno/vectordb/weaviate/index.py +15 -0
  564. agno/vectordb/weaviate/weaviate.py +1009 -0
  565. agno/workflow/__init__.py +23 -1
  566. agno/workflow/agent.py +299 -0
  567. agno/workflow/condition.py +759 -0
  568. agno/workflow/loop.py +756 -0
  569. agno/workflow/parallel.py +853 -0
  570. agno/workflow/router.py +723 -0
  571. agno/workflow/step.py +1564 -0
  572. agno/workflow/steps.py +613 -0
  573. agno/workflow/types.py +556 -0
  574. agno/workflow/workflow.py +4327 -514
  575. agno-2.3.13.dist-info/METADATA +639 -0
  576. agno-2.3.13.dist-info/RECORD +613 -0
  577. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
  578. agno-2.3.13.dist-info/licenses/LICENSE +201 -0
  579. agno/api/playground.py +0 -91
  580. agno/api/schemas/playground.py +0 -22
  581. agno/api/schemas/user.py +0 -22
  582. agno/api/schemas/workspace.py +0 -46
  583. agno/api/user.py +0 -160
  584. agno/api/workspace.py +0 -151
  585. agno/cli/auth_server.py +0 -118
  586. agno/cli/config.py +0 -275
  587. agno/cli/console.py +0 -88
  588. agno/cli/credentials.py +0 -23
  589. agno/cli/entrypoint.py +0 -571
  590. agno/cli/operator.py +0 -355
  591. agno/cli/settings.py +0 -85
  592. agno/cli/ws/ws_cli.py +0 -817
  593. agno/constants.py +0 -13
  594. agno/document/__init__.py +0 -1
  595. agno/document/chunking/semantic.py +0 -47
  596. agno/document/chunking/strategy.py +0 -31
  597. agno/document/reader/__init__.py +0 -1
  598. agno/document/reader/arxiv_reader.py +0 -41
  599. agno/document/reader/base.py +0 -22
  600. agno/document/reader/csv_reader.py +0 -84
  601. agno/document/reader/docx_reader.py +0 -46
  602. agno/document/reader/firecrawl_reader.py +0 -99
  603. agno/document/reader/json_reader.py +0 -43
  604. agno/document/reader/pdf_reader.py +0 -219
  605. agno/document/reader/s3/pdf_reader.py +0 -46
  606. agno/document/reader/s3/text_reader.py +0 -51
  607. agno/document/reader/text_reader.py +0 -41
  608. agno/document/reader/website_reader.py +0 -175
  609. agno/document/reader/youtube_reader.py +0 -50
  610. agno/embedder/__init__.py +0 -1
  611. agno/embedder/azure_openai.py +0 -86
  612. agno/embedder/cohere.py +0 -72
  613. agno/embedder/fastembed.py +0 -37
  614. agno/embedder/google.py +0 -73
  615. agno/embedder/huggingface.py +0 -54
  616. agno/embedder/mistral.py +0 -80
  617. agno/embedder/ollama.py +0 -57
  618. agno/embedder/openai.py +0 -74
  619. agno/embedder/sentence_transformer.py +0 -38
  620. agno/embedder/voyageai.py +0 -64
  621. agno/eval/perf.py +0 -201
  622. agno/file/__init__.py +0 -1
  623. agno/file/file.py +0 -16
  624. agno/file/local/csv.py +0 -32
  625. agno/file/local/txt.py +0 -19
  626. agno/infra/app.py +0 -240
  627. agno/infra/base.py +0 -144
  628. agno/infra/context.py +0 -20
  629. agno/infra/db_app.py +0 -52
  630. agno/infra/resource.py +0 -205
  631. agno/infra/resources.py +0 -55
  632. agno/knowledge/agent.py +0 -230
  633. agno/knowledge/arxiv.py +0 -22
  634. agno/knowledge/combined.py +0 -22
  635. agno/knowledge/csv.py +0 -28
  636. agno/knowledge/csv_url.py +0 -19
  637. agno/knowledge/document.py +0 -20
  638. agno/knowledge/docx.py +0 -30
  639. agno/knowledge/json.py +0 -28
  640. agno/knowledge/langchain.py +0 -71
  641. agno/knowledge/llamaindex.py +0 -66
  642. agno/knowledge/pdf.py +0 -28
  643. agno/knowledge/pdf_url.py +0 -26
  644. agno/knowledge/s3/base.py +0 -60
  645. agno/knowledge/s3/pdf.py +0 -21
  646. agno/knowledge/s3/text.py +0 -23
  647. agno/knowledge/text.py +0 -30
  648. agno/knowledge/website.py +0 -88
  649. agno/knowledge/wikipedia.py +0 -31
  650. agno/knowledge/youtube.py +0 -22
  651. agno/memory/agent.py +0 -392
  652. agno/memory/classifier.py +0 -104
  653. agno/memory/db/__init__.py +0 -1
  654. agno/memory/db/base.py +0 -42
  655. agno/memory/db/mongodb.py +0 -189
  656. agno/memory/db/postgres.py +0 -203
  657. agno/memory/db/sqlite.py +0 -193
  658. agno/memory/memory.py +0 -15
  659. agno/memory/row.py +0 -36
  660. agno/memory/summarizer.py +0 -192
  661. agno/memory/summary.py +0 -19
  662. agno/memory/workflow.py +0 -38
  663. agno/models/google/gemini_openai.py +0 -26
  664. agno/models/ollama/hermes.py +0 -221
  665. agno/models/ollama/tools.py +0 -362
  666. agno/models/vertexai/gemini.py +0 -595
  667. agno/playground/__init__.py +0 -3
  668. agno/playground/async_router.py +0 -421
  669. agno/playground/deploy.py +0 -249
  670. agno/playground/operator.py +0 -92
  671. agno/playground/playground.py +0 -91
  672. agno/playground/schemas.py +0 -76
  673. agno/playground/serve.py +0 -55
  674. agno/playground/sync_router.py +0 -405
  675. agno/reasoning/agent.py +0 -68
  676. agno/run/response.py +0 -112
  677. agno/storage/agent/__init__.py +0 -0
  678. agno/storage/agent/base.py +0 -38
  679. agno/storage/agent/dynamodb.py +0 -350
  680. agno/storage/agent/json.py +0 -92
  681. agno/storage/agent/mongodb.py +0 -228
  682. agno/storage/agent/postgres.py +0 -367
  683. agno/storage/agent/session.py +0 -79
  684. agno/storage/agent/singlestore.py +0 -303
  685. agno/storage/agent/sqlite.py +0 -357
  686. agno/storage/agent/yaml.py +0 -93
  687. agno/storage/workflow/__init__.py +0 -0
  688. agno/storage/workflow/base.py +0 -40
  689. agno/storage/workflow/mongodb.py +0 -233
  690. agno/storage/workflow/postgres.py +0 -366
  691. agno/storage/workflow/session.py +0 -60
  692. agno/storage/workflow/sqlite.py +0 -359
  693. agno/tools/googlesearch.py +0 -88
  694. agno/utils/defaults.py +0 -57
  695. agno/utils/filesystem.py +0 -39
  696. agno/utils/git.py +0 -52
  697. agno/utils/json_io.py +0 -30
  698. agno/utils/load_env.py +0 -19
  699. agno/utils/py_io.py +0 -19
  700. agno/utils/pyproject.py +0 -18
  701. agno/utils/resource_filter.py +0 -31
  702. agno/vectordb/singlestore/s2vectordb.py +0 -390
  703. agno/vectordb/singlestore/s2vectordb2.py +0 -355
  704. agno/workspace/__init__.py +0 -0
  705. agno/workspace/config.py +0 -325
  706. agno/workspace/enums.py +0 -6
  707. agno/workspace/helpers.py +0 -48
  708. agno/workspace/operator.py +0 -758
  709. agno/workspace/settings.py +0 -63
  710. agno-0.1.2.dist-info/LICENSE +0 -375
  711. agno-0.1.2.dist-info/METADATA +0 -502
  712. agno-0.1.2.dist-info/RECORD +0 -352
  713. agno-0.1.2.dist-info/entry_points.txt +0 -3
  714. /agno/{cli → db/migrations}/__init__.py +0 -0
  715. /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
  716. /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
  717. /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
  718. /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
  719. /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
  720. /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
  721. /agno/{reranker → utils/models}/__init__.py +0 -0
  722. /agno/{storage → utils/print_response}/__init__.py +0 -0
  723. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/infra/resources.py DELETED
@@ -1,55 +0,0 @@
1
- from typing import Any, List, Optional, Tuple
2
-
3
- from agno.infra.base import InfraBase
4
-
5
-
6
- class InfraResources(InfraBase):
7
- """InfraResources is a group of InfraResource and InfraApp objects
8
- that are managed together.
9
- """
10
-
11
- apps: Optional[List[Any]] = None
12
- resources: Optional[List[Any]] = None
13
-
14
- def create_resources(
15
- self,
16
- group_filter: Optional[str] = None,
17
- name_filter: Optional[str] = None,
18
- type_filter: Optional[str] = None,
19
- dry_run: Optional[bool] = False,
20
- auto_confirm: Optional[bool] = False,
21
- force: Optional[bool] = None,
22
- pull: Optional[bool] = None,
23
- ) -> Tuple[int, int]:
24
- raise NotImplementedError
25
-
26
- def delete_resources(
27
- self,
28
- group_filter: Optional[str] = None,
29
- name_filter: Optional[str] = None,
30
- type_filter: Optional[str] = None,
31
- dry_run: Optional[bool] = False,
32
- auto_confirm: Optional[bool] = False,
33
- force: Optional[bool] = None,
34
- ) -> Tuple[int, int]:
35
- raise NotImplementedError
36
-
37
- def update_resources(
38
- self,
39
- group_filter: Optional[str] = None,
40
- name_filter: Optional[str] = None,
41
- type_filter: Optional[str] = None,
42
- dry_run: Optional[bool] = False,
43
- auto_confirm: Optional[bool] = False,
44
- force: Optional[bool] = None,
45
- pull: Optional[bool] = None,
46
- ) -> Tuple[int, int]:
47
- raise NotImplementedError
48
-
49
- def save_resources(
50
- self,
51
- group_filter: Optional[str] = None,
52
- name_filter: Optional[str] = None,
53
- type_filter: Optional[str] = None,
54
- ) -> Tuple[int, int]:
55
- raise NotImplementedError
agno/knowledge/agent.py DELETED
@@ -1,230 +0,0 @@
1
- from typing import Any, Dict, Iterator, List, Optional
2
-
3
- from pydantic import BaseModel, ConfigDict, Field, model_validator
4
-
5
- from agno.document import Document
6
- from agno.document.chunking.fixed import FixedSizeChunking
7
- from agno.document.chunking.strategy import ChunkingStrategy
8
- from agno.document.reader.base import Reader
9
- from agno.utils.log import logger
10
- from agno.vectordb import VectorDb
11
-
12
-
13
- class AgentKnowledge(BaseModel):
14
- """Base class for Agent knowledge"""
15
-
16
- # Reader for reading documents from files, pdfs, urls, etc.
17
- reader: Optional[Reader] = None
18
- # Vector db for storing knowledge
19
- vector_db: Optional[VectorDb] = None
20
- # Number of relevant documents to return on search
21
- num_documents: int = 5
22
- # Number of documents to optimize the vector db on
23
- optimize_on: Optional[int] = 1000
24
-
25
- chunking_strategy: ChunkingStrategy = Field(default_factory=FixedSizeChunking)
26
-
27
- model_config = ConfigDict(arbitrary_types_allowed=True)
28
-
29
- @model_validator(mode="after")
30
- def update_reader(self) -> "AgentKnowledge":
31
- if self.reader is not None:
32
- self.reader.chunking_strategy = self.chunking_strategy
33
- return self
34
-
35
- @property
36
- def document_lists(self) -> Iterator[List[Document]]:
37
- """Iterator that yields lists of documents in the knowledge base
38
- Each object yielded by the iterator is a list of documents.
39
- """
40
- raise NotImplementedError
41
-
42
- def search(
43
- self, query: str, num_documents: Optional[int] = None, filters: Optional[Dict[str, Any]] = None
44
- ) -> List[Document]:
45
- """Returns relevant documents matching a query"""
46
- try:
47
- if self.vector_db is None:
48
- logger.warning("No vector db provided")
49
- return []
50
-
51
- _num_documents = num_documents or self.num_documents
52
- logger.debug(f"Getting {_num_documents} relevant documents for query: {query}")
53
- return self.vector_db.search(query=query, limit=_num_documents, filters=filters)
54
- except Exception as e:
55
- logger.error(f"Error searching for documents: {e}")
56
- return []
57
-
58
- def load(
59
- self,
60
- recreate: bool = False,
61
- upsert: bool = False,
62
- skip_existing: bool = True,
63
- filters: Optional[Dict[str, Any]] = None,
64
- ) -> None:
65
- """Load the knowledge base to the vector db
66
-
67
- Args:
68
- recreate (bool): If True, recreates the collection in the vector db. Defaults to False.
69
- upsert (bool): If True, upserts documents to the vector db. Defaults to False.
70
- skip_existing (bool): If True, skips documents which already exist in the vector db when inserting. Defaults to True.
71
- filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
72
- """
73
-
74
- if self.vector_db is None:
75
- logger.warning("No vector db provided")
76
- return
77
-
78
- if recreate:
79
- logger.info("Dropping collection")
80
- self.vector_db.drop()
81
-
82
- logger.info("Creating collection")
83
- self.vector_db.create()
84
-
85
- logger.info("Loading knowledge base")
86
- num_documents = 0
87
- for document_list in self.document_lists:
88
- documents_to_load = document_list
89
- # Upsert documents if upsert is True and vector db supports upsert
90
- if upsert and self.vector_db.upsert_available():
91
- self.vector_db.upsert(documents=documents_to_load, filters=filters)
92
- # Insert documents
93
- else:
94
- # Filter out documents which already exist in the vector db
95
- if skip_existing:
96
- # Use set for O(1) lookups
97
- seen_content = set()
98
- documents_to_load = []
99
- for doc in document_list:
100
- if doc.content not in seen_content and not self.vector_db.doc_exists(doc):
101
- seen_content.add(doc.content)
102
- documents_to_load.append(doc)
103
- self.vector_db.insert(documents=documents_to_load, filters=filters)
104
- num_documents += len(documents_to_load)
105
- logger.info(f"Added {len(documents_to_load)} documents to knowledge base")
106
-
107
- def load_documents(
108
- self,
109
- documents: List[Document],
110
- upsert: bool = False,
111
- skip_existing: bool = True,
112
- filters: Optional[Dict[str, Any]] = None,
113
- ) -> None:
114
- """Load documents to the knowledge base
115
-
116
- Args:
117
- documents (List[Document]): List of documents to load
118
- upsert (bool): If True, upserts documents to the vector db. Defaults to False.
119
- skip_existing (bool): If True, skips documents which already exist in the vector db when inserting. Defaults to True.
120
- filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
121
- """
122
-
123
- logger.info("Loading knowledge base")
124
- if self.vector_db is None:
125
- logger.warning("No vector db provided")
126
- return
127
-
128
- logger.debug("Creating collection")
129
- self.vector_db.create()
130
-
131
- # Upsert documents if upsert is True
132
- if upsert and self.vector_db.upsert_available():
133
- self.vector_db.upsert(documents=documents, filters=filters)
134
- logger.info(f"Loaded {len(documents)} documents to knowledge base")
135
- return
136
-
137
- # Filter out documents which already exist in the vector db
138
- documents_to_load = (
139
- [document for document in documents if not self.vector_db.doc_exists(document)]
140
- if skip_existing
141
- else documents
142
- )
143
-
144
- # Insert documents
145
- if len(documents_to_load) > 0:
146
- self.vector_db.insert(documents=documents_to_load, filters=filters)
147
- logger.info(f"Loaded {len(documents_to_load)} documents to knowledge base")
148
- else:
149
- logger.info("No new documents to load")
150
-
151
- def load_document(
152
- self,
153
- document: Document,
154
- upsert: bool = False,
155
- skip_existing: bool = True,
156
- filters: Optional[Dict[str, Any]] = None,
157
- ) -> None:
158
- """Load a document to the knowledge base
159
-
160
- Args:
161
- document (Document): Document to load
162
- upsert (bool): If True, upserts documents to the vector db. Defaults to False.
163
- skip_existing (bool): If True, skips documents which already exist in the vector db. Defaults to True.
164
- filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
165
- """
166
- self.load_documents(documents=[document], upsert=upsert, skip_existing=skip_existing, filters=filters)
167
-
168
- def load_dict(
169
- self,
170
- document: Dict[str, Any],
171
- upsert: bool = False,
172
- skip_existing: bool = True,
173
- filters: Optional[Dict[str, Any]] = None,
174
- ) -> None:
175
- """Load a dictionary representation of a document to the knowledge base
176
-
177
- Args:
178
- document (Dict[str, Any]): Dictionary representation of a document
179
- upsert (bool): If True, upserts documents to the vector db. Defaults to False.
180
- skip_existing (bool): If True, skips documents which already exist in the vector db. Defaults to True.
181
- filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
182
- """
183
- self.load_documents(
184
- documents=[Document.from_dict(document)], upsert=upsert, skip_existing=skip_existing, filters=filters
185
- )
186
-
187
- def load_json(
188
- self, document: str, upsert: bool = False, skip_existing: bool = True, filters: Optional[Dict[str, Any]] = None
189
- ) -> None:
190
- """Load a json representation of a document to the knowledge base
191
-
192
- Args:
193
- document (str): Json representation of a document
194
- upsert (bool): If True, upserts documents to the vector db. Defaults to False.
195
- skip_existing (bool): If True, skips documents which already exist in the vector db. Defaults to True.
196
- filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
197
- """
198
- self.load_documents(
199
- documents=[Document.from_json(document)], upsert=upsert, skip_existing=skip_existing, filters=filters
200
- )
201
-
202
- def load_text(
203
- self, text: str, upsert: bool = False, skip_existing: bool = True, filters: Optional[Dict[str, Any]] = None
204
- ) -> None:
205
- """Load a text to the knowledge base
206
-
207
- Args:
208
- text (str): Text to load to the knowledge base
209
- upsert (bool): If True, upserts documents to the vector db. Defaults to False.
210
- skip_existing (bool): If True, skips documents which already exist in the vector db. Defaults to True.
211
- filters (Optional[Dict[str, Any]]): Filters to add to each row that can be used to limit results during querying. Defaults to None.
212
- """
213
- self.load_documents(
214
- documents=[Document(content=text)], upsert=upsert, skip_existing=skip_existing, filters=filters
215
- )
216
-
217
- def exists(self) -> bool:
218
- """Returns True if the knowledge base exists"""
219
- if self.vector_db is None:
220
- logger.warning("No vector db provided")
221
- return False
222
- return self.vector_db.exists()
223
-
224
- def delete(self) -> bool:
225
- """Clear the knowledge base"""
226
- if self.vector_db is None:
227
- logger.warning("No vector db available")
228
- return True
229
-
230
- return self.vector_db.delete()
agno/knowledge/arxiv.py DELETED
@@ -1,22 +0,0 @@
1
- from typing import Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.document.reader.arxiv_reader import ArxivReader
5
- from agno.knowledge.agent import AgentKnowledge
6
-
7
-
8
- class ArxivKnowledgeBase(AgentKnowledge):
9
- queries: List[str] = []
10
- reader: ArxivReader = ArxivReader()
11
-
12
- @property
13
- def document_lists(self) -> Iterator[List[Document]]:
14
- """Iterate over urls and yield lists of documents.
15
- Each object yielded by the iterator is a list of documents.
16
-
17
- Returns:
18
- Iterator[List[Document]]: Iterator yielding list of documents
19
- """
20
-
21
- for _query in self.queries:
22
- yield self.reader.read(query=_query)
@@ -1,22 +0,0 @@
1
- from typing import Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.knowledge.agent import AgentKnowledge
5
- from agno.utils.log import logger
6
-
7
-
8
- class CombinedKnowledgeBase(AgentKnowledge):
9
- sources: List[AgentKnowledge] = []
10
-
11
- @property
12
- def document_lists(self) -> Iterator[List[Document]]:
13
- """Iterate over knowledge bases and yield lists of documents.
14
- Each object yielded by the iterator is a list of documents.
15
-
16
- Returns:
17
- Iterator[List[Document]]: Iterator yielding list of documents
18
- """
19
-
20
- for kb in self.sources:
21
- logger.debug(f"Loading documents from {kb.__class__.__name__}")
22
- yield from kb.document_lists
agno/knowledge/csv.py DELETED
@@ -1,28 +0,0 @@
1
- from pathlib import Path
2
- from typing import Iterator, List, Union
3
-
4
- from agno.document import Document
5
- from agno.document.reader.csv_reader import CSVReader
6
- from agno.knowledge.agent import AgentKnowledge
7
-
8
-
9
- class CSVKnowledgeBase(AgentKnowledge):
10
- path: Union[str, Path]
11
- reader: CSVReader = CSVReader()
12
-
13
- @property
14
- def document_lists(self) -> Iterator[List[Document]]:
15
- """Iterate over CSVs and yield lists of documents.
16
- Each object yielded by the iterator is a list of documents.
17
-
18
- Returns:
19
- Iterator[List[Document]]: Iterator yielding list of documents
20
- """
21
-
22
- _csv_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
23
-
24
- if _csv_path.exists() and _csv_path.is_dir():
25
- for _csv in _csv_path.glob("**/*.csv"):
26
- yield self.reader.read(file=_csv)
27
- elif _csv_path.exists() and _csv_path.is_file() and _csv_path.suffix == ".csv":
28
- yield self.reader.read(file=_csv_path)
agno/knowledge/csv_url.py DELETED
@@ -1,19 +0,0 @@
1
- from typing import Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.document.reader.csv_reader import CSVUrlReader
5
- from agno.knowledge.agent import AgentKnowledge
6
- from agno.utils.log import logger
7
-
8
-
9
- class CSVUrlKnowledgeBase(AgentKnowledge):
10
- urls: List[str]
11
- reader: CSVUrlReader = CSVUrlReader()
12
-
13
- @property
14
- def document_lists(self) -> Iterator[List[Document]]:
15
- for url in self.urls:
16
- if url.endswith(".csv"):
17
- yield self.reader.read(url=url)
18
- else:
19
- logger.error(f"Unsupported URL: {url}")
@@ -1,20 +0,0 @@
1
- from typing import Iterator, List
2
-
3
- from agno.document import Document
4
- from agno.knowledge.agent import AgentKnowledge
5
-
6
-
7
- class DocumentKnowledgeBase(AgentKnowledge):
8
- documents: List[Document]
9
-
10
- @property
11
- def document_lists(self) -> Iterator[List[Document]]:
12
- """Iterate over documents and yield lists of documents.
13
- Each object yielded by the iterator is a list of documents.
14
-
15
- Returns:
16
- Iterator[List[Document]]: Iterator yielding list of documents
17
- """
18
-
19
- for _document in self.documents:
20
- yield [_document]
agno/knowledge/docx.py DELETED
@@ -1,30 +0,0 @@
1
- from pathlib import Path
2
- from typing import Iterator, List, Union
3
-
4
- from agno.document import Document
5
- from agno.document.reader.docx_reader import DocxReader
6
- from agno.knowledge.agent import AgentKnowledge
7
-
8
-
9
- class DocxKnowledgeBase(AgentKnowledge):
10
- path: Union[str, Path]
11
- formats: List[str] = [".doc", ".docx"]
12
- reader: DocxReader = DocxReader()
13
-
14
- @property
15
- def document_lists(self) -> Iterator[List[Document]]:
16
- """Iterate over doc/docx files and yield lists of documents.
17
- Each object yielded by the iterator is a list of documents.
18
-
19
- Returns:
20
- Iterator[List[Document]]: Iterator yielding list of documents
21
- """
22
-
23
- _file_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
24
-
25
- if _file_path.exists() and _file_path.is_dir():
26
- for _file in _file_path.glob("**/*"):
27
- if _file.suffix in self.formats:
28
- yield self.reader.read(file=_file)
29
- elif _file_path.exists() and _file_path.is_file() and _file_path.suffix in self.formats:
30
- yield self.reader.read(file=_file_path)
agno/knowledge/json.py DELETED
@@ -1,28 +0,0 @@
1
- from pathlib import Path
2
- from typing import Iterator, List, Union
3
-
4
- from agno.document import Document
5
- from agno.document.reader.json_reader import JSONReader
6
- from agno.knowledge.agent import AgentKnowledge
7
-
8
-
9
- class JSONKnowledgeBase(AgentKnowledge):
10
- path: Union[str, Path]
11
- reader: JSONReader = JSONReader()
12
-
13
- @property
14
- def document_lists(self) -> Iterator[List[Document]]:
15
- """Iterate over Json files and yield lists of documents.
16
- Each object yielded by the iterator is a list of documents.
17
-
18
- Returns:
19
- Iterator[List[Document]]: Iterator yielding list of documents
20
- """
21
-
22
- _json_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
23
-
24
- if _json_path.exists() and _json_path.is_dir():
25
- for _pdf in _json_path.glob("*.json"):
26
- yield self.reader.read(path=_pdf)
27
- elif _json_path.exists() and _json_path.is_file() and _json_path.suffix == ".json":
28
- yield self.reader.read(path=_json_path)
@@ -1,71 +0,0 @@
1
- from typing import Any, Callable, Dict, List, Optional
2
-
3
- from agno.document import Document
4
- from agno.knowledge.agent import AgentKnowledge
5
- from agno.utils.log import logger
6
-
7
-
8
- class LangChainKnowledgeBase(AgentKnowledge):
9
- loader: Optional[Callable] = None
10
-
11
- vectorstore: Optional[Any] = None
12
- search_kwargs: Optional[dict] = None
13
-
14
- retriever: Optional[Any] = None
15
-
16
- def search(
17
- self, query: str, num_documents: Optional[int] = None, filters: Optional[Dict[str, Any]] = None
18
- ) -> List[Document]:
19
- """Returns relevant documents matching the query"""
20
-
21
- try:
22
- from langchain_core.documents import Document as LangChainDocument
23
- from langchain_core.retrievers import BaseRetriever
24
- except ImportError:
25
- raise ImportError(
26
- "The `langchain` package is not installed. Please install it via `pip install langchain`."
27
- )
28
-
29
- if self.vectorstore is not None and self.retriever is None:
30
- logger.debug("Creating retriever")
31
- if self.search_kwargs is None:
32
- self.search_kwargs = {"k": self.num_documents}
33
- if filters is not None:
34
- self.search_kwargs.update(filters)
35
- self.retriever = self.vectorstore.as_retriever(search_kwargs=self.search_kwargs)
36
-
37
- if self.retriever is None:
38
- logger.error("No retriever provided")
39
- return []
40
-
41
- if not isinstance(self.retriever, BaseRetriever):
42
- raise ValueError(f"Retriever is not of type BaseRetriever: {self.retriever}")
43
-
44
- _num_documents = num_documents or self.num_documents
45
- logger.debug(f"Getting {_num_documents} relevant documents for query: {query}")
46
- lc_documents: List[LangChainDocument] = self.retriever.invoke(input=query)
47
- documents = []
48
- for lc_doc in lc_documents:
49
- documents.append(
50
- Document(
51
- content=lc_doc.page_content,
52
- meta_data=lc_doc.metadata,
53
- )
54
- )
55
- return documents
56
-
57
- def load(
58
- self,
59
- recreate: bool = False,
60
- upsert: bool = True,
61
- skip_existing: bool = True,
62
- filters: Optional[Dict[str, Any]] = None,
63
- ) -> None:
64
- if self.loader is None:
65
- logger.error("No loader provided for LangChainKnowledgeBase")
66
- return
67
- self.loader()
68
-
69
- def exists(self) -> bool:
70
- logger.warning("LangChainKnowledgeBase.exists() not supported - please check the vectorstore manually.")
71
- return True
@@ -1,66 +0,0 @@
1
- from typing import Any, Callable, Dict, List, Optional
2
-
3
- from agno.document import Document
4
- from agno.knowledge.agent import AgentKnowledge
5
- from agno.utils.log import logger
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 LlamaIndexKnowledgeBase(AgentKnowledge):
17
- retriever: BaseRetriever
18
- loader: Optional[Callable] = None
19
-
20
- def search(
21
- self, query: str, num_documents: Optional[int] = None, filters: Optional[Dict[str, Any]] = None
22
- ) -> List[Document]:
23
- """
24
- Returns relevant documents matching the query.
25
-
26
- Args:
27
- query (str): The query string to search for.
28
- num_documents (Optional[int]): The maximum number of documents to return. Defaults to None.
29
- filters (Optional[Dict[str, Any]]): Filters to apply to the search. Defaults to None.
30
-
31
- Returns:
32
- List[Document]: A list of relevant documents matching the query.
33
- Raises:
34
- ValueError: If the retriever is not of type BaseRetriever.
35
- """
36
- if not isinstance(self.retriever, BaseRetriever):
37
- raise ValueError(f"Retriever is not of type BaseRetriever: {self.retriever}")
38
-
39
- lc_documents: List[NodeWithScore] = self.retriever.retrieve(query)
40
- if num_documents is not None:
41
- lc_documents = lc_documents[:num_documents]
42
- documents = []
43
- for lc_doc in lc_documents:
44
- documents.append(
45
- Document(
46
- content=lc_doc.text,
47
- meta_data=lc_doc.metadata,
48
- )
49
- )
50
- return documents
51
-
52
- def load(
53
- self,
54
- recreate: bool = False,
55
- upsert: bool = True,
56
- skip_existing: bool = True,
57
- filters: Optional[Dict[str, Any]] = None,
58
- ) -> None:
59
- if self.loader is None:
60
- logger.error("No loader provided for LlamaIndexKnowledgeBase")
61
- return
62
- self.loader()
63
-
64
- def exists(self) -> bool:
65
- logger.warning("LlamaIndexKnowledgeBase.exists() not supported - please check the vectorstore manually.")
66
- return True
agno/knowledge/pdf.py DELETED
@@ -1,28 +0,0 @@
1
- from pathlib import Path
2
- from typing import Iterator, List, Union
3
-
4
- from agno.document import Document
5
- from agno.document.reader.pdf_reader import PDFImageReader, PDFReader
6
- from agno.knowledge.agent import AgentKnowledge
7
-
8
-
9
- class PDFKnowledgeBase(AgentKnowledge):
10
- path: Union[str, Path]
11
- reader: Union[PDFReader, PDFImageReader] = PDFReader()
12
-
13
- @property
14
- def document_lists(self) -> Iterator[List[Document]]:
15
- """Iterate over PDFs and yield lists of documents.
16
- Each object yielded by the iterator is a list of documents.
17
-
18
- Returns:
19
- Iterator[List[Document]]: Iterator yielding list of documents
20
- """
21
-
22
- _pdf_path: Path = Path(self.path) if isinstance(self.path, str) else self.path
23
-
24
- if _pdf_path.exists() and _pdf_path.is_dir():
25
- for _pdf in _pdf_path.glob("**/*.pdf"):
26
- yield self.reader.read(pdf=_pdf)
27
- elif _pdf_path.exists() and _pdf_path.is_file() and _pdf_path.suffix == ".pdf":
28
- yield self.reader.read(pdf=_pdf_path)
agno/knowledge/pdf_url.py DELETED
@@ -1,26 +0,0 @@
1
- from typing import Iterator, List, Union
2
-
3
- from agno.document import Document
4
- from agno.document.reader.pdf_reader import PDFUrlImageReader, PDFUrlReader
5
- from agno.knowledge.agent import AgentKnowledge
6
- from agno.utils.log import logger
7
-
8
-
9
- class PDFUrlKnowledgeBase(AgentKnowledge):
10
- urls: List[str] = []
11
- reader: Union[PDFUrlReader, PDFUrlImageReader] = PDFUrlReader()
12
-
13
- @property
14
- def document_lists(self) -> Iterator[List[Document]]:
15
- """Iterate over PDF urls and yield lists of documents.
16
- Each object yielded by the iterator is a list of documents.
17
-
18
- Returns:
19
- Iterator[List[Document]]: Iterator yielding list of documents
20
- """
21
-
22
- for url in self.urls:
23
- if url.endswith(".pdf"):
24
- yield self.reader.read(url=url)
25
- else:
26
- logger.error(f"Unsupported URL: {url}")