agno 1.8.0__py3-none-any.whl → 2.0.0a1__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 (583) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2781 -4126
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  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 +9 -64
  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 +1749 -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 +1438 -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 +888 -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 +1051 -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 +1417 -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 +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -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 +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  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 +10 -10
  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 +1515 -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 +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  136. agno/media.py +2 -2
  137. agno/memory/__init__.py +2 -10
  138. agno/memory/manager.py +1003 -148
  139. agno/models/aimlapi/__init__.py +2 -2
  140. agno/models/aimlapi/aimlapi.py +6 -6
  141. agno/models/anthropic/claude.py +129 -82
  142. agno/models/aws/bedrock.py +107 -175
  143. agno/models/aws/claude.py +64 -18
  144. agno/models/azure/ai_foundry.py +73 -23
  145. agno/models/base.py +347 -287
  146. agno/models/cerebras/cerebras.py +84 -27
  147. agno/models/cohere/chat.py +106 -98
  148. agno/models/dashscope/dashscope.py +14 -5
  149. agno/models/google/gemini.py +123 -53
  150. agno/models/groq/groq.py +97 -35
  151. agno/models/huggingface/huggingface.py +92 -27
  152. agno/models/ibm/watsonx.py +72 -13
  153. agno/models/litellm/chat.py +85 -13
  154. agno/models/message.py +38 -144
  155. agno/models/meta/llama.py +85 -49
  156. agno/models/metrics.py +120 -0
  157. agno/models/mistral/mistral.py +90 -21
  158. agno/models/ollama/__init__.py +0 -2
  159. agno/models/ollama/chat.py +84 -46
  160. agno/models/openai/chat.py +135 -27
  161. agno/models/openai/responses.py +233 -115
  162. agno/models/perplexity/perplexity.py +26 -2
  163. agno/models/portkey/portkey.py +0 -7
  164. agno/models/response.py +14 -8
  165. agno/models/utils.py +20 -0
  166. agno/models/vercel/__init__.py +2 -2
  167. agno/models/vercel/v0.py +1 -1
  168. agno/models/vllm/__init__.py +2 -2
  169. agno/models/vllm/vllm.py +3 -3
  170. agno/models/xai/xai.py +10 -10
  171. agno/os/__init__.py +3 -0
  172. agno/os/app.py +393 -0
  173. agno/os/auth.py +47 -0
  174. agno/os/config.py +103 -0
  175. agno/os/interfaces/agui/__init__.py +3 -0
  176. agno/os/interfaces/agui/agui.py +31 -0
  177. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  178. agno/{app → os/interfaces}/agui/utils.py +65 -28
  179. agno/os/interfaces/base.py +21 -0
  180. agno/os/interfaces/slack/__init__.py +3 -0
  181. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  182. agno/os/interfaces/slack/slack.py +33 -0
  183. agno/os/interfaces/whatsapp/__init__.py +3 -0
  184. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  185. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  186. agno/os/router.py +843 -0
  187. agno/os/routers/__init__.py +3 -0
  188. agno/os/routers/evals/__init__.py +3 -0
  189. agno/os/routers/evals/evals.py +204 -0
  190. agno/os/routers/evals/schemas.py +142 -0
  191. agno/os/routers/evals/utils.py +161 -0
  192. agno/os/routers/knowledge/__init__.py +3 -0
  193. agno/os/routers/knowledge/knowledge.py +413 -0
  194. agno/os/routers/knowledge/schemas.py +118 -0
  195. agno/os/routers/memory/__init__.py +3 -0
  196. agno/os/routers/memory/memory.py +179 -0
  197. agno/os/routers/memory/schemas.py +58 -0
  198. agno/os/routers/metrics/__init__.py +3 -0
  199. agno/os/routers/metrics/metrics.py +58 -0
  200. agno/os/routers/metrics/schemas.py +47 -0
  201. agno/os/routers/session/__init__.py +3 -0
  202. agno/os/routers/session/session.py +163 -0
  203. agno/os/schema.py +892 -0
  204. agno/{app/playground → os}/settings.py +8 -15
  205. agno/os/utils.py +270 -0
  206. agno/reasoning/azure_ai_foundry.py +4 -4
  207. agno/reasoning/deepseek.py +4 -4
  208. agno/reasoning/default.py +6 -11
  209. agno/reasoning/groq.py +4 -4
  210. agno/reasoning/helpers.py +4 -6
  211. agno/reasoning/ollama.py +4 -4
  212. agno/reasoning/openai.py +4 -4
  213. agno/run/{response.py → agent.py} +144 -72
  214. agno/run/base.py +44 -58
  215. agno/run/cancel.py +83 -0
  216. agno/run/team.py +133 -77
  217. agno/run/workflow.py +537 -12
  218. agno/session/__init__.py +10 -0
  219. agno/session/agent.py +244 -0
  220. agno/session/summary.py +225 -0
  221. agno/session/team.py +262 -0
  222. agno/{storage/session/v2 → session}/workflow.py +47 -24
  223. agno/team/__init__.py +15 -16
  224. agno/team/team.py +2967 -4243
  225. agno/tools/agentql.py +14 -5
  226. agno/tools/airflow.py +9 -4
  227. agno/tools/api.py +7 -3
  228. agno/tools/apify.py +2 -46
  229. agno/tools/arxiv.py +8 -3
  230. agno/tools/aws_lambda.py +7 -5
  231. agno/tools/aws_ses.py +7 -1
  232. agno/tools/baidusearch.py +4 -1
  233. agno/tools/bitbucket.py +4 -4
  234. agno/tools/brandfetch.py +14 -11
  235. agno/tools/bravesearch.py +4 -1
  236. agno/tools/brightdata.py +42 -22
  237. agno/tools/browserbase.py +13 -4
  238. agno/tools/calcom.py +12 -10
  239. agno/tools/calculator.py +10 -27
  240. agno/tools/cartesia.py +18 -13
  241. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  242. agno/tools/confluence.py +71 -18
  243. agno/tools/crawl4ai.py +7 -1
  244. agno/tools/csv_toolkit.py +9 -8
  245. agno/tools/dalle.py +18 -11
  246. agno/tools/daytona.py +13 -16
  247. agno/tools/decorator.py +6 -3
  248. agno/tools/desi_vocal.py +16 -7
  249. agno/tools/discord.py +11 -8
  250. agno/tools/docker.py +30 -42
  251. agno/tools/duckdb.py +34 -53
  252. agno/tools/duckduckgo.py +8 -7
  253. agno/tools/e2b.py +62 -62
  254. agno/tools/eleven_labs.py +35 -28
  255. agno/tools/email.py +4 -1
  256. agno/tools/evm.py +7 -1
  257. agno/tools/exa.py +19 -14
  258. agno/tools/fal.py +29 -29
  259. agno/tools/file.py +9 -8
  260. agno/tools/financial_datasets.py +25 -44
  261. agno/tools/firecrawl.py +22 -22
  262. agno/tools/function.py +68 -17
  263. agno/tools/giphy.py +22 -10
  264. agno/tools/github.py +48 -126
  265. agno/tools/gmail.py +46 -62
  266. agno/tools/google_bigquery.py +7 -6
  267. agno/tools/google_maps.py +11 -26
  268. agno/tools/googlesearch.py +7 -2
  269. agno/tools/googlesheets.py +21 -17
  270. agno/tools/hackernews.py +9 -5
  271. agno/tools/jina.py +5 -4
  272. agno/tools/jira.py +18 -9
  273. agno/tools/knowledge.py +31 -32
  274. agno/tools/linear.py +18 -33
  275. agno/tools/linkup.py +5 -1
  276. agno/tools/local_file_system.py +8 -5
  277. agno/tools/lumalab.py +31 -19
  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 +32 -14
  282. agno/tools/models/gemini.py +58 -31
  283. agno/tools/models/groq.py +29 -20
  284. agno/tools/models/nebius.py +27 -11
  285. agno/tools/models_labs.py +39 -15
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +134 -0
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +57 -26
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +62 -46
  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 +54 -41
  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 +95 -118
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/location.py +2 -2
  337. agno/utils/log.py +2 -2
  338. agno/utils/mcp.py +11 -5
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/claude.py +6 -4
  342. agno/utils/models/mistral.py +8 -7
  343. agno/utils/models/schema_utils.py +3 -3
  344. agno/utils/pprint.py +33 -32
  345. agno/utils/print_response/agent.py +779 -0
  346. agno/utils/print_response/team.py +1565 -0
  347. agno/utils/print_response/workflow.py +1451 -0
  348. agno/utils/prompts.py +14 -14
  349. agno/utils/reasoning.py +87 -0
  350. agno/utils/response.py +42 -42
  351. agno/utils/string.py +8 -22
  352. agno/utils/team.py +50 -0
  353. agno/utils/timer.py +2 -2
  354. agno/vectordb/base.py +33 -21
  355. agno/vectordb/cassandra/cassandra.py +287 -23
  356. agno/vectordb/chroma/chromadb.py +482 -59
  357. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  358. agno/vectordb/couchbase/couchbase.py +309 -29
  359. agno/vectordb/lancedb/lance_db.py +360 -21
  360. agno/vectordb/langchaindb/__init__.py +5 -0
  361. agno/vectordb/langchaindb/langchaindb.py +145 -0
  362. agno/vectordb/lightrag/__init__.py +5 -0
  363. agno/vectordb/lightrag/lightrag.py +374 -0
  364. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  365. agno/vectordb/milvus/milvus.py +242 -32
  366. agno/vectordb/mongodb/mongodb.py +200 -24
  367. agno/vectordb/pgvector/pgvector.py +319 -37
  368. agno/vectordb/pineconedb/pineconedb.py +221 -27
  369. agno/vectordb/qdrant/qdrant.py +356 -14
  370. agno/vectordb/singlestore/singlestore.py +286 -29
  371. agno/vectordb/surrealdb/surrealdb.py +187 -7
  372. agno/vectordb/upstashdb/upstashdb.py +342 -26
  373. agno/vectordb/weaviate/weaviate.py +227 -165
  374. agno/workflow/__init__.py +17 -13
  375. agno/workflow/{v2/condition.py → condition.py} +135 -32
  376. agno/workflow/{v2/loop.py → loop.py} +115 -28
  377. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  378. agno/workflow/{v2/router.py → router.py} +133 -32
  379. agno/workflow/{v2/step.py → step.py} +200 -42
  380. agno/workflow/{v2/steps.py → steps.py} +147 -66
  381. agno/workflow/types.py +482 -0
  382. agno/workflow/workflow.py +2394 -696
  383. agno-2.0.0a1.dist-info/METADATA +355 -0
  384. agno-2.0.0a1.dist-info/RECORD +514 -0
  385. agno/agent/metrics.py +0 -107
  386. agno/api/app.py +0 -35
  387. agno/api/playground.py +0 -92
  388. agno/api/schemas/app.py +0 -12
  389. agno/api/schemas/playground.py +0 -22
  390. agno/api/schemas/user.py +0 -35
  391. agno/api/schemas/workspace.py +0 -46
  392. agno/api/user.py +0 -160
  393. agno/api/workflows.py +0 -33
  394. agno/api/workspace.py +0 -175
  395. agno/app/agui/__init__.py +0 -3
  396. agno/app/agui/app.py +0 -17
  397. agno/app/agui/sync_router.py +0 -120
  398. agno/app/base.py +0 -186
  399. agno/app/discord/__init__.py +0 -3
  400. agno/app/fastapi/__init__.py +0 -3
  401. agno/app/fastapi/app.py +0 -107
  402. agno/app/fastapi/async_router.py +0 -457
  403. agno/app/fastapi/sync_router.py +0 -448
  404. agno/app/playground/app.py +0 -228
  405. agno/app/playground/async_router.py +0 -1050
  406. agno/app/playground/deploy.py +0 -249
  407. agno/app/playground/operator.py +0 -183
  408. agno/app/playground/schemas.py +0 -220
  409. agno/app/playground/serve.py +0 -55
  410. agno/app/playground/sync_router.py +0 -1042
  411. agno/app/playground/utils.py +0 -46
  412. agno/app/settings.py +0 -15
  413. agno/app/slack/__init__.py +0 -3
  414. agno/app/slack/app.py +0 -19
  415. agno/app/slack/sync_router.py +0 -92
  416. agno/app/utils.py +0 -54
  417. agno/app/whatsapp/__init__.py +0 -3
  418. agno/app/whatsapp/app.py +0 -15
  419. agno/app/whatsapp/sync_router.py +0 -197
  420. agno/cli/auth_server.py +0 -249
  421. agno/cli/config.py +0 -274
  422. agno/cli/console.py +0 -88
  423. agno/cli/credentials.py +0 -23
  424. agno/cli/entrypoint.py +0 -571
  425. agno/cli/operator.py +0 -357
  426. agno/cli/settings.py +0 -96
  427. agno/cli/ws/ws_cli.py +0 -817
  428. agno/constants.py +0 -13
  429. agno/document/__init__.py +0 -5
  430. agno/document/chunking/semantic.py +0 -45
  431. agno/document/chunking/strategy.py +0 -31
  432. agno/document/reader/__init__.py +0 -5
  433. agno/document/reader/base.py +0 -47
  434. agno/document/reader/docx_reader.py +0 -60
  435. agno/document/reader/gcs/pdf_reader.py +0 -44
  436. agno/document/reader/s3/pdf_reader.py +0 -59
  437. agno/document/reader/s3/text_reader.py +0 -63
  438. agno/document/reader/url_reader.py +0 -59
  439. agno/document/reader/youtube_reader.py +0 -58
  440. agno/embedder/__init__.py +0 -5
  441. agno/embedder/langdb.py +0 -80
  442. agno/embedder/mistral.py +0 -82
  443. agno/embedder/openai.py +0 -78
  444. agno/file/__init__.py +0 -5
  445. agno/file/file.py +0 -16
  446. agno/file/local/csv.py +0 -32
  447. agno/file/local/txt.py +0 -19
  448. agno/infra/app.py +0 -240
  449. agno/infra/base.py +0 -144
  450. agno/infra/context.py +0 -20
  451. agno/infra/db_app.py +0 -52
  452. agno/infra/resource.py +0 -205
  453. agno/infra/resources.py +0 -55
  454. agno/knowledge/agent.py +0 -698
  455. agno/knowledge/arxiv.py +0 -33
  456. agno/knowledge/combined.py +0 -36
  457. agno/knowledge/csv.py +0 -144
  458. agno/knowledge/csv_url.py +0 -124
  459. agno/knowledge/document.py +0 -223
  460. agno/knowledge/docx.py +0 -137
  461. agno/knowledge/firecrawl.py +0 -34
  462. agno/knowledge/gcs/__init__.py +0 -0
  463. agno/knowledge/gcs/base.py +0 -39
  464. agno/knowledge/gcs/pdf.py +0 -125
  465. agno/knowledge/json.py +0 -137
  466. agno/knowledge/langchain.py +0 -71
  467. agno/knowledge/light_rag.py +0 -273
  468. agno/knowledge/llamaindex.py +0 -66
  469. agno/knowledge/markdown.py +0 -154
  470. agno/knowledge/pdf.py +0 -164
  471. agno/knowledge/pdf_bytes.py +0 -42
  472. agno/knowledge/pdf_url.py +0 -148
  473. agno/knowledge/s3/__init__.py +0 -0
  474. agno/knowledge/s3/base.py +0 -64
  475. agno/knowledge/s3/pdf.py +0 -33
  476. agno/knowledge/s3/text.py +0 -34
  477. agno/knowledge/text.py +0 -141
  478. agno/knowledge/url.py +0 -46
  479. agno/knowledge/website.py +0 -179
  480. agno/knowledge/wikipedia.py +0 -32
  481. agno/knowledge/youtube.py +0 -35
  482. agno/memory/agent.py +0 -423
  483. agno/memory/classifier.py +0 -104
  484. agno/memory/db/__init__.py +0 -5
  485. agno/memory/db/base.py +0 -42
  486. agno/memory/db/mongodb.py +0 -189
  487. agno/memory/db/postgres.py +0 -203
  488. agno/memory/db/sqlite.py +0 -193
  489. agno/memory/memory.py +0 -22
  490. agno/memory/row.py +0 -36
  491. agno/memory/summarizer.py +0 -201
  492. agno/memory/summary.py +0 -19
  493. agno/memory/team.py +0 -415
  494. agno/memory/v2/__init__.py +0 -2
  495. agno/memory/v2/db/__init__.py +0 -1
  496. agno/memory/v2/db/base.py +0 -42
  497. agno/memory/v2/db/firestore.py +0 -339
  498. agno/memory/v2/db/mongodb.py +0 -196
  499. agno/memory/v2/db/postgres.py +0 -214
  500. agno/memory/v2/db/redis.py +0 -187
  501. agno/memory/v2/db/schema.py +0 -54
  502. agno/memory/v2/db/sqlite.py +0 -209
  503. agno/memory/v2/manager.py +0 -437
  504. agno/memory/v2/memory.py +0 -1097
  505. agno/memory/v2/schema.py +0 -55
  506. agno/memory/v2/summarizer.py +0 -215
  507. agno/memory/workflow.py +0 -38
  508. agno/models/ollama/tools.py +0 -430
  509. agno/models/qwen/__init__.py +0 -5
  510. agno/playground/__init__.py +0 -10
  511. agno/playground/deploy.py +0 -3
  512. agno/playground/playground.py +0 -3
  513. agno/playground/serve.py +0 -3
  514. agno/playground/settings.py +0 -3
  515. agno/reranker/__init__.py +0 -0
  516. agno/run/v2/__init__.py +0 -0
  517. agno/run/v2/workflow.py +0 -567
  518. agno/storage/__init__.py +0 -0
  519. agno/storage/agent/__init__.py +0 -0
  520. agno/storage/agent/dynamodb.py +0 -1
  521. agno/storage/agent/json.py +0 -1
  522. agno/storage/agent/mongodb.py +0 -1
  523. agno/storage/agent/postgres.py +0 -1
  524. agno/storage/agent/singlestore.py +0 -1
  525. agno/storage/agent/sqlite.py +0 -1
  526. agno/storage/agent/yaml.py +0 -1
  527. agno/storage/base.py +0 -60
  528. agno/storage/dynamodb.py +0 -673
  529. agno/storage/firestore.py +0 -297
  530. agno/storage/gcs_json.py +0 -261
  531. agno/storage/in_memory.py +0 -234
  532. agno/storage/json.py +0 -237
  533. agno/storage/mongodb.py +0 -328
  534. agno/storage/mysql.py +0 -685
  535. agno/storage/postgres.py +0 -682
  536. agno/storage/redis.py +0 -336
  537. agno/storage/session/__init__.py +0 -16
  538. agno/storage/session/agent.py +0 -64
  539. agno/storage/session/team.py +0 -63
  540. agno/storage/session/v2/__init__.py +0 -5
  541. agno/storage/session/workflow.py +0 -61
  542. agno/storage/singlestore.py +0 -606
  543. agno/storage/sqlite.py +0 -646
  544. agno/storage/workflow/__init__.py +0 -0
  545. agno/storage/workflow/mongodb.py +0 -1
  546. agno/storage/workflow/postgres.py +0 -1
  547. agno/storage/workflow/sqlite.py +0 -1
  548. agno/storage/yaml.py +0 -241
  549. agno/tools/thinking.py +0 -73
  550. agno/utils/defaults.py +0 -57
  551. agno/utils/filesystem.py +0 -39
  552. agno/utils/git.py +0 -52
  553. agno/utils/json_io.py +0 -30
  554. agno/utils/load_env.py +0 -19
  555. agno/utils/py_io.py +0 -19
  556. agno/utils/pyproject.py +0 -18
  557. agno/utils/resource_filter.py +0 -31
  558. agno/workflow/v2/__init__.py +0 -21
  559. agno/workflow/v2/types.py +0 -357
  560. agno/workflow/v2/workflow.py +0 -3312
  561. agno/workspace/__init__.py +0 -0
  562. agno/workspace/config.py +0 -325
  563. agno/workspace/enums.py +0 -6
  564. agno/workspace/helpers.py +0 -52
  565. agno/workspace/operator.py +0 -757
  566. agno/workspace/settings.py +0 -158
  567. agno-1.8.0.dist-info/METADATA +0 -979
  568. agno-1.8.0.dist-info/RECORD +0 -565
  569. agno-1.8.0.dist-info/entry_points.txt +0 -3
  570. /agno/{app → db/migrations}/__init__.py +0 -0
  571. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  572. /agno/{cli → integrations}/__init__.py +0 -0
  573. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  574. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  575. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  576. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  577. /agno/{app → os/interfaces}/slack/security.py +0 -0
  578. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  579. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  580. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  581. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  582. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  583. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
