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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. agno/agent/__init__.py +19 -27
  2. agno/agent/agent.py +3143 -4170
  3. agno/api/agent.py +11 -67
  4. agno/api/api.py +5 -46
  5. agno/api/evals.py +8 -19
  6. agno/api/os.py +17 -0
  7. agno/api/routes.py +6 -41
  8. agno/api/schemas/__init__.py +9 -0
  9. agno/api/schemas/agent.py +5 -21
  10. agno/api/schemas/evals.py +7 -16
  11. agno/api/schemas/os.py +14 -0
  12. agno/api/schemas/team.py +5 -21
  13. agno/api/schemas/utils.py +21 -0
  14. agno/api/schemas/workflows.py +11 -7
  15. agno/api/settings.py +53 -0
  16. agno/api/team.py +11 -66
  17. agno/api/workflow.py +28 -0
  18. agno/cloud/aws/base.py +214 -0
  19. agno/cloud/aws/s3/__init__.py +2 -0
  20. agno/cloud/aws/s3/api_client.py +43 -0
  21. agno/cloud/aws/s3/bucket.py +195 -0
  22. agno/cloud/aws/s3/object.py +57 -0
  23. agno/db/__init__.py +24 -0
  24. agno/db/base.py +245 -0
  25. agno/db/dynamo/__init__.py +3 -0
  26. agno/db/dynamo/dynamo.py +1743 -0
  27. agno/db/dynamo/schemas.py +278 -0
  28. agno/db/dynamo/utils.py +684 -0
  29. agno/db/firestore/__init__.py +3 -0
  30. agno/db/firestore/firestore.py +1432 -0
  31. agno/db/firestore/schemas.py +130 -0
  32. agno/db/firestore/utils.py +278 -0
  33. agno/db/gcs_json/__init__.py +3 -0
  34. agno/db/gcs_json/gcs_json_db.py +1001 -0
  35. agno/db/gcs_json/utils.py +194 -0
  36. agno/db/in_memory/__init__.py +3 -0
  37. agno/db/in_memory/in_memory_db.py +882 -0
  38. agno/db/in_memory/utils.py +172 -0
  39. agno/db/json/__init__.py +3 -0
  40. agno/db/json/json_db.py +1045 -0
  41. agno/db/json/utils.py +196 -0
  42. agno/db/migrations/v1_to_v2.py +162 -0
  43. agno/db/mongo/__init__.py +3 -0
  44. agno/db/mongo/mongo.py +1416 -0
  45. agno/db/mongo/schemas.py +77 -0
  46. agno/db/mongo/utils.py +204 -0
  47. agno/db/mysql/__init__.py +3 -0
  48. agno/db/mysql/mysql.py +1719 -0
  49. agno/db/mysql/schemas.py +124 -0
  50. agno/db/mysql/utils.py +297 -0
  51. agno/db/postgres/__init__.py +3 -0
  52. agno/db/postgres/postgres.py +1710 -0
  53. agno/db/postgres/schemas.py +124 -0
  54. agno/db/postgres/utils.py +280 -0
  55. agno/db/redis/__init__.py +3 -0
  56. agno/db/redis/redis.py +1367 -0
  57. agno/db/redis/schemas.py +109 -0
  58. agno/db/redis/utils.py +288 -0
  59. agno/db/schemas/__init__.py +3 -0
  60. agno/db/schemas/evals.py +33 -0
  61. agno/db/schemas/knowledge.py +40 -0
  62. agno/db/schemas/memory.py +46 -0
  63. agno/db/singlestore/__init__.py +3 -0
  64. agno/db/singlestore/schemas.py +116 -0
  65. agno/db/singlestore/singlestore.py +1712 -0
  66. agno/db/singlestore/utils.py +326 -0
  67. agno/db/sqlite/__init__.py +3 -0
  68. agno/db/sqlite/schemas.py +119 -0
  69. agno/db/sqlite/sqlite.py +1676 -0
  70. agno/db/sqlite/utils.py +268 -0
  71. agno/db/utils.py +88 -0
  72. agno/eval/__init__.py +14 -0
  73. agno/eval/accuracy.py +154 -48
  74. agno/eval/performance.py +88 -23
  75. agno/eval/reliability.py +73 -20
  76. agno/eval/utils.py +23 -13
  77. agno/integrations/discord/__init__.py +3 -0
  78. agno/{app → integrations}/discord/client.py +10 -10
  79. agno/knowledge/__init__.py +2 -2
  80. agno/{document → knowledge}/chunking/agentic.py +2 -2
  81. agno/{document → knowledge}/chunking/document.py +2 -2
  82. agno/{document → knowledge}/chunking/fixed.py +3 -3
  83. agno/{document → knowledge}/chunking/markdown.py +2 -2
  84. agno/{document → knowledge}/chunking/recursive.py +2 -2
  85. agno/{document → knowledge}/chunking/row.py +2 -2
  86. agno/knowledge/chunking/semantic.py +59 -0
  87. agno/knowledge/chunking/strategy.py +121 -0
  88. agno/knowledge/content.py +74 -0
  89. agno/knowledge/document/__init__.py +5 -0
  90. agno/{document → knowledge/document}/base.py +12 -2
  91. agno/knowledge/embedder/__init__.py +5 -0
  92. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  93. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  94. agno/{embedder → knowledge/embedder}/base.py +6 -0
  95. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  96. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  97. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  98. agno/{embedder → knowledge/embedder}/google.py +74 -1
  99. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  100. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  101. agno/knowledge/embedder/langdb.py +22 -0
  102. agno/knowledge/embedder/mistral.py +139 -0
  103. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  104. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  105. agno/knowledge/embedder/openai.py +223 -0
  106. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  107. agno/{embedder → knowledge/embedder}/together.py +1 -1
  108. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  109. agno/knowledge/knowledge.py +1551 -0
  110. agno/knowledge/reader/__init__.py +7 -0
  111. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  112. agno/knowledge/reader/base.py +88 -0
  113. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  114. agno/knowledge/reader/docx_reader.py +83 -0
  115. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  116. agno/{document → knowledge}/reader/json_reader.py +30 -9
  117. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  118. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  119. agno/knowledge/reader/reader_factory.py +268 -0
  120. agno/knowledge/reader/s3_reader.py +101 -0
  121. agno/{document → knowledge}/reader/text_reader.py +31 -10
  122. agno/knowledge/reader/url_reader.py +128 -0
  123. agno/knowledge/reader/web_search_reader.py +366 -0
  124. agno/{document → knowledge}/reader/website_reader.py +37 -10
  125. agno/knowledge/reader/wikipedia_reader.py +59 -0
  126. agno/knowledge/reader/youtube_reader.py +78 -0
  127. agno/knowledge/remote_content/remote_content.py +88 -0
  128. agno/{reranker → knowledge/reranker}/base.py +1 -1
  129. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  130. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  131. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  132. agno/knowledge/types.py +30 -0
  133. agno/knowledge/utils.py +169 -0
  134. agno/media.py +269 -268
  135. agno/memory/__init__.py +2 -10
  136. agno/memory/manager.py +1003 -148
  137. agno/models/aimlapi/__init__.py +2 -2
  138. agno/models/aimlapi/aimlapi.py +6 -6
  139. agno/models/anthropic/claude.py +128 -72
  140. agno/models/aws/bedrock.py +107 -175
  141. agno/models/aws/claude.py +64 -18
  142. agno/models/azure/ai_foundry.py +73 -23
  143. agno/models/base.py +346 -290
  144. agno/models/cerebras/cerebras.py +84 -27
  145. agno/models/cohere/chat.py +106 -98
  146. agno/models/google/gemini.py +105 -46
  147. agno/models/groq/groq.py +97 -35
  148. agno/models/huggingface/huggingface.py +92 -27
  149. agno/models/ibm/watsonx.py +72 -13
  150. agno/models/litellm/chat.py +85 -13
  151. agno/models/message.py +46 -151
  152. agno/models/meta/llama.py +85 -49
  153. agno/models/metrics.py +120 -0
  154. agno/models/mistral/mistral.py +90 -21
  155. agno/models/ollama/__init__.py +0 -2
  156. agno/models/ollama/chat.py +85 -47
  157. agno/models/openai/chat.py +154 -37
  158. agno/models/openai/responses.py +178 -105
  159. agno/models/perplexity/perplexity.py +26 -2
  160. agno/models/portkey/portkey.py +0 -7
  161. agno/models/response.py +15 -9
  162. agno/models/utils.py +20 -0
  163. agno/models/vercel/__init__.py +2 -2
  164. agno/models/vercel/v0.py +1 -1
  165. agno/models/vllm/__init__.py +2 -2
  166. agno/models/vllm/vllm.py +3 -3
  167. agno/models/xai/xai.py +10 -10
  168. agno/os/__init__.py +3 -0
  169. agno/os/app.py +497 -0
  170. agno/os/auth.py +47 -0
  171. agno/os/config.py +103 -0
  172. agno/os/interfaces/agui/__init__.py +3 -0
  173. agno/os/interfaces/agui/agui.py +31 -0
  174. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  175. agno/{app → os/interfaces}/agui/utils.py +65 -28
  176. agno/os/interfaces/base.py +21 -0
  177. agno/os/interfaces/slack/__init__.py +3 -0
  178. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  179. agno/os/interfaces/slack/slack.py +32 -0
  180. agno/os/interfaces/whatsapp/__init__.py +3 -0
  181. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  182. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  183. agno/os/mcp.py +235 -0
  184. agno/os/router.py +1400 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +393 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +850 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +410 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +178 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +536 -0
  201. agno/os/schema.py +945 -0
  202. agno/{app/playground → os}/settings.py +7 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/agent.py +633 -0
  212. agno/run/base.py +53 -77
  213. agno/run/cancel.py +81 -0
  214. agno/run/team.py +243 -96
  215. agno/run/workflow.py +550 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +3260 -4824
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +43 -23
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +20 -17
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +22 -12
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +17 -8
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +62 -62
  252. agno/tools/eleven_labs.py +36 -29
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +30 -30
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +17 -18
  260. agno/tools/function.py +127 -18
  261. agno/tools/giphy.py +23 -11
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +32 -20
  276. agno/tools/mcp.py +1 -2
  277. agno/tools/mem0.py +18 -12
  278. agno/tools/memori.py +14 -10
  279. agno/tools/mlx_transcribe.py +3 -2
  280. agno/tools/models/azure_openai.py +33 -15
  281. agno/tools/models/gemini.py +59 -32
  282. agno/tools/models/groq.py +30 -23
  283. agno/tools/models/nebius.py +28 -12
  284. agno/tools/models_labs.py +40 -16
  285. agno/tools/moviepy_video.py +7 -6
  286. agno/tools/neo4j.py +10 -8
  287. agno/tools/newspaper.py +7 -2
  288. agno/tools/newspaper4k.py +8 -3
  289. agno/tools/openai.py +58 -32
  290. agno/tools/openbb.py +12 -11
  291. agno/tools/opencv.py +63 -47
  292. agno/tools/openweather.py +14 -12
  293. agno/tools/pandas.py +11 -3
  294. agno/tools/postgres.py +4 -12
  295. agno/tools/pubmed.py +4 -1
  296. agno/tools/python.py +9 -22
  297. agno/tools/reasoning.py +35 -27
  298. agno/tools/reddit.py +11 -26
  299. agno/tools/replicate.py +55 -42
  300. agno/tools/resend.py +4 -1
  301. agno/tools/scrapegraph.py +15 -14
  302. agno/tools/searxng.py +10 -23
  303. agno/tools/serpapi.py +6 -3
  304. agno/tools/serper.py +13 -4
  305. agno/tools/shell.py +9 -2
  306. agno/tools/slack.py +12 -11
  307. agno/tools/sleep.py +3 -2
  308. agno/tools/spider.py +24 -4
  309. agno/tools/sql.py +7 -6
  310. agno/tools/tavily.py +6 -4
  311. agno/tools/telegram.py +12 -4
  312. agno/tools/todoist.py +11 -31
  313. agno/tools/toolkit.py +1 -1
  314. agno/tools/trafilatura.py +22 -6
  315. agno/tools/trello.py +9 -22
  316. agno/tools/twilio.py +10 -3
  317. agno/tools/user_control_flow.py +6 -1
  318. agno/tools/valyu.py +34 -5
  319. agno/tools/visualization.py +19 -28
  320. agno/tools/webbrowser.py +4 -3
  321. agno/tools/webex.py +11 -7
  322. agno/tools/website.py +15 -46
  323. agno/tools/webtools.py +12 -4
  324. agno/tools/whatsapp.py +5 -9
  325. agno/tools/wikipedia.py +20 -13
  326. agno/tools/x.py +14 -13
  327. agno/tools/yfinance.py +13 -40
  328. agno/tools/youtube.py +26 -20
  329. agno/tools/zendesk.py +7 -2
  330. agno/tools/zep.py +10 -7
  331. agno/tools/zoom.py +10 -9
  332. agno/utils/common.py +1 -19
  333. agno/utils/events.py +100 -123
  334. agno/utils/gemini.py +1 -1
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/log.py +54 -4
  337. agno/utils/mcp.py +68 -10
  338. agno/utils/media.py +39 -0
  339. agno/utils/message.py +12 -1
  340. agno/utils/models/aws_claude.py +1 -1
  341. agno/utils/models/claude.py +6 -12
  342. agno/utils/models/cohere.py +1 -1
  343. agno/utils/models/mistral.py +8 -7
  344. agno/utils/models/schema_utils.py +3 -3
  345. agno/utils/models/watsonx.py +1 -1
  346. agno/utils/openai.py +1 -1
  347. agno/utils/pprint.py +33 -32
  348. agno/utils/print_response/agent.py +779 -0
  349. agno/utils/print_response/team.py +1669 -0
  350. agno/utils/print_response/workflow.py +1451 -0
  351. agno/utils/prompts.py +14 -14
  352. agno/utils/reasoning.py +87 -0
  353. agno/utils/response.py +42 -42
  354. agno/utils/streamlit.py +481 -0
  355. agno/utils/string.py +8 -22
  356. agno/utils/team.py +50 -0
  357. agno/utils/timer.py +2 -2
  358. agno/vectordb/base.py +33 -21
  359. agno/vectordb/cassandra/cassandra.py +287 -23
  360. agno/vectordb/chroma/chromadb.py +482 -59
  361. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  362. agno/vectordb/couchbase/couchbase.py +309 -29
  363. agno/vectordb/lancedb/lance_db.py +360 -21
  364. agno/vectordb/langchaindb/__init__.py +5 -0
  365. agno/vectordb/langchaindb/langchaindb.py +145 -0
  366. agno/vectordb/lightrag/__init__.py +5 -0
  367. agno/vectordb/lightrag/lightrag.py +374 -0
  368. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  369. agno/vectordb/milvus/milvus.py +242 -32
  370. agno/vectordb/mongodb/mongodb.py +200 -24
  371. agno/vectordb/pgvector/pgvector.py +319 -37
  372. agno/vectordb/pineconedb/pineconedb.py +221 -27
  373. agno/vectordb/qdrant/qdrant.py +334 -14
  374. agno/vectordb/singlestore/singlestore.py +286 -29
  375. agno/vectordb/surrealdb/surrealdb.py +187 -7
  376. agno/vectordb/upstashdb/upstashdb.py +342 -26
  377. agno/vectordb/weaviate/weaviate.py +227 -165
  378. agno/workflow/__init__.py +17 -13
  379. agno/workflow/{v2/condition.py → condition.py} +135 -32
  380. agno/workflow/{v2/loop.py → loop.py} +115 -28
  381. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  382. agno/workflow/{v2/router.py → router.py} +133 -32
  383. agno/workflow/{v2/step.py → step.py} +207 -49
  384. agno/workflow/{v2/steps.py → steps.py} +147 -66
  385. agno/workflow/types.py +482 -0
  386. agno/workflow/workflow.py +2410 -696
  387. agno-2.0.0.dist-info/METADATA +494 -0
  388. agno-2.0.0.dist-info/RECORD +515 -0
  389. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  390. agno/agent/metrics.py +0 -110
  391. agno/api/app.py +0 -35
  392. agno/api/playground.py +0 -92
  393. agno/api/schemas/app.py +0 -12
  394. agno/api/schemas/playground.py +0 -22
  395. agno/api/schemas/user.py +0 -35
  396. agno/api/schemas/workspace.py +0 -46
  397. agno/api/user.py +0 -160
  398. agno/api/workflows.py +0 -33
  399. agno/api/workspace.py +0 -175
  400. agno/app/agui/__init__.py +0 -3
  401. agno/app/agui/app.py +0 -17
  402. agno/app/agui/sync_router.py +0 -120
  403. agno/app/base.py +0 -186
  404. agno/app/discord/__init__.py +0 -3
  405. agno/app/fastapi/__init__.py +0 -3
  406. agno/app/fastapi/app.py +0 -107
  407. agno/app/fastapi/async_router.py +0 -457
  408. agno/app/fastapi/sync_router.py +0 -448
  409. agno/app/playground/app.py +0 -228
  410. agno/app/playground/async_router.py +0 -1053
  411. agno/app/playground/deploy.py +0 -249
  412. agno/app/playground/operator.py +0 -183
  413. agno/app/playground/schemas.py +0 -223
  414. agno/app/playground/serve.py +0 -55
  415. agno/app/playground/sync_router.py +0 -1045
  416. agno/app/playground/utils.py +0 -46
  417. agno/app/settings.py +0 -15
  418. agno/app/slack/__init__.py +0 -3
  419. agno/app/slack/app.py +0 -19
  420. agno/app/slack/sync_router.py +0 -92
  421. agno/app/utils.py +0 -54
  422. agno/app/whatsapp/__init__.py +0 -3
  423. agno/app/whatsapp/app.py +0 -15
  424. agno/app/whatsapp/sync_router.py +0 -197
  425. agno/cli/auth_server.py +0 -249
  426. agno/cli/config.py +0 -274
  427. agno/cli/console.py +0 -88
  428. agno/cli/credentials.py +0 -23
  429. agno/cli/entrypoint.py +0 -571
  430. agno/cli/operator.py +0 -357
  431. agno/cli/settings.py +0 -96
  432. agno/cli/ws/ws_cli.py +0 -817
  433. agno/constants.py +0 -13
  434. agno/document/__init__.py +0 -5
  435. agno/document/chunking/semantic.py +0 -45
  436. agno/document/chunking/strategy.py +0 -31
  437. agno/document/reader/__init__.py +0 -5
  438. agno/document/reader/base.py +0 -47
  439. agno/document/reader/docx_reader.py +0 -60
  440. agno/document/reader/gcs/pdf_reader.py +0 -44
  441. agno/document/reader/s3/pdf_reader.py +0 -59
  442. agno/document/reader/s3/text_reader.py +0 -63
  443. agno/document/reader/url_reader.py +0 -59
  444. agno/document/reader/youtube_reader.py +0 -58
  445. agno/embedder/__init__.py +0 -5
  446. agno/embedder/langdb.py +0 -80
  447. agno/embedder/mistral.py +0 -82
  448. agno/embedder/openai.py +0 -78
  449. agno/file/__init__.py +0 -5
  450. agno/file/file.py +0 -16
  451. agno/file/local/csv.py +0 -32
  452. agno/file/local/txt.py +0 -19
  453. agno/infra/app.py +0 -240
  454. agno/infra/base.py +0 -144
  455. agno/infra/context.py +0 -20
  456. agno/infra/db_app.py +0 -52
  457. agno/infra/resource.py +0 -205
  458. agno/infra/resources.py +0 -55
  459. agno/knowledge/agent.py +0 -702
  460. agno/knowledge/arxiv.py +0 -33
  461. agno/knowledge/combined.py +0 -36
  462. agno/knowledge/csv.py +0 -144
  463. agno/knowledge/csv_url.py +0 -124
  464. agno/knowledge/document.py +0 -223
  465. agno/knowledge/docx.py +0 -137
  466. agno/knowledge/firecrawl.py +0 -34
  467. agno/knowledge/gcs/__init__.py +0 -0
  468. agno/knowledge/gcs/base.py +0 -39
  469. agno/knowledge/gcs/pdf.py +0 -125
  470. agno/knowledge/json.py +0 -137
  471. agno/knowledge/langchain.py +0 -71
  472. agno/knowledge/light_rag.py +0 -273
  473. agno/knowledge/llamaindex.py +0 -66
  474. agno/knowledge/markdown.py +0 -154
  475. agno/knowledge/pdf.py +0 -164
  476. agno/knowledge/pdf_bytes.py +0 -42
  477. agno/knowledge/pdf_url.py +0 -148
  478. agno/knowledge/s3/__init__.py +0 -0
  479. agno/knowledge/s3/base.py +0 -64
  480. agno/knowledge/s3/pdf.py +0 -33
  481. agno/knowledge/s3/text.py +0 -34
  482. agno/knowledge/text.py +0 -141
  483. agno/knowledge/url.py +0 -46
  484. agno/knowledge/website.py +0 -179
  485. agno/knowledge/wikipedia.py +0 -32
  486. agno/knowledge/youtube.py +0 -35
  487. agno/memory/agent.py +0 -423
  488. agno/memory/classifier.py +0 -104
  489. agno/memory/db/__init__.py +0 -5
  490. agno/memory/db/base.py +0 -42
  491. agno/memory/db/mongodb.py +0 -189
  492. agno/memory/db/postgres.py +0 -203
  493. agno/memory/db/sqlite.py +0 -193
  494. agno/memory/memory.py +0 -22
  495. agno/memory/row.py +0 -36
  496. agno/memory/summarizer.py +0 -201
  497. agno/memory/summary.py +0 -19
  498. agno/memory/team.py +0 -415
  499. agno/memory/v2/__init__.py +0 -2
  500. agno/memory/v2/db/__init__.py +0 -1
  501. agno/memory/v2/db/base.py +0 -42
  502. agno/memory/v2/db/firestore.py +0 -339
  503. agno/memory/v2/db/mongodb.py +0 -196
  504. agno/memory/v2/db/postgres.py +0 -214
  505. agno/memory/v2/db/redis.py +0 -187
  506. agno/memory/v2/db/schema.py +0 -54
  507. agno/memory/v2/db/sqlite.py +0 -209
  508. agno/memory/v2/manager.py +0 -437
  509. agno/memory/v2/memory.py +0 -1097
  510. agno/memory/v2/schema.py +0 -55
  511. agno/memory/v2/summarizer.py +0 -215
  512. agno/memory/workflow.py +0 -38
  513. agno/models/ollama/tools.py +0 -430
  514. agno/models/qwen/__init__.py +0 -5
  515. agno/playground/__init__.py +0 -10
  516. agno/playground/deploy.py +0 -3
  517. agno/playground/playground.py +0 -3
  518. agno/playground/serve.py +0 -3
  519. agno/playground/settings.py +0 -3
  520. agno/reranker/__init__.py +0 -0
  521. agno/run/response.py +0 -467
  522. agno/run/v2/__init__.py +0 -0
  523. agno/run/v2/workflow.py +0 -567
  524. agno/storage/__init__.py +0 -0
  525. agno/storage/agent/__init__.py +0 -0
  526. agno/storage/agent/dynamodb.py +0 -1
  527. agno/storage/agent/json.py +0 -1
  528. agno/storage/agent/mongodb.py +0 -1
  529. agno/storage/agent/postgres.py +0 -1
  530. agno/storage/agent/singlestore.py +0 -1
  531. agno/storage/agent/sqlite.py +0 -1
  532. agno/storage/agent/yaml.py +0 -1
  533. agno/storage/base.py +0 -60
  534. agno/storage/dynamodb.py +0 -673
  535. agno/storage/firestore.py +0 -297
  536. agno/storage/gcs_json.py +0 -261
  537. agno/storage/in_memory.py +0 -234
  538. agno/storage/json.py +0 -237
  539. agno/storage/mongodb.py +0 -328
  540. agno/storage/mysql.py +0 -685
  541. agno/storage/postgres.py +0 -682
  542. agno/storage/redis.py +0 -336
  543. agno/storage/session/__init__.py +0 -16
  544. agno/storage/session/agent.py +0 -64
  545. agno/storage/session/team.py +0 -63
  546. agno/storage/session/v2/__init__.py +0 -5
  547. agno/storage/session/workflow.py +0 -61
  548. agno/storage/singlestore.py +0 -606
  549. agno/storage/sqlite.py +0 -646
  550. agno/storage/workflow/__init__.py +0 -0
  551. agno/storage/workflow/mongodb.py +0 -1
  552. agno/storage/workflow/postgres.py +0 -1
  553. agno/storage/workflow/sqlite.py +0 -1
  554. agno/storage/yaml.py +0 -241
  555. agno/tools/thinking.py +0 -73
  556. agno/utils/defaults.py +0 -57
  557. agno/utils/filesystem.py +0 -39
  558. agno/utils/git.py +0 -52
  559. agno/utils/json_io.py +0 -30
  560. agno/utils/load_env.py +0 -19
  561. agno/utils/py_io.py +0 -19
  562. agno/utils/pyproject.py +0 -18
  563. agno/utils/resource_filter.py +0 -31
  564. agno/workflow/v2/__init__.py +0 -21
  565. agno/workflow/v2/types.py +0 -357
  566. agno/workflow/v2/workflow.py +0 -3313
  567. agno/workspace/__init__.py +0 -0
  568. agno/workspace/config.py +0 -325
  569. agno/workspace/enums.py +0 -6
  570. agno/workspace/helpers.py +0 -52
  571. agno/workspace/operator.py +0 -757
  572. agno/workspace/settings.py +0 -158
  573. agno-1.8.2.dist-info/METADATA +0 -982
  574. agno-1.8.2.dist-info/RECORD +0 -566
  575. agno-1.8.2.dist-info/entry_points.txt +0 -3
  576. agno-1.8.2.dist-info/licenses/LICENSE +0 -375
  577. /agno/{app → db/migrations}/__init__.py +0 -0
  578. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  579. /agno/{cli → integrations}/__init__.py +0 -0
  580. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  581. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  582. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  583. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  584. /agno/{app → os/interfaces}/slack/security.py +0 -0
  585. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  586. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  587. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  588. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  589. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
