agno 2.2.13__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 (575) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +51 -0
  3. agno/agent/agent.py +10405 -0
  4. agno/api/__init__.py +0 -0
  5. agno/api/agent.py +28 -0
  6. agno/api/api.py +40 -0
  7. agno/api/evals.py +22 -0
  8. agno/api/os.py +17 -0
  9. agno/api/routes.py +13 -0
  10. agno/api/schemas/__init__.py +9 -0
  11. agno/api/schemas/agent.py +16 -0
  12. agno/api/schemas/evals.py +16 -0
  13. agno/api/schemas/os.py +14 -0
  14. agno/api/schemas/response.py +6 -0
  15. agno/api/schemas/team.py +16 -0
  16. agno/api/schemas/utils.py +21 -0
  17. agno/api/schemas/workflows.py +16 -0
  18. agno/api/settings.py +53 -0
  19. agno/api/team.py +30 -0
  20. agno/api/workflow.py +28 -0
  21. agno/cloud/aws/base.py +214 -0
  22. agno/cloud/aws/s3/__init__.py +2 -0
  23. agno/cloud/aws/s3/api_client.py +43 -0
  24. agno/cloud/aws/s3/bucket.py +195 -0
  25. agno/cloud/aws/s3/object.py +57 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +598 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2042 -0
  33. agno/db/dynamo/schemas.py +314 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +1795 -0
  37. agno/db/firestore/schemas.py +140 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1335 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1160 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1328 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/__init__.py +0 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/mongo/__init__.py +17 -0
  51. agno/db/mongo/async_mongo.py +2026 -0
  52. agno/db/mongo/mongo.py +1982 -0
  53. agno/db/mongo/schemas.py +87 -0
  54. agno/db/mongo/utils.py +259 -0
  55. agno/db/mysql/__init__.py +3 -0
  56. agno/db/mysql/mysql.py +2308 -0
  57. agno/db/mysql/schemas.py +138 -0
  58. agno/db/mysql/utils.py +355 -0
  59. agno/db/postgres/__init__.py +4 -0
  60. agno/db/postgres/async_postgres.py +1927 -0
  61. agno/db/postgres/postgres.py +2260 -0
  62. agno/db/postgres/schemas.py +139 -0
  63. agno/db/postgres/utils.py +442 -0
  64. agno/db/redis/__init__.py +3 -0
  65. agno/db/redis/redis.py +1660 -0
  66. agno/db/redis/schemas.py +123 -0
  67. agno/db/redis/utils.py +346 -0
  68. agno/db/schemas/__init__.py +4 -0
  69. agno/db/schemas/culture.py +120 -0
  70. agno/db/schemas/evals.py +33 -0
  71. agno/db/schemas/knowledge.py +40 -0
  72. agno/db/schemas/memory.py +46 -0
  73. agno/db/schemas/metrics.py +0 -0
  74. agno/db/singlestore/__init__.py +3 -0
  75. agno/db/singlestore/schemas.py +130 -0
  76. agno/db/singlestore/singlestore.py +2272 -0
  77. agno/db/singlestore/utils.py +384 -0
  78. agno/db/sqlite/__init__.py +4 -0
  79. agno/db/sqlite/async_sqlite.py +2293 -0
  80. agno/db/sqlite/schemas.py +133 -0
  81. agno/db/sqlite/sqlite.py +2288 -0
  82. agno/db/sqlite/utils.py +431 -0
  83. agno/db/surrealdb/__init__.py +3 -0
  84. agno/db/surrealdb/metrics.py +292 -0
  85. agno/db/surrealdb/models.py +309 -0
  86. agno/db/surrealdb/queries.py +71 -0
  87. agno/db/surrealdb/surrealdb.py +1353 -0
  88. agno/db/surrealdb/utils.py +147 -0
  89. agno/db/utils.py +116 -0
  90. agno/debug.py +18 -0
  91. agno/eval/__init__.py +14 -0
  92. agno/eval/accuracy.py +834 -0
  93. agno/eval/performance.py +773 -0
  94. agno/eval/reliability.py +306 -0
  95. agno/eval/utils.py +119 -0
  96. agno/exceptions.py +161 -0
  97. agno/filters.py +354 -0
  98. agno/guardrails/__init__.py +6 -0
  99. agno/guardrails/base.py +19 -0
  100. agno/guardrails/openai.py +144 -0
  101. agno/guardrails/pii.py +94 -0
  102. agno/guardrails/prompt_injection.py +52 -0
  103. agno/integrations/__init__.py +0 -0
  104. agno/integrations/discord/__init__.py +3 -0
  105. agno/integrations/discord/client.py +203 -0
  106. agno/knowledge/__init__.py +5 -0
  107. agno/knowledge/chunking/__init__.py +0 -0
  108. agno/knowledge/chunking/agentic.py +79 -0
  109. agno/knowledge/chunking/document.py +91 -0
  110. agno/knowledge/chunking/fixed.py +57 -0
  111. agno/knowledge/chunking/markdown.py +151 -0
  112. agno/knowledge/chunking/recursive.py +63 -0
  113. agno/knowledge/chunking/row.py +39 -0
  114. agno/knowledge/chunking/semantic.py +86 -0
  115. agno/knowledge/chunking/strategy.py +165 -0
  116. agno/knowledge/content.py +74 -0
  117. agno/knowledge/document/__init__.py +5 -0
  118. agno/knowledge/document/base.py +58 -0
  119. agno/knowledge/embedder/__init__.py +5 -0
  120. agno/knowledge/embedder/aws_bedrock.py +343 -0
  121. agno/knowledge/embedder/azure_openai.py +210 -0
  122. agno/knowledge/embedder/base.py +23 -0
  123. agno/knowledge/embedder/cohere.py +323 -0
  124. agno/knowledge/embedder/fastembed.py +62 -0
  125. agno/knowledge/embedder/fireworks.py +13 -0
  126. agno/knowledge/embedder/google.py +258 -0
  127. agno/knowledge/embedder/huggingface.py +94 -0
  128. agno/knowledge/embedder/jina.py +182 -0
  129. agno/knowledge/embedder/langdb.py +22 -0
  130. agno/knowledge/embedder/mistral.py +206 -0
  131. agno/knowledge/embedder/nebius.py +13 -0
  132. agno/knowledge/embedder/ollama.py +154 -0
  133. agno/knowledge/embedder/openai.py +195 -0
  134. agno/knowledge/embedder/sentence_transformer.py +63 -0
  135. agno/knowledge/embedder/together.py +13 -0
  136. agno/knowledge/embedder/vllm.py +262 -0
  137. agno/knowledge/embedder/voyageai.py +165 -0
  138. agno/knowledge/knowledge.py +1988 -0
  139. agno/knowledge/reader/__init__.py +7 -0
  140. agno/knowledge/reader/arxiv_reader.py +81 -0
  141. agno/knowledge/reader/base.py +95 -0
  142. agno/knowledge/reader/csv_reader.py +166 -0
  143. agno/knowledge/reader/docx_reader.py +82 -0
  144. agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
  145. agno/knowledge/reader/firecrawl_reader.py +201 -0
  146. agno/knowledge/reader/json_reader.py +87 -0
  147. agno/knowledge/reader/markdown_reader.py +137 -0
  148. agno/knowledge/reader/pdf_reader.py +431 -0
  149. agno/knowledge/reader/pptx_reader.py +101 -0
  150. agno/knowledge/reader/reader_factory.py +313 -0
  151. agno/knowledge/reader/s3_reader.py +89 -0
  152. agno/knowledge/reader/tavily_reader.py +194 -0
  153. agno/knowledge/reader/text_reader.py +115 -0
  154. agno/knowledge/reader/web_search_reader.py +372 -0
  155. agno/knowledge/reader/website_reader.py +455 -0
  156. agno/knowledge/reader/wikipedia_reader.py +59 -0
  157. agno/knowledge/reader/youtube_reader.py +78 -0
  158. agno/knowledge/remote_content/__init__.py +0 -0
  159. agno/knowledge/remote_content/remote_content.py +88 -0
  160. agno/knowledge/reranker/__init__.py +3 -0
  161. agno/knowledge/reranker/base.py +14 -0
  162. agno/knowledge/reranker/cohere.py +64 -0
  163. agno/knowledge/reranker/infinity.py +195 -0
  164. agno/knowledge/reranker/sentence_transformer.py +54 -0
  165. agno/knowledge/types.py +39 -0
  166. agno/knowledge/utils.py +189 -0
  167. agno/media.py +462 -0
  168. agno/memory/__init__.py +3 -0
  169. agno/memory/manager.py +1327 -0
  170. agno/models/__init__.py +0 -0
  171. agno/models/aimlapi/__init__.py +5 -0
  172. agno/models/aimlapi/aimlapi.py +45 -0
  173. agno/models/anthropic/__init__.py +5 -0
  174. agno/models/anthropic/claude.py +757 -0
  175. agno/models/aws/__init__.py +15 -0
  176. agno/models/aws/bedrock.py +701 -0
  177. agno/models/aws/claude.py +378 -0
  178. agno/models/azure/__init__.py +18 -0
  179. agno/models/azure/ai_foundry.py +485 -0
  180. agno/models/azure/openai_chat.py +131 -0
  181. agno/models/base.py +2175 -0
  182. agno/models/cerebras/__init__.py +12 -0
  183. agno/models/cerebras/cerebras.py +501 -0
  184. agno/models/cerebras/cerebras_openai.py +112 -0
  185. agno/models/cohere/__init__.py +5 -0
  186. agno/models/cohere/chat.py +389 -0
  187. agno/models/cometapi/__init__.py +5 -0
  188. agno/models/cometapi/cometapi.py +57 -0
  189. agno/models/dashscope/__init__.py +5 -0
  190. agno/models/dashscope/dashscope.py +91 -0
  191. agno/models/deepinfra/__init__.py +5 -0
  192. agno/models/deepinfra/deepinfra.py +28 -0
  193. agno/models/deepseek/__init__.py +5 -0
  194. agno/models/deepseek/deepseek.py +61 -0
  195. agno/models/defaults.py +1 -0
  196. agno/models/fireworks/__init__.py +5 -0
  197. agno/models/fireworks/fireworks.py +26 -0
  198. agno/models/google/__init__.py +5 -0
  199. agno/models/google/gemini.py +1085 -0
  200. agno/models/groq/__init__.py +5 -0
  201. agno/models/groq/groq.py +556 -0
  202. agno/models/huggingface/__init__.py +5 -0
  203. agno/models/huggingface/huggingface.py +491 -0
  204. agno/models/ibm/__init__.py +5 -0
  205. agno/models/ibm/watsonx.py +422 -0
  206. agno/models/internlm/__init__.py +3 -0
  207. agno/models/internlm/internlm.py +26 -0
  208. agno/models/langdb/__init__.py +1 -0
  209. agno/models/langdb/langdb.py +48 -0
  210. agno/models/litellm/__init__.py +14 -0
  211. agno/models/litellm/chat.py +468 -0
  212. agno/models/litellm/litellm_openai.py +25 -0
  213. agno/models/llama_cpp/__init__.py +5 -0
  214. agno/models/llama_cpp/llama_cpp.py +22 -0
  215. agno/models/lmstudio/__init__.py +5 -0
  216. agno/models/lmstudio/lmstudio.py +25 -0
  217. agno/models/message.py +434 -0
  218. agno/models/meta/__init__.py +12 -0
  219. agno/models/meta/llama.py +475 -0
  220. agno/models/meta/llama_openai.py +78 -0
  221. agno/models/metrics.py +120 -0
  222. agno/models/mistral/__init__.py +5 -0
  223. agno/models/mistral/mistral.py +432 -0
  224. agno/models/nebius/__init__.py +3 -0
  225. agno/models/nebius/nebius.py +54 -0
  226. agno/models/nexus/__init__.py +3 -0
  227. agno/models/nexus/nexus.py +22 -0
  228. agno/models/nvidia/__init__.py +5 -0
  229. agno/models/nvidia/nvidia.py +28 -0
  230. agno/models/ollama/__init__.py +5 -0
  231. agno/models/ollama/chat.py +441 -0
  232. agno/models/openai/__init__.py +9 -0
  233. agno/models/openai/chat.py +883 -0
  234. agno/models/openai/like.py +27 -0
  235. agno/models/openai/responses.py +1050 -0
  236. agno/models/openrouter/__init__.py +5 -0
  237. agno/models/openrouter/openrouter.py +66 -0
  238. agno/models/perplexity/__init__.py +5 -0
  239. agno/models/perplexity/perplexity.py +187 -0
  240. agno/models/portkey/__init__.py +3 -0
  241. agno/models/portkey/portkey.py +81 -0
  242. agno/models/requesty/__init__.py +5 -0
  243. agno/models/requesty/requesty.py +52 -0
  244. agno/models/response.py +199 -0
  245. agno/models/sambanova/__init__.py +5 -0
  246. agno/models/sambanova/sambanova.py +28 -0
  247. agno/models/siliconflow/__init__.py +5 -0
  248. agno/models/siliconflow/siliconflow.py +25 -0
  249. agno/models/together/__init__.py +5 -0
  250. agno/models/together/together.py +25 -0
  251. agno/models/utils.py +266 -0
  252. agno/models/vercel/__init__.py +3 -0
  253. agno/models/vercel/v0.py +26 -0
  254. agno/models/vertexai/__init__.py +0 -0
  255. agno/models/vertexai/claude.py +70 -0
  256. agno/models/vllm/__init__.py +3 -0
  257. agno/models/vllm/vllm.py +78 -0
  258. agno/models/xai/__init__.py +3 -0
  259. agno/models/xai/xai.py +113 -0
  260. agno/os/__init__.py +3 -0
  261. agno/os/app.py +876 -0
  262. agno/os/auth.py +57 -0
  263. agno/os/config.py +104 -0
  264. agno/os/interfaces/__init__.py +1 -0
  265. agno/os/interfaces/a2a/__init__.py +3 -0
  266. agno/os/interfaces/a2a/a2a.py +42 -0
  267. agno/os/interfaces/a2a/router.py +250 -0
  268. agno/os/interfaces/a2a/utils.py +924 -0
  269. agno/os/interfaces/agui/__init__.py +3 -0
  270. agno/os/interfaces/agui/agui.py +47 -0
  271. agno/os/interfaces/agui/router.py +144 -0
  272. agno/os/interfaces/agui/utils.py +534 -0
  273. agno/os/interfaces/base.py +25 -0
  274. agno/os/interfaces/slack/__init__.py +3 -0
  275. agno/os/interfaces/slack/router.py +148 -0
  276. agno/os/interfaces/slack/security.py +30 -0
  277. agno/os/interfaces/slack/slack.py +47 -0
  278. agno/os/interfaces/whatsapp/__init__.py +3 -0
  279. agno/os/interfaces/whatsapp/router.py +211 -0
  280. agno/os/interfaces/whatsapp/security.py +53 -0
  281. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  282. agno/os/mcp.py +292 -0
  283. agno/os/middleware/__init__.py +7 -0
  284. agno/os/middleware/jwt.py +233 -0
  285. agno/os/router.py +1763 -0
  286. agno/os/routers/__init__.py +3 -0
  287. agno/os/routers/evals/__init__.py +3 -0
  288. agno/os/routers/evals/evals.py +430 -0
  289. agno/os/routers/evals/schemas.py +142 -0
  290. agno/os/routers/evals/utils.py +162 -0
  291. agno/os/routers/health.py +31 -0
  292. agno/os/routers/home.py +52 -0
  293. agno/os/routers/knowledge/__init__.py +3 -0
  294. agno/os/routers/knowledge/knowledge.py +997 -0
  295. agno/os/routers/knowledge/schemas.py +178 -0
  296. agno/os/routers/memory/__init__.py +3 -0
  297. agno/os/routers/memory/memory.py +515 -0
  298. agno/os/routers/memory/schemas.py +62 -0
  299. agno/os/routers/metrics/__init__.py +3 -0
  300. agno/os/routers/metrics/metrics.py +190 -0
  301. agno/os/routers/metrics/schemas.py +47 -0
  302. agno/os/routers/session/__init__.py +3 -0
  303. agno/os/routers/session/session.py +997 -0
  304. agno/os/schema.py +1055 -0
  305. agno/os/settings.py +43 -0
  306. agno/os/utils.py +630 -0
  307. agno/py.typed +0 -0
  308. agno/reasoning/__init__.py +0 -0
  309. agno/reasoning/anthropic.py +80 -0
  310. agno/reasoning/azure_ai_foundry.py +67 -0
  311. agno/reasoning/deepseek.py +63 -0
  312. agno/reasoning/default.py +97 -0
  313. agno/reasoning/gemini.py +73 -0
  314. agno/reasoning/groq.py +71 -0
  315. agno/reasoning/helpers.py +63 -0
  316. agno/reasoning/ollama.py +67 -0
  317. agno/reasoning/openai.py +86 -0
  318. agno/reasoning/step.py +31 -0
  319. agno/reasoning/vertexai.py +76 -0
  320. agno/run/__init__.py +6 -0
  321. agno/run/agent.py +787 -0
  322. agno/run/base.py +229 -0
  323. agno/run/cancel.py +81 -0
  324. agno/run/messages.py +32 -0
  325. agno/run/team.py +753 -0
  326. agno/run/workflow.py +708 -0
  327. agno/session/__init__.py +10 -0
  328. agno/session/agent.py +295 -0
  329. agno/session/summary.py +265 -0
  330. agno/session/team.py +392 -0
  331. agno/session/workflow.py +205 -0
  332. agno/team/__init__.py +37 -0
  333. agno/team/team.py +8793 -0
  334. agno/tools/__init__.py +10 -0
  335. agno/tools/agentql.py +120 -0
  336. agno/tools/airflow.py +69 -0
  337. agno/tools/api.py +122 -0
  338. agno/tools/apify.py +314 -0
  339. agno/tools/arxiv.py +127 -0
  340. agno/tools/aws_lambda.py +53 -0
  341. agno/tools/aws_ses.py +66 -0
  342. agno/tools/baidusearch.py +89 -0
  343. agno/tools/bitbucket.py +292 -0
  344. agno/tools/brandfetch.py +213 -0
  345. agno/tools/bravesearch.py +106 -0
  346. agno/tools/brightdata.py +367 -0
  347. agno/tools/browserbase.py +209 -0
  348. agno/tools/calcom.py +255 -0
  349. agno/tools/calculator.py +151 -0
  350. agno/tools/cartesia.py +187 -0
  351. agno/tools/clickup.py +244 -0
  352. agno/tools/confluence.py +240 -0
  353. agno/tools/crawl4ai.py +158 -0
  354. agno/tools/csv_toolkit.py +185 -0
  355. agno/tools/dalle.py +110 -0
  356. agno/tools/daytona.py +475 -0
  357. agno/tools/decorator.py +262 -0
  358. agno/tools/desi_vocal.py +108 -0
  359. agno/tools/discord.py +161 -0
  360. agno/tools/docker.py +716 -0
  361. agno/tools/duckdb.py +379 -0
  362. agno/tools/duckduckgo.py +91 -0
  363. agno/tools/e2b.py +703 -0
  364. agno/tools/eleven_labs.py +196 -0
  365. agno/tools/email.py +67 -0
  366. agno/tools/evm.py +129 -0
  367. agno/tools/exa.py +396 -0
  368. agno/tools/fal.py +127 -0
  369. agno/tools/file.py +240 -0
  370. agno/tools/file_generation.py +350 -0
  371. agno/tools/financial_datasets.py +288 -0
  372. agno/tools/firecrawl.py +143 -0
  373. agno/tools/function.py +1187 -0
  374. agno/tools/giphy.py +93 -0
  375. agno/tools/github.py +1760 -0
  376. agno/tools/gmail.py +922 -0
  377. agno/tools/google_bigquery.py +117 -0
  378. agno/tools/google_drive.py +270 -0
  379. agno/tools/google_maps.py +253 -0
  380. agno/tools/googlecalendar.py +674 -0
  381. agno/tools/googlesearch.py +98 -0
  382. agno/tools/googlesheets.py +377 -0
  383. agno/tools/hackernews.py +77 -0
  384. agno/tools/jina.py +101 -0
  385. agno/tools/jira.py +170 -0
  386. agno/tools/knowledge.py +218 -0
  387. agno/tools/linear.py +426 -0
  388. agno/tools/linkup.py +58 -0
  389. agno/tools/local_file_system.py +90 -0
  390. agno/tools/lumalab.py +183 -0
  391. agno/tools/mcp/__init__.py +10 -0
  392. agno/tools/mcp/mcp.py +331 -0
  393. agno/tools/mcp/multi_mcp.py +347 -0
  394. agno/tools/mcp/params.py +24 -0
  395. agno/tools/mcp_toolbox.py +284 -0
  396. agno/tools/mem0.py +193 -0
  397. agno/tools/memori.py +339 -0
  398. agno/tools/memory.py +419 -0
  399. agno/tools/mlx_transcribe.py +139 -0
  400. agno/tools/models/__init__.py +0 -0
  401. agno/tools/models/azure_openai.py +190 -0
  402. agno/tools/models/gemini.py +203 -0
  403. agno/tools/models/groq.py +158 -0
  404. agno/tools/models/morph.py +186 -0
  405. agno/tools/models/nebius.py +124 -0
  406. agno/tools/models_labs.py +195 -0
  407. agno/tools/moviepy_video.py +349 -0
  408. agno/tools/neo4j.py +134 -0
  409. agno/tools/newspaper.py +46 -0
  410. agno/tools/newspaper4k.py +93 -0
  411. agno/tools/notion.py +204 -0
  412. agno/tools/openai.py +202 -0
  413. agno/tools/openbb.py +160 -0
  414. agno/tools/opencv.py +321 -0
  415. agno/tools/openweather.py +233 -0
  416. agno/tools/oxylabs.py +385 -0
  417. agno/tools/pandas.py +102 -0
  418. agno/tools/parallel.py +314 -0
  419. agno/tools/postgres.py +257 -0
  420. agno/tools/pubmed.py +188 -0
  421. agno/tools/python.py +205 -0
  422. agno/tools/reasoning.py +283 -0
  423. agno/tools/reddit.py +467 -0
  424. agno/tools/replicate.py +117 -0
  425. agno/tools/resend.py +62 -0
  426. agno/tools/scrapegraph.py +222 -0
  427. agno/tools/searxng.py +152 -0
  428. agno/tools/serpapi.py +116 -0
  429. agno/tools/serper.py +255 -0
  430. agno/tools/shell.py +53 -0
  431. agno/tools/slack.py +136 -0
  432. agno/tools/sleep.py +20 -0
  433. agno/tools/spider.py +116 -0
  434. agno/tools/sql.py +154 -0
  435. agno/tools/streamlit/__init__.py +0 -0
  436. agno/tools/streamlit/components.py +113 -0
  437. agno/tools/tavily.py +254 -0
  438. agno/tools/telegram.py +48 -0
  439. agno/tools/todoist.py +218 -0
  440. agno/tools/tool_registry.py +1 -0
  441. agno/tools/toolkit.py +146 -0
  442. agno/tools/trafilatura.py +388 -0
  443. agno/tools/trello.py +274 -0
  444. agno/tools/twilio.py +186 -0
  445. agno/tools/user_control_flow.py +78 -0
  446. agno/tools/valyu.py +228 -0
  447. agno/tools/visualization.py +467 -0
  448. agno/tools/webbrowser.py +28 -0
  449. agno/tools/webex.py +76 -0
  450. agno/tools/website.py +54 -0
  451. agno/tools/webtools.py +45 -0
  452. agno/tools/whatsapp.py +286 -0
  453. agno/tools/wikipedia.py +63 -0
  454. agno/tools/workflow.py +278 -0
  455. agno/tools/x.py +335 -0
  456. agno/tools/yfinance.py +257 -0
  457. agno/tools/youtube.py +184 -0
  458. agno/tools/zendesk.py +82 -0
  459. agno/tools/zep.py +454 -0
  460. agno/tools/zoom.py +382 -0
  461. agno/utils/__init__.py +0 -0
  462. agno/utils/agent.py +820 -0
  463. agno/utils/audio.py +49 -0
  464. agno/utils/certs.py +27 -0
  465. agno/utils/code_execution.py +11 -0
  466. agno/utils/common.py +132 -0
  467. agno/utils/dttm.py +13 -0
  468. agno/utils/enum.py +22 -0
  469. agno/utils/env.py +11 -0
  470. agno/utils/events.py +696 -0
  471. agno/utils/format_str.py +16 -0
  472. agno/utils/functions.py +166 -0
  473. agno/utils/gemini.py +426 -0
  474. agno/utils/hooks.py +57 -0
  475. agno/utils/http.py +74 -0
  476. agno/utils/json_schema.py +234 -0
  477. agno/utils/knowledge.py +36 -0
  478. agno/utils/location.py +19 -0
  479. agno/utils/log.py +255 -0
  480. agno/utils/mcp.py +214 -0
  481. agno/utils/media.py +352 -0
  482. agno/utils/merge_dict.py +41 -0
  483. agno/utils/message.py +118 -0
  484. agno/utils/models/__init__.py +0 -0
  485. agno/utils/models/ai_foundry.py +43 -0
  486. agno/utils/models/claude.py +358 -0
  487. agno/utils/models/cohere.py +87 -0
  488. agno/utils/models/llama.py +78 -0
  489. agno/utils/models/mistral.py +98 -0
  490. agno/utils/models/openai_responses.py +140 -0
  491. agno/utils/models/schema_utils.py +153 -0
  492. agno/utils/models/watsonx.py +41 -0
  493. agno/utils/openai.py +257 -0
  494. agno/utils/pickle.py +32 -0
  495. agno/utils/pprint.py +178 -0
  496. agno/utils/print_response/__init__.py +0 -0
  497. agno/utils/print_response/agent.py +842 -0
  498. agno/utils/print_response/team.py +1724 -0
  499. agno/utils/print_response/workflow.py +1668 -0
  500. agno/utils/prompts.py +111 -0
  501. agno/utils/reasoning.py +108 -0
  502. agno/utils/response.py +163 -0
  503. agno/utils/response_iterator.py +17 -0
  504. agno/utils/safe_formatter.py +24 -0
  505. agno/utils/serialize.py +32 -0
  506. agno/utils/shell.py +22 -0
  507. agno/utils/streamlit.py +487 -0
  508. agno/utils/string.py +231 -0
  509. agno/utils/team.py +139 -0
  510. agno/utils/timer.py +41 -0
  511. agno/utils/tools.py +102 -0
  512. agno/utils/web.py +23 -0
  513. agno/utils/whatsapp.py +305 -0
  514. agno/utils/yaml_io.py +25 -0
  515. agno/vectordb/__init__.py +3 -0
  516. agno/vectordb/base.py +127 -0
  517. agno/vectordb/cassandra/__init__.py +5 -0
  518. agno/vectordb/cassandra/cassandra.py +501 -0
  519. agno/vectordb/cassandra/extra_param_mixin.py +11 -0
  520. agno/vectordb/cassandra/index.py +13 -0
  521. agno/vectordb/chroma/__init__.py +5 -0
  522. agno/vectordb/chroma/chromadb.py +929 -0
  523. agno/vectordb/clickhouse/__init__.py +9 -0
  524. agno/vectordb/clickhouse/clickhousedb.py +835 -0
  525. agno/vectordb/clickhouse/index.py +9 -0
  526. agno/vectordb/couchbase/__init__.py +3 -0
  527. agno/vectordb/couchbase/couchbase.py +1442 -0
  528. agno/vectordb/distance.py +7 -0
  529. agno/vectordb/lancedb/__init__.py +6 -0
  530. agno/vectordb/lancedb/lance_db.py +995 -0
  531. agno/vectordb/langchaindb/__init__.py +5 -0
  532. agno/vectordb/langchaindb/langchaindb.py +163 -0
  533. agno/vectordb/lightrag/__init__.py +5 -0
  534. agno/vectordb/lightrag/lightrag.py +388 -0
  535. agno/vectordb/llamaindex/__init__.py +3 -0
  536. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  537. agno/vectordb/milvus/__init__.py +4 -0
  538. agno/vectordb/milvus/milvus.py +1182 -0
  539. agno/vectordb/mongodb/__init__.py +9 -0
  540. agno/vectordb/mongodb/mongodb.py +1417 -0
  541. agno/vectordb/pgvector/__init__.py +12 -0
  542. agno/vectordb/pgvector/index.py +23 -0
  543. agno/vectordb/pgvector/pgvector.py +1462 -0
  544. agno/vectordb/pineconedb/__init__.py +5 -0
  545. agno/vectordb/pineconedb/pineconedb.py +747 -0
  546. agno/vectordb/qdrant/__init__.py +5 -0
  547. agno/vectordb/qdrant/qdrant.py +1134 -0
  548. agno/vectordb/redis/__init__.py +9 -0
  549. agno/vectordb/redis/redisdb.py +694 -0
  550. agno/vectordb/search.py +7 -0
  551. agno/vectordb/singlestore/__init__.py +10 -0
  552. agno/vectordb/singlestore/index.py +41 -0
  553. agno/vectordb/singlestore/singlestore.py +763 -0
  554. agno/vectordb/surrealdb/__init__.py +3 -0
  555. agno/vectordb/surrealdb/surrealdb.py +699 -0
  556. agno/vectordb/upstashdb/__init__.py +5 -0
  557. agno/vectordb/upstashdb/upstashdb.py +718 -0
  558. agno/vectordb/weaviate/__init__.py +8 -0
  559. agno/vectordb/weaviate/index.py +15 -0
  560. agno/vectordb/weaviate/weaviate.py +1005 -0
  561. agno/workflow/__init__.py +23 -0
  562. agno/workflow/agent.py +299 -0
  563. agno/workflow/condition.py +738 -0
  564. agno/workflow/loop.py +735 -0
  565. agno/workflow/parallel.py +824 -0
  566. agno/workflow/router.py +702 -0
  567. agno/workflow/step.py +1432 -0
  568. agno/workflow/steps.py +592 -0
  569. agno/workflow/types.py +520 -0
  570. agno/workflow/workflow.py +4321 -0
  571. agno-2.2.13.dist-info/METADATA +614 -0
  572. agno-2.2.13.dist-info/RECORD +575 -0
  573. agno-2.2.13.dist-info/WHEEL +5 -0
  574. agno-2.2.13.dist-info/licenses/LICENSE +201 -0
  575. agno-2.2.13.dist-info/top_level.txt +1 -0
