agno 1.8.1__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 (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1416 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1551 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.dist-info → agno-2.0.0.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,5 +0,0 @@
1
- from agno.document.base import Document
2
-
3
- __all__ = [
4
- "Document",
5
- ]
@@ -1,45 +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 `pip install chonkie`")
12
-
13
-
14
- class SemanticChunking(ChunkingStrategy):
15
- """Chunking strategy that splits text into semantic chunks using chonkie"""
16
-
17
- def __init__(self, embedder: Optional[Embedder] = None, chunk_size: int = 5000, similarity_threshold: float = 0.5):
18
- self.embedder = embedder or OpenAIEmbedder(id="text-embedding-3-small") # type: ignore
19
- self.chunk_size = chunk_size
20
- self.similarity_threshold = similarity_threshold
21
- self.chunker = SemanticChunker(
22
- embedding_model=self.embedder.id, # type: ignore
23
- chunk_size=self.chunk_size,
24
- threshold=self.similarity_threshold,
25
- )
26
-
27
- def chunk(self, document: Document) -> List[Document]:
28
- """Split document into semantic chunks using chokie"""
29
- if not document.content:
30
- return [document]
31
-
32
- # Use chonkie to split into semantic chunks
33
- chunks = self.chunker.chunk(self.clean_text(document.content))
34
-
35
- # Convert chunks to Documents
36
- chunked_documents: List[Document] = []
37
- for i, chunk in enumerate(chunks, 1):
38
- meta_data = document.meta_data.copy()
39
- meta_data["chunk"] = i
40
- chunk_id = f"{document.id}_{i}" if document.id else None
41
- meta_data["chunk_size"] = len(chunk.text)
42
-
43
- chunked_documents.append(Document(id=chunk_id, name=document.name, meta_data=meta_data, content=chunk.text))
44
-
45
- 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,5 +0,0 @@
1
- from agno.document.reader.base import Reader
2
-
3
- __all__ = [
4
- "Reader",
5
- ]
@@ -1,47 +0,0 @@
1
- import asyncio
2
- from dataclasses import dataclass, field
3
- from typing import Any, List, Optional
4
-
5
- from agno.document.base import Document
6
- from agno.document.chunking.fixed import FixedSizeChunking
7
- from agno.document.chunking.strategy import ChunkingStrategy
8
-
9
-
10
- @dataclass
11
- class Reader:
12
- """Base class for reading documents"""
13
-
14
- chunk: bool = True
15
- chunk_size: int = 5000
16
- separators: List[str] = field(default_factory=lambda: ["\n", "\n\n", "\r", "\r\n", "\n\r", "\t", " ", " "])
17
- chunking_strategy: Optional[ChunkingStrategy] = None
18
-
19
- def read(self, obj: Any) -> List[Document]:
20
- raise NotImplementedError
21
-
22
- async def async_read(self, obj: Any) -> List[Document]:
23
- raise NotImplementedError
24
-
25
- def chunk_document(self, document: Document) -> List[Document]:
26
- if self.chunking_strategy is None:
27
- self.chunking_strategy = FixedSizeChunking(chunk_size=self.chunk_size)
28
- return self.chunking_strategy.chunk(document) # type: ignore
29
-
30
- async def chunk_documents_async(self, documents: List[Document]) -> List[Document]:
31
- """
32
- Asynchronously chunk a list of documents using the instance's chunk_document method.
33
-
34
- Args:
35
- documents: List of documents to be chunked.
36
-
37
- Returns:
38
- A flattened list of chunked documents.
39
- """
40
-
41
- async def _chunk_document_async(doc: Document) -> List[Document]:
42
- return await asyncio.to_thread(self.chunk_document, doc)
43
-
44
- # Process chunking in parallel for all documents
45
- chunked_lists = await asyncio.gather(*[_chunk_document_async(doc) for doc in documents])
46
- # Flatten the result
47
- return [chunk for sublist in chunked_lists for chunk in sublist]
@@ -1,60 +0,0 @@
1
- import asyncio
2
- from pathlib import Path
3
- from typing import IO, Any, List, Union
4
- from uuid import uuid4
5
-
6
- from agno.document.base import Document
7
- from agno.document.reader.base import Reader
8
- from agno.utils.log import log_info, logger
9
-
10
- try:
11
- from docx import Document as DocxDocument # type: ignore
12
- except ImportError:
13
- raise ImportError("The `python-docx` package is not installed. Please install it via `pip install python-docx`.")
14
-
15
-
16
- class DocxReader(Reader):
17
- """Reader for Doc/Docx files"""
18
-
19
- def read(self, file: Union[Path, IO[Any]]) -> List[Document]:
20
- """Read a docx file and return a list of documents"""
21
- try:
22
- if isinstance(file, Path):
23
- if not file.exists():
24
- raise FileNotFoundError(f"Could not find file: {file}")
25
- log_info(f"Reading: {file}")
26
- docx_document = DocxDocument(str(file))
27
- doc_name = file.stem
28
- else:
29
- log_info(f"Reading uploaded file: {file.name}")
30
- docx_document = DocxDocument(file)
31
- doc_name = file.name.split(".")[0]
32
-
33
- doc_content = "\n\n".join([para.text for para in docx_document.paragraphs])
34
-
35
- documents = [
36
- Document(
37
- name=doc_name,
38
- id=str(uuid4()),
39
- content=doc_content,
40
- )
41
- ]
42
-
43
- if self.chunk:
44
- chunked_documents = []
45
- for document in documents:
46
- chunked_documents.extend(self.chunk_document(document))
47
- return chunked_documents
48
- return documents
49
-
50
- except Exception as e:
51
- logger.error(f"Error reading file: {e}")
52
- return []
53
-
54
- async def async_read(self, file: Union[Path, IO[Any]]) -> List[Document]:
55
- """Asynchronously read a docx file and return a list of documents"""
56
- try:
57
- return await asyncio.to_thread(self.read, file)
58
- except Exception as e:
59
- logger.error(f"Error reading file asynchronously: {e}")
60
- return []
@@ -1,44 +0,0 @@
1
- import asyncio
2
- from io import BytesIO
3
- from typing import List
4
- from uuid import uuid4
5
-
6
- from agno.document.base import Document
7
- from agno.document.reader.base import Reader
8
- from agno.utils.log import log_info
9
-
10
- try:
11
- from google.cloud import storage
12
- except ImportError:
13
- raise ImportError("`google-cloud-storage` not installed. Please install it via `pip install google-cloud-storage`.")
14
-
15
- try:
16
- from pypdf import PdfReader as DocumentReader
17
- except ImportError:
18
- raise ImportError("`pypdf` not installed. Please install it via `pip install pypdf`.")
19
-
20
-
21
- class GCSPDFReader(Reader):
22
- def read(self, blob: storage.Blob) -> List[Document]:
23
- log_info(f"Reading: gs://{blob.bucket.name}/{blob.name}")
24
- data = blob.download_as_bytes()
25
- doc_name = blob.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
26
- doc_reader = DocumentReader(BytesIO(data))
27
- documents = [
28
- Document(
29
- name=doc_name,
30
- id=str(uuid4()),
31
- meta_data={"page": page_number},
32
- content=page.extract_text(),
33
- )
34
- for page_number, page in enumerate(doc_reader.pages, 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
-
43
- async def async_read(self, blob: storage.Blob) -> List[Document]:
44
- return await asyncio.to_thread(self.read, blob)
@@ -1,59 +0,0 @@
1
- import asyncio
2
- from io import BytesIO
3
- from typing import List
4
- from uuid import uuid4
5
-
6
- from agno.document.base import Document
7
- from agno.document.reader.base import Reader
8
- from agno.utils.log import log_info
9
-
10
- try:
11
- from agno.aws.resource.s3.object import S3Object # type: ignore
12
- except (ModuleNotFoundError, ImportError):
13
- raise ImportError("`agno-aws` not installed. Please install using `pip install agno-aws`")
14
-
15
- try:
16
- from pypdf import PdfReader as DocumentReader # noqa: F401
17
- except ImportError:
18
- raise ImportError("`pypdf` not installed. Please install it via `pip install pypdf`.")
19
-
20
-
21
- class S3PDFReader(Reader):
22
- """Reader for PDF files on S3"""
23
-
24
- def read(self, s3_object: S3Object) -> List[Document]:
25
- try:
26
- log_info(f"Reading: {s3_object.uri}")
27
-
28
- object_resource = s3_object.get_resource()
29
- object_body = object_resource.get()["Body"]
30
- doc_name = s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
31
- doc_reader = DocumentReader(BytesIO(object_body.read()))
32
- documents = [
33
- Document(
34
- name=doc_name,
35
- id=str(uuid4()),
36
- meta_data={"page": page_number},
37
- content=page.extract_text(),
38
- )
39
- for page_number, page in enumerate(doc_reader.pages, start=1)
40
- ]
41
- if self.chunk:
42
- chunked_documents = []
43
- for document in documents:
44
- chunked_documents.extend(self.chunk_document(document))
45
- return chunked_documents
46
- return documents
47
- except Exception:
48
- raise
49
-
50
- async def async_read(self, s3_object: S3Object) -> List[Document]:
51
- """Asynchronously read PDF files from S3 by running the synchronous read operation in a thread.
52
-
53
- Args:
54
- s3_object (S3Object): The S3 object to read
55
-
56
- Returns:
57
- List[Document]: List of documents from the PDF file
58
- """
59
- return await asyncio.to_thread(self.read, s3_object)
@@ -1,63 +0,0 @@
1
- import asyncio
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 log_debug, log_info, logger
8
-
9
- try:
10
- from agno.aws.resource.s3.object import S3Object # type: ignore
11
- except (ModuleNotFoundError, ImportError):
12
- raise ImportError("`agno-aws` not installed. Please install using `pip install agno-aws`")
13
-
14
- try:
15
- import textract # noqa: F401
16
- except ImportError:
17
- raise ImportError("`textract` not installed. Please install it via `pip install textract`.")
18
-
19
-
20
- class S3TextReader(Reader):
21
- """Reader for text files on S3"""
22
-
23
- def read(self, s3_object: S3Object) -> List[Document]:
24
- try:
25
- log_info(f"Reading: {s3_object.uri}")
26
-
27
- obj_name = s3_object.name.split("/")[-1]
28
- temporary_file = Path("storage").joinpath(obj_name)
29
- s3_object.download(temporary_file)
30
-
31
- log_info(f"Parsing: {temporary_file}")
32
- doc_name = s3_object.name.split("/")[-1].split(".")[0].replace("/", "_").replace(" ", "_")
33
- doc_content = textract.process(temporary_file)
34
- documents = [
35
- Document(
36
- name=doc_name,
37
- id=doc_name,
38
- content=doc_content.decode("utf-8"),
39
- )
40
- ]
41
- if self.chunk:
42
- chunked_documents = []
43
- for document in documents:
44
- chunked_documents.extend(self.chunk_document(document))
45
- return chunked_documents
46
-
47
- log_debug(f"Deleting: {temporary_file}")
48
- temporary_file.unlink()
49
- return documents
50
- except Exception as e:
51
- logger.error(f"Error reading: {s3_object.uri}: {e}")
52
- return []
53
-
54
- async def async_read(self, s3_object: S3Object) -> List[Document]:
55
- """Asynchronously read text files from S3 by running the synchronous read operation in a thread.
56
-
57
- Args:
58
- s3_object (S3Object): The S3 object to read
59
-
60
- Returns:
61
- List[Document]: List of documents from the text file
62
- """
63
- return await asyncio.to_thread(self.read, s3_object)
@@ -1,59 +0,0 @@
1
- from typing import List, Optional
2
- from urllib.parse import urlparse
3
-
4
- import httpx
5
-
6
- from agno.document.base import Document
7
- from agno.document.reader.base import Reader
8
- from agno.utils.http import async_fetch_with_retry, fetch_with_retry
9
- from agno.utils.log import log_debug
10
-
11
-
12
- class URLReader(Reader):
13
- """Reader for general URL content"""
14
-
15
- def __init__(self, proxy: Optional[str] = None, **kwargs):
16
- super().__init__(**kwargs)
17
- self.proxy = proxy
18
-
19
- def read(self, url: str) -> List[Document]:
20
- if not url:
21
- raise ValueError("No url provided")
22
-
23
- log_debug(f"Reading: {url}")
24
- # Retry the request up to 3 times with exponential backoff
25
- response = fetch_with_retry(url, proxy=self.proxy)
26
-
27
- document = self._create_document(url, response.text)
28
- if self.chunk:
29
- return self.chunk_document(document)
30
- return [document]
31
-
32
- async def async_read(self, url: str) -> List[Document]:
33
- """Async version of read method"""
34
- if not url:
35
- raise ValueError("No url provided")
36
-
37
- log_debug(f"Reading async: {url}")
38
- client_args = {"proxy": self.proxy} if self.proxy else {}
39
- async with httpx.AsyncClient(**client_args) as client: # type: ignore
40
- response = await async_fetch_with_retry(url, client=client)
41
-
42
- document = self._create_document(url, response.text)
43
- if self.chunk:
44
- return await self.chunk_documents_async([document])
45
- return [document]
46
-
47
- def _create_document(self, url: str, content: str) -> Document:
48
- """Helper method to create a document from URL content"""
49
- parsed_url = urlparse(url)
50
- doc_name = parsed_url.path.strip("/").replace("/", "_").replace(" ", "_")
51
- if not doc_name:
52
- doc_name = parsed_url.netloc
53
-
54
- return Document(
55
- name=doc_name,
56
- id=doc_name,
57
- meta_data={"url": url},
58
- content=content,
59
- )
@@ -1,58 +0,0 @@
1
- import asyncio
2
- from typing import List
3
-
4
- from agno.document.base import Document
5
- from agno.document.reader.base import Reader
6
- from agno.utils.log import log_debug, log_info, logger
7
-
8
- try:
9
- from youtube_transcript_api import YouTubeTranscriptApi
10
- except ImportError:
11
- raise ImportError(
12
- "`youtube_transcript_api` not installed. Please install it via `pip install youtube_transcript_api`."
13
- )
14
-
15
-
16
- class YouTubeReader(Reader):
17
- """Reader for YouTube video transcripts"""
18
-
19
- def read(self, video_url: str) -> List[Document]:
20
- try:
21
- # Extract video ID from URL
22
- video_id = video_url.split("v=")[-1].split("&")[0]
23
- log_info(f"Reading transcript for video: {video_id}")
24
-
25
- # Get transcript
26
- log_debug(f"Fetching transcript for video: {video_id}")
27
- # Create an instance of YouTubeTranscriptApi
28
- ytt_api = YouTubeTranscriptApi()
29
- transcript_data = ytt_api.fetch(video_id)
30
-
31
- # Combine transcript segments into full text
32
- transcript_text = ""
33
-
34
- for segment in transcript_data:
35
- transcript_text += f"{segment.text} "
36
-
37
- documents = [
38
- Document(
39
- name=f"youtube_{video_id}",
40
- id=f"youtube_{video_id}",
41
- meta_data={"video_url": video_url, "video_id": video_id},
42
- content=transcript_text.strip(),
43
- )
44
- ]
45
-
46
- if self.chunk:
47
- chunked_documents = []
48
- for document in documents:
49
- chunked_documents.extend(self.chunk_document(document))
50
- return chunked_documents
51
- return documents
52
-
53
- except Exception as e:
54
- logger.error(f"Error reading transcript for {video_url}: {e}")
55
- return []
56
-
57
- async def async_read(self, video_url: str) -> List[Document]:
58
- return await asyncio.get_event_loop().run_in_executor(None, self.read, video_url)
agno/embedder/__init__.py DELETED
@@ -1,5 +0,0 @@
1
- from agno.embedder.base import Embedder
2
-
3
- __all__ = [
4
- "Embedder",
5
- ]
agno/embedder/langdb.py DELETED
@@ -1,80 +0,0 @@
1
- from os import getenv
2
- from typing import Any, Dict, List, Optional, Tuple
3
-
4
- from typing_extensions import Literal
5
-
6
- from agno.embedder.base import Embedder
7
- from agno.utils.log import logger
8
-
9
- try:
10
- from openai import OpenAI as OpenAIClient
11
- from openai.types.create_embedding_response import CreateEmbeddingResponse
12
- except ImportError:
13
- raise ImportError("`openai` not installed")
14
-
15
-
16
- class LangDBEmbedder(Embedder):
17
- model: str = "text-embedding-ada-002"
18
- dimensions: int = 1536
19
- encoding_format: Literal["float", "base64"] = "float"
20
- user: Optional[str] = None
21
- api_key: Optional[str] = getenv("LANGDB_API_KEY")
22
- project_id: Optional[str] = getenv("LANGDB_PROJECT_ID")
23
- organization: Optional[str] = None
24
- base_url: Optional[str] = None
25
- request_params: Optional[Dict[str, Any]] = None
26
- client_params: Optional[Dict[str, Any]] = None
27
- openai_client: Optional[OpenAIClient] = None
28
-
29
- @property
30
- def client(self) -> OpenAIClient:
31
- if self.openai_client:
32
- return self.openai_client
33
-
34
- if not self.project_id:
35
- raise ValueError("LANGDB_PROJECT_ID not set in the environment")
36
-
37
- _client_params: Dict[str, Any] = {}
38
- if self.api_key:
39
- _client_params["api_key"] = self.api_key
40
- if self.organization:
41
- _client_params["organization"] = self.organization
42
-
43
- if not self.base_url:
44
- self.base_url = f"https://api.us-east-1.langdb.ai/{self.project_id}/v1"
45
- _client_params["base_url"] = self.base_url
46
-
47
- if self.client_params:
48
- _client_params.update(self.client_params)
49
- return OpenAIClient(**_client_params)
50
-
51
- def response(self, text: str) -> CreateEmbeddingResponse:
52
- _request_params: Dict[str, Any] = {
53
- "input": text,
54
- "model": self.model,
55
- "encoding_format": self.encoding_format,
56
- }
57
- if self.user is not None:
58
- _request_params["user"] = self.user
59
- if self.model.startswith("text-embedding-3"):
60
- _request_params["dimensions"] = self.dimensions
61
- if self.request_params:
62
- _request_params.update(self.request_params)
63
- return self.client.embeddings.create(**_request_params)
64
-
65
- def get_embedding(self, text: str) -> List[float]:
66
- response: CreateEmbeddingResponse = self.response(text=text)
67
- try:
68
- return response.data[0].embedding
69
- except Exception as e:
70
- logger.warning(e)
71
- return []
72
-
73
- def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
74
- response: CreateEmbeddingResponse = self.response(text=text)
75
-
76
- embedding = response.data[0].embedding
77
- usage = response.usage
78
- if usage:
79
- return embedding, usage.model_dump()
80
- return embedding, None
agno/embedder/mistral.py DELETED
@@ -1,82 +0,0 @@
1
- from dataclasses import dataclass
2
- from os import getenv
3
- from typing import Any, Dict, List, Optional, Tuple
4
-
5
- from agno.embedder.base import Embedder
6
- from agno.utils.log import logger
7
-
8
- try:
9
- from mistralai import Mistral
10
- from mistralai.models.embeddingresponse import EmbeddingResponse
11
- except ImportError:
12
- raise ImportError("`mistralai` not installed")
13
-
14
-
15
- @dataclass
16
- class MistralEmbedder(Embedder):
17
- id: str = "mistral-embed"
18
- dimensions: int = 1024
19
- # -*- Request parameters
20
- request_params: Optional[Dict[str, Any]] = None
21
- # -*- Client parameters
22
- api_key: Optional[str] = getenv("MISTRAL_API_KEY")
23
- endpoint: Optional[str] = None
24
- max_retries: Optional[int] = None
25
- timeout: Optional[int] = None
26
- client_params: Optional[Dict[str, Any]] = None
27
- # -*- Provide the Mistral Client manually
28
- mistral_client: Optional[Mistral] = None
29
-
30
- @property
31
- def client(self) -> Mistral:
32
- if self.mistral_client:
33
- return self.mistral_client
34
-
35
- _client_params: Dict[str, Any] = {
36
- "api_key": self.api_key,
37
- "endpoint": self.endpoint,
38
- "max_retries": self.max_retries,
39
- "timeout": self.timeout,
40
- }
41
- _client_params = {k: v for k, v in _client_params.items() if v is not None}
42
-
43
- if self.client_params:
44
- _client_params.update(self.client_params)
45
-
46
- self.mistral_client = Mistral(**_client_params)
47
-
48
- return self.mistral_client
49
-
50
- def _response(self, text: str) -> EmbeddingResponse:
51
- _request_params: Dict[str, Any] = {
52
- "inputs": text,
53
- "model": self.id,
54
- }
55
- if self.request_params:
56
- _request_params.update(self.request_params)
57
- response = self.client.embeddings.create(**_request_params)
58
- if response is None:
59
- raise ValueError("Failed to get embedding response")
60
- return response
61
-
62
- def get_embedding(self, text: str) -> List[float]:
63
- try:
64
- response: EmbeddingResponse = self._response(text=text)
65
- if response.data and response.data[0].embedding:
66
- return response.data[0].embedding
67
- return []
68
- except Exception as e:
69
- logger.warning(f"Error getting embedding: {e}")
70
- return []
71
-
72
- def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Dict[str, Any]]:
73
- try:
74
- response: EmbeddingResponse = self._response(text=text)
75
- embedding: List[float] = (
76
- response.data[0].embedding if (response.data and response.data[0].embedding) else []
77
- )
78
- usage: Dict[str, Any] = response.usage.model_dump() if response.usage else {}
79
- return embedding, usage
80
- except Exception as e:
81
- logger.warning(f"Error getting embedding and usage: {e}")
82
- return [], {}