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
@@ -10,7 +10,9 @@ from agno.exceptions import ModelProviderError
10
10
  from agno.media import AudioResponse
11
11
  from agno.models.base import Model
12
12
  from agno.models.message import Message
13
+ from agno.models.metrics import Metrics
13
14
  from agno.models.response import ModelResponse
15
+ from agno.run.agent import RunOutput
14
16
  from agno.utils.log import log_debug, log_error, log_warning
15
17
  from agno.utils.openai import _format_file_for_message, audio_to_message, images_to_message
16
18
 
@@ -18,6 +20,7 @@ try:
18
20
  from openai import APIConnectionError, APIStatusError, RateLimitError
19
21
  from openai import AsyncOpenAI as AsyncOpenAIClient
20
22
  from openai import OpenAI as OpenAIClient
23
+ from openai.types import CompletionUsage
21
24
  from openai.types.chat import ChatCompletionAudio
22
25
  from openai.types.chat.chat_completion import ChatCompletion
23
26
  from openai.types.chat.chat_completion_chunk import (
@@ -77,7 +80,7 @@ class OpenAIChat(Model):
77
80
  max_retries: Optional[int] = None
78
81
  default_headers: Optional[Any] = None
79
82
  default_query: Optional[Any] = None
80
- http_client: Optional[httpx.Client] = None
83
+ http_client: Optional[Union[httpx.Client, httpx.AsyncClient]] = None
81
84
  client_params: Optional[Dict[str, Any]] = None
82
85
 
83
86
  # The role to map the message role to.
@@ -123,8 +126,11 @@ class OpenAIChat(Model):
123
126
  OpenAIClient: An instance of the OpenAI client.
124
127
  """
125
128
  client_params: Dict[str, Any] = self._get_client_params()
126
- if self.http_client is not None:
127
- client_params["http_client"] = self.http_client
129
+ if self.http_client:
130
+ if isinstance(self.http_client, httpx.Client):
131
+ client_params["http_client"] = self.http_client
132
+ else:
133
+ log_warning("http_client is not an instance of httpx.Client.")
128
134
  return OpenAIClient(**client_params)
129
135
 
130
136
  def get_async_client(self) -> AsyncOpenAIClient:
@@ -136,7 +142,14 @@ class OpenAIChat(Model):
136
142
  """
137
143
  client_params: Dict[str, Any] = self._get_client_params()
138
144
  if self.http_client:
139
- client_params["http_client"] = self.http_client
145
+ if isinstance(self.http_client, httpx.AsyncClient):
146
+ client_params["http_client"] = self.http_client
147
+ else:
148
+ log_warning("http_client is not an instance of httpx.AsyncClient. Using default httpx.AsyncClient.")
149
+ # Create a new async HTTP client with custom limits
150
+ client_params["http_client"] = httpx.AsyncClient(
151
+ limits=httpx.Limits(max_connections=1000, max_keepalive_connections=100)
152
+ )
140
153
  else:
141
154
  # Create a new async HTTP client with custom limits
142
155
  client_params["http_client"] = httpx.AsyncClient(
@@ -205,6 +218,15 @@ class OpenAIChat(Model):
205
218
 
206
219
  # Add tools
207
220
  if tools is not None and len(tools) > 0:
221
+ # Remove unsupported fields for OpenAILike models
222
+ if self.provider in ["AIMLAPI", "Fireworks", "Nvidia"]:
223
+ for tool in tools:
224
+ if tool.get("type") == "function":
225
+ if tool["function"].get("requires_confirmation") is not None:
226
+ del tool["function"]["requires_confirmation"]
227
+ if tool["function"].get("external_execution") is not None:
228
+ del tool["function"]["external_execution"]
229
+
208
230
  request_params["tools"] = tools
209
231
 
210
232
  if tool_choice is not None:
@@ -320,25 +342,43 @@ class OpenAIChat(Model):
320
342
  def invoke(
321
343
  self,
322
344
  messages: List[Message],
345
+ assistant_message: Message,
323
346
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
324
347
  tools: Optional[List[Dict[str, Any]]] = None,
325
348
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
326
- ) -> ChatCompletion:
349
+ run_response: Optional[RunOutput] = None,
350
+ ) -> ModelResponse:
327
351
  """
328
- Send a chat completion request to the OpenAI API.
352
+ Send a chat completion request to the OpenAI API and parse the response.
329
353
 
330
354
  Args:
331
355
  messages (List[Message]): A list of messages to send to the model.
356
+ assistant_message (Message): The assistant message to populate.
357
+ response_format (Optional[Union[Dict, Type[BaseModel]]]): The response format to use.
358
+ tools (Optional[List[Dict[str, Any]]]): The tools to use.
359
+ tool_choice (Optional[Union[str, Dict[str, Any]]]): The tool choice to use.
332
360
 
333
361
  Returns:
334
- ChatCompletion: The chat completion response from the API.
362
+ ModelResponse: The chat completion response from the API.
335
363
  """
336
364
  try:
337
- return self.get_client().chat.completions.create(
365
+ if run_response and run_response.metrics:
366
+ run_response.metrics.set_time_to_first_token()
367
+
368
+ assistant_message.metrics.start_timer()
369
+
370
+ provider_response = self.get_client().chat.completions.create(
338
371
  model=self.id,
339
372
  messages=[self._format_message(m) for m in messages], # type: ignore
340
373
  **self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
341
374
  )
375
+ assistant_message.metrics.stop_timer()
376
+
377
+ # Parse the response into an Agno ModelResponse object
378
+ model_response = self._parse_provider_response(provider_response, response_format=response_format)
379
+
380
+ return model_response
381
+
342
382
  except RateLimitError as e:
343
383
  log_error(f"Rate limit error from OpenAI API: {e}")
344
384
  error_message = e.response.json().get("error", {})
@@ -380,25 +420,42 @@ class OpenAIChat(Model):
380
420
  async def ainvoke(
381
421
  self,
382
422
  messages: List[Message],
423
+ assistant_message: Message,
383
424
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
384
425
  tools: Optional[List[Dict[str, Any]]] = None,
385
426
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
386
- ) -> ChatCompletion:
427
+ run_response: Optional[RunOutput] = None,
428
+ ) -> ModelResponse:
387
429
  """
388
430
  Sends an asynchronous chat completion request to the OpenAI API.
389
431
 
390
432
  Args:
391
433
  messages (List[Message]): A list of messages to send to the model.
434
+ assistant_message (Message): The assistant message to populate.
435
+ response_format (Optional[Union[Dict, Type[BaseModel]]]): The response format to use.
436
+ tools (Optional[List[Dict[str, Any]]]): The tools to use.
437
+ tool_choice (Optional[Union[str, Dict[str, Any]]]): The tool choice to use.
392
438
 
393
439
  Returns:
394
- ChatCompletion: The chat completion response from the API.
440
+ ModelResponse: The chat completion response from the API.
395
441
  """
396
442
  try:
397
- return await self.get_async_client().chat.completions.create(
443
+ if run_response and run_response.metrics:
444
+ run_response.metrics.set_time_to_first_token()
445
+
446
+ assistant_message.metrics.start_timer()
447
+ response = await self.get_async_client().chat.completions.create(
398
448
  model=self.id,
399
449
  messages=[self._format_message(m) for m in messages], # type: ignore
400
450
  **self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
401
451
  )
452
+ assistant_message.metrics.stop_timer()
453
+
454
+ # Parse the response into an Agno ModelResponse object
455
+ provider_response: ModelResponse = self._parse_provider_response(response, response_format=response_format)
456
+
457
+ return provider_response
458
+
402
459
  except RateLimitError as e:
403
460
  log_error(f"Rate limit error from OpenAI API: {e}")
404
461
  error_message = e.response.json().get("error", {})
@@ -440,10 +497,12 @@ class OpenAIChat(Model):
440
497
  def invoke_stream(
441
498
  self,
442
499
  messages: List[Message],
500
+ assistant_message: Message,
443
501
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
444
502
  tools: Optional[List[Dict[str, Any]]] = None,
445
503
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
446
- ) -> Iterator[ChatCompletionChunk]:
504
+ run_response: Optional[RunOutput] = None,
505
+ ) -> Iterator[ModelResponse]:
447
506
  """
448
507
  Send a streaming chat completion request to the OpenAI API.
449
508
 
@@ -451,17 +510,26 @@ class OpenAIChat(Model):
451
510
  messages (List[Message]): A list of messages to send to the model.
452
511
 
453
512
  Returns:
454
- Iterator[ChatCompletionChunk]: An iterator of chat completion chunks.
513
+ Iterator[ModelResponse]: An iterator of model responses.
455
514
  """
456
515
 
457
516
  try:
458
- yield from self.get_client().chat.completions.create(
517
+ if run_response and run_response.metrics:
518
+ run_response.metrics.set_time_to_first_token()
519
+
520
+ assistant_message.metrics.start_timer()
521
+
522
+ for chunk in self.get_client().chat.completions.create(
459
523
  model=self.id,
460
524
  messages=[self._format_message(m) for m in messages], # type: ignore
461
525
  stream=True,
462
526
  stream_options={"include_usage": True},
463
527
  **self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
464
- ) # type: ignore
528
+ ):
529
+ yield self._parse_provider_response_delta(chunk)
530
+
531
+ assistant_message.metrics.stop_timer()
532
+
465
533
  except RateLimitError as e:
466
534
  log_error(f"Rate limit error from OpenAI API: {e}")
467
535
  error_message = e.response.json().get("error", {})
@@ -503,10 +571,12 @@ class OpenAIChat(Model):
503
571
  async def ainvoke_stream(
504
572
  self,
505
573
  messages: List[Message],
574
+ assistant_message: Message,
506
575
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
507
576
  tools: Optional[List[Dict[str, Any]]] = None,
508
577
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
509
- ) -> AsyncIterator[ChatCompletionChunk]:
578
+ run_response: Optional[RunOutput] = None,
579
+ ) -> AsyncIterator[ModelResponse]:
510
580
  """
511
581
  Sends an asynchronous streaming chat completion request to the OpenAI API.
512
582
 
@@ -514,10 +584,15 @@ class OpenAIChat(Model):
514
584
  messages (List[Message]): A list of messages to send to the model.
515
585
 
516
586
  Returns:
517
- Any: An asynchronous iterator of chat completion chunks.
587
+ Any: An asynchronous iterator of model responses.
518
588
  """
