agno 1.8.1__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 (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  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/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 +129 -82
  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 +38 -144
  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 +393 -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 +65 -28
  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 +33 -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 +30 -0
  184. agno/os/router.py +843 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +204 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +413 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +179 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +58 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +2961 -4253
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +42 -22
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +18 -13
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.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
16
  from agno.utils.models.claude import MCPServerConfiguration, format_messages
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`"
@@ -232,29 +230,44 @@ class Claude(Model):
232
230
  def invoke(
233
231
  self,
234
232
  messages: List[Message],
233
+ assistant_message: Message,
235
234
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
236
235
  tools: Optional[List[Dict[str, Any]]] = None,
237
236
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
238
- ) -> Union[AnthropicMessage, BetaMessage]:
237
+ run_response: Optional[RunOutput] = None,
238
+ ) -> ModelResponse:
239
239
  """
240
240
  Send a request to the Anthropic API to generate a response.
241
241
  """
242
242
  try:
243
+ if run_response and run_response.metrics:
244
+ run_response.metrics.set_time_to_first_token()
245
+
243
246
  chat_messages, system_message = format_messages(messages)
244
247
  request_kwargs = self._prepare_request_kwargs(system_message, tools)
245
248
 
246
249
  if self.mcp_servers is not None:
247
- return self.get_client().beta.messages.create(
250
+ assistant_message.metrics.start_timer()
251
+ provider_response = self.get_client().beta.messages.create(
248
252
  model=self.id,
249
253
  messages=chat_messages, # type: ignore
250
254
  **self.get_request_params(),
251
255
  )
252
256
  else:
253
- return self.get_client().messages.create(
257
+ assistant_message.metrics.start_timer()
258
+ provider_response = self.get_client().messages.create(
254
259
  model=self.id,
255
260
  messages=chat_messages, # type: ignore
256
261
  **request_kwargs,
257
262
  )
263
+
264
+ assistant_message.metrics.stop_timer()
265
+
266
+ # Parse the response into an Agno ModelResponse object
267
+ model_response = self._parse_provider_response(provider_response, response_format=response_format) # type: ignore
268
+
269
+ return model_response
270
+
258
271
  except APIConnectionError as e:
259
272
  log_error(f"Connection error while calling Claude API: {str(e)}")
260
273
  raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
@@ -273,9 +286,11 @@ class Claude(Model):
273
286
  def invoke_stream(
274
287
  self,
275
288
  messages: List[Message],
289
+ assistant_message: Message,
276
290
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
277
291
  tools: Optional[List[Dict[str, Any]]] = None,
278
292
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
293
+ run_response: Optional[RunOutput] = None,
279
294
  ) -> Any:
280
295
  """
281
296
  Stream a response from the Anthropic API.
@@ -295,26 +310,30 @@ class Claude(Model):
295
310
  request_kwargs = self._prepare_request_kwargs(system_message, tools)
296
311
 
297
312
  try:
313
+ if run_response and run_response.metrics:
314
+ run_response.metrics.set_time_to_first_token()
315
+
298
316
  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
- )
317
+ assistant_message.metrics.start_timer()
318
+ with self.get_client().beta.messages.stream(
319
+ model=self.id,
320
+ messages=chat_messages, # type: ignore
321
+ **request_kwargs,
322
+ ) as stream:
323
+ for chunk in stream:
324
+ yield self._parse_provider_response_delta(chunk) # type: ignore
308
325
  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
- )
326
+ assistant_message.metrics.start_timer()
327
+ with self.get_client().messages.stream(
328
+ model=self.id,
329
+ messages=chat_messages, # type: ignore
330
+ **request_kwargs,
331
+ ) as stream:
332
+ for chunk in stream: # type: ignore
333
+ yield self._parse_provider_response_delta(chunk) # type: ignore
334
+
335
+ assistant_message.metrics.stop_timer()
336
+
318
337
  except APIConnectionError as e:
319
338
  log_error(f"Connection error while calling Claude API: {str(e)}")
320
339
  raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
@@ -333,29 +352,44 @@ class Claude(Model):
333
352
  async def ainvoke(
334
353
  self,
335
354
  messages: List[Message],
355
+ assistant_message: Message,
336
356
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
337
357
  tools: Optional[List[Dict[str, Any]]] = None,
338
358
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
339
- ) -> Union[AnthropicMessage, BetaMessage]:
359
+ run_response: Optional[RunOutput] = None,
360
+ ) -> ModelResponse:
340
361
  """
341
362
  Send an asynchronous request to the Anthropic API to generate a response.
342
363
  """
343
364
  try:
365
+ if run_response and run_response.metrics:
366
+ run_response.metrics.set_time_to_first_token()
367
+
344
368
  chat_messages, system_message = format_messages(messages)
345
369
  request_kwargs = self._prepare_request_kwargs(system_message, tools)
346
370
 
347
371
  if self.mcp_servers is not None:
348
- return await self.get_async_client().beta.messages.create(
372
+ assistant_message.metrics.start_timer()
373
+ provider_response = await self.get_async_client().beta.messages.create(
349
374
  model=self.id,
350
375
  messages=chat_messages, # type: ignore
351
376
  **self.get_request_params(),
352
377
  )
353
378
  else:
354
- return await self.get_async_client().messages.create(
379
+ assistant_message.metrics.start_timer()
380
+ provider_response = await self.get_async_client().messages.create(
355
381
  model=self.id,
356
382
  messages=chat_messages, # type: ignore
357
383
  **request_kwargs,
358
384
  )
385
+
386
+ assistant_message.metrics.stop_timer()
387
+
388
+ # Parse the response into an Agno ModelResponse object
389
+ model_response = self._parse_provider_response(provider_response, response_format=response_format) # type: ignore
390
+
391
+ return model_response
392
+
359
393
  except APIConnectionError as e:
360
394
  log_error(f"Connection error while calling Claude API: {str(e)}")
361
395
  raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
@@ -374,44 +408,51 @@ class Claude(Model):
374
408
  async def ainvoke_stream(
375
409
  self,
376
410
  messages: List[Message],
411
+ assistant_message: Message,
377
412
  response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
378
413
  tools: Optional[List[Dict[str, Any]]] = None,
379
414
  tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
380
- ) -> AsyncIterator[Any]:
415
+ run_response: Optional[RunOutput] = None,
416
+ ) -> AsyncIterator[ModelResponse]:
381
417
  """
382
418
  Stream an asynchronous response from the Anthropic API.
383
-
384
419
  Args:
385
420
  messages (List[Message]): A list of messages to send to the model.
386
-
387
421
  Returns:
388
- Any: The streamed response from the model.
389
-
422
+ AsyncIterator[ModelResponse]: An async iterator of processed model responses.
390
423
  Raises:
391
424
  APIConnectionError: If there are network connectivity issues
392
425
  RateLimitError: If the API rate limit is exceeded
393
426
  APIStatusError: For other API-related errors
394
427
  """
395
428
  try:
429
+ if run_response and run_response.metrics:
430
+ run_response.metrics.set_time_to_first_token()
431
+
396
432
  chat_messages, system_message = format_messages(messages)
397
433
  request_kwargs = self._prepare_request_kwargs(system_message, tools)
398
434
 
399
435
  if self.mcp_servers is not None:
436
+ assistant_message.metrics.start_timer()
400
437
  async with self.get_async_client().beta.messages.stream(
401
438
  model=self.id,
402
439
  messages=chat_messages, # type: ignore
403
440
  **request_kwargs,
404
441
  ) as stream:
405
442
  async for chunk in stream:
406
- yield chunk
443
+ yield self._parse_provider_response_delta(chunk) # type: ignore
407
444
  else:
445
+ assistant_message.metrics.start_timer()
408
446
  async with self.get_async_client().messages.stream(
409
447
  model=self.id,
410
448
  messages=chat_messages, # type: ignore
411
449
  **request_kwargs,
412
450
  ) as stream:
413
451
  async for chunk in stream: # type: ignore
414
- yield chunk
452
+ yield self._parse_provider_response_delta(chunk) # type: ignore
453
+
454
+ assistant_message.metrics.stop_timer()
455
+
415
456
  except APIConnectionError as e:
416
457
  log_error(f"Connection error while calling Claude API: {str(e)}")
417
458
  raise ModelProviderError(message=e.message, model_name=self.name, model_id=self.id) from e
@@ -453,7 +494,7 @@ class Claude(Model):
453
494
  return tool_call_prompt
454
495
  return None
455
496
 
456
- def parse_provider_response(self, response: AnthropicMessage, **kwargs) -> ModelResponse:
497
+ def _parse_provider_response(self, response: AnthropicMessage, **kwargs) -> ModelResponse:
457
498
  """
458
499
  Parse the Claude response into a ModelResponse.
459
500
 
@@ -496,12 +537,12 @@ class Claude(Model):
496
537
  )
497
538
  )
498
539
  elif block.type == "thinking":
499
- model_response.thinking = block.thinking
540
+ model_response.reasoning_content = block.thinking
500
541
  model_response.provider_data = {
501
542
  "signature": block.signature,
502
543
  }
503
544
  elif block.type == "redacted_thinking":
504
- model_response.redacted_thinking = block.data
545
+ model_response.redacted_reasoning_content = block.data
505
546
 
506
547
  # Extract tool calls from the response
507
548
  if response.stop_reason == "tool_use":
@@ -515,6 +556,7 @@ class Claude(Model):
515
556
  function_def["arguments"] = json.dumps(tool_input)
516
557
 
517
558
  model_response.extra = model_response.extra or {}
559
+
518
560
  model_response.tool_calls.append(
519
561
  {
520
562
  "id": block.id,
@@ -525,23 +567,19 @@ class Claude(Model):
525
567
 
526
568
  # Add usage metrics
527
569
  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
570
+ model_response.response_usage = self._get_metrics(response.usage)
540
571
 
541
572
  return model_response
542
573
 
543
- def parse_provider_response_delta(
544
- self, response: Union[ContentBlockStartEvent, ContentBlockDeltaEvent, ContentBlockStopEvent, MessageStopEvent]
574
+ def _parse_provider_response_delta(
575
+ self,
576
+ response: Union[
577
+ ContentBlockStartEvent,
578
+ ContentBlockDeltaEvent,
579
+ ContentBlockStopEvent,
580
+ MessageStopEvent,
581
+ BetaRawContentBlockDeltaEvent,
582
+ ],
545
583
  ) -> ModelResponse:
546
584
  """
547
585
  Parse the Claude streaming response into ModelProviderResponse objects.
@@ -553,9 +591,10 @@ class Claude(Model):
553
591
  ModelResponse: Iterator of parsed response data
554
592
  """
555
593
  model_response = ModelResponse()
594
+
556
595
  if isinstance(response, ContentBlockStartEvent):
557
- if response.content_block.type == "redacted_thinking":
558
- model_response.redacted_thinking = response.content_block.data
596
+ if response.content_block.type == "redacted_reasoning_content":
597
+ model_response.redacted_reasoning_content = response.content_block.data
559
598
 
560
599
  if isinstance(response, ContentBlockDeltaEvent):
561
600
  # Handle text content
@@ -563,23 +602,14 @@ class Claude(Model):
563
602
  model_response.content = response.delta.text
564
603
  # Handle thinking content
565
604
  elif response.delta.type == "thinking_delta":
566
- model_response.thinking = response.delta.thinking
605
+ model_response.reasoning_content = response.delta.thinking
567
606
  elif response.delta.type == "signature_delta":
568
607
  model_response.provider_data = {
569
608
  "signature": response.delta.signature,
570
609
  }
571
610
 
572
611
  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
612
+ if response.content_block.type == "tool_use": # type: ignore
583
613
  tool_use = response.content_block # type: ignore
584
614
  tool_name = tool_use.name
585
615
  tool_input = tool_use.input
@@ -617,19 +647,8 @@ class Claude(Model):
617
647
  DocumentCitation(document_title=citation.document_title, cited_text=citation.cited_text)
618
648
  )
619
649
 
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
650
+ if hasattr(response, "message") and hasattr(response.message, "usage") and response.message.usage is not None: # type: ignore
651
+ model_response.response_usage = self._get_metrics(response.message.usage) # type: ignore
633
652
 
634
653
  # Capture the Beta response
635
654
  try:
@@ -643,3 +662,31 @@ class Claude(Model):
643
662
  log_error(f"Error parsing Beta response: {e}")
644
663
 
645
664
  return model_response
665
+
666
+ def _get_metrics(self, response_usage: Union[Usage, MessageDeltaUsage]) -> Metrics:
667
+ """
668
+ Parse the given Anthropic-specific usage into an Agno Metrics object.
669
+
670
+ Args:
671
+ response_usage: Usage data from Anthropic
672
+
673
+ Returns:
674
+ Metrics: Parsed metrics data
675
+ """
676
+ metrics = Metrics()
677
+
678
+ metrics.input_tokens = response_usage.input_tokens or 0
679
+ metrics.output_tokens = response_usage.output_tokens or 0
680
+ metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
681
+ metrics.cache_read_tokens = response_usage.cache_read_input_tokens or 0
682
+ metrics.cache_write_tokens = response_usage.cache_creation_input_tokens or 0
683
+
684
+ # Anthropic-specific additional fields
685
+ if response_usage.server_tool_use:
686
+ metrics.provider_metrics = {"server_tool_use": response_usage.server_tool_use}
687
+ if isinstance(response_usage, Usage):
688
+ if response_usage.service_tier:
689
+ metrics.provider_metrics = metrics.provider_metrics or {}
690
+ metrics.provider_metrics["service_tier"] = response_usage.service_tier
691
+
692
+ return metrics