@@ -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
@@ -0,0 +1,22 @@
1
+ from dataclasses import dataclass
2
+ from os import getenv
3
+ from typing import Optional
4
+
5
+ from agno.knowledge.embedder.openai import OpenAIEmbedder
6
+
7
+
8
+ @dataclass
9
+ class LangDBEmbedder(OpenAIEmbedder):
10
+ id: str = "text-embedding-ada-002"
11
+ dimensions: int = 1536
12
+ api_key: Optional[str] = getenv("LANGDB_API_KEY")
13
+ project_id: Optional[str] = getenv("LANGDB_PROJECT_ID")
14
+ base_url: Optional[str] = None
15
+
16
+ def __post_init__(self):
17
+ """Set the base_url based on project_id if not provided."""
18
+ if not self.project_id:
19
+ raise ValueError("LANGDB_PROJECT_ID not set in the environment")
20
+
21
+ if not self.base_url:
22
+ self.base_url = f"https://api.us-east-1.langdb.ai/{self.project_id}/v1"
@@ -0,0 +1,139 @@
1
+ from dataclasses import dataclass
2
+ from os import getenv
3
+ from typing import Any, Dict, List, Optional, Tuple
4
+
5
+ from agno.knowledge.embedder.base import Embedder
6
+ from agno.utils.log import logger
7
+
8
+ try:
9
+ from mistralai import Mistral # type: ignore
10
+ from mistralai.models.embeddingresponse import EmbeddingResponse # type: ignore
11
+ except ImportError:
12
+ logger.error("`mistralai` not installed")
13
+ raise
14
+
15
+
16
+ @dataclass
17
+ class MistralEmbedder(Embedder):
18
+ id: str = "mistral-embed"
19
+ dimensions: int = 1024
20
+ # -*- Request parameters
21
+ request_params: Optional[Dict[str, Any]] = None
22
+ # -*- Client parameters
23
+ api_key: Optional[str] = getenv("MISTRAL_API_KEY")
24
+ endpoint: Optional[str] = None
25
+ max_retries: Optional[int] = None
26
+ timeout: Optional[int] = None
27
+ client_params: Optional[Dict[str, Any]] = None
28
+ # -*- Provide the Mistral Client manually
29
+ mistral_client: Optional[Mistral] = None
30
+
31
+ @property
32
+ def client(self) -> Mistral:
33
+ if self.mistral_client:
34
+ return self.mistral_client
35
+
36
+ _client_params: Dict[str, Any] = {
37
+ "api_key": self.api_key,
38
+ "endpoint": self.endpoint,
39
+ "max_retries": self.max_retries,
40
+ "timeout": self.timeout,
41
+ }
42
+ _client_params = {k: v for k, v in _client_params.items() if v is not None}
43
+
44
+ if self.client_params:
45
+ _client_params.update(self.client_params)
46
+
47
+ self.mistral_client = Mistral(**_client_params)
48
+
49
+ return self.mistral_client
50
+
51
+ def _response(self, text: str) -> EmbeddingResponse:
52
+ _request_params: Dict[str, Any] = {
53
+ "inputs": text,
54
+ "model": self.id,
55
+ }
56
+ if self.request_params:
57
+ _request_params.update(self.request_params)
58
+ response = self.client.embeddings.create(**_request_params)
59
+ if response is None:
60
+ raise ValueError("Failed to get embedding response")
61
+ return response
62
+
63
+ def get_embedding(self, text: str) -> List[float]:
64
+ try:
65
+ response: EmbeddingResponse = self._response(text=text)
66
+ if response.data and response.data[0].embedding:
67
+ return response.data[0].embedding
68
+ return []
69
+ except Exception as e:
70
+ logger.warning(f"Error getting embedding: {e}")
71
+ return []
72
+
73
+ def get_embedding_and_usage(self, text: str) -> Tuple[List[float], Dict[str, Any]]:
74
+ try:
75
+ response: EmbeddingResponse = self._response(text=text)
76
+ embedding: List[float] = (
77
+ response.data[0].embedding if (response.data and response.data[0].embedding) else []
78
+ )
79
+ usage: Dict[str, Any] = response.usage.model_dump() if response.usage else {}
80
+ return embedding, usage
81
+ except Exception as e:
82
+ logger.warning(f"Error getting embedding and usage: {e}")
83
+ return [], {}
84
+
85
+ async def async_get_embedding(self, text: str) -> List[float]:
86
+ """Async version of get_embedding."""
87
+ try:
88
+ # Check if the client has an async version of embeddings.create
89
+ if hasattr(self.client.embeddings, "create_async"):
90
+ response: EmbeddingResponse = await self.client.embeddings.create_async(
91
+ inputs=text, model=self.id, **self.request_params if self.request_params else {}
92
+ )
93
+ else:
94
+ # Fallback to running sync method in thread executor
95
+ import asyncio
96
+
97
+ loop = asyncio.get_running_loop()
98
+ response: EmbeddingResponse = await loop.run_in_executor( # type: ignore
99
+ None,
100
+ lambda: self.client.embeddings.create(
101
+ inputs=text, model=self.id, **self.request_params if self.request_params else {}
102
+ ),
103
+ )
104
+
105
+ if response.data and response.data[0].embedding:
106
+ return response.data[0].embedding
107
+ return []
108
+ except Exception as e:
109
+ logger.warning(f"Error getting embedding: {e}")
110
+ return []
111
+
112
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Dict[str, Any]]:
113
+ """Async version of get_embedding_and_usage."""
114
+ try:
115
+ # Check if the client has an async version of embeddings.create
116
+ if hasattr(self.client.embeddings, "create_async"):
117
+ response: EmbeddingResponse = await self.client.embeddings.create_async(
118
+ inputs=text, model=self.id, **self.request_params if self.request_params else {}
119
+ )
120
+ else:
121
+ # Fallback to running sync method in thread executor
122
+ import asyncio
123
+
124
+ loop = asyncio.get_running_loop()
125
+ response: EmbeddingResponse = await loop.run_in_executor( # type: ignore
126
+ None,
127
+ lambda: self.client.embeddings.create(
128
+ inputs=text, model=self.id, **self.request_params if self.request_params else {}
129
+ ),
130
+ )
131
+
132
+ embedding: List[float] = (
133
+ response.data[0].embedding if (response.data and response.data[0].embedding) else []
134
+ )
135
+ usage: Dict[str, Any] = response.usage.model_dump() if response.usage else {}
136
+ return embedding, usage
137
+ except Exception as e:
138
+ logger.warning(f"Error getting embedding and usage: {e}")
139
+ return [], {}
@@ -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
@@ -1,12 +1,13 @@
1
1
  from dataclasses import dataclass
