agno 1.8.1__py3-none-any.whl → 2.0.0rc1__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 +3181 -4169
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1411 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +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 +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +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/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +45 -150
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +84 -46
  158. agno/models/openai/chat.py +121 -23
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +14 -8
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +489 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +255 -0
  185. agno/os/router.py +869 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +208 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +436 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +188 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +60 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +168 -0
  202. agno/os/schema.py +892 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/{response.py → agent.py} +231 -74
  213. agno/run/base.py +44 -58
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +133 -77
  216. agno/run/workflow.py +537 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +2960 -4252
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +42 -22
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +18 -13
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +18 -11
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +16 -7
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +61 -61
  253. agno/tools/eleven_labs.py +35 -28
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +29 -29
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +22 -10
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +31 -19
  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 +32 -14
  281. agno/tools/models/gemini.py +58 -31
  282. agno/tools/models/groq.py +29 -20
  283. agno/tools/models/nebius.py +27 -11
  284. agno/tools/models_labs.py +39 -15
  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 +57 -26
  290. agno/tools/openbb.py +12 -11
  291. agno/tools/opencv.py +62 -46
  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 +54 -41
  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 +95 -118
  334. agno/utils/gemini.py +31 -1
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/log.py +2 -2
  337. agno/utils/mcp.py +11 -5
  338. agno/utils/media.py +39 -0
  339. agno/utils/message.py +12 -1
  340. agno/utils/models/claude.py +55 -4
  341. agno/utils/models/mistral.py +8 -7
  342. agno/utils/models/schema_utils.py +3 -3
  343. agno/utils/pprint.py +33 -32
  344. agno/utils/print_response/agent.py +779 -0
  345. agno/utils/print_response/team.py +1565 -0
  346. agno/utils/print_response/workflow.py +1451 -0
  347. agno/utils/prompts.py +14 -14
  348. agno/utils/reasoning.py +87 -0
  349. agno/utils/response.py +42 -42
  350. agno/utils/streamlit.py +454 -0
  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 +334 -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 +2401 -696
  383. agno-2.0.0rc1.dist-info/METADATA +355 -0
  384. agno-2.0.0rc1.dist-info/RECORD +516 -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 -702
  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.1.dist-info/METADATA +0 -982
  568. agno-1.8.1.dist-info/RECORD +0 -566
  569. agno-1.8.1.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.1.dist-info → agno-2.0.0rc1.dist-info}/WHEEL +0 -0
  582. {agno-1.8.1.dist-info → agno-2.0.0rc1.dist-info}/licenses/LICENSE +0 -0
  583. {agno-1.8.1.dist-info → agno-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,5 +1,5 @@
1
- from agno.models.aimlapi.aimlapi import AIMLApi
1
+ from agno.models.aimlapi.aimlapi import AIMLAPI
2
2
 
3
3
  __all__ = [
4
- "AIMLApi",
4
+ "AIMLAPI",
5
5
  ]
@@ -7,22 +7,22 @@ from agno.models.openai.like import OpenAILike
7
7
 
8
8
 
9
9
  @dataclass
10
- class AIMLApi(OpenAILike):
10
+ class AIMLAPI(OpenAILike):
11
11
  """
12
- A class for using models hosted on AIMLApi.
12
+ A class for using models hosted on AIMLAPI.
13
13
 
14
14
  Attributes:
15
15
  id (str): The model id. Defaults to "gpt-4o-mini".
16
- name (str): The model name. Defaults to "AIMLApi".
17
- provider (str): The provider name. Defaults to "AIMLApi".
16
+ name (str): The model name. Defaults to "AIMLAPI".
17
+ provider (str): The provider name. Defaults to "AIMLAPI".
18
18
  api_key (Optional[str]): The API key.
19
19
  base_url (str): The base URL. Defaults to "https://api.aimlapi.com/v1".
20
20
  max_tokens (int): The maximum number of tokens. Defaults to 4096.
21
21
  """
22
22
 
23
23
  id: str = "gpt-4o-mini"
24
- name: str = "AIMLApi"
25
- provider: str = "AIMLApi"
24
+ name: str = "AIMLAPI"
25
+ provider: str = "AIMLAPI"
26
26
 
27
27
  api_key: Optional[str] = getenv("AIMLAPI_API_KEY")
28
28
  base_url: str = "https://api.aimlapi.com/v1"
@@ -9,14 +9,14 @@ from pydantic import BaseModel
9
9
  from agno.exceptions import ModelProviderError, ModelRateLimitError
10
10
  from agno.models.base import Model
11
11
  from agno.models.message import Citations, DocumentCitation, Message, UrlCitation
12
+ from agno.models.metrics import Metrics
12
13
  from agno.models.response import ModelResponse
14
+ from agno.run.agent import RunOutput
13
15
  from agno.utils.log import log_debug, log_error, log_warning
14
- from agno.utils.models.claude import MCPServerConfiguration, format_messages
16
+ from agno.utils.models.claude import MCPServerConfiguration, format_messages, format_tools_for_model
15
17
 
16
18
  try:
17
- from anthropic import (
18
- Anthropic as AnthropicClient,
19
- )
19
+ from anthropic import Anthropic as AnthropicClient
20
20
  from anthropic import (
21
21
  APIConnectionError,
22
22
  APIStatusError,
@@ -31,8 +31,10 @@ try:
31
31
  ContentBlockDeltaEvent,
32
32
  ContentBlockStartEvent,
33
33
  ContentBlockStopEvent,
34
+ MessageDeltaUsage,
34
35
  # MessageDeltaEvent, # Currently broken
35
36
  MessageStopEvent,
37
+ Usage,
36
38
  )
37
39
  from anthropic.types import (
38
40
  Message as AnthropicMessage,
@@ -42,11 +44,7 @@ except ImportError as e:
42
44
 
43
45
  # Import Beta types
44
46
  try:
45
- from anthropic.types.beta import (
46
- BetaMessage,
47
- BetaRawContentBlockDeltaEvent,
48
- BetaTextDelta,
49
- )
47
+ from anthropic.types.beta import BetaRawContentBlockDeltaEvent, BetaTextDelta
50
48
  except ImportError as e:
51
49
  raise ImportError(
52
50
  "`anthropic` not installed or missing beta components. Please install with `pip install anthropic`"
@@ -176,85 +174,53 @@ class Claude(Model):
176
174
  request_kwargs["system"] = [{"text": system_message, "type": "text"}]
177
175
 
178
176
  if tools:
179
- request_kwargs["tools"] = self._format_tools_for_model(tools)
177
+ request_kwargs["tools"] = format_tools_for_model(tools)
180
178
 
181
179
  if request_kwargs:
182
180
  log_debug(f"Calling {self.provider} with request parameters: {request_kwargs}", log_level=2)
183
181
  return request_kwargs
184
182
 
185
- def _format_tools_for_model(self, tools: Optional[List[Dict[str, Any]]] = None) -> Optional[List[Dict[str, Any]]]:
186
- """
187
- Transforms function definitions into a format accepted by the Anthropic API.
188
- """
189
- if not tools:
190
- return None
191
-
192
- parsed_tools: List[Dict[str, Any]] = []
193
- for tool_def in tools:
194
- if tool_def.get("type", "") != "function":
195
- parsed_tools.append(tool_def)
196
- continue
197
-
198
- func_def = tool_def.get("function", {})
199
- parameters: Dict[str, Any] = func_def.get("parameters", {})
200
- properties: Dict[str, Any] = parameters.get("properties", {})
201
- required_params: List[str] = []
202
-
203
- for param_name, param_info in properties.items():
204
- param_type = param_info.get("type", "")
205
- param_type_list: List[str] = [param_type] if isinstance(param_type, str) else param_type or []
206
-
207
- if "null" not in param_type_list:
208
- required_params.append(param_name)
209
-
210
- input_properties: Dict[str, Dict[str, Union[str, List[str]]]] = {}
211
- for param_name, param_info in properties.items():
212
- input_properties[param_name] = {
213
- "description": param_info.get("description", ""),
214
- }
215
- if "type" not in param_info and "anyOf" in param_info:
216
- input_properties[param_name]["anyOf"] = param_info["anyOf"]
217
- else:
218
- input_properties[param_name]["type"] = param_info.get("type", "")
219
-
220
- tool = {
221
- "name": func_def.get("name") or "",
222
- "description": func_def.get("description") or "",
223
- "input_schema": {
224
- "type": parameters.get("type", "object"),
225
- "properties": input_properties,
226
- "required": required_params,
227
- },
228
- }
229
- parsed_tools.append(tool)
230
- return parsed_tools
231
-
232
183
  def invoke(
233
184
  self,
234
185
  messages: List[Message],
186
+ assistant_message: Message,
235
187
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
236
188
  tools: Optional[List[Dict[str, Any]]] = None,
237
189
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
238
- ) -> Union[AnthropicMessage, BetaMessage]:
190
+ run_response: Optional[RunOutput] = None,
191
+ ) -> ModelResponse:
239
192
  """
240
193
  Send a request to the Anthropic API to generate a response.
241
194
  """
242
195
  try:
196
+ if run_response and run_response.metrics:
197
+ run_response.metrics.set_time_to_first_token()
198
+
243
199
  chat_messages, system_message = format_messages(messages)
244
200
  request_kwargs = self._prepare_request_kwargs(system_message, tools)
245
201
 
246
202
  if self.mcp_servers is not None:
247
- return self.get_client().beta.messages.create(
203
+ assistant_message.metrics.start_timer()
204
+ provider_response = self.get_client().beta.messages.create(
248
205
  model=self.id,
249
206
  messages=chat_messages, # type: ignore
250
207
  **self.get_request_params(),
251
208
  )
252
209
  else:
253
- return self.get_client().messages.create(
210
+ assistant_message.metrics.start_timer()
211
+ provider_response = self.get_client().messages.create(
254
212
  model=self.id,
255
213
  messages=chat_messages, # type: ignore
256
214
  **request_kwargs,
257
215
  )
216
+
217
+ assistant_message.metrics.stop_timer()
218
+
219
+ # Parse the response into an Agno ModelResponse object
220
+ model_response = self._parse_provider_response(provider_response, response_format=response_format) # type: ignore
221
+
222
+ return model_response
223
+
258
224
  except APIConnectionError as e:
259
225
  log_error(f"Connection error while calling Claude API: {str(e)}")
260
226
  raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
@@ -273,9 +239,11 @@ class Claude(Model):
273
239
  def invoke_stream(
274
240
  self,
275
241
  messages: List[Message],
242
+ assistant_message: Message,
276
243
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
277
244
  tools: Optional[List[Dict[str, Any]]] = None,
278
245
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
246
+ run_response: Optional[RunOutput] = None,
279
247
  ) -> Any:
280
248
  """
281
249
  Stream a response from the Anthropic API.
@@ -295,26 +263,30 @@ class Claude(Model):
295
263
  request_kwargs = self._prepare_request_kwargs(system_message, tools)
296
264
 
297
265
  try:
266
+ if run_response and run_response.metrics:
267
+ run_response.metrics.set_time_to_first_token()
268
+
298
269
  if self.mcp_servers is not None:
299
- return (
300
- self.get_client()
301
- .beta.messages.stream(
302
- model=self.id,
303
- messages=chat_messages, # type: ignore
304
- **request_kwargs,
305
- )
306
- .__enter__()
307
- )
270
+ assistant_message.metrics.start_timer()
271
+ with self.get_client().beta.messages.stream(
272
+ model=self.id,
273
+ messages=chat_messages, # type: ignore
274
+ **request_kwargs,
275
+ ) as stream:
276
+ for chunk in stream:
277
+ yield self._parse_provider_response_delta(chunk) # type: ignore
308
278
  else:
309
- return (
310
- self.get_client()
311
- .messages.stream(
312
- model=self.id,
313
- messages=chat_messages, # type: ignore
314
- **request_kwargs,
315
- )
316
- .__enter__()
317
- )
279
+ assistant_message.metrics.start_timer()
280
+ with self.get_client().messages.stream(
281
+ model=self.id,
282
+ messages=chat_messages, # type: ignore
283
+ **request_kwargs,
284
+ ) as stream:
285
+ for chunk in stream: # type: ignore
286
+ yield self._parse_provider_response_delta(chunk) # type: ignore
287
+
288
+ assistant_message.metrics.stop_timer()
289
+
318
290
  except APIConnectionError as e:
319
291
  log_error(f"Connection error while calling Claude API: {str(e)}")
320
292
  raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
@@ -333,29 +305,44 @@ class Claude(Model):
333
305
  async def ainvoke(
334
306
  self,
335
307
  messages: List[Message],
308
+ assistant_message: Message,
336
309
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
337
310
  tools: Optional[List[Dict[str, Any]]] = None,
338
311
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
339
- ) -> Union[AnthropicMessage, BetaMessage]:
312
+ run_response: Optional[RunOutput] = None,
313
+ ) -> ModelResponse:
340
314
  """
341
315
  Send an asynchronous request to the Anthropic API to generate a response.
342
316
  """
343
317
  try:
318
+ if run_response and run_response.metrics:
319
+ run_response.metrics.set_time_to_first_token()
320
+
344
321
  chat_messages, system_message = format_messages(messages)
345
322
  request_kwargs = self._prepare_request_kwargs(system_message, tools)
346
323
 
347
324
  if self.mcp_servers is not None:
348
- return await self.get_async_client().beta.messages.create(
325
+ assistant_message.metrics.start_timer()
326
+ provider_response = await self.get_async_client().beta.messages.create(
349
327
  model=self.id,
350
328
  messages=chat_messages, # type: ignore
351
329
  **self.get_request_params(),
352
330
  )
353
331
  else:
354
- return await self.get_async_client().messages.create(
332
+ assistant_message.metrics.start_timer()
333
+ provider_response = await self.get_async_client().messages.create(
355
334
  model=self.id,
356
335
  messages=chat_messages, # type: ignore
357
336
  **request_kwargs,
358
337
  )
338
+
339
+ assistant_message.metrics.stop_timer()
340
+
341
+ # Parse the response into an Agno ModelResponse object
342
+ model_response = self._parse_provider_response(provider_response, response_format=response_format) # type: ignore
343
+
344
+ return model_response
345
+
359
346
  except APIConnectionError as e:
360
347
  log_error(f"Connection error while calling Claude API: {str(e)}")
361
348
  raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
@@ -374,44 +361,51 @@ class Claude(Model):
374
361
  async def ainvoke_stream(
375
362
  self,
376
363
  messages: List[Message],
364
+ assistant_message: Message,
377
365
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
378
366
  tools: Optional[List[Dict[str, Any]]] = None,
379
367
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
380
- ) -> AsyncIterator[Any]:
368
+ run_response: Optional[RunOutput] = None,
369
+ ) -> AsyncIterator[ModelResponse]:
381
370
  """
382
371
  Stream an asynchronous response from the Anthropic API.
383
-
384
372
  Args:
385
373
  messages (List[Message]): A list of messages to send to the model.
386
-
387
374
  Returns:
388
- Any: The streamed response from the model.
389
-
375
+ AsyncIterator[ModelResponse]: An async iterator of processed model responses.
390
376
  Raises:
391
377
  APIConnectionError: If there are network connectivity issues
392
378
  RateLimitError: If the API rate limit is exceeded
393
379
  APIStatusError: For other API-related errors
394
380
  """
395
381
  try:
382
+ if run_response and run_response.metrics:
383
+ run_response.metrics.set_time_to_first_token()
384
+
396
385
  chat_messages, system_message = format_messages(messages)
397
386
  request_kwargs = self._prepare_request_kwargs(system_message, tools)
398
387
 
399
388
  if self.mcp_servers is not None:
389
+ assistant_message.metrics.start_timer()
400
390
  async with self.get_async_client().beta.messages.stream(
401
391
  model=self.id,
402
392
  messages=chat_messages, # type: ignore
403
393
  **request_kwargs,
404
394
  ) as stream:
405
395
  async for chunk in stream:
406
- yield chunk
396
+ yield self._parse_provider_response_delta(chunk) # type: ignore
407
397
  else:
398
+ assistant_message.metrics.start_timer()
408
399
  async with self.get_async_client().messages.stream(
409
400
  model=self.id,
410
401
  messages=chat_messages, # type: ignore
411
402
  **request_kwargs,
412
403
  ) as stream:
413
404
  async for chunk in stream: # type: ignore
414
- yield chunk
405
+ yield self._parse_provider_response_delta(chunk) # type: ignore
406
+
407
+ assistant_message.metrics.stop_timer()
408
+
415
409
  except APIConnectionError as e:
416
410
  log_error(f"Connection error while calling Claude API: {str(e)}")
417
411
  raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
@@ -453,7 +447,7 @@ class Claude(Model):
453
447
  return tool_call_prompt
454
448
  return None
455
449
 
456
- def parse_provider_response(self, response: AnthropicMessage, **kwargs) -> ModelResponse:
450
+ def _parse_provider_response(self, response: AnthropicMessage, **kwargs) -> ModelResponse:
457
451
  """
458
452
  Parse the Claude response into a ModelResponse.
459
453
 
@@ -496,12 +490,12 @@ class Claude(Model):
496
490
  )
497
491
  )
498
492
  elif block.type == "thinking":
499
- model_response.thinking = block.thinking
493
+ model_response.reasoning_content = block.thinking
500
494
  model_response.provider_data = {
501
495
  "signature": block.signature,
502
496
  }
503
497
  elif block.type == "redacted_thinking":
504
- model_response.redacted_thinking = block.data
498
+ model_response.redacted_reasoning_content = block.data
505
499
 
506
500
  # Extract tool calls from the response
507
501
  if response.stop_reason == "tool_use":
@@ -515,6 +509,7 @@ class Claude(Model):
515
509
  function_def["arguments"] = json.dumps(tool_input)
516
510
 
517
511
  model_response.extra = model_response.extra or {}
512
+
518
513
  model_response.tool_calls.append(
519
514
  {
520
515
  "id": block.id,
@@ -525,23 +520,19 @@ class Claude(Model):
525
520
 
526
521
  # Add usage metrics
527
522
  if response.usage is not None:
528
- usage_dict = {
529
- "input_tokens": response.usage.input_tokens,
530
- "output_tokens": response.usage.output_tokens,
531
- }
532
-
533
- if hasattr(response.usage, "cache_creation_input_tokens") and response.usage.cache_creation_input_tokens:
534
- usage_dict["cache_write_tokens"] = response.usage.cache_creation_input_tokens
535
-
536
- if hasattr(response.usage, "cache_read_input_tokens") and response.usage.cache_read_input_tokens:
537
- usage_dict["cached_tokens"] = response.usage.cache_read_input_tokens
538
-
539
- model_response.response_usage = usage_dict
523
+ model_response.response_usage = self._get_metrics(response.usage)
540
524
 
541
525
  return model_response
542
526
 
543
- def parse_provider_response_delta(
544
- self, response: Union[ContentBlockStartEvent, ContentBlockDeltaEvent, ContentBlockStopEvent, MessageStopEvent]
527
+ def _parse_provider_response_delta(
528
+ self,
529
+ response: Union[
530
+ ContentBlockStartEvent,
531
+ ContentBlockDeltaEvent,
532
+ ContentBlockStopEvent,
533
+ MessageStopEvent,
534
+ BetaRawContentBlockDeltaEvent,
535
+ ],
545
536
  ) -> ModelResponse:
546
537
  """
547
538
  Parse the Claude streaming response into ModelProviderResponse objects.
@@ -553,9 +544,10 @@ class Claude(Model):
553
544
  ModelResponse: Iterator of parsed response data
554
545
  """
555
546
  model_response = ModelResponse()
547
+
556
548
  if isinstance(response, ContentBlockStartEvent):
557
- if response.content_block.type == "redacted_thinking":
558
- model_response.redacted_thinking = response.content_block.data
549
+ if response.content_block.type == "redacted_reasoning_content":
550
+ model_response.redacted_reasoning_content = response.content_block.data
559
551
 
560
552
  if isinstance(response, ContentBlockDeltaEvent):
561
553
  # Handle text content
@@ -563,23 +555,14 @@ class Claude(Model):
563
555
  model_response.content = response.delta.text
564
556
  # Handle thinking content
565
557
  elif response.delta.type == "thinking_delta":
566
- model_response.thinking = response.delta.thinking
558
+ model_response.reasoning_content = response.delta.thinking
567
559
  elif response.delta.type == "signature_delta":
568
560
  model_response.provider_data = {
569
561
  "signature": response.delta.signature,
570
562
  }
571
563
 
572
564
  elif isinstance(response, ContentBlockStopEvent):
573
- # Handle completed thinking content
574
- if response.content_block.type == "thinking": # type: ignore
575
- model_response.thinking = response.content_block.thinking # type: ignore
576
- # Store signature if available
577
- if hasattr(response.content_block, "signature"): # type: ignore
578
- model_response.provider_data = {
579
- "signature": response.content_block.signature, # type: ignore
580
- }
581
- # Handle tool calls
582
- elif response.content_block.type == "tool_use": # type: ignore
565
+ if response.content_block.type == "tool_use": # type: ignore
583
566
  tool_use = response.content_block # type: ignore
584
567
  tool_name = tool_use.name
585
568
  tool_input = tool_use.input
@@ -617,19 +600,8 @@ class Claude(Model):
617
600
  DocumentCitation(document_title=citation.document_title, cited_text=citation.cited_text)
618
601
  )
619
602
 
620
- if hasattr(response, "usage") and response.usage is not None:
621
- usage_dict = {
622
- "input_tokens": response.usage.input_tokens or 0,
623
- "output_tokens": response.usage.output_tokens or 0,
624
- }
625
-
626
- if hasattr(response.usage, "cache_creation_input_tokens") and response.usage.cache_creation_input_tokens:
627
- usage_dict["cache_write_tokens"] = response.usage.cache_creation_input_tokens
628
-
629
- if hasattr(response.usage, "cache_read_input_tokens") and response.usage.cache_read_input_tokens:
630
- usage_dict["cached_tokens"] = response.usage.cache_read_input_tokens
631
-
632
- model_response.response_usage = usage_dict
603
+ if hasattr(response, "message") and hasattr(response.message, "usage") and response.message.usage is not None: # type: ignore
604
+ model_response.response_usage = self._get_metrics(response.message.usage) # type: ignore
633
605
 
634
606
  # Capture the Beta response
635
607
  try:
@@ -643,3 +615,31 @@ class Claude(Model):
643
615
  log_error(f"Error parsing Beta response: {e}")
644
616
 
645
617
  return model_response
618
+
619
+ def _get_metrics(self, response_usage: Union[Usage, MessageDeltaUsage]) -> Metrics:
620
+ """
621
+ Parse the given Anthropic-specific usage into an Agno Metrics object.
622
+
623
+ Args:
624
+ response_usage: Usage data from Anthropic
625
+
626
+ Returns:
627
+ Metrics: Parsed metrics data
628
+ """
629
+ metrics = Metrics()
630
+
631
+ metrics.input_tokens = response_usage.input_tokens or 0
632
+ metrics.output_tokens = response_usage.output_tokens or 0
633
+ metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
634
+ metrics.cache_read_tokens = response_usage.cache_read_input_tokens or 0
635
+ metrics.cache_write_tokens = response_usage.cache_creation_input_tokens or 0
636
+
637
+ # Anthropic-specific additional fields
638
+ if response_usage.server_tool_use:
639
+ metrics.provider_metrics = {"server_tool_use": response_usage.server_tool_use}
640
+ if isinstance(response_usage, Usage):
641
+ if response_usage.service_tier:
642
+ metrics.provider_metrics = metrics.provider_metrics or {}
643
+ metrics.provider_metrics["service_tier"] = response_usage.service_tier
644
+
645
+ return metrics