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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. agno/agent/__init__.py +19 -27
  2. agno/agent/agent.py +3143 -4170
  3. agno/api/agent.py +11 -67
  4. agno/api/api.py +5 -46
  5. agno/api/evals.py +8 -19
  6. agno/api/os.py +17 -0
  7. agno/api/routes.py +6 -41
  8. agno/api/schemas/__init__.py +9 -0
  9. agno/api/schemas/agent.py +5 -21
  10. agno/api/schemas/evals.py +7 -16
  11. agno/api/schemas/os.py +14 -0
  12. agno/api/schemas/team.py +5 -21
  13. agno/api/schemas/utils.py +21 -0
  14. agno/api/schemas/workflows.py +11 -7
  15. agno/api/settings.py +53 -0
  16. agno/api/team.py +11 -66
  17. agno/api/workflow.py +28 -0
  18. agno/cloud/aws/base.py +214 -0
  19. agno/cloud/aws/s3/__init__.py +2 -0
  20. agno/cloud/aws/s3/api_client.py +43 -0
  21. agno/cloud/aws/s3/bucket.py +195 -0
  22. agno/cloud/aws/s3/object.py +57 -0
  23. agno/db/__init__.py +24 -0
  24. agno/db/base.py +245 -0
  25. agno/db/dynamo/__init__.py +3 -0
  26. agno/db/dynamo/dynamo.py +1743 -0
  27. agno/db/dynamo/schemas.py +278 -0
  28. agno/db/dynamo/utils.py +684 -0
  29. agno/db/firestore/__init__.py +3 -0
  30. agno/db/firestore/firestore.py +1432 -0
  31. agno/db/firestore/schemas.py +130 -0
  32. agno/db/firestore/utils.py +278 -0
  33. agno/db/gcs_json/__init__.py +3 -0
  34. agno/db/gcs_json/gcs_json_db.py +1001 -0
  35. agno/db/gcs_json/utils.py +194 -0
  36. agno/db/in_memory/__init__.py +3 -0
  37. agno/db/in_memory/in_memory_db.py +882 -0
  38. agno/db/in_memory/utils.py +172 -0
  39. agno/db/json/__init__.py +3 -0
  40. agno/db/json/json_db.py +1045 -0
  41. agno/db/json/utils.py +196 -0
  42. agno/db/migrations/v1_to_v2.py +162 -0
  43. agno/db/mongo/__init__.py +3 -0
  44. agno/db/mongo/mongo.py +1416 -0
  45. agno/db/mongo/schemas.py +77 -0
  46. agno/db/mongo/utils.py +204 -0
  47. agno/db/mysql/__init__.py +3 -0
  48. agno/db/mysql/mysql.py +1719 -0
  49. agno/db/mysql/schemas.py +124 -0
  50. agno/db/mysql/utils.py +297 -0
  51. agno/db/postgres/__init__.py +3 -0
  52. agno/db/postgres/postgres.py +1710 -0
  53. agno/db/postgres/schemas.py +124 -0
  54. agno/db/postgres/utils.py +280 -0
  55. agno/db/redis/__init__.py +3 -0
  56. agno/db/redis/redis.py +1367 -0
  57. agno/db/redis/schemas.py +109 -0
  58. agno/db/redis/utils.py +288 -0
  59. agno/db/schemas/__init__.py +3 -0
  60. agno/db/schemas/evals.py +33 -0
  61. agno/db/schemas/knowledge.py +40 -0
  62. agno/db/schemas/memory.py +46 -0
  63. agno/db/singlestore/__init__.py +3 -0
  64. agno/db/singlestore/schemas.py +116 -0
  65. agno/db/singlestore/singlestore.py +1712 -0
  66. agno/db/singlestore/utils.py +326 -0
  67. agno/db/sqlite/__init__.py +3 -0
  68. agno/db/sqlite/schemas.py +119 -0
  69. agno/db/sqlite/sqlite.py +1676 -0
  70. agno/db/sqlite/utils.py +268 -0
  71. agno/db/utils.py +88 -0
  72. agno/eval/__init__.py +14 -0
  73. agno/eval/accuracy.py +154 -48
  74. agno/eval/performance.py +88 -23
  75. agno/eval/reliability.py +73 -20
  76. agno/eval/utils.py +23 -13
  77. agno/integrations/discord/__init__.py +3 -0
  78. agno/{app → integrations}/discord/client.py +10 -10
  79. agno/knowledge/__init__.py +2 -2
  80. agno/{document → knowledge}/chunking/agentic.py +2 -2
  81. agno/{document → knowledge}/chunking/document.py +2 -2
  82. agno/{document → knowledge}/chunking/fixed.py +3 -3
  83. agno/{document → knowledge}/chunking/markdown.py +2 -2
  84. agno/{document → knowledge}/chunking/recursive.py +2 -2
  85. agno/{document → knowledge}/chunking/row.py +2 -2
  86. agno/knowledge/chunking/semantic.py +59 -0
  87. agno/knowledge/chunking/strategy.py +121 -0
  88. agno/knowledge/content.py +74 -0
  89. agno/knowledge/document/__init__.py +5 -0
  90. agno/{document → knowledge/document}/base.py +12 -2
  91. agno/knowledge/embedder/__init__.py +5 -0
  92. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  93. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  94. agno/{embedder → knowledge/embedder}/base.py +6 -0
  95. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  96. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  97. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  98. agno/{embedder → knowledge/embedder}/google.py +74 -1
  99. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  100. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  101. agno/knowledge/embedder/langdb.py +22 -0
  102. agno/knowledge/embedder/mistral.py +139 -0
  103. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  104. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  105. agno/knowledge/embedder/openai.py +223 -0
  106. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  107. agno/{embedder → knowledge/embedder}/together.py +1 -1
  108. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  109. agno/knowledge/knowledge.py +1551 -0
  110. agno/knowledge/reader/__init__.py +7 -0
  111. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  112. agno/knowledge/reader/base.py +88 -0
  113. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  114. agno/knowledge/reader/docx_reader.py +83 -0
  115. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  116. agno/{document → knowledge}/reader/json_reader.py +30 -9
  117. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  118. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  119. agno/knowledge/reader/reader_factory.py +268 -0
  120. agno/knowledge/reader/s3_reader.py +101 -0
  121. agno/{document → knowledge}/reader/text_reader.py +31 -10
  122. agno/knowledge/reader/url_reader.py +128 -0
  123. agno/knowledge/reader/web_search_reader.py +366 -0
  124. agno/{document → knowledge}/reader/website_reader.py +37 -10
  125. agno/knowledge/reader/wikipedia_reader.py +59 -0
  126. agno/knowledge/reader/youtube_reader.py +78 -0
  127. agno/knowledge/remote_content/remote_content.py +88 -0
  128. agno/{reranker → knowledge/reranker}/base.py +1 -1
  129. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  130. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  131. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  132. agno/knowledge/types.py +30 -0
  133. agno/knowledge/utils.py +169 -0
  134. agno/media.py +269 -268
  135. agno/memory/__init__.py +2 -10
  136. agno/memory/manager.py +1003 -148
  137. agno/models/aimlapi/__init__.py +2 -2
  138. agno/models/aimlapi/aimlapi.py +6 -6
  139. agno/models/anthropic/claude.py +128 -72
  140. agno/models/aws/bedrock.py +107 -175
  141. agno/models/aws/claude.py +64 -18
  142. agno/models/azure/ai_foundry.py +73 -23
  143. agno/models/base.py +346 -290
  144. agno/models/cerebras/cerebras.py +84 -27
  145. agno/models/cohere/chat.py +106 -98
  146. agno/models/google/gemini.py +105 -46
  147. agno/models/groq/groq.py +97 -35
  148. agno/models/huggingface/huggingface.py +92 -27
  149. agno/models/ibm/watsonx.py +72 -13
  150. agno/models/litellm/chat.py +85 -13
  151. agno/models/message.py +46 -151
  152. agno/models/meta/llama.py +85 -49
  153. agno/models/metrics.py +120 -0
  154. agno/models/mistral/mistral.py +90 -21
  155. agno/models/ollama/__init__.py +0 -2
  156. agno/models/ollama/chat.py +85 -47
  157. agno/models/openai/chat.py +154 -37
  158. agno/models/openai/responses.py +178 -105
  159. agno/models/perplexity/perplexity.py +26 -2
  160. agno/models/portkey/portkey.py +0 -7
  161. agno/models/response.py +15 -9
  162. agno/models/utils.py +20 -0
  163. agno/models/vercel/__init__.py +2 -2
  164. agno/models/vercel/v0.py +1 -1
  165. agno/models/vllm/__init__.py +2 -2
  166. agno/models/vllm/vllm.py +3 -3
  167. agno/models/xai/xai.py +10 -10
  168. agno/os/__init__.py +3 -0
  169. agno/os/app.py +497 -0
  170. agno/os/auth.py +47 -0
  171. agno/os/config.py +103 -0
  172. agno/os/interfaces/agui/__init__.py +3 -0
  173. agno/os/interfaces/agui/agui.py +31 -0
  174. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  175. agno/{app → os/interfaces}/agui/utils.py +65 -28
  176. agno/os/interfaces/base.py +21 -0
  177. agno/os/interfaces/slack/__init__.py +3 -0
  178. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  179. agno/os/interfaces/slack/slack.py +32 -0
  180. agno/os/interfaces/whatsapp/__init__.py +3 -0
  181. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  182. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  183. agno/os/mcp.py +235 -0
  184. agno/os/router.py +1400 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +393 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +850 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +410 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +178 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +536 -0
  201. agno/os/schema.py +945 -0
  202. agno/{app/playground → os}/settings.py +7 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/agent.py +633 -0
  212. agno/run/base.py +53 -77
  213. agno/run/cancel.py +81 -0
  214. agno/run/team.py +243 -96
  215. agno/run/workflow.py +550 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +3260 -4824
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +43 -23
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +20 -17
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +22 -12
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +17 -8
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +62 -62
  252. agno/tools/eleven_labs.py +36 -29
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +30 -30
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +17 -18
  260. agno/tools/function.py +127 -18
  261. agno/tools/giphy.py +23 -11
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +32 -20
  276. agno/tools/mcp.py +1 -2
  277. agno/tools/mem0.py +18 -12
  278. agno/tools/memori.py +14 -10
  279. agno/tools/mlx_transcribe.py +3 -2
  280. agno/tools/models/azure_openai.py +33 -15
  281. agno/tools/models/gemini.py +59 -32
  282. agno/tools/models/groq.py +30 -23
  283. agno/tools/models/nebius.py +28 -12
  284. agno/tools/models_labs.py +40 -16
  285. agno/tools/moviepy_video.py +7 -6
  286. agno/tools/neo4j.py +10 -8
  287. agno/tools/newspaper.py +7 -2
  288. agno/tools/newspaper4k.py +8 -3
  289. agno/tools/openai.py +58 -32
  290. agno/tools/openbb.py +12 -11
  291. agno/tools/opencv.py +63 -47
  292. agno/tools/openweather.py +14 -12
  293. agno/tools/pandas.py +11 -3
  294. agno/tools/postgres.py +4 -12
  295. agno/tools/pubmed.py +4 -1
  296. agno/tools/python.py +9 -22
  297. agno/tools/reasoning.py +35 -27
  298. agno/tools/reddit.py +11 -26
  299. agno/tools/replicate.py +55 -42
  300. agno/tools/resend.py +4 -1
  301. agno/tools/scrapegraph.py +15 -14
  302. agno/tools/searxng.py +10 -23
  303. agno/tools/serpapi.py +6 -3
  304. agno/tools/serper.py +13 -4
  305. agno/tools/shell.py +9 -2
  306. agno/tools/slack.py +12 -11
  307. agno/tools/sleep.py +3 -2
  308. agno/tools/spider.py +24 -4
  309. agno/tools/sql.py +7 -6
  310. agno/tools/tavily.py +6 -4
  311. agno/tools/telegram.py +12 -4
  312. agno/tools/todoist.py +11 -31
  313. agno/tools/toolkit.py +1 -1
  314. agno/tools/trafilatura.py +22 -6
  315. agno/tools/trello.py +9 -22
  316. agno/tools/twilio.py +10 -3
  317. agno/tools/user_control_flow.py +6 -1
  318. agno/tools/valyu.py +34 -5
  319. agno/tools/visualization.py +19 -28
  320. agno/tools/webbrowser.py +4 -3
  321. agno/tools/webex.py +11 -7
  322. agno/tools/website.py +15 -46
  323. agno/tools/webtools.py +12 -4
  324. agno/tools/whatsapp.py +5 -9
  325. agno/tools/wikipedia.py +20 -13
  326. agno/tools/x.py +14 -13
  327. agno/tools/yfinance.py +13 -40
  328. agno/tools/youtube.py +26 -20
  329. agno/tools/zendesk.py +7 -2
  330. agno/tools/zep.py +10 -7
  331. agno/tools/zoom.py +10 -9
  332. agno/utils/common.py +1 -19
  333. agno/utils/events.py +100 -123
  334. agno/utils/gemini.py +1 -1
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/log.py +54 -4
  337. agno/utils/mcp.py +68 -10
  338. agno/utils/media.py +39 -0
  339. agno/utils/message.py +12 -1
  340. agno/utils/models/aws_claude.py +1 -1
  341. agno/utils/models/claude.py +6 -12
  342. agno/utils/models/cohere.py +1 -1
  343. agno/utils/models/mistral.py +8 -7
  344. agno/utils/models/schema_utils.py +3 -3
  345. agno/utils/models/watsonx.py +1 -1
  346. agno/utils/openai.py +1 -1
  347. agno/utils/pprint.py +33 -32
  348. agno/utils/print_response/agent.py +779 -0
  349. agno/utils/print_response/team.py +1669 -0
  350. agno/utils/print_response/workflow.py +1451 -0
  351. agno/utils/prompts.py +14 -14
  352. agno/utils/reasoning.py +87 -0
  353. agno/utils/response.py +42 -42
  354. agno/utils/streamlit.py +481 -0
  355. agno/utils/string.py +8 -22
  356. agno/utils/team.py +50 -0
  357. agno/utils/timer.py +2 -2
  358. agno/vectordb/base.py +33 -21
  359. agno/vectordb/cassandra/cassandra.py +287 -23
  360. agno/vectordb/chroma/chromadb.py +482 -59
  361. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  362. agno/vectordb/couchbase/couchbase.py +309 -29
  363. agno/vectordb/lancedb/lance_db.py +360 -21
  364. agno/vectordb/langchaindb/__init__.py +5 -0
  365. agno/vectordb/langchaindb/langchaindb.py +145 -0
  366. agno/vectordb/lightrag/__init__.py +5 -0
  367. agno/vectordb/lightrag/lightrag.py +374 -0
  368. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  369. agno/vectordb/milvus/milvus.py +242 -32
  370. agno/vectordb/mongodb/mongodb.py +200 -24
  371. agno/vectordb/pgvector/pgvector.py +319 -37
  372. agno/vectordb/pineconedb/pineconedb.py +221 -27
  373. agno/vectordb/qdrant/qdrant.py +334 -14
  374. agno/vectordb/singlestore/singlestore.py +286 -29
  375. agno/vectordb/surrealdb/surrealdb.py +187 -7
  376. agno/vectordb/upstashdb/upstashdb.py +342 -26
  377. agno/vectordb/weaviate/weaviate.py +227 -165
  378. agno/workflow/__init__.py +17 -13
  379. agno/workflow/{v2/condition.py → condition.py} +135 -32
  380. agno/workflow/{v2/loop.py → loop.py} +115 -28
  381. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  382. agno/workflow/{v2/router.py → router.py} +133 -32
  383. agno/workflow/{v2/step.py → step.py} +207 -49
  384. agno/workflow/{v2/steps.py → steps.py} +147 -66
  385. agno/workflow/types.py +482 -0
  386. agno/workflow/workflow.py +2410 -696
  387. agno-2.0.0.dist-info/METADATA +494 -0
  388. agno-2.0.0.dist-info/RECORD +515 -0
  389. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  390. agno/agent/metrics.py +0 -110
  391. agno/api/app.py +0 -35
  392. agno/api/playground.py +0 -92
  393. agno/api/schemas/app.py +0 -12
  394. agno/api/schemas/playground.py +0 -22
  395. agno/api/schemas/user.py +0 -35
  396. agno/api/schemas/workspace.py +0 -46
  397. agno/api/user.py +0 -160
  398. agno/api/workflows.py +0 -33
  399. agno/api/workspace.py +0 -175
  400. agno/app/agui/__init__.py +0 -3
  401. agno/app/agui/app.py +0 -17
  402. agno/app/agui/sync_router.py +0 -120
  403. agno/app/base.py +0 -186
  404. agno/app/discord/__init__.py +0 -3
  405. agno/app/fastapi/__init__.py +0 -3
  406. agno/app/fastapi/app.py +0 -107
  407. agno/app/fastapi/async_router.py +0 -457
  408. agno/app/fastapi/sync_router.py +0 -448
  409. agno/app/playground/app.py +0 -228
  410. agno/app/playground/async_router.py +0 -1053
  411. agno/app/playground/deploy.py +0 -249
  412. agno/app/playground/operator.py +0 -183
  413. agno/app/playground/schemas.py +0 -223
  414. agno/app/playground/serve.py +0 -55
  415. agno/app/playground/sync_router.py +0 -1045
  416. agno/app/playground/utils.py +0 -46
  417. agno/app/settings.py +0 -15
  418. agno/app/slack/__init__.py +0 -3
  419. agno/app/slack/app.py +0 -19
  420. agno/app/slack/sync_router.py +0 -92
  421. agno/app/utils.py +0 -54
  422. agno/app/whatsapp/__init__.py +0 -3
  423. agno/app/whatsapp/app.py +0 -15
  424. agno/app/whatsapp/sync_router.py +0 -197
  425. agno/cli/auth_server.py +0 -249
  426. agno/cli/config.py +0 -274
  427. agno/cli/console.py +0 -88
  428. agno/cli/credentials.py +0 -23
  429. agno/cli/entrypoint.py +0 -571
  430. agno/cli/operator.py +0 -357
  431. agno/cli/settings.py +0 -96
  432. agno/cli/ws/ws_cli.py +0 -817
  433. agno/constants.py +0 -13
  434. agno/document/__init__.py +0 -5
  435. agno/document/chunking/semantic.py +0 -45
  436. agno/document/chunking/strategy.py +0 -31
  437. agno/document/reader/__init__.py +0 -5
  438. agno/document/reader/base.py +0 -47
  439. agno/document/reader/docx_reader.py +0 -60
  440. agno/document/reader/gcs/pdf_reader.py +0 -44
  441. agno/document/reader/s3/pdf_reader.py +0 -59
  442. agno/document/reader/s3/text_reader.py +0 -63
  443. agno/document/reader/url_reader.py +0 -59
  444. agno/document/reader/youtube_reader.py +0 -58
  445. agno/embedder/__init__.py +0 -5
  446. agno/embedder/langdb.py +0 -80
  447. agno/embedder/mistral.py +0 -82
  448. agno/embedder/openai.py +0 -78
  449. agno/file/__init__.py +0 -5
  450. agno/file/file.py +0 -16
  451. agno/file/local/csv.py +0 -32
  452. agno/file/local/txt.py +0 -19
  453. agno/infra/app.py +0 -240
  454. agno/infra/base.py +0 -144
  455. agno/infra/context.py +0 -20
  456. agno/infra/db_app.py +0 -52
  457. agno/infra/resource.py +0 -205
  458. agno/infra/resources.py +0 -55
  459. agno/knowledge/agent.py +0 -702
  460. agno/knowledge/arxiv.py +0 -33
  461. agno/knowledge/combined.py +0 -36
  462. agno/knowledge/csv.py +0 -144
  463. agno/knowledge/csv_url.py +0 -124
  464. agno/knowledge/document.py +0 -223
  465. agno/knowledge/docx.py +0 -137
  466. agno/knowledge/firecrawl.py +0 -34
  467. agno/knowledge/gcs/__init__.py +0 -0
  468. agno/knowledge/gcs/base.py +0 -39
  469. agno/knowledge/gcs/pdf.py +0 -125
  470. agno/knowledge/json.py +0 -137
  471. agno/knowledge/langchain.py +0 -71
  472. agno/knowledge/light_rag.py +0 -273
  473. agno/knowledge/llamaindex.py +0 -66
  474. agno/knowledge/markdown.py +0 -154
  475. agno/knowledge/pdf.py +0 -164
  476. agno/knowledge/pdf_bytes.py +0 -42
  477. agno/knowledge/pdf_url.py +0 -148
  478. agno/knowledge/s3/__init__.py +0 -0
  479. agno/knowledge/s3/base.py +0 -64
  480. agno/knowledge/s3/pdf.py +0 -33
  481. agno/knowledge/s3/text.py +0 -34
  482. agno/knowledge/text.py +0 -141
  483. agno/knowledge/url.py +0 -46
  484. agno/knowledge/website.py +0 -179
  485. agno/knowledge/wikipedia.py +0 -32
  486. agno/knowledge/youtube.py +0 -35
  487. agno/memory/agent.py +0 -423
  488. agno/memory/classifier.py +0 -104
  489. agno/memory/db/__init__.py +0 -5
  490. agno/memory/db/base.py +0 -42
  491. agno/memory/db/mongodb.py +0 -189
  492. agno/memory/db/postgres.py +0 -203
  493. agno/memory/db/sqlite.py +0 -193
  494. agno/memory/memory.py +0 -22
  495. agno/memory/row.py +0 -36
  496. agno/memory/summarizer.py +0 -201
  497. agno/memory/summary.py +0 -19
  498. agno/memory/team.py +0 -415
  499. agno/memory/v2/__init__.py +0 -2
  500. agno/memory/v2/db/__init__.py +0 -1
  501. agno/memory/v2/db/base.py +0 -42
  502. agno/memory/v2/db/firestore.py +0 -339
  503. agno/memory/v2/db/mongodb.py +0 -196
  504. agno/memory/v2/db/postgres.py +0 -214
  505. agno/memory/v2/db/redis.py +0 -187
  506. agno/memory/v2/db/schema.py +0 -54
  507. agno/memory/v2/db/sqlite.py +0 -209
  508. agno/memory/v2/manager.py +0 -437
  509. agno/memory/v2/memory.py +0 -1097
  510. agno/memory/v2/schema.py +0 -55
  511. agno/memory/v2/summarizer.py +0 -215
  512. agno/memory/workflow.py +0 -38
  513. agno/models/ollama/tools.py +0 -430
  514. agno/models/qwen/__init__.py +0 -5
  515. agno/playground/__init__.py +0 -10
  516. agno/playground/deploy.py +0 -3
  517. agno/playground/playground.py +0 -3
  518. agno/playground/serve.py +0 -3
  519. agno/playground/settings.py +0 -3
  520. agno/reranker/__init__.py +0 -0
  521. agno/run/response.py +0 -467
  522. agno/run/v2/__init__.py +0 -0
  523. agno/run/v2/workflow.py +0 -567
  524. agno/storage/__init__.py +0 -0
  525. agno/storage/agent/__init__.py +0 -0
  526. agno/storage/agent/dynamodb.py +0 -1
  527. agno/storage/agent/json.py +0 -1
  528. agno/storage/agent/mongodb.py +0 -1
  529. agno/storage/agent/postgres.py +0 -1
  530. agno/storage/agent/singlestore.py +0 -1
  531. agno/storage/agent/sqlite.py +0 -1
  532. agno/storage/agent/yaml.py +0 -1
  533. agno/storage/base.py +0 -60
  534. agno/storage/dynamodb.py +0 -673
  535. agno/storage/firestore.py +0 -297
  536. agno/storage/gcs_json.py +0 -261
  537. agno/storage/in_memory.py +0 -234
  538. agno/storage/json.py +0 -237
  539. agno/storage/mongodb.py +0 -328
  540. agno/storage/mysql.py +0 -685
  541. agno/storage/postgres.py +0 -682
  542. agno/storage/redis.py +0 -336
  543. agno/storage/session/__init__.py +0 -16
  544. agno/storage/session/agent.py +0 -64
  545. agno/storage/session/team.py +0 -63
  546. agno/storage/session/v2/__init__.py +0 -5
  547. agno/storage/session/workflow.py +0 -61
  548. agno/storage/singlestore.py +0 -606
  549. agno/storage/sqlite.py +0 -646
  550. agno/storage/workflow/__init__.py +0 -0
  551. agno/storage/workflow/mongodb.py +0 -1
  552. agno/storage/workflow/postgres.py +0 -1
  553. agno/storage/workflow/sqlite.py +0 -1
  554. agno/storage/yaml.py +0 -241
  555. agno/tools/thinking.py +0 -73
  556. agno/utils/defaults.py +0 -57
  557. agno/utils/filesystem.py +0 -39
  558. agno/utils/git.py +0 -52
  559. agno/utils/json_io.py +0 -30
  560. agno/utils/load_env.py +0 -19
  561. agno/utils/py_io.py +0 -19
  562. agno/utils/pyproject.py +0 -18
  563. agno/utils/resource_filter.py +0 -31
  564. agno/workflow/v2/__init__.py +0 -21
  565. agno/workflow/v2/types.py +0 -357
  566. agno/workflow/v2/workflow.py +0 -3313
  567. agno/workspace/__init__.py +0 -0
  568. agno/workspace/config.py +0 -325
  569. agno/workspace/enums.py +0 -6
  570. agno/workspace/helpers.py +0 -52
  571. agno/workspace/operator.py +0 -757
  572. agno/workspace/settings.py +0 -158
  573. agno-1.8.2.dist-info/METADATA +0 -982
  574. agno-1.8.2.dist-info/RECORD +0 -566
  575. agno-1.8.2.dist-info/entry_points.txt +0 -3
  576. agno-1.8.2.dist-info/licenses/LICENSE +0 -375
  577. /agno/{app → db/migrations}/__init__.py +0 -0
  578. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  579. /agno/{cli → integrations}/__init__.py +0 -0
  580. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  581. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  582. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  583. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  584. /agno/{app → os/interfaces}/slack/security.py +0 -0
  585. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  586. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  587. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  588. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  589. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