2
2
  from typing import Any, Dict, List, Optional, Tuple
3
3
 
4
- from agno.embedder.base import Embedder
5
- from agno.utils.log import logger
4
+ from agno.knowledge.embedder.base import Embedder
5
+ from agno.utils.log import log_error, logger
6
6
 
7
7
  try:
8
8
  import importlib.metadata as metadata
9
9
 
10
+ from ollama import AsyncClient as AsyncOllamaClient
10
11
  from ollama import Client as OllamaClient
11
12
  from packaging import version
12
13
 
@@ -30,7 +31,7 @@ except ImportError as e:
30
31
 
31
32
  except Exception as e:
32
33
  # Catch-all for unexpected errors
33
- print(f"An unexpected error occurred: {e}")
34
+ log_error(f"An unexpected error occurred: {e}")
34
35
 
35
36
 
36
37
  @dataclass
@@ -42,6 +43,7 @@ class OllamaEmbedder(Embedder):
42
43
  options: Optional[Any] = None
43
44
  client_kwargs: Optional[Dict[str, Any]] = None
44
45
  ollama_client: Optional[OllamaClient] = None
46
+ async_client: Optional[AsyncOllamaClient] = None
45
47
 
46
48
  @property
47
49
  def client(self) -> OllamaClient:
@@ -58,6 +60,21 @@ class OllamaEmbedder(Embedder):
58
60
  self.ollama_client = OllamaClient(**_ollama_params)