@@ -0,0 +1,491 @@
1
+ import json
2
+ from collections.abc import AsyncIterator
3
+ from dataclasses import asdict, dataclass
4
+ from os import getenv
5
+ from typing import Any, Dict, Iterator, List, Optional, Type, Union
6
+
7
+ import httpx
8
+ from huggingface_hub import ChatCompletionInputStreamOptions
9
+ from pydantic import BaseModel
10
+
11
+ from agno.exceptions import ModelProviderError
12
+ from agno.models.base import Model
13
+ from agno.models.message import Message
14
+ from agno.models.metrics import Metrics
15
+ from agno.models.response import ModelResponse
16
+ from agno.run.agent import RunOutput
17
+ from agno.utils.log import log_debug, log_error, log_warning
18
+
19
+ try:
20
+ from huggingface_hub import (
21
+ AsyncInferenceClient,
22
+ ChatCompletionOutput,
23
+ ChatCompletionOutputMessage,
24
+ ChatCompletionStreamOutput,
25
+ ChatCompletionStreamOutputDelta,
26
+ ChatCompletionStreamOutputDeltaToolCall,
27
+ InferenceClient,
28
+ )
29
+ from huggingface_hub.errors import InferenceTimeoutError
30
+ except ImportError:
31
+ raise ImportError("`huggingface_hub` not installed. Please install using `pip install huggingface_hub`")
32
+
33
+
34
+ @dataclass
35
+ class HuggingFace(Model):
36
+ """
37
+ A class for interacting with HuggingFace Hub Inference models.
38
+
39
+ For more information, see: https://huggingface.co/docs/api-inference/index
40
+ """
41
+
42
+ id: str = "meta-llama/Meta-Llama-3-8B-Instruct"
43
+ name: str = "HuggingFace"
44
+ provider: str = "HuggingFace"
45
+
46
+ # Request parameters
47
+ store: Optional[bool] = None
48
+ frequency_penalty: Optional[float] = None
49
+ logit_bias: Optional[Any] = None
50
+ logprobs: Optional[bool] = None
51
+ max_tokens: Optional[int] = None
52
+ presence_penalty: Optional[float] = None
53
+ seed: Optional[int] = None
54
+ stop: Optional[Union[str, List[str]]] = None
55
+ temperature: Optional[float] = None
56
+ top_logprobs: Optional[int] = None
57
+ top_p: Optional[float] = None
58
+ request_params: Optional[Dict[str, Any]] = None
59
+
60
+ # Client parameters
61
+ api_key: Optional[str] = None
62
+ base_url: Optional[Union[str, httpx.URL]] = None
63
+ timeout: Optional[float] = None
64
+ max_retries: Optional[int] = None
65
+ default_headers: Optional[Any] = None
66
+ default_query: Optional[Any] = None
67
+ client_params: Optional[Dict[str, Any]] = None
68
+
69
+ # HuggingFace Hub Inference clients
70
+ client: Optional[InferenceClient] = None
71
+ async_client: Optional[AsyncInferenceClient] = None
72
+
73
+ def get_client_params(self) -> Dict[str, Any]:
74
+ self.api_key = self.api_key or getenv("HF_TOKEN")
75
+ if not self.api_key:
76
+ log_error("HF_TOKEN not set. Please set the HF_TOKEN environment variable.")
77
+
78
+ _client_params: Dict[str, Any] = {}
79
+ if self.api_key is not None:
80
+ _client_params["api_key"] = self.api_key
81
+ if self.base_url is not None:
82
+ _client_params["base_url"] = self.base_url
83
+ if self.timeout is not None:
84
+ _client_params["timeout"] = self.timeout
85
+ if self.max_retries is not None:
86
+ _client_params["max_retries"] = self.max_retries
87
+ if self.default_headers is not None:
88
+ _client_params["default_headers"] = self.default_headers
89
+ if self.default_query is not None:
90
+ _client_params["default_query"] = self.default_query
91
+ if self.client_params is not None:
92
+ _client_params.update(self.client_params)
93
+ return _client_params
94
+
95
+ def get_client(self) -> InferenceClient:
96
+ """
97
+ Returns an HuggingFace Inference client.
98
+
99
+ Returns:
100
+ InferenceClient: An instance of the Inference client.
101
+ """
102
+ if self.client:
103
+ return self.client
104
+
105
+ _client_params: Dict[str, Any] = self.get_client_params()
106
+ self.client = InferenceClient(**_client_params)
107
+ return self.client
108
+
109
+ def get_async_client(self) -> AsyncInferenceClient:
110
+ """
111
+ Returns an asynchronous HuggingFace Hub client.
112
+
113
+ Returns:
114
+ AsyncInferenceClient: An instance of the asynchronous HuggingFace Inference client.
115
+ """
116
+ if self.async_client:
117
+ return self.async_client
118
+
119
+ _client_params: Dict[str, Any] = self.get_client_params()
120
+ self.async_client = AsyncInferenceClient(**_client_params)
121
+ return self.async_client
122
+
123
+ def get_request_params(
124
+ self, tools: Optional[List[Dict[str, Any]]] = None, tool_choice: Optional[Union[str, Dict[str, Any]]] = None
125
+ ) -> Dict[str, Any]:
126
+ """
127
+ Returns keyword arguments for inference model client requests.
128
+
129
+ Returns:
130
+ Dict[str, Any]: A dictionary of keyword arguments for inference model client requests.
131
+ """
132
+ _request_params: Dict[str, Any] = {}
133
+ if self.store is not None:
134
+ _request_params["store"] = self.store
135
+ if self.frequency_penalty is not None:
136
+ _request_params["frequency_penalty"] = self.frequency_penalty
137
+ if self.logit_bias is not None:
138
+ _request_params["logit_bias"] = self.logit_bias
139
+ if self.logprobs is not None:
140
+ _request_params["logprobs"] = self.logprobs
141
+ if self.max_tokens is not None:
142
+ _request_params["max_tokens"] = self.max_tokens
143
+ if self.presence_penalty is not None:
144
+ _request_params["presence_penalty"] = self.presence_penalty
145
+ if self.seed is not None:
146
+ _request_params["seed"] = self.seed
147
+ if self.stop is not None:
148
+ _request_params["stop"] = self.stop
149
+ if self.temperature is not None:
150
+ _request_params["temperature"] = self.temperature
151
+ if self.top_logprobs is not None:
152
+ _request_params["top_logprobs"] = self.top_logprobs
153
+ if self.top_p is not None:
154
+ _request_params["top_p"] = self.top_p
155
+ if tools is not None:
156
+ _request_params["tools"] = tools
157
+ if tool_choice is None:
158
+ _request_params["tool_choice"] = "auto"
159
+ else:
160
+ _request_params["tool_choice"] = tool_choice
161
+ if self.request_params is not None:
162
+ _request_params.update(self.request_params)
163
+
164
+ if _request_params:
165
+ log_debug(f"Calling {self.provider} with request parameters: {_request_params}", log_level=2)
166
+ return _request_params
167
+
168
+ def to_dict(self) -> Dict[str, Any]:
169
+ """
170
+ Convert the model to a dictionary.
171
+
172
+ Returns:
173
+ Dict[str, Any]: The dictionary representation of the model.
174
+ """
175
+ _dict = super().to_dict()
176
+ _dict.update(
177
+ {
178
+ "store": self.store,
179
+ "frequency_penalty": self.frequency_penalty,
180
+ "logit_bias": self.logit_bias,
181
+ "logprobs": self.logprobs,
182
+ "max_tokens": self.max_tokens,
183
+ "presence_penalty": self.presence_penalty,
184
+ "seed": self.seed,
185
+ "stop": self.stop,
186
+ "temperature": self.temperature,
187
+ "top_logprobs": self.top_logprobs,
188
+ "top_p": self.top_p,
189
+ }
190
+ )
191
+ cleaned_dict = {k: v for k, v in _dict.items() if v is not None}
192
+ return cleaned_dict
193
+
194
+ def _format_message(self, message: Message) -> Dict[str, Any]:
195
+ """
196
+ Format a message into the format expected by HuggingFace.
197
+
198
+ Args:
199
+ message (Message): The message to format.
200
+
201
+ Returns:
202
+ Dict[str, Any]: The formatted message.
203
+ """
204
+ message_dict: Dict[str, Any] = {
205
+ "role": message.role,
206
+ "content": message.content if message.content is not None else "",
207
+ "name": message.name or message.tool_name,
208
+ "tool_call_id": message.tool_call_id,
209
+ "tool_calls": message.tool_calls,
210
+ }
211
+
212
+ message_dict = {k: v for k, v in message_dict.items() if v is not None}
213
+
214
+ if message.tool_calls is None or len(message.tool_calls) == 0:
215
+ message_dict["tool_calls"] = None
216
+
217
+ if message.audio is not None and len(message.audio) > 0:
218
+ log_warning("Audio input is currently unsupported.")
219
+
220
+ if message.files is not None and len(message.files) > 0:
221
+ log_warning("File input is currently unsupported.")
222
+
223
+ if message.images is not None and len(message.images) > 0:
224
+ log_warning("Image input is currently unsupported.")
225
+
226
+ if message.videos is not None and len(message.videos) > 0:
227
+ log_warning("Video input is currently unsupported.")
228
+
229
+ return message_dict
230
+
231
+ def invoke(
232
+ self,
233
+ messages: List[Message],
234
+ assistant_message: Message,
235
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
236
+ tools: Optional[List[Dict[str, Any]]] = None,
237
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
238
+ run_response: Optional[RunOutput] = None,
239
+ ) -> ModelResponse:
240
+ """
241
+ Send a chat completion request to the HuggingFace Hub.
242
+ """
243
+ try:
244
+ if run_response and run_response.metrics:
245
+ run_response.metrics.set_time_to_first_token()
246
+
247
+ assistant_message.metrics.start_timer()
248
+ provider_response = self.get_client().chat.completions.create(
249
+ model=self.id,
250
+ messages=[self._format_message(m) for m in messages],
251
+ **self.get_request_params(tools=tools, tool_choice=tool_choice),
252
+ )
253
+ assistant_message.metrics.stop_timer()
254
+
255
+ return self._parse_provider_response(provider_response, response_format=response_format)
256
+
257
+ except InferenceTimeoutError as e:
258
+ log_error(f"Error invoking HuggingFace model: {e}")
259
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
260
+ except Exception as e:
261
+ log_error(f"Unexpected error invoking HuggingFace model: {e}")
262
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
263
+
264
+ async def ainvoke(
265
+ self,
266
+ messages: List[Message],
267
+ assistant_message: Message,
268
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
269
+ tools: Optional[List[Dict[str, Any]]] = None,
270
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
271
+ run_response: Optional[RunOutput] = None,
272
+ ) -> ModelResponse:
273
+ """
274
+ Sends an asynchronous chat completion request to the HuggingFace Hub Inference.
275
+ """
276
+ try:
277
+ if run_response and run_response.metrics:
278
+ run_response.metrics.set_time_to_first_token()
279
+
280
+ assistant_message.metrics.start_timer()
281
+ provider_response = await self.get_async_client().chat.completions.create(
282
+ model=self.id,
283
+ messages=[self._format_message(m) for m in messages],
284
+ **self.get_request_params(tools=tools, tool_choice=tool_choice),
285
+ )
286
+ assistant_message.metrics.stop_timer()
287
+
288
+ return self._parse_provider_response(provider_response, response_format=response_format)
289
+
290
+ except InferenceTimeoutError as e:
291
+ log_error(f"Error invoking HuggingFace model: {e}")
292
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
293
+ except Exception as e:
294
+ log_error(f"Unexpected error invoking HuggingFace model: {e}")
295
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
296
+
297
+ def invoke_stream(
298
+ self,
299
+ messages: List[Message],
300
+ assistant_message: Message,
301
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
302
+ tools: Optional[List[Dict[str, Any]]] = None,
303
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
304
+ run_response: Optional[RunOutput] = None,
305
+ ) -> Iterator[ModelResponse]:
306
+ """
307
+ Send a streaming chat completion request to the HuggingFace API.
308
+ """
309
+ try:
310
+ if run_response and run_response.metrics:
311
+ run_response.metrics.set_time_to_first_token()
312
+
313
+ assistant_message.metrics.start_timer()
314
+
315
+ stream = self.get_client().chat.completions.create(
316
+ model=self.id,
317
+ messages=[self._format_message(m) for m in messages],
318
+ stream=True,
319
+ stream_options=ChatCompletionInputStreamOptions(include_usage=True), # type: ignore
320
+ **self.get_request_params(tools=tools, tool_choice=tool_choice),
321
+ )
322
+
323
+ for chunk in stream:
324
+ yield self._parse_provider_response_delta(chunk)
325
+
326
+ assistant_message.metrics.stop_timer()
327
+
328
+ except InferenceTimeoutError as e:
329
+ log_error(f"Error invoking HuggingFace model: {e}")
330
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
331
+ except Exception as e:
332
+ log_error(f"Unexpected error invoking HuggingFace model: {e}")
333
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
334
+
335
+ async def ainvoke_stream(
336
+ self,
337
+ messages: List[Message],
338
+ assistant_message: Message,
339
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
340
+ tools: Optional[List[Dict[str, Any]]] = None,
341
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
342
+ run_response: Optional[RunOutput] = None,
343
+ ) -> AsyncIterator[Any]:
344
+ """
345
+ Sends an asynchronous streaming chat completion request to the HuggingFace API.
346
+ """
347
+ try:
348
+ if run_response and run_response.metrics:
349
+ run_response.metrics.set_time_to_first_token()
350
+
351
+ assistant_message.metrics.start_timer()
352
+ provider_response = await self.get_async_client().chat.completions.create(
353
+ model=self.id,
354
+ messages=[self._format_message(m) for m in messages],
355
+ stream=True,
356
+ stream_options=ChatCompletionInputStreamOptions(include_usage=True), # type: ignore
357
+ **self.get_request_params(tools=tools, tool_choice=tool_choice),
358
+ )
359
+
360
+ async for chunk in provider_response:
361
+ yield self._parse_provider_response_delta(chunk)
362
+
363
+ assistant_message.metrics.stop_timer()
364
+
365
+ except InferenceTimeoutError as e:
366
+ log_error(f"Error invoking HuggingFace model: {e}")
367
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
368
+ except Exception as e:
369
+ log_error(f"Unexpected error invoking HuggingFace model: {e}")
370
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
371
+
372
+ # Override base method
373
+ @staticmethod
374
+ def parse_tool_calls(tool_calls_data: List[ChatCompletionStreamOutputDeltaToolCall]) -> List[Dict[str, Any]]:
375
+ """
376
+ Build tool calls from streamed tool call data.
377
+
378
+ Args:
379
+ tool_calls_data (List[ChatCompletionStreamOutputDeltaToolCall]): The tool call data to build from.
380
+
381
+ Returns:
382
+ List[Dict[str, Any]]: The built tool calls.
383
+ """
384
+ tool_calls: List[Dict[str, Any]] = []
385
+ for tool_call in tool_calls_data:
386
+ _tool_call = tool_call[0]
387
+ _index = _tool_call.index
388
+ _tool_call_id = _tool_call.id
389
+ _tool_call_type = _tool_call.type
390
+ _function_name = _tool_call.function.name if _tool_call.function else None
391
+ _function_arguments = _tool_call.function.arguments if _tool_call.function else None
392
+
393
+ if len(tool_calls) <= _index:
394
+ tool_calls.extend([{}] * (_index - len(tool_calls) + 1))
395
+ tool_call_entry = tool_calls[_index]
396
+ if not tool_call_entry:
397
+ tool_call_entry["id"] = _tool_call_id
398
+ tool_call_entry["type"] = _tool_call_type
399
+ tool_call_entry["function"] = {
400
+ "name": _function_name or "",
401
+ "arguments": _function_arguments or "",
402
+ }
403
+ else:
404
+ if _function_name:
405
+ tool_call_entry["function"]["name"] += _function_name
406
+ if _function_arguments:
407
+ tool_call_entry["function"]["arguments"] += _function_arguments
408
+ if _tool_call_id:
409
+ tool_call_entry["id"] = _tool_call_id
410
+ if _tool_call_type:
411
+ tool_call_entry["type"] = _tool_call_type
412
+ return tool_calls
413
+
414
+ def _parse_provider_response(
415
+ self,
416
+ response: ChatCompletionOutput,
417
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
418
+ ) -> ModelResponse:
419
+ """
420
+ Parse the provider response into a ModelResponse.
421
+ """
422
+ model_response = ModelResponse()
423
+
424
+ response_message: ChatCompletionOutputMessage = response.choices[0].message
425
+
426
+ model_response.role = response_message.role
427
+ if response_message.content is not None:
428
+ model_response.content = response_message.content
429
+
430
+ if response_message.tool_calls is not None and len(response_message.tool_calls) > 0:
431
+ model_response.tool_calls = [asdict(t) for t in response_message.tool_calls]
432
+ for tool_call in model_response.tool_calls:
433
+ if isinstance(tool_call["function"]["arguments"], dict):
434
+ tool_call["function"]["arguments"] = json.dumps(tool_call["function"]["arguments"])
435
+
436
+ try:
437
+ if (
438
+ response_format is not None
439
+ and isinstance(response_format, type)
440
+ and issubclass(response_format, BaseModel)
441
+ ):
442
+ parsed_object = response_message.parsed # type: ignore
443
+ if parsed_object is not None:
444
+ model_response.parsed = parsed_object
445
+ except Exception as e:
446
+ log_warning(f"Error retrieving structured outputs: {e}")
447
+
448
+ if response.usage is not None:
449
+ model_response.response_usage = self._get_metrics(response)
450
+
451
+ return model_response
452
+
453
+ def _parse_provider_response_delta(self, response_delta: ChatCompletionStreamOutput) -> ModelResponse:
454
+ """
455
+ Parse the provider response delta into a ModelResponse.
456
+ """
457
+ model_response = ModelResponse()
458
+ if response_delta.choices and len(response_delta.choices) > 0:
459
+ response_delta_message: ChatCompletionStreamOutputDelta = response_delta.choices[0].delta
460
+
461
+ model_response.role = response_delta_message.role
462
+
463
+ if response_delta_message.content is not None:
464
+ model_response.content = response_delta_message.content
465
+ if response_delta_message.tool_calls is not None and len(response_delta_message.tool_calls) > 0:
466
+ model_response.tool_calls = [response_delta_message.tool_calls] # type: ignore
467
+ if response_delta.usage is not None:
468
+ model_response.response_usage = self._get_metrics(response_delta)
469
+
470
+ return model_response
471
+
472
+ def _get_metrics(self, response: Union[ChatCompletionOutput, ChatCompletionStreamOutput]) -> Metrics:
473
+ """
474
+ Parse the given HuggingFace-specific usage into an Agno Metrics object.
475
+
476
+ Args:
477
+ response: The HuggingFace response to parse.
478
+
479
+ Returns:
480
+ Metrics: Parsed metrics data
481
+ """
482
+ metrics = Metrics()
483
+
484
+ if not response.usage:
485
+ return metrics
486
+
487
+ metrics.input_tokens = response.usage.prompt_tokens or 0
488
+ metrics.output_tokens = response.usage.completion_tokens or 0
489
+ metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
490
+
491
+ return metrics
@@ -0,0 +1,5 @@
1
+ from agno.models.ibm.watsonx import WatsonX
2
+
3
+ __all__ = [
4
+ "WatsonX",
5
+ ]