@@ -7,8 +7,11 @@ from urllib.parse import urljoin, urlparse
7
7
 
8
8
  import httpx
9
9
 
10
- from agno.document.base import Document
11
- from agno.document.reader.base import Reader
10
+ from agno.knowledge.chunking.semantic import SemanticChunking
11
+ from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
12
+ from agno.knowledge.document.base import Document
13
+ from agno.knowledge.reader.base import Reader
14
+ from agno.knowledge.types import ContentType
12
15
  from agno.utils.log import log_debug, logger
13
16
 
14
17
  try:
@@ -28,9 +31,15 @@ class WebsiteReader(Reader):
28
31
  _urls_to_crawl: List[Tuple[str, int]] = field(default_factory=list)
29
32
 
30
33
  def __init__(
31
- self, max_depth: int = 3, max_links: int = 10, timeout: int = 10, proxy: Optional[str] = None, **kwargs
34
+ self,
35
+ chunking_strategy: Optional[ChunkingStrategy] = SemanticChunking(),
36
+ max_depth: int = 3,
37
+ max_links: int = 10,
38
+ timeout: int = 10,
39
+ proxy: Optional[str] = None,
40
+ **kwargs,
32
41
  ):
33
- super().__init__(**kwargs)
42
+ super().__init__(chunking_strategy=chunking_strategy, **kwargs)
34
43
  self.max_depth = max_depth