1
  from dataclasses import dataclass, field
2
2
  from typing import Any, Dict, List, Optional
3
3
 
4
- from agno.embedder import Embedder
4
+ from agno.knowledge.embedder import Embedder
5
5
 
6
6
 
7
7
  @dataclass
@@ -12,10 +12,13 @@ class Document:
12
12
  id: Optional[str] = None
13
13
  name: Optional[str] = None
14
14
  meta_data: Dict[str, Any] = field(default_factory=dict)
15
- embedder: Optional[Embedder] = None
15
+ embedder: Optional["Embedder"] = None
16
16
  embedding: Optional[List[float]] = None
17
17
  usage: Optional[Dict[str, Any]] = None
18
18
  reranking_score: Optional[float] = None
19
+ content_id: Optional[str] = None
20
+ content_origin: Optional[str] = None
21
+ size: Optional[int] = None
19
22
 
20
23
  def embed(self, embedder: Optional[Embedder] = None) -> None:
21
24
  """Embed the document using the provided embedder"""
@@ -26,6 +29,13 @@ class Document:
26
29
 
27
30
  self.embedding, self.usage = _embedder.get_embedding_and_usage(self.content)
28
31
 
32
+ async def async_embed(self, embedder: Optional[Embedder] = None) -> None:
33
+ """Embed the document using the provided embedder"""
34
+ _embedder = embedder or self.embedder
35
+ if _embedder is None:
36
+ raise ValueError("No embedder provided")
37
+ self.embedding, self.usage = await _embedder.async_get_embedding_and_usage(self.content)
38
+
29
39
  def to_dict(self) -> Dict[str, Any]:
30
40
  """Returns a dictionary representation of the document"""
31
41
  fields = {"name", "meta_data", "content"}
@@ -0,0 +1,5 @@
1
+ from agno.knowledge.embedder.base import Embedder
2
+
3
+ __all__ = [
4
+ "Embedder",
5
+ ]
@@ -3,8 +3,8 @@ from dataclasses import dataclass
3
3
  from os import getenv
4
4
  from typing import Any, Dict, List, Optional, Tuple
5
5
 
6
- from agno.embedder.base import Embedder
7
6
  from agno.exceptions import AgnoError, ModelProviderError
7
+ from agno.knowledge.embedder.base import Embedder
8
8
  from agno.utils.log import log_error, logger
9
9
 
10
10
  try:
@@ -15,6 +15,14 @@ except ImportError:
15
15
  log_error("`boto3` not installed. Please install it via `pip install boto3`.")
16
16
  raise
17
17
 
18
+ try:
19
+ import aioboto3
20
+ from aioboto3.session import Session as AioSession
21
+ except ImportError:
22
+ log_error("`aioboto3` not installed. Please install it via `pip install aioboto3`.")
23
+ aioboto3 = None
24
+ AioSession = None
25
+
18
26
 
19
27
  @dataclass
20
28
  class AwsBedrockEmbedder(Embedder):