519
589
 
520
590
  try:
591
+ if run_response and run_response.metrics:
592
+ run_response.metrics.set_time_to_first_token()
593
+
594
+ assistant_message.metrics.start_timer()
595
+
521
596
  async_stream = await self.get_async_client().chat.completions.create(
522
597
  model=self.id,
523
598
  messages=[self._format_message(m) for m in messages], # type: ignore
@@ -525,8 +600,12 @@ class OpenAIChat(Model):
525
600
  stream_options={"include_usage": True},
526
601
  **self.get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice),
527
602
  )
603
+
528
604
  async for chunk in async_stream:
529
- yield chunk
605
+ yield self._parse_provider_response_delta(chunk)
606
+
607
+ assistant_message.metrics.stop_timer()
608
+
530
609
  except RateLimitError as e:
531
610
  log_error(f"Rate limit error from OpenAI API: {e}")
532
611
  error_message = e.response.json().get("error", {})
@@ -565,7 +644,6 @@ class OpenAIChat(Model):
565
644
  log_error(f"Error from OpenAI API: {e}")
566
645
  raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
567
646
 
568
- # Override base method
569
647
  @staticmethod
570
648
  def parse_tool_calls(tool_calls_data: List[ChoiceDeltaToolCall]) -> List[Dict[str, Any]]:
571
649
  """
@@ -606,7 +684,7 @@ class OpenAIChat(Model):
606
684
  tool_call_entry["type"] = _tool_call_type
607
685
  return tool_calls
608
686
 
609
- def parse_provider_response(
687
+ def _parse_provider_response(
610
688
  self,
611
689
  response: ChatCompletion,
612
690
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
@@ -616,9 +694,9 @@ class OpenAIChat(Model):
616
694
  """
617
695
  model_response = ModelResponse()
618
696
 
619
- if hasattr(response, "error") and response.error:
697
+ if hasattr(response, "error") and response.error: # type: ignore
620
698
  raise ModelProviderError(
621
- message=response.error.get("message", "Unknown model error"),
699
+ message=response.error.get("message", "Unknown model error"), # type: ignore
622
700
  model_name=self.name,
623
701
  model_id=self.id,
624
702
  )
@@ -667,15 +745,15 @@ class OpenAIChat(Model):
667
745
  except Exception as e:
668
746
  log_warning(f"Error processing audio: {e}")
669
747
 
670
- if hasattr(response_message, "reasoning_content") and response_message.reasoning_content is not None:
671
- model_response.reasoning_content = response_message.reasoning_content
748
+ if hasattr(response_message, "reasoning_content") and response_message.reasoning_content is not None: # type: ignore
749
+ model_response.reasoning_content = response_message.reasoning_content # type: ignore
672
750
 
673
751
  if response.usage is not None:
674
- model_response.response_usage = response.usage
752
+ model_response.response_usage = self._get_metrics(response.usage)
675
753
 
676
754
  return model_response
677
755
 
678
- def parse_provider_response_delta(self, response_delta: ChatCompletionChunk) -> ModelResponse:
756
+ def _parse_provider_response_delta(self, response_delta: ChatCompletionChunk) -> ModelResponse:
679
757
  """
680
758
  Parse the OpenAI streaming response into a ModelResponse.
681
759
 
@@ -686,6 +764,7 @@ class OpenAIChat(Model):
686
764
  ModelResponse: Parsed response data
687
765
  """
688
766
  model_response = ModelResponse()
767
+
689
768
  if response_delta.choices and len(response_delta.choices) > 0:
690
769
  choice_delta: ChoiceDelta = response_delta.choices[0].delta
691
770
 
@@ -727,6 +806,35 @@ class OpenAIChat(Model):
727
806
 
728
807
  # Add usage metrics if present
729
808
  if response_delta.usage is not None:
730
- model_response.response_usage = response_delta.usage
809
+ model_response.response_usage = self._get_metrics(response_delta.usage)
731
810
 
732
811
  return model_response
812
+
813
+ def _get_metrics(self, response_usage: CompletionUsage) -> Metrics:
814
+ """
815
+ Parse the given OpenAI-specific usage into an Agno Metrics object.
816
+
817
+ Args:
818
+ response_usage: Usage data from OpenAI
819
+
820
+ Returns:
821
+ Metrics: Parsed metrics data
822
+ """
823
+
824
+ metrics = Metrics()
825
+
826
+ metrics.input_tokens = response_usage.prompt_tokens or 0
827
+ metrics.output_tokens = response_usage.completion_tokens or 0
828
+ metrics.total_tokens = response_usage.total_tokens or 0
829
+
830
+ # Add the prompt_tokens_details field
831
+ if prompt_token_details := response_usage.prompt_tokens_details:
832
+ metrics.audio_input_tokens = prompt_token_details.audio_tokens or 0
833
+ metrics.cache_read_tokens = prompt_token_details.cached_tokens or 0
834
+
835
+ # Add the completion_tokens_details field
836
+ if completion_tokens_details := response_usage.completion_tokens_details:
837
+ metrics.audio_output_tokens = completion_tokens_details.audio_tokens or 0
838
+ metrics.reasoning_tokens = completion_tokens_details.reasoning_tokens or 0
839
+
840
+ return metrics