35
44
  self.max_links = max_links
36
45
  self.proxy = proxy
@@ -39,6 +48,21 @@ class WebsiteReader(Reader):
39
48
  self._visited = set()
40
49
  self._urls_to_crawl = []
41
50
 
51
+ @classmethod
52
+ def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
53
+ """Get the list of supported chunking strategies for Website readers."""
54
+ return [
55
+ ChunkingStrategyType.AGENTIC_CHUNKER,
56
+ ChunkingStrategyType.DOCUMENT_CHUNKER,
57
+ ChunkingStrategyType.RECURSIVE_CHUNKER,
58
+ ChunkingStrategyType.SEMANTIC_CHUNKER,
59
+ ChunkingStrategyType.FIXED_SIZE_CHUNKER,
60
+ ]
61
+
62
+ @classmethod
63
+ def get_supported_content_types(self) -> List[ContentType]:
64
+ return [ContentType.URL]
65
+
42
66
  def delay(self, min_seconds=1, max_seconds=3):
43
67
  """
44
68
  Introduce a random delay.
@@ -316,7 +340,7 @@ class WebsiteReader(Reader):
316
340
 
317
341
  return crawler_result
318
342
 
319
- def read(self, url: str) -> List[Document]:
343
+ def read(self, url: str, name: Optional[str] = None) -> List[Document]:
320
344
  """