@@ -94,6 +102,46 @@ class AwsBedrockEmbedder(Embedder):
94
102
  )
95
103
  return self.client
96
104
 
105
+ def get_async_client(self):
106
+ """
107
+ Returns an async AWS Bedrock client using aioboto3.
108
+
109
+ Returns:
110
+ An aioboto3 bedrock-runtime client context manager.
111
+ """
112
+ if aioboto3 is None:
113
+ raise AgnoError(
114
+ message="aioboto3 not installed. Please install it via `pip install aioboto3`.",
115
+ status_code=400,
116
+ )
117
+
118
+ if self.session:
119
+ # Convert boto3 session to aioboto3 session
120
+ aio_session = aioboto3.Session(
121
+ aws_access_key_id=self.session.get_credentials().access_key,
122
+ aws_secret_access_key=self.session.get_credentials().secret_key,
123
+ aws_session_token=self.session.get_credentials().token,
124
+ region_name=self.session.region_name,
125
+ )
126
+ else:
127
+ self.aws_access_key_id = self.aws_access_key_id or getenv("AWS_ACCESS_KEY_ID")
128
+ self.aws_secret_access_key = self.aws_secret_access_key or getenv("AWS_SECRET_ACCESS_KEY")
129
+ self.aws_region = self.aws_region or getenv("AWS_REGION")
130
+
131
+ if not self.aws_access_key_id or not self.aws_secret_access_key:
132
+ raise AgnoError(
133
+ message="AWS credentials not found. Please set AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables or provide a boto3 session.",
134
+ status_code=400,
135
+ )
136
+
137
+ aio_session = aioboto3.Session(
138
+ aws_access_key_id=self.aws_access_key_id,
139
+ aws_secret_access_key=self.aws_secret_access_key,
140
+ region_name=self.aws_region,
141
+ )
142
+
143
+ return aio_session.client("bedrock-runtime", **(self.client_params or {}))
144
+
97
145
  def _format_request_body(self, text: str) -> str:
98
146
  """
99
147
  Format the request body for the embedder.
@@ -210,3 +258,81 @@ class AwsBedrockEmbedder(Embedder):
210
258
  usage = response["usage"]
211
259
 
212
260
  return embedding, usage
261
+
262
+ async def async_get_embedding(self, text: str) -> List[float]:
263
+ """
264
+ Async version of get_embedding() using native aioboto3 async client.
265
+ """
266
+ try:
267
+ body = self._format_request_body(text)
268
+ async with self.get_async_client() as client:
269
+ response = await client.invoke_model(
270
+ modelId=self.id,
271
+ body=body,
272
+ contentType="application/json",
273
+ accept="application/json",
274
+ )
275
+ response_body = json.loads((await response["body"].read()).decode("utf-8"))
276
+
277
+ # Extract embeddings using the same logic as get_embedding
278
+ if "embeddings" in response_body:
279
+ if isinstance(response_body["embeddings"], list):
280
+ # Default 'float' embeddings response format
281
+ return response_body["embeddings"][0]
282
+ elif isinstance(response_body["embeddings"], dict):
283
+ # If embeddings_types parameter was used, select float embeddings
284
+ if "float" in response_body["embeddings"]:
285
+ return response_body["embeddings"]["float"][0]
286
+ # Fallback to the first available embedding type
287
+ for embedding_type in response_body["embeddings"]:
288
+ return response_body["embeddings"][embedding_type][0]
289
+ logger.warning("No embeddings found in response")
290
+ return []
291
+ except ClientError as e:
292
+ log_error(f"Unexpected error calling Bedrock API: {str(e)}")
293
+ raise ModelProviderError(message=str(e.response), model_name="AwsBedrockEmbedder", model_id=self.id) from e
294
+ except Exception as e:
295
+ log_error(f"Unexpected error calling Bedrock API: {str(e)}")
296
+ raise ModelProviderError(message=str(e), model_name="AwsBedrockEmbedder", model_id=self.id) from e
297
+
298
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict[str, Any]]]:
299
+ """
300
+ Async version of get_embedding_and_usage() using native aioboto3 async client.
301
+ """
302
+ try:
303
+ body = self._format_request_body(text)
304
+ async with self.get_async_client() as client:
305
+ response = await client.invoke_model(
306
+ modelId=self.id,
307
+ body=body,
308
+ contentType="application/json",
309
+ accept="application/json",
310
+ )
311
+ response_body = json.loads((await response["body"].read()).decode("utf-8"))
312
+
313
+ embedding: List[float] = []
314
+ # Extract embeddings using the same logic as get_embedding_and_usage
315
+ if "embeddings" in response_body:
316
+ if isinstance(response_body["embeddings"], list):
317
+ embedding = response_body["embeddings"][0]
318
+ elif isinstance(response_body["embeddings"], dict):
319
+ if "float" in response_body["embeddings"]:
320
+ embedding = response_body["embeddings"]["float"][0]
321
+ # Fallback to the first available embedding type
322
+ else:
323
+ for embedding_type in response_body["embeddings"]:
324
+ embedding = response_body["embeddings"][embedding_type][0]
325
+ break
326
+
327
+ # Extract usage metrics if available
328
+ usage = None
329
+ if "usage" in response_body:
330
+ usage = response_body["usage"]
331
+
332
+ return embedding, usage
333
+ except ClientError as e:
334
+ log_error(f"Unexpected error calling Bedrock API: {str(e)}")
335
+ raise ModelProviderError(message=str(e.response), model_name="AwsBedrockEmbedder", model_id=self.id) from e
336
+ except Exception as e:
337
+ log_error(f"Unexpected error calling Bedrock API: {str(e)}")
338
+ raise ModelProviderError(message=str(e), model_name="AwsBedrockEmbedder", model_id=self.id) from e
@@ -4,10 +4,11 @@ from typing import Any, Dict, List, Optional, Tuple
4
4
 
5
5
  from typing_extensions import Literal
6
6
 
7
- from agno.embedder.base import Embedder
7
+ from agno.knowledge.embedder.base import Embedder
8
8
  from agno.utils.log import logger
9
9
 
10
10
  try:
11
+ from openai import AsyncAzureOpenAI as AsyncAzureOpenAIClient
11
12
  from openai import AzureOpenAI as AzureOpenAIClient
12
13
  from openai.types.create_embedding_response import CreateEmbeddingResponse
13
14
  except ImportError:
@@ -32,6 +33,7 @@ class AzureOpenAIEmbedder(Embedder):
32
33
  request_params: Optional[Dict[str, Any]] = None
33
34
  client_params: Optional[Dict[str, Any]] = None
34
35
  openai_client: Optional[AzureOpenAIClient] = None
36
+ async_client: Optional[AsyncAzureOpenAIClient] = None
35
37
 
36
38
  @property
37
39
  def client(self) -> AzureOpenAIClient:
@@ -61,6 +63,35 @@ class AzureOpenAIEmbedder(Embedder):
61
63
 
62
64
  return AzureOpenAIClient(**_client_params)
63
65
 
66
+ @property
67
+ def aclient(self) -> AsyncAzureOpenAIClient:
68
+ if self.async_client:
69
+ return self.async_client
70
+
71
+ _client_params: Dict[str, Any] = {}
72
+ if self.api_key:
73
+ _client_params["api_key"] = self.api_key
74
+ if self.api_version:
75
+ _client_params["api_version"] = self.api_version
76
+ if self.organization:
77
+ _client_params["organization"] = self.organization
78
+ if self.azure_endpoint:
79
+ _client_params["azure_endpoint"] = self.azure_endpoint
80
+ if self.azure_deployment:
81
+ _client_params["azure_deployment"] = self.azure_deployment
82
+ if self.base_url:
83
+ _client_params["base_url"] = self.base_url
84
+ if self.azure_ad_token:
85
+ _client_params["azure_ad_token"] = self.azure_ad_token
86
+ if self.azure_ad_token_provider:
87
+ _client_params["azure_ad_token_provider"] = self.azure_ad_token_provider
88
+
89
+ if self.client_params:
90
+ _client_params.update(self.client_params)
91
+
92
+ self.async_client = AsyncAzureOpenAIClient(**_client_params)
93
+ return self.async_client
94
+
64
95
  def _response(self, text: str) -> CreateEmbeddingResponse:
65
96
  _request_params: Dict[str, Any] = {
66
97
  "input": text,
@@ -90,3 +121,36 @@ class AzureOpenAIEmbedder(Embedder):
90
121
  embedding = response.data[0].embedding
91
122
  usage = response.usage
92
123
  return embedding, usage.model_dump()
124
+
125
+ async def _aresponse(self, text: str) -> CreateEmbeddingResponse:
126
+ """Async version of _response method."""
127
+ _request_params: Dict[str, Any] = {
128
+ "input": text,
129
+ "model": self.id,
130
+ "encoding_format": self.encoding_format,
131
+ }
132
+ if self.user is not None:
133
+ _request_params["user"] = self.user
134
+ if self.id.startswith("text-embedding-3"):
135
+ _request_params["dimensions"] = self.dimensions
136
+ if self.request_params:
137
+ _request_params.update(self.request_params)
138
+
139
+ return await self.aclient.embeddings.create(**_request_params)
140
+
141
+ async def async_get_embedding(self, text: str) -> List[float]:
142
+ """Async version of get_embedding using the native Azure OpenAI async client."""
143
+ response: CreateEmbeddingResponse = await self._aresponse(text=text)
144
+ try:
145
+ return response.data[0].embedding
146
+ except Exception as e:
147
+ logger.warning(e)
148
+ return []
149
+
150
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
151
+ """Async version of get_embedding_and_usage using the native Azure OpenAI async client."""
152
+ response: CreateEmbeddingResponse = await self._aresponse(text=text)
153
+
154
+ embedding = response.data[0].embedding
155
+ usage = response.usage
156
+ return embedding, usage.model_dump()
@@ -13,3 +13,9 @@ class Embedder:
13
13
 
14
14
  def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
15
15
  raise NotImplementedError
16
+
17
+ async def async_get_embedding(self, text: str) -> List[float]:
18
+ raise NotImplementedError
19
+
20
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
21
+ raise NotImplementedError
@@ -1,10 +1,11 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import Any, Dict, List, Optional, Tuple, Union
3
3
 
4
- from agno.embedder.base import Embedder
4
+ from agno.knowledge.embedder.base import Embedder
5
5
  from agno.utils.log import logger
6
6
 
7
7
  try:
8
+ from cohere import AsyncClient as AsyncCohereClient
8
9
  from cohere import Client as CohereClient
9
10
  from cohere.types.embed_response import EmbeddingsByTypeEmbedResponse, EmbeddingsFloatsEmbedResponse
10
11
  except ImportError:
@@ -20,6 +21,7 @@ class CohereEmbedder(Embedder):
20
21
  request_params: Optional[Dict[str, Any]] = None
21
22
  client_params: Optional[Dict[str, Any]] = None
22
23
  cohere_client: Optional[CohereClient] = None
24
+ async_client: Optional[AsyncCohereClient] = None
23
25
 
24
26
  @property
25
27
  def client(self) -> CohereClient:
@@ -28,9 +30,24 @@ class CohereEmbedder(Embedder):
28
30
  client_params: Dict[str, Any] = {}
29
31
  if self.api_key:
30
32
  client_params["api_key"] = self.api_key
33
+ if self.client_params:
34
+ client_params.update(self.client_params)
31
35
  self.cohere_client = CohereClient(**client_params)
32
36
  return self.cohere_client
33
37
 
38
+ @property
39
+ def aclient(self) -> AsyncCohereClient:
40
+ """Lazy init for Cohere async client."""
41
+ if self.async_client:
42
+ return self.async_client
43
+ params: Dict[str, Any] = {}
44
+ if self.api_key:
45
+ params["api_key"] = self.api_key
46
+ if self.client_params:
47
+ params.update(self.client_params)
48
+ self.async_client = AsyncCohereClient(**params)
49
+ return self.async_client
50
+
34
51
  def response(self, text: str) -> Union[EmbeddingsFloatsEmbedResponse, EmbeddingsByTypeEmbedResponse]:
35
52
  request_params: Dict[str, Any] = {}
36
53
 
@@ -71,3 +88,57 @@ class CohereEmbedder(Embedder):
71
88
  if usage:
72
89
  return embedding, usage.model_dump()
73
90
  return embedding, None
91
+
92
+ async def async_get_embedding(self, text: str) -> List[float]:
93
+ request_params: Dict[str, Any] = {}
94
+
95
+ if self.id:
96
+ request_params["model"] = self.id
97
+ if self.input_type:
98
+ request_params["input_type"] = self.input_type
99
+ if self.embedding_types:
100
+ request_params["embedding_types"] = self.embedding_types
101
+ if self.request_params:
102
+ request_params.update(self.request_params)
103
+
104
+ try:
105
+ response: Union[EmbeddingsFloatsEmbedResponse, EmbeddingsByTypeEmbedResponse] = await self.aclient.embed(
106
+ texts=[text], **request_params
107
+ )
108
+ if isinstance(response, EmbeddingsFloatsEmbedResponse):
109
+ return response.embeddings[0]
110
+ elif isinstance(response, EmbeddingsByTypeEmbedResponse):
111
+ return response.embeddings.float_[0] if response.embeddings.float_ else []
112
+ else:
113
+ logger.warning("No embeddings found")
114
+ return []
115
+ except Exception as e:
116
+ logger.warning(e)
117
+ return []
118
+
119
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict[str, Any]]]:
120
+ request_params: Dict[str, Any] = {}
121
+
122
+ if self.id:
123
+ request_params["model"] = self.id
124
+ if self.input_type:
125
+ request_params["input_type"] = self.input_type
126
+ if self.embedding_types:
127
+ request_params["embedding_types"] = self.embedding_types
128
+ if self.request_params:
129
+ request_params.update(self.request_params)
130
+
131
+ response: Union[EmbeddingsFloatsEmbedResponse, EmbeddingsByTypeEmbedResponse] = await self.aclient.embed(
132
+ texts=[text], **request_params
133
+ )
134
+
135
+ embedding: List[float] = []
136
+ if isinstance(response, EmbeddingsFloatsEmbedResponse):
137
+ embedding = response.embeddings[0]
138
+ elif isinstance(response, EmbeddingsByTypeEmbedResponse):
139
+ embedding = response.embeddings.float_[0] if response.embeddings.float_ else []
140
+
141
+ usage = response.meta.billed_units if response.meta else None
142
+ if usage:
143
+ return embedding, usage.model_dump()
144
+ return embedding, None
@@ -1,7 +1,7 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import Dict, List, Optional, Tuple
3
3
 
4
- from agno.embedder.base import Embedder
4
+ from agno.knowledge.embedder.base import Embedder
5
5
  from agno.utils.log import logger
6
6
 
7
7
  try:
@@ -44,3 +44,19 @@ class FastEmbedEmbedder(Embedder):
44
44
  usage = None
45
45
 
46
46
  return embedding, usage
47
+
48
+ async def async_get_embedding(self, text: str) -> List[float]:
49
+ """Async version using thread executor for CPU-bound operations."""
50
+ import asyncio
51
+
52
+ loop = asyncio.get_event_loop()
53
+ # Run the CPU-bound operation in a thread executor
54
+ return await loop.run_in_executor(None, self.get_embedding, text)
55
+
56
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
57
+ """Async version using thread executor for CPU-bound operations."""
58
+ import asyncio
59
+
60
+ loop = asyncio.get_event_loop()
61
+ # Run the CPU-bound operation in a thread executor
62
+ return await loop.run_in_executor(None, self.get_embedding_and_usage, text)
@@ -2,7 +2,7 @@ from dataclasses import dataclass
2
2
  from os import getenv
3
3
  from typing import Optional
4
4
 
5
- from agno.embedder.openai import OpenAIEmbedder
5
+ from agno.knowledge.embedder.openai import OpenAIEmbedder
6
6
 
7
7
 
8
8
  @dataclass
@@ -2,7 +2,7 @@ from dataclasses import dataclass
2
2
  from os import getenv
3
3
  from typing import Any, Dict, List, Optional, Tuple
4
4
 
5
- from agno.embedder.base import Embedder
5
+ from agno.knowledge.embedder.base import Embedder
6
6
  from agno.utils.log import log_error, log_info
7
7
 
8
8
  try:
@@ -56,6 +56,11 @@ class GeminiEmbedder(Embedder):
56
56
 
57
57
  return self.gemini_client
58
58
 
59
+ @property
60
+ def aclient(self) -> GeminiClient:
61
+ """Returns the same client instance since Google GenAI Client supports both sync and async operations."""
62
+ return self.client
63
+
59
64
  def _response(self, text: str) -> EmbedContentResponse:
60
65
  # If a user provides a model id with the `models/` prefix, we need to remove it
61
66
  _id = self.id
@@ -105,3 +110,71 @@ class GeminiEmbedder(Embedder):
105
110
  except Exception as e:
106
111
  log_error(f"Error extracting embeddings: {e}")
107
112
  return [], usage
113
+
114
+ async def async_get_embedding(self, text: str) -> List[float]:
115
+ """Async version of get_embedding using client.aio."""
116
+ # If a user provides a model id with the `models/` prefix, we need to remove it
117
+ _id = self.id
118
+ if _id.startswith("models/"):
119
+ _id = _id.split("/")[-1]
120
+
121
+ _request_params: Dict[str, Any] = {"contents": text, "model": _id, "config": {}}
122
+ if self.dimensions:
123
+ _request_params["config"]["output_dimensionality"] = self.dimensions
124
+ if self.task_type:
125
+ _request_params["config"]["task_type"] = self.task_type
126
+ if self.title:
127
+ _request_params["config"]["title"] = self.title
128
+ if not _request_params["config"]:
129
+ del _request_params["config"]
130
+
131
+ if self.request_params:
132
+ _request_params.update(self.request_params)
133
+
134
+ try:
135
+ response = await self.aclient.aio.models.embed_content(**_request_params)
136
+ if response.embeddings and len(response.embeddings) > 0:
137
+ values = response.embeddings[0].values
138
+ if values is not None:
139
+ return values
140
+ log_info("No embeddings found in response")
141
+ return []
142
+ except Exception as e:
143
+ log_error(f"Error extracting embeddings: {e}")
144
+ return []
145
+
146
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict[str, Any]]]:
147
+ """Async version of get_embedding_and_usage using client.aio."""
148
+ # If a user provides a model id with the `models/` prefix, we need to remove it
149
+ _id = self.id
150
+ if _id.startswith("models/"):
151
+ _id = _id.split("/")[-1]
152
+
153
+ _request_params: Dict[str, Any] = {"contents": text, "model": _id, "config": {}}
154
+ if self.dimensions:
155
+ _request_params["config"]["output_dimensionality"] = self.dimensions
156
+ if self.task_type:
157
+ _request_params["config"]["task_type"] = self.task_type
158
+ if self.title:
159
+ _request_params["config"]["title"] = self.title
160
+ if not _request_params["config"]:
161
+ del _request_params["config"]
162
+
163
+ if self.request_params:
164
+ _request_params.update(self.request_params)
165
+
166
+ try:
167
+ response = await self.aclient.aio.models.embed_content(**_request_params)
168
+ usage = None
169
+ if response.metadata and hasattr(response.metadata, "billable_character_count"):
170
+ usage = {"billable_character_count": response.metadata.billable_character_count}
171
+
172
+ if response.embeddings and len(response.embeddings) > 0:
173
+ values = response.embeddings[0].values
174
+ if values is not None:
175
+ return values, usage
176
+ log_info("No embeddings found in response")
177
+ return [], usage
178
+ except Exception as e:
179
+ log_error(f"Error extracting embeddings: {e}")
180
+ return [], usage
@@ -2,11 +2,11 @@ from dataclasses import dataclass
2
2
  from os import getenv
3
3
  from typing import Any, Dict, List, Optional, Tuple
4
4
 
5
- from agno.embedder.base import Embedder
5
+ from agno.knowledge.embedder.base import Embedder
6
6
  from agno.utils.log import logger
7
7
 
8
8
  try:
9
- from huggingface_hub import InferenceClient
9
+ from huggingface_hub import AsyncInferenceClient, InferenceClient
10
10
  except ImportError:
11
11
  logger.error("`huggingface-hub` not installed, please run `pip install huggingface-hub`")
12
12
  raise
@@ -20,6 +20,7 @@ class HuggingfaceCustomEmbedder(Embedder):
20
20
  api_key: Optional[str] = getenv("HUGGINGFACE_API_KEY")
21
21
  client_params: Optional[Dict[str, Any]] = None
22
22
  huggingface_client: Optional[InferenceClient] = None
23
+ async_client: Optional[AsyncInferenceClient] = None
23
24
 
24
25
  @property
25
26
  def client(self) -> InferenceClient:
@@ -33,6 +34,18 @@ class HuggingfaceCustomEmbedder(Embedder):
33
34
  self.huggingface_client = InferenceClient(**_client_params)
34
35
  return self.huggingface_client
35
36
 
37
+ @property
38
+ def aclient(self) -> AsyncInferenceClient:
39
+ if self.async_client:
40
+ return self.async_client
41
+ _client_params: Dict[str, Any] = {}
42
+ if self.api_key:
43
+ _client_params["api_key"] = self.api_key
44
+ if self.client_params:
45
+ _client_params.update(self.client_params)
46
+ self.async_client = AsyncInferenceClient(**_client_params)
47
+ return self.async_client
48
+
36
49
  def _response(self, text: str):
37
50
  return self.client.feature_extraction(text=text, model=self.id)
38
51
 
@@ -53,3 +66,24 @@ class HuggingfaceCustomEmbedder(Embedder):
53
66
 
54
67
  def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
55
68
  return self.get_embedding(text=text), None
69
+
70
+ async def async_get_embedding(self, text: str) -> List[float]:
71
+ """Async version of get_embedding using AsyncInferenceClient."""
72
+ response = await self.aclient.feature_extraction(text=text, model=self.id)
73
+ try:
74
+ # If already a list, return directly
75
+ if isinstance(response, list):
76
+ return response
77
+ # If numpy array, convert to list
78
+ elif hasattr(response, "tolist"):
79
+ return response.tolist()
80
+ else:
81
+ return list(response)
82
+ except Exception as e:
83
+ logger.warning(f"Failed to process embeddings: {e}")
84
+ return []
85
+
86
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
87
+ """Async version of get_embedding_and_usage."""
88
+ embedding = await self.async_get_embedding(text=text)
89
+ return embedding, None
@@ -4,13 +4,18 @@ from typing import Any, Dict, List, Optional, Tuple
4
4
 
5
5
  from typing_extensions import Literal
6
6
 
7
- from agno.embedder.base import Embedder
7
+ from agno.knowledge.embedder.base import Embedder
8
8
  from agno.utils.log import logger
9
9
 
10
10
  try:
11
11
  import requests
12
12
  except ImportError:
13
- raise ImportError("requests not installed, use pip install requests")
13
+ raise ImportError("`requests` not installed, use pip install requests")
14
+
15
+ try:
16
+ import aiohttp
17
+ except ImportError:
18
+ raise ImportError("`aiohttp` not installed, use pip install aiohttp")
14
19
 
15
20
 
16
21
  @dataclass
@@ -71,3 +76,44 @@ class JinaEmbedder(Embedder):
71
76
  except Exception as e:
72
77
  logger.warning(f"Failed to get embedding and usage: {e}")
73
78
  return [], None
79
+
80
+ async def _async_response(self, text: str) -> Dict[str, Any]:
81
+ """Async version of _response using aiohttp."""
82
+ data = {
83
+ "model": self.id,
84
+ "late_chunking": self.late_chunking,
85
+ "dimensions": self.dimensions,
86
+ "embedding_type": self.embedding_type,
87
+ "input": [text], # Jina API expects a list
88
+ }
89
+ if self.user is not None:
90
+ data["user"] = self.user
91
+ if self.request_params:
92
+ data.update(self.request_params)
93
+
94
+ timeout = aiohttp.ClientTimeout(total=self.timeout) if self.timeout else None
95
+
96
+ async with aiohttp.ClientSession(timeout=timeout) as session:
97
+ async with session.post(self.base_url, headers=self._get_headers(), json=data) as response:
98
+ response.raise_for_status()
99
+ return await response.json()
100
+
101
+ async def async_get_embedding(self, text: str) -> List[float]:
102
+ """Async version of get_embedding."""
103
+ try:
104
+ result = await self._async_response(text)
105
+ return result["data"][0]["embedding"]
106
+ except Exception as e:
107
+ logger.warning(f"Failed to get embedding: {e}")
108
+ return []
109
+
110
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
111
+ """Async version of get_embedding_and_usage."""
112
+ try:
113
+ result = await self._async_response(text)
114
+ embedding = result["data"][0]["embedding"]
115
+ usage = result.get("usage")
116
+ return embedding, usage
117
+ except Exception as e:
118
+ logger.warning(f"Failed to get embedding and usage: {e}")
119
+ return [], None