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/constants.py DELETED
@@ -1,13 +0,0 @@
1
- PYTHONPATH_ENV_VAR: str = "PYTHONPATH"
2
- AGNO_RUNTIME_ENV_VAR: str = "AGNO_RUNTIME"
3
- AGNO_API_KEY_ENV_VAR: str = "AGNO_API_KEY"
4
-
5
- WORKSPACE_ID_ENV_VAR: str = "AGNO_WORKSPACE_ID"
6
- WORKSPACE_NAME_ENV_VAR: str = "AGNO_WORKSPACE_NAME"
7
- WORKSPACE_ROOT_ENV_VAR: str = "AGNO_WORKSPACE_ROOT"
8
- WORKSPACE_DIR_ENV_VAR: str = "AGNO_WORKSPACE_DIR"
9
- REQUIREMENTS_FILE_PATH_ENV_VAR: str = "REQUIREMENTS_FILE_PATH"
10
-
11
- AWS_REGION_ENV_VAR: str = "AWS_REGION"
12
- AWS_DEFAULT_REGION_ENV_VAR: str = "AWS_DEFAULT_REGION"
13
- AWS_PROFILE_ENV_VAR: str = "AWS_PROFILE"
agno/document/__init__.py DELETED
@@ -1 +0,0 @@
1
- from agno.document.base import Document
@@ -1,47 +0,0 @@
1
- from typing import List, Optional
2
-
3
- from agno.document.base import Document
4
- from agno.document.chunking.strategy import ChunkingStrategy
5
- from agno.embedder.base import Embedder
6
- from agno.embedder.openai import OpenAIEmbedder
7
-
8
- try:
9
- from chonkie import SemanticChunker
10
- except ImportError:
11
- raise ImportError("`chonkie` is required for semantic chunking, please install using `uv pip install chonkie`")
12
-
13
-
14
- class SemanticChunking(ChunkingStrategy):
15
- """Chunking strategy that splits text into semantic chunks using chonkie"""
16
-
17
- def __init__(
18
- self, embedder: Optional[Embedder] = None, chunk_size: int = 5000, similarity_threshold: Optional[float] = 0.5
19
- ):
20
- self.embedder = embedder or OpenAIEmbedder(id="text-embedding-3-small") # type: ignore
21
- self.chunk_size = chunk_size
22
- self.similarity_threshold = similarity_threshold
23
- self.chunker = SemanticChunker(
24
- embedding_model=self.embedder.model, # type: ignore
25
- chunk_size=self.chunk_size,
26
- threshold=self.similarity_threshold,
27
- )
28
-
29
- def chunk(self, document: Document) -> List[Document]:
30
- """Split document into semantic chunks using chokie"""
31
- if not document.content:
32
- return [document]
33
-
34
- # Use chonkie to split into semantic chunks
35
- chunks = self.chunker.chunk(self.clean_text(document.content))
36
-
37
- # Convert chunks to Documents
38
- chunked_documents: List[Document] = []
39
- for i, chunk in enumerate(chunks, 1):
40
- meta_data = document.meta_data.copy()
41
- meta_data["chunk"] = i
42
- chunk_id = f"{document.id}_{i}" if document.id else None
43
- meta_data["chunk_size"] = len(chunk.text)
44
-
45
- chunked_documents.append(Document(id=chunk_id, name=document.name, meta_data=meta_data, content=chunk.text))
46
-
47
- return chunked_documents
@@ -1,31 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- from typing import List
3
-
4
- from agno.document.base import Document
5
-
6
-
7
- class ChunkingStrategy(ABC):
8
- """Base class for chunking strategies"""
9
-
10
- @abstractmethod
11
- def chunk(self, document: Document) -> List[Document]:
12
- raise NotImplementedError
13
-
14
- def clean_text(self, text: str) -> str:
15
- """Clean the text by replacing multiple newlines with a single newline"""
16
- import re
17
-
18
- # Replace multiple newlines with a single newline
19
- cleaned_text = re.sub(r"\n+", "\n", text)
20
- # Replace multiple spaces with a single space
21
- cleaned_text = re.sub(r"\s+", " ", cleaned_text)
22
- # Replace multiple tabs with a single tab
23
- cleaned_text = re.sub(r"\t+", "\t", cleaned_text)
24
- # Replace multiple carriage returns with a single carriage return
25
- cleaned_text = re.sub(r"\r+", "\r", cleaned_text)
26
- # Replace multiple form feeds with a single form feed
27
- cleaned_text = re.sub(r"\f+", "\f", cleaned_text)
28
- # Replace multiple vertical tabs with a single vertical tab
29
- cleaned_text = re.sub(r"\v+", "\v", cleaned_text)
30
-
31
- return cleaned_text
@@ -1 +0,0 @@
1
- from agno.document.reader.base import Reader
@@ -1,41 +0,0 @@
1
- from typing import List
2
-
3
- from agno.document.base import Document
4
- from agno.document.reader.base import Reader
5
-
6
- try:
7
- import arxiv # noqa: F401
8
- except ImportError:
9
- raise ImportError("The `arxiv` package is not installed. Please install it via `pip install arxiv`.")
10
-
11
-
12
- class ArxivReader(Reader):
13
- max_results: int = 5 # Top articles
14
- sort_by: arxiv.SortCriterion = arxiv.SortCriterion.Relevance
15
-
16
- def read(self, query: str) -> List[Document]:
17
- """
18
- Search a query from arXiv database
19
-
20
- This function gets the top_k articles based on a user's query, sorted by relevance from arxiv
21
-
22
- @param query:
23
- @return: List of documents
24
- """
25
-
26
- documents = []
27
- search = arxiv.Search(query=query, max_results=self.max_results, sort_by=self.sort_by)
28
-
29
- for result in search.results():
30
- links = ", ".join([x.href for x in result.links])
31
-
32
- documents.append(
33
- Document(
34
- name=result.title,
35
- id=result.title,
36
- meta_data={"pdf_url": str(result.pdf_url), "article_links": links},
37
- content=result.summary,
38
- )
39
- )
40
-
41
- return documents
@@ -1,22 +0,0 @@
1
- from dataclasses import dataclass, field
2
- from typing import Any, List
3
-
4
- from agno.document.base import Document
5
- from agno.document.chunking.fixed import FixedSizeChunking
6
- from agno.document.chunking.strategy import ChunkingStrategy
7
-
8
-
9
- @dataclass
10
- class Reader:
11
- """Base class for reading documents"""
12
-
13
- chunk: bool = True
14
- chunk_size: int = 3000
15
- separators: List[str] = field(default_factory=lambda: ["\n", "\n\n", "\r", "\r\n", "\n\r", "\t", " ", " "])
16
- chunking_strategy: ChunkingStrategy = field(default_factory=FixedSizeChunking)
17
-
18
- def read(self, obj: Any) -> List[Document]:
19
- raise NotImplementedError
20
-
21
- def chunk_document(self, document: Document) -> List[Document]:
22
- return self.chunking_strategy.chunk(document)
@@ -1,84 +0,0 @@
1
- import csv
2
- import io
3
- import os
4
- from pathlib import Path
5
- from typing import IO, Any, List, Union
6
- from urllib.parse import urlparse
7
-
8
- from agno.document.base import Document
9
- from agno.document.reader.base import Reader
10
- from agno.utils.log import logger
11
-
12
-
13
- class CSVReader(Reader):
14
- """Reader for CSV files"""
15
-
16
- def read(self, file: Union[Path, IO[Any]], delimiter: str = ",", quotechar: str = '"') -> List[Document]:
17
- try:
18
- if isinstance(file, Path):
19
- if not file.exists():
20
- raise FileNotFoundError(f"Could not find file: {file}")
21
- logger.info(f"Reading: {file}")
22
- file_content = file.open(newline="", mode="r", encoding="utf-8")
23
- else:
24
- logger.info(f"Reading uploaded file: {file.name}")
25
- file.seek(0)
26
- file_content = io.StringIO(file.read().decode("utf-8")) # type: ignore
27
-
28
- csv_name = Path(file.name).stem if isinstance(file, Path) else file.name.split(".")[0]
29
- csv_content = ""
30
- with file_content as csvfile:
31
- csv_reader = csv.reader(csvfile, delimiter=delimiter, quotechar=quotechar)
32
- for row in csv_reader:
33
- csv_content += ", ".join(row) + "\n"
34
-
35
- documents = [
36
- Document(
37
- name=csv_name,
38
- id=csv_name,
39
- content=csv_content,
40
- )
41
- ]
42
- if self.chunk:
43
- chunked_documents = []
44
- for document in documents:
45
- chunked_documents.extend(self.chunk_document(document))
46
- return chunked_documents
47
- return documents
48
- except Exception as e:
49
- logger.error(f"Error reading: {file.name if isinstance(file, IO) else file}: {e}")
50
- return []
51
-
52
-
53
- class CSVUrlReader(Reader):
54
- """Reader for CSV files"""
55
-
56
- def read(self, url: str) -> List[Document]:
57
- if not url:
58
- raise ValueError("No URL provided")
59
-
60
- try:
61
- import httpx
62
- except ImportError:
63
- raise ImportError("`httpx` not installed")
64
-
65
- logger.info(f"Reading: {url}")
66
- response = httpx.get(url)
67
-
68
- try:
69
- response.raise_for_status()
70
- except httpx.HTTPStatusError as e:
71
- logger.error(f"HTTP error occurred: {e.response.status_code} - {e.response.text}")
72
- raise
73
-
74
- parsed_url = urlparse(url)
75
- filename = os.path.basename(parsed_url.path) or "data.csv"
76
-
77
- file_obj = io.BytesIO(response.content)
78
- file_obj.name = filename
79
-
80
- documents = CSVReader().read(file=file_obj)
81
-
82
- file_obj.close()
83
-
84
- return documents
@@ -1,46 +0,0 @@
1
- import io
2
- from pathlib import Path
3
- from typing import List, Union
4
-
5
- from agno.document.base import Document
6
- from agno.document.reader.base import Reader
7
- from agno.utils.log import logger
8
-
9
- try:
10
- from docx import Document as DocxDocument # type: ignore
11
- except ImportError:
12
- raise ImportError("The `python-docx` package is not installed. Please install it via `pip install python-docx`.")
13
-
14
-
15
- class DocxReader(Reader):
16
- """Reader for Doc/Docx files"""
17
-
18
- def read(self, file: Union[Path, io.BytesIO]) -> List[Document]:
19
- try:
20
- if isinstance(file, Path):
21
- logger.info(f"Reading: {file}")
22
- docx_document = DocxDocument(str(file))
23
- doc_name = file.stem
24
- else: # Handle file-like object from upload
25
- logger.info(f"Reading uploaded file: {file.name}")
26
- docx_document = DocxDocument(file)
27
- doc_name = file.name.split(".")[0]
28
-
29
- doc_content = "\n\n".join([para.text for para in docx_document.paragraphs])
30
-
31
- documents = [
32
- Document(
33
- name=doc_name,
34
- id=doc_name,
35
- content=doc_content,
36
- )
37
- ]
38
- if self.chunk:
39
- chunked_documents = []
40
- for document in documents:
41
- chunked_documents.extend(self.chunk_document(document))
42
- return chunked_documents
43
- return documents
44
- except Exception as e:
45
- logger.error(f"Error reading file: {e}")
46
- return []
@@ -1,99 +0,0 @@
1
- from dataclasses import dataclass
2
- from typing import Dict, List, Literal, Optional
3
-
4
- from agno.document.base import Document
5
- from agno.document.reader.base import Reader
6
- from agno.utils.log import logger
7
-
8
- try:
9
- from firecrawl import FirecrawlApp
10
- except ImportError:
11
- raise ImportError("The `firecrawl` package is not installed. Please install it via `pip install firecrawl-py`.")
12
-
13
-
14
- @dataclass
15
- class FirecrawlReader(Reader):
16
- api_key: Optional[str] = None
17
- params: Optional[Dict] = None
18
- mode: Literal["scrape", "crawl"] = "scrape"
19
-
20
- def scrape(self, url: str) -> List[Document]:
21
- """
22
- Scrapes a website and returns a list of documents.
23
-
24
- Args:
25
- url: The URL of the website to scrape
26
-
27
- Returns:
28
- A list of documents
29
- """
30
-
31
- logger.debug(f"Scraping: {url}")
32
-
33
- app = FirecrawlApp(api_key=self.api_key)
34
- scraped_data = app.scrape_url(url, params=self.params)
35
- # print(scraped_data)
36
- content = scraped_data.get("markdown", "")
37
-
38
- # Debug logging
39
- logger.debug(f"Received content type: {type(content)}")
40
- logger.debug(f"Content empty: {not bool(content)}")
41
-
42
- # Ensure content is a string
43
- if content is None:
44
- content = "" # or you could use metadata to create a meaningful message
45
- logger.warning(f"No content received for URL: {url}")
46
-
47
- documents = []
48
- if self.chunk and content: # Only chunk if there's content
49
- documents.extend(self.chunk_document(Document(name=url, id=url, content=content)))
50
- else:
51
- documents.append(Document(name=url, id=url, content=content))
52
- return documents
53
-
54
- def crawl(self, url: str) -> List[Document]:
55
- """
56
- Crawls a website and returns a list of documents.
57
-
58
- Args:
59
- url: The URL of the website to crawl
60
-
61
- Returns:
62
- A list of documents
63
- """
64
- logger.debug(f"Crawling: {url}")
65
-
66
- app = FirecrawlApp(api_key=self.api_key)
67
- crawl_result = app.crawl_url(url, params=self.params)
68
- documents = []
69
-
70
- # Extract data from crawl results
71
- results_data = crawl_result.get("data", [])
72
- for result in results_data:
73
- # Get markdown content, default to empty string if not found
74
- content = result.get("markdown", "")
75
-
76
- if content: # Only create document if content exists
77
- if self.chunk:
78
- documents.extend(self.chunk_document(Document(name=url, id=url, content=content)))
79
- else:
80
- documents.append(Document(name=url, id=url, content=content))
81
-
82
- return documents
83
-
84
- def read(self, url: str) -> List[Document]:
85
- """
86
-
87
- Args:
88
- url: The URL of the website to scrape
89
-
90
- Returns:
91
- A list of documents
92
- """
93
-
94
- if self.mode == "scrape":
95
- return self.scrape(url)
96
- elif self.mode == "crawl":
97
- return self.crawl(url)
98
- else:
99
- raise NotImplementedError(f"Mode {self.mode} not implemented")
@@ -1,43 +0,0 @@
1
- import json
2
- from pathlib import Path
3
- from typing import List
4
-
5
- from agno.document.base import Document
6
- from agno.document.reader.base import Reader
7
- from agno.utils.log import logger
8
-
9
-
10
- class JSONReader(Reader):
11
- """Reader for JSON files"""
12
-
13
- chunk: bool = False
14
-
15
- def read(self, path: Path) -> List[Document]:
16
- if not path.exists():
17
- raise FileNotFoundError(f"Could not find file: {path}")
18
-
19
- try:
20
- logger.info(f"Reading: {path}")
21
- json_name = path.name.split(".")[0]
22
- json_contents = json.loads(path.read_text("utf-8"))
23
-
24
- if isinstance(json_contents, dict):
25
- json_contents = [json_contents]
26
-
27
- documents = [
28
- Document(
29
- name=json_name,
30
- id=f"{json_name}_{page_number}",
31
- meta_data={"page": page_number},
32
- content=json.dumps(content),
33
- )
34
- for page_number, content in enumerate(json_contents, start=1)
35
- ]
36
- if self.chunk:
37
- chunked_documents = []
38
- for document in documents:
39
- chunked_documents.extend(self.chunk_document(document))
40
- return chunked_documents
41
- return documents
42
- except Exception:
43
- raise
@@ -1,219 +0,0 @@
1
- from pathlib import Path
2
- from typing import IO, Any, List, Union
3
-
4
- from agno.document.base import Document
5
- from agno.document.reader.base import Reader
6
- from agno.utils.log import logger
7
-
8
- try:
9
- from pypdf import PdfReader as DocumentReader # noqa: F401
10
- except ImportError:
11
- raise ImportError("`pypdf` not installed. Please install it via `pip install pypdf`.")
12
-
13
-
14
- class PDFReader(Reader):
15
- """Reader for PDF files"""
16
-
17
- def read(self, pdf: Union[str, Path, IO[Any]]) -> List[Document]:
18
- doc_name = ""
19
- try:
20
- if isinstance(pdf, str):
21
- doc_name = pdf.split("/")[-1].split(".")[0].replace(" ", "_")
22
- else:
23
- doc_name = pdf.name.split(".")[0]
24
- except Exception:
25
- doc_name = "pdf"
26
-
27
- logger.info(f"Reading: {doc_name}")
28
- doc_reader = DocumentReader(pdf)
29
-
30
- documents = [
31
- Document(
32
- name=doc_name,
33
- id=f"{doc_name}_{page_number}",
34
- meta_data={"page": page_number},
35
- content=page.extract_text(),
36
- )
37
- for page_number, page in enumerate(doc_reader.pages, start=1)
38
- ]
39
- if self.chunk:
40
- chunked_documents = []
41
- for document in documents:
42
- chunked_documents.extend(self.chunk_document(document))
43
- return chunked_documents
44
- return documents
45
-
46
-
47
- class PDFUrlReader(Reader):
48
- """Reader for PDF files from URL"""
49
-
50
- def read(self, url: str) -> List[Document]:
51
- if not url:
52
- raise ValueError("No url provided")
53
-
54
- from io import BytesIO
55
-
56
- try:
57
- import httpx
58
- except ImportError:
59
- raise ImportError("`httpx` not installed. Please install it via `pip install httpx`.")
60
-
61
- logger.info(f"Reading: {url}")
62
- response = httpx.get(url)
63
-
64
- try:
65
- response.raise_for_status()
66
- except httpx.HTTPStatusError as e:
67
- logger.error(f"HTTP error occurred: {e.response.status_code} - {e.response.text}")
68
- raise
69
-
70
- doc_name = url.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
71
- doc_reader = DocumentReader(BytesIO(response.content))
72
-
73
- documents = [
74
- Document(
75
- name=doc_name,
76
- id=f"{doc_name}_{page_number}",
77
- meta_data={"page": page_number},
78
- content=page.extract_text(),
79
- )
80
- for page_number, page in enumerate(doc_reader.pages, start=1)
81
- ]
82
- if self.chunk:
83
- chunked_documents = []
84
- for document in documents:
85
- chunked_documents.extend(self.chunk_document(document))
86
- return chunked_documents
87
- return documents
88
-
89
-
90
- class PDFImageReader(Reader):
91
- """Reader for PDF files with text and images extraction"""
92
-
93
- def read(self, pdf: Union[str, Path, IO[Any]]) -> List[Document]:
94
- if not pdf:
95
- raise ValueError("No pdf provided")
96
-
97
- try:
98
- import rapidocr_onnxruntime as rapidocr
99
- except ImportError:
100
- raise ImportError(
101
- "`rapidocr_onnxruntime` not installed. Please install it via `pip install rapidocr_onnxruntime`."
102
- )
103
-
104
- doc_name = ""
105
- try:
106
- if isinstance(pdf, str):
107
- doc_name = pdf.split("/")[-1].split(".")[0].replace(" ", "_")
108
- else:
109
- doc_name = pdf.name.split(".")[0]
110
- except Exception:
111
- doc_name = "pdf"
112
-
113
- logger.info(f"Reading: {doc_name}")
114
- doc_reader = DocumentReader(pdf)
115
-
116
- # Initialize RapidOCR
117
- ocr = rapidocr.RapidOCR()
118
-
119
- documents = []
120
- for page_number, page in enumerate(doc_reader.pages, start=1):
121
- page_text = page.extract_text() or ""
122
- images_text_list: List = []
123
-
124
- for image_object in page.images:
125
- image_data = image_object.data
126
-
127
- # Perform OCR on the image
128
- ocr_result, elapse = ocr(image_data)
129
-
130
- # Extract text from OCR result
131
- if ocr_result:
132
- images_text_list += [item[1] for item in ocr_result]
133
-
134
- images_text: str = "\n".join(images_text_list)
135
- content = page_text + "\n" + images_text
136
-
137
- documents.append(
138
- Document(
139
- name=doc_name,
140
- id=f"{doc_name}_{page_number}",
141
- meta_data={"page": page_number},
142
- content=content,
143
- )
144
- )
145
-
146
- if self.chunk:
147
- chunked_documents = []
148
- for document in documents:
149
- chunked_documents.extend(self.chunk_document(document))
150
- return chunked_documents
151
-
152
- return documents
153
-
154
-
155
- class PDFUrlImageReader(Reader):
156
- """Reader for PDF files from URL with text and images extraction"""
157
-
158
- def read(self, url: str) -> List[Document]:
159
- if not url:
160
- raise ValueError("No url provided")
161
-
162
- from io import BytesIO
163
-
164
- try:
165
- import httpx
166
- import rapidocr_onnxruntime as rapidocr
167
- except ImportError:
168
- raise ImportError(
169
- "`httpx`, `rapidocr_onnxruntime` not installed. Please install it via `pip install httpx rapidocr_onnxruntime`."
170
- )
171
-
172
- # Read the PDF from the URL
173
- logger.info(f"Reading: {url}")
174
- response = httpx.get(url)
175
-
176
- doc_name = url.split("/")[-1].split(".")[0].replace(" ", "_")
177
- doc_reader = DocumentReader(BytesIO(response.content))
178
-
179
- # Initialize RapidOCR
180
- ocr = rapidocr.RapidOCR()
181
-
182
- # Process each page of the PDF
183
- documents = []
184
- for page_number, page in enumerate(doc_reader.pages, start=1):
185
- page_text = page.extract_text() or ""
186
- images_text_list = []
187
-
188
- # Extract and process images
189
- for image_object in page.images:
190
- image_data = image_object.data
191
-
192
- # Perform OCR on the image
193
- ocr_result, elapse = ocr(image_data)
194
-
195
- # Extract text from OCR result
196
- if ocr_result:
197
- images_text_list += [item[1] for item in ocr_result]
198
-
199
- images_text = "\n".join(images_text_list)
200
- content = page_text + "\n" + images_text
201
-
202
- # Append the document
203
- documents.append(
204
- Document(
205
- name=doc_name,
206
- id=f"{doc_name}_{page_number}",
207
- meta_data={"page": page_number},
208
- content=content,
209
- )
210
- )
211
-
212
- # Optionally chunk documents
213
- if self.chunk:
214
- chunked_documents = []
215
- for document in documents:
216
- chunked_documents.extend(self.chunk_document(document))
217
- return chunked_documents
218
-
219
- return documents