59
61
  return self.ollama_client
60
62
 
63
+ @property
64
+ def aclient(self) -> AsyncOllamaClient:
65
+ if self.async_client:
66
+ return self.async_client
67
+
68
+ _ollama_params: Dict[str, Any] = {
69
+ "host": self.host,
70
+ "timeout": self.timeout,
71
+ }
72
+ _ollama_params = {k: v for k, v in _ollama_params.items() if v is not None}
73
+ if self.client_kwargs:
74
+ _ollama_params.update(self.client_kwargs)
75
+ self.async_client = AsyncOllamaClient(**_ollama_params)
76
+ return self.async_client
77
+
61
78
  def _response(self, text: str) -> Dict[str, Any]:
62
79
  kwargs: Dict[str, Any] = {}
63
80
  if self.options is not None:
@@ -88,3 +105,37 @@ class OllamaEmbedder(Embedder):
88
105
  embedding = self.get_embedding(text=text)
89
106
  usage = None
90
107
  return embedding, usage
108
+
109
+ async def _async_response(self, text: str) -> Dict[str, Any]:
110
+ """Async version of _response using AsyncOllamaClient."""
111
+ kwargs: Dict[str, Any] = {}
112
+ if self.options is not None:
113
+ kwargs["options"] = self.options
114
+
115
+ response = await self.aclient.embed(input=text, model=self.id, **kwargs)
116
+ if response and "embeddings" in response:
117
+ embeddings = response["embeddings"]
118
+ if isinstance(embeddings, list) and len(embeddings) > 0 and isinstance(embeddings[0], list):
119
+ return {"embeddings": embeddings[0]} # Use the first element
120
+ elif isinstance(embeddings, list) and all(isinstance(x, (int, float)) for x in embeddings):
121
+ return {"embeddings": embeddings} # Return as-is if already flat
122
+ return {"embeddings": []} # Return an empty list if no valid embedding is found
123
+
124
+ async def async_get_embedding(self, text: str) -> List[float]:
125
+ """Async version of get_embedding."""
126
+ try:
127
+ response = await self._async_response(text=text)
128
+ embedding = response.get("embeddings", [])
129
+ if len(embedding) != self.dimensions:
130
+ logger.warning(f"Expected embedding dimension {self.dimensions}, but got {len(embedding)}")
131
+ return []
132
+ return embedding
133
+ except Exception as e:
134
+ logger.warning(f"Error getting embedding: {e}")
135
+ return []
136
+
137
+ async def async_get_embedding_and_usage(self, text: str) -> Tuple[List[float], Optional[Dict]]:
138
+ """Async version of get_embedding_and_usage."""
139
+ embedding = await self.async_get_embedding(text=text)
140
+ usage = None
141
+ return embedding, usage