321
345
  Reads a website and returns a list of documents.
322
346
 
@@ -338,7 +362,7 @@ class WebsiteReader(Reader):
338
362
  documents.extend(
339
363
  self.chunk_document(
340
364
  Document(
341
- name=url,
365
+ name=name or url,
342
366
  id=str(crawled_url),
343
367
  meta_data={"url": str(crawled_url)},
344
368
  content=crawled_content,
@@ -348,7 +372,7 @@ class WebsiteReader(Reader):
348
372
  else:
349
373
  documents.append(
350
374
  Document(
351
- name=url,
375
+ name=name or url,
352
376
  id=str(crawled_url),
353
377
  meta_data={"url": str(crawled_url)},
354
378
  content=crawled_content,
@@ -359,7 +383,7 @@ class WebsiteReader(Reader):
359
383
  logger.error(f"Error reading website {url}: {e}")
360
384
  raise
361
385
 
362
- async def async_read(self, url: str) -> List[Document]:
386
+ async def async_read(self, url: str, name: Optional[str] = None) -> List[Document]:
363
387
  """
364
388
  Asynchronously reads a website and returns a list of documents.
365
389
 
@@ -380,13 +404,16 @@ class WebsiteReader(Reader):
380
404
  async def process_document(crawled_url, crawled_content):
381
405
  if self.chunk:
382
406
  doc = Document(
383
- name=url, id=str(crawled_url), meta_data={"url": str(crawled_url)}, content=crawled_content
407
+ name=name or url,
408
+ id=str(crawled_url),
409
+ meta_data={"url": str(crawled_url)},
410
+ content=crawled_content,
384
411
  )
385
412
  return self.chunk_document(doc)
386
413
  else:
387
414
  return [
388
415
  Document(
389
- name=url,
416
+ name=name or url,
390
417
  id=str(crawled_url),
391
418
  meta_data={"url": str(crawled_url)},
392
419
  content=crawled_content,
@@ -0,0 +1,59 @@
1
+ from typing import List, Optional
2
+
3
+ from agno.knowledge.chunking.fixed import FixedSizeChunking
4
+ from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
5
+ from agno.knowledge.document import Document
6
+ from agno.knowledge.reader.base import Reader
7
+ from agno.knowledge.types import ContentType
8
+ from agno.utils.log import log_debug, log_info
9
+
10
+ try:
11
+ import wikipedia # noqa: F401
12
+ except ImportError:
13
+ raise ImportError("The `wikipedia` package is not installed. Please install it via `pip install wikipedia`.")
14
+
15
+
16
+ class WikipediaReader(Reader):
17
+ auto_suggest: bool = True
18
+
19
+ def __init__(
20
+ self, chunking_strategy: Optional[ChunkingStrategy] = FixedSizeChunking(), auto_suggest: bool = True, **kwargs
21
+ ):
22
+ super().__init__(chunking_strategy=chunking_strategy, **kwargs)
23
+ self.auto_suggest = auto_suggest
24
+
25
+ @classmethod
26
+ def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
27
+ """Get the list of supported chunking strategies for Wikipedia readers."""
28
+ return [
29
+ ChunkingStrategyType.FIXED_SIZE_CHUNKER,
30
+ ChunkingStrategyType.AGENTIC_CHUNKER,
31
+ ChunkingStrategyType.DOCUMENT_CHUNKER,
32
+ ChunkingStrategyType.RECURSIVE_CHUNKER,
33
+ ChunkingStrategyType.SEMANTIC_CHUNKER,
34
+ ]
35
+
36
+ @classmethod
37
+ def get_supported_content_types(self) -> List[ContentType]:
38
+ return [ContentType.TOPIC]
39
+
40
+ def read(self, topic: str) -> List[Document]:
41
+ log_debug(f"Reading Wikipedia topic: {topic}")
42
+ summary = None
43
+ try:
44
+ summary = wikipedia.summary(topic, auto_suggest=self.auto_suggest)
45
+
46
+ except wikipedia.exceptions.PageError:
47
+ summary = None
48
+ log_info("PageError: Page not found.")
49
+
50
+ # Only create Document if we successfully got a summary
51
+ if summary:
52
+ return [
53
+ Document(
54
+ name=topic,
55
+ meta_data={"topic": topic},
56
+ content=summary,
57
+ )
58
+ ]
59
+ return []
@@ -0,0 +1,78 @@
1
+ import asyncio
2
+ from typing import List, Optional
3
+
4
+ from agno.knowledge.chunking.recursive import RecursiveChunking
5
+ from agno.knowledge.chunking.strategy import ChunkingStrategy, ChunkingStrategyType
6
+ from agno.knowledge.document.base import Document
7
+ from agno.knowledge.reader.base import Reader
8
+ from agno.knowledge.types import ContentType
9
+ from agno.utils.log import log_debug, log_error, log_info
10
+
11
+ try:
12
+ from youtube_transcript_api import YouTubeTranscriptApi
13
+ except ImportError:
14
+ raise ImportError(
15
+ "`youtube_transcript_api` not installed. Please install it via `pip install youtube_transcript_api`."
16
+ )
17
+
18
+
19
+ class YouTubeReader(Reader):
20
+ """Reader for YouTube video transcripts"""
21
+
22
+ def __init__(self, chunking_strategy: Optional[ChunkingStrategy] = RecursiveChunking(), **kwargs):
23
+ super().__init__(chunking_strategy=chunking_strategy, **kwargs)
24
+
25
+ @classmethod
26
+ def get_supported_chunking_strategies(self) -> List[ChunkingStrategyType]:
27
+ """Get the list of supported chunking strategies for YouTube readers."""
28
+ return [
29
+ ChunkingStrategyType.RECURSIVE_CHUNKER,
30
+ ChunkingStrategyType.AGENTIC_CHUNKER,
31
+ ChunkingStrategyType.DOCUMENT_CHUNKER,
32
+ ChunkingStrategyType.SEMANTIC_CHUNKER,
33
+ ChunkingStrategyType.FIXED_SIZE_CHUNKER,
34
+ ]
35
+
36
+ @classmethod
37
+ def get_supported_content_types(self) -> List[ContentType]:
38
+ return [ContentType.YOUTUBE]
39
+
40
+ def read(self, url: str, name: Optional[str] = None) -> List[Document]:
41
+ try:
42
+ # Extract video ID from URL
43
+ video_id = url.split("v=")[-1].split("&")[0]
44
+ log_info(f"Reading transcript for video: {video_id}")
45
+
46
+ # Get transcript
47
+ log_debug(f"Fetching transcript for video: {video_id}")
48
+ # Create an instance of YouTubeTranscriptApi
49
+ ytt_api = YouTubeTranscriptApi()
50
+ transcript_data = ytt_api.fetch(video_id)
51
+
52
+ # Combine transcript segments into full text
53
+ transcript_text = ""
54
+ for segment in transcript_data:
55
+ transcript_text += f"{segment.text} "
56
+
57
+ documents = [
58
+ Document(
59
+ name=name or f"youtube_{video_id}",
60
+ id=f"youtube_{video_id}",
61
+ meta_data={"video_url": url, "video_id": video_id},
62
+ content=transcript_text.strip(),
63
+ )
64
+ ]
65
+
66
+ if self.chunk:
67
+ chunked_documents = []
68
+ for document in documents:
69
+ chunked_documents.extend(self.chunk_document(document))
70
+ return chunked_documents
71
+ return documents
72
+
73
+ except Exception as e:
74
+ log_error(f"Error reading transcript for {url}: {e}")
75
+ return []
76
+
77
+ async def async_read(self, url: str) -> List[Document]:
78
+ return await asyncio.get_event_loop().run_in_executor(None, self.read, url)
@@ -0,0 +1,88 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional, Union
3
+
4
+ from agno.cloud.aws.s3.bucket import S3Bucket
5
+ from agno.cloud.aws.s3.object import S3Object
6
+
7
+
8
+ @dataclass
9
+ class S3Content:
10
+ def __init__(
11
+ self,
12
+ bucket_name: Optional[str] = None,
13
+ bucket: Optional[S3Bucket] = None,
14
+ key: Optional[str] = None,
15
+ object: Optional[S3Object] = None,
16
+ prefix: Optional[str] = None,
17
+ ):
18
+ self.bucket_name = bucket_name
19
+ self.bucket = bucket
20
+ self.key = key
21
+ self.object = object
22
+ self.prefix = prefix
23
+
24
+ if bucket_name is None and bucket is None:
25
+ raise ValueError("Either bucket_name or bucket must be provided")
26
+ if key is None and object is None:
27
+ raise ValueError("Either key or object must be provided")
28
+ if bucket_name is not None and bucket is not None:
29
+ raise ValueError("Either bucket_name or bucket must be provided, not both")
30
+ if key is not None and object is not None:
31
+ raise ValueError("Either key or object must be provided, not both")
32
+
33
+ if self.bucket_name is not None:
34
+ self.bucket = S3Bucket(name=self.bucket_name)
35
+
36
+ def get_config(self):
37
+ return {
38
+ "bucket_name": self.bucket_name,
39
+ "bucket": self.bucket,
40
+ "key": self.key,
41
+ "object": self.object,
42
+ "prefix": self.prefix,
43
+ }
44
+
45
+
46
+ @dataclass
47
+ class GCSContent:
48
+ def __init__(
49
+ self,
50
+ bucket=None, # Type hint removed to avoid import issues
51
+ bucket_name: Optional[str] = None,
52
+ blob_name: Optional[str] = None,
53
+ prefix: Optional[str] = None,
54
+ ):
55
+ # Import Google Cloud Storage only when actually needed
56
+ try:
57
+ from google.cloud import storage # type: ignore
58
+ except ImportError:
59
+ raise ImportError(
60
+ "The `google-cloud-storage` package is not installed. Please install it via `pip install google-cloud-storage`."
61
+ )
62
+
63
+ self.bucket = bucket
64
+ self.bucket_name = bucket_name
65
+ self.blob_name = blob_name
66
+ self.prefix = prefix
67
+
68
+ if self.bucket is None and self.bucket_name is None:
69
+ raise ValueError("No bucket or bucket_name provided")
70
+ if self.bucket is not None and self.bucket_name is not None:
71
+ raise ValueError("Provide either bucket or bucket_name")
72
+ if self.blob_name is None and self.prefix is None:
73
+ raise ValueError("Either blob_name or prefix must be provided")
74
+
75
+ if self.bucket is None:
76
+ client = storage.Client()
77
+ self.bucket = client.bucket(self.bucket_name)
78
+
79
+ def get_config(self):
80
+ return {
81
+ "bucket": self.bucket,
82
+ "bucket_name": self.bucket_name,
83
+ "blob_name": self.blob_name,
84
+ "prefix": self.prefix,
85
+ }
86
+
87
+
88
+ RemoteContent = Union[S3Content, GCSContent]
@@ -2,7 +2,7 @@ from typing import List
2
2
 
3
3
  from pydantic import BaseModel, ConfigDict
4
4
 
5
- from agno.document import Document
5
+ from agno.knowledge.document import Document
6
6
 
7
7
 
8
8
  class Reranker(BaseModel):
@@ -1,7 +1,7 @@
1
1
  from typing import Any, Dict, List, Optional
2
2
 
3
- from agno.document import Document
4
- from agno.reranker.base import Reranker
3
+ from agno.knowledge.document import Document
4
+ from agno.knowledge.reranker.base import Reranker
5
5
  from agno.utils.log import logger
6
6
 
7
7
  try:
@@ -1,8 +1,8 @@
1
1
  from typing import Any, List, Optional
2
2
  from urllib.parse import urlparse
3
3
 
4
- from agno.document import Document
5
- from agno.reranker.base import Reranker
4
+ from agno.knowledge.document import Document
5
+ from agno.knowledge.reranker.base import Reranker
6
6
  from agno.utils.log import logger
7
7
 
8
8
  try:
@@ -1,7 +1,7 @@
1
1
  from typing import Any, Dict, List, Optional
2
2
 
3
- from agno.document import Document
4
- from agno.reranker.base import Reranker
3
+ from agno.knowledge.document import Document
4
+ from agno.knowledge.reranker.base import Reranker
5
5
  from agno.utils.log import logger
6
6
 
7
7
  try:
@@ -0,0 +1,30 @@
1
+ from enum import Enum
2
+
3
+
4
+ class ContentType(str, Enum):
5
+ """Enum for content types supported by knowledge readers."""
6
+
7
+ # Generic types
8
+ FILE = "file"
9
+ URL = "url"
10
+ TEXT = "text"
11
+ TOPIC = "topic"
12
+ YOUTUBE = "youtube"
13
+
14
+ # Document file extensions
15
+ PDF = ".pdf"
16
+ TXT = ".txt"
17
+ MARKDOWN = ".md"
18
+ DOCX = ".docx"
19
+ DOC = ".doc"
20
+ JSON = ".json"
21
+
22
+ # Spreadsheet file extensions
23
+ CSV = ".csv"
24
+ XLSX = ".xlsx"
25
+ XLS = ".xls"
26
+
27
+
28
+ def get_content_type_enum(content_type_str: str) -> ContentType:
29
+ """Convert a content type string to ContentType enum."""
30
+ return ContentType(content_type_str)
@@ -0,0 +1,169 @@
1
+ from typing import Dict, List
2
+
3
+ from agno.knowledge.reader.reader_factory import ReaderFactory
4
+ from agno.knowledge.types import ContentType
5
+ from agno.utils.log import log_debug
6
+
7
+
8
+ def _get_chunker_class(strategy_type):
9
+ """Get the chunker class for a given strategy type without instantiation."""
10
+ from agno.knowledge.chunking.strategy import ChunkingStrategyType
11
+
12
+ # Map strategy types to their corresponding classes
13
+ strategy_class_mapping = {
14
+ ChunkingStrategyType.AGENTIC_CHUNKER: lambda: _import_class(
15
+ "agno.knowledge.chunking.agentic", "AgenticChunking"
16
+ ),
17
+ ChunkingStrategyType.DOCUMENT_CHUNKER: lambda: _import_class(
18
+ "agno.knowledge.chunking.document", "DocumentChunking"
19
+ ),
20
+ ChunkingStrategyType.RECURSIVE_CHUNKER: lambda: _import_class(
21
+ "agno.knowledge.chunking.recursive", "RecursiveChunking"
22
+ ),
23
+ ChunkingStrategyType.SEMANTIC_CHUNKER: lambda: _import_class(
24
+ "agno.knowledge.chunking.semantic", "SemanticChunking"
25
+ ),
26
+ ChunkingStrategyType.FIXED_SIZE_CHUNKER: lambda: _import_class(
27
+ "agno.knowledge.chunking.fixed", "FixedSizeChunking"
28
+ ),
29
+ ChunkingStrategyType.ROW_CHUNKER: lambda: _import_class("agno.knowledge.chunking.row", "RowChunking"),
30
+ ChunkingStrategyType.MARKDOWN_CHUNKER: lambda: _import_class(
31
+ "agno.knowledge.chunking.markdown", "MarkdownChunking"
32
+ ),
33
+ }
34
+
35
+ if strategy_type not in strategy_class_mapping:
36
+ raise ValueError(f"Unknown strategy type: {strategy_type}")
37
+
38
+ return strategy_class_mapping[strategy_type]()
39
+
40
+
41
+ def _import_class(module_name: str, class_name: str):
42
+ """Dynamically import a class from a module."""
43
+ import importlib
44
+
45
+ module = importlib.import_module(module_name)
46
+ return getattr(module, class_name)
47
+
48
+
49
+ def get_reader_info(reader_key: str) -> Dict:
50
+ """Get information about a reader without instantiating it."""
51
+ # Try to create the reader to get its info, but don't cache it
52
+ try:
53
+ reader_factory_method = ReaderFactory._get_reader_method(reader_key)
54
+
55
+ # Create an instance to get the class, then call class methods
56
+ reader_instance = reader_factory_method()
57
+ reader_class = reader_instance.__class__
58
+
59
+ supported_strategies = reader_class.get_supported_chunking_strategies()
60
+ supported_content_types = reader_class.get_supported_content_types()
61
+
62
+ return {
63
+ "id": reader_key,
64
+ "name": "".join(word.capitalize() for word in reader_key.split("_")) + "Reader",
65
+ "description": reader_instance.description,
66
+ "chunking_strategies": [
67
+ strategy.value for strategy in supported_strategies
68
+ ], # Convert enums to string values
69
+ "content_types": [ct.value for ct in supported_content_types], # Convert enums to string values
70
+ }
71
+ except ImportError as e:
72
+ # Skip readers with missing dependencies
73
+ raise ValueError(f"Reader '{reader_key}' has missing dependencies: {str(e)}")
74
+ except Exception as e:
75
+ raise ValueError(f"Unknown reader: {reader_key}. Error: {str(e)}")
76
+
77
+
78
+ def get_all_readers_info() -> List[Dict]:
79
+ """Get information about all available readers."""
80
+ readers_info = []
81
+ keys = ReaderFactory.get_all_reader_keys()
82
+ for key in keys:
83
+ try:
84
+ reader_info = get_reader_info(key)
85
+ readers_info.append(reader_info)
86
+ except ValueError as e:
87
+ # Skip readers with missing dependencies or other issues
88
+ # Log the error but don't fail the entire request
89
+ log_debug(f"Skipping reader '{key}': {e}")
90
+ continue
91
+ return readers_info
92
+
93
+
94
+ def get_content_types_to_readers_mapping() -> Dict[str, List[str]]:
95
+ """Get mapping of content types to list of reader IDs that support them.
96
+
97
+ Returns:
98
+ Dictionary mapping content type strings (ContentType enum values) to list of reader IDs.
99
+ """
100
+ content_type_mapping: Dict[str, List[str]] = {}
101
+ readers_info = get_all_readers_info()
102
+
103
+ for reader_info in readers_info:
104
+ reader_id = reader_info["id"]
105
+ content_types = reader_info.get("content_types", [])
106
+
107
+ for content_type in content_types:
108
+ if content_type not in content_type_mapping:
109
+ content_type_mapping[content_type] = []
110
+ content_type_mapping[content_type].append(reader_id)
111
+
112
+ return content_type_mapping
113
+
114
+
115
+ def get_chunker_info(chunker_key: str) -> Dict:
116
+ """Get information about a chunker without instantiating it."""
117
+ try:
118
+ # Use chunking strategies directly
119
+ from agno.knowledge.chunking.strategy import ChunkingStrategyType
120
+
121
+ try:
122
+ # Use the chunker key directly as the strategy type value
123
+ strategy_type = ChunkingStrategyType.from_string(chunker_key)
124
+
125
+ # Get class directly without instantiation
126
+ chunker_class = _get_chunker_class(strategy_type)
127
+
128
+ # Extract class information
129
+ class_name = chunker_class.__name__
130
+ docstring = chunker_class.__doc__ or f"{class_name} chunking strategy"
131
+
132
+ return {
133
+ "key": chunker_key,
134
+ "class_name": class_name,
135
+ "name": chunker_key,
136
+ "description": docstring.strip(),
137
+ "strategy_type": strategy_type.value,
138
+ }
139
+ except ValueError:
140
+ raise ValueError(f"Unknown chunker key: {chunker_key}")
141
+
142
+ except ImportError as e:
143
+ # Skip chunkers with missing dependencies
144
+ raise ValueError(f"Chunker '{chunker_key}' has missing dependencies: {str(e)}")
145
+ except Exception as e:
146
+ raise ValueError(f"Unknown chunker: {chunker_key}. Error: {str(e)}")
147
+
148
+
149
+ def get_all_content_types() -> List[ContentType]:
150
+ """Get all available content types as ContentType enums."""
151
+ return list(ContentType)
152
+
153
+
154
+ def get_all_chunkers_info() -> List[Dict]:
155
+ """Get information about all available chunkers."""
156
+ chunkers_info = []
157
+
158
+ from agno.knowledge.chunking.strategy import ChunkingStrategyType
159
+
160
+ keys = [strategy_type.value for strategy_type in ChunkingStrategyType]
161
+
162
+ for key in keys:
163
+ try:
164
+ chunker_info = get_chunker_info(key)
165
+ chunkers_info.append(chunker_info)
166
+ except ValueError as e:
167
+ log_debug(f"Skipping chunker '{key}': {e}")
168
+ continue
169
+ return chunkers_info