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
@@ -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