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,5 @@
1
+ from agno.models.openrouter.openrouter import OpenRouter
2
+
3
+ __all__ = [
4
+ "OpenRouter",
5
+ ]
@@ -0,0 +1,66 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import Any, Dict, List, Optional, Type, Union
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from agno.models.openai.like import OpenAILike
8
+ from agno.run.agent import RunOutput
9
+
10
+
11
+ @dataclass
12
+ class OpenRouter(OpenAILike):
13
+ """
14
+ A class for using models hosted on OpenRouter.
15
+
16
+ Attributes:
17
+ id (str): The model id. Defaults to "gpt-4o".
18
+ name (str): The model name. Defaults to "OpenRouter".
19
+ provider (str): The provider name. Defaults to "OpenRouter".
20
+ api_key (Optional[str]): The API key.
21
+ base_url (str): The base URL. Defaults to "https://openrouter.ai/api/v1".
22
+ max_tokens (int): The maximum number of tokens. Defaults to 1024.
23
+ fallback_models (Optional[List[str]]): List of fallback model IDs to use if the primary model
24
+ fails due to rate limits, timeouts, or unavailability. OpenRouter will automatically try
25
+ these models in order. Example: ["anthropic/claude-sonnet-4", "deepseek/deepseek-r1"]
26
+ """
27
+
28
+ id: str = "gpt-4o"
29
+ name: str = "OpenRouter"
30
+ provider: str = "OpenRouter"
31
+
32
+ api_key: Optional[str] = field(default_factory=lambda: getenv("OPENROUTER_API_KEY"))
33
+ base_url: str = "https://openrouter.ai/api/v1"
34
+ max_tokens: int = 1024
35
+ models: Optional[List[str]] = None # Dynamic model routing https://openrouter.ai/docs/features/model-routing
36
+
37
+ def get_request_params(
38
+ self,
39
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
40
+ tools: Optional[List[Dict[str, Any]]] = None,
41
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
42
+ run_response: Optional[RunOutput] = None,
43
+ ) -> Dict[str, Any]:
44
+ """
45
+ Returns keyword arguments for API requests, including fallback models configuration.
46
+
47
+ Returns:
48
+ Dict[str, Any]: A dictionary of keyword arguments for API requests.
49
+ """
50
+ # Get base request params from parent class
51
+ request_params = super().get_request_params(
52
+ response_format=response_format, tools=tools, tool_choice=tool_choice, run_response=run_response
53
+ )
54
+
55
+ # Add fallback models to extra_body if specified
56
+ if self.models:
57
+ # Get existing extra_body or create new dict
58
+ extra_body = request_params.get("extra_body") or {}
59
+
60
+ # Merge fallback models into extra_body
61
+ extra_body["models"] = self.models
62
+
63
+ # Update request params
64
+ request_params["extra_body"] = extra_body
65
+
66
+ return request_params
@@ -0,0 +1,5 @@
1
+ from agno.models.perplexity.perplexity import Perplexity
2
+
3
+ __all__ = [
4
+ "Perplexity",
5
+ ]
@@ -0,0 +1,187 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import Any, Dict, Optional, Type, Union
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from agno.exceptions import ModelProviderError
8
+ from agno.models.message import Citations, UrlCitation
9
+ from agno.models.metrics import Metrics
10
+ from agno.models.response import ModelResponse
11
+ from agno.utils.log import log_debug, log_warning
12
+
13
+ try:
14
+ from openai.types.chat.chat_completion import ChatCompletion
15
+ from openai.types.chat.chat_completion_chunk import (
16
+ ChatCompletionChunk,
17
+ ChoiceDelta,
18
+ )
19
+ from openai.types.chat.parsed_chat_completion import ParsedChatCompletion
20
+ from openai.types.completion_usage import CompletionUsage
21
+ except ModuleNotFoundError:
22
+ raise ImportError("`openai` not installed. Please install using `pip install openai`")
23
+
24
+ from agno.models.openai.like import OpenAILike
25
+
26
+
27
+ @dataclass
28
+ class Perplexity(OpenAILike):
29
+ """
30
+ A class for using models hosted on Perplexity.
31
+
32
+ Attributes:
33
+ id (str): The model id. Defaults to "sonar".
34
+ name (str): The model name. Defaults to "Perplexity".
35
+ provider (str): The provider name. Defaults to "Perplexity".
36
+ api_key (Optional[str]): The API key.
37
+ base_url (str): The base URL. Defaults to "https://api.perplexity.ai/chat/completions".
38
+ max_tokens (int): The maximum number of tokens. Defaults to 1024.
39
+ """
40
+
41
+ id: str = "sonar"
42
+ name: str = "Perplexity"
43
+ provider: str = "Perplexity"
44
+
45
+ api_key: Optional[str] = field(default_factory=lambda: getenv("PERPLEXITY_API_KEY"))
46
+ base_url: str = "https://api.perplexity.ai/"
47
+ max_tokens: int = 1024
48
+ top_k: Optional[float] = None
49
+
50
+ supports_native_structured_outputs: bool = False
51
+ supports_json_schema_outputs: bool = True
52
+
53
+ def get_request_params(
54
+ self,
55
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
56
+ **kwargs: Any,
57
+ ) -> Dict[str, Any]:
58
+ """
59
+ Returns keyword arguments for API requests.
60
+ """
61
+ # Define base request parameters
62
+ base_params: Dict[str, Any] = {
63
+ "max_tokens": self.max_tokens,
64
+ "temperature": self.temperature,
65
+ "top_p": self.top_p,
66
+ "top_k": self.top_k,
67
+ "presence_penalty": self.presence_penalty,
68
+ "frequency_penalty": self.frequency_penalty,
69
+ }
70
+
71
+ if response_format is not None:
72
+ base_params["response_format"] = response_format
73
+
74
+ # Filter out None values
75
+ request_params = {k: v for k, v in base_params.items() if v is not None}
76
+ # Add additional request params if provided
77
+ if self.request_params:
78
+ request_params.update(self.request_params)
79
+
80
+ if request_params:
81
+ log_debug(f"Calling {self.provider} with request parameters: {request_params}", log_level=2)
82
+ return request_params
83
+
84
+ def parse_provider_response(self, response: Union[ChatCompletion, ParsedChatCompletion], **kwargs) -> ModelResponse:
85
+ """
86
+ Parse the Perplexity response into a ModelResponse.
87
+
88
+ Args:
89
+ response: Response from invoke() method
90
+
91
+ Returns:
92
+ ModelResponse: Parsed response data
93
+ """
94
+ model_response = ModelResponse()
95
+
96
+ if hasattr(response, "error") and response.error:
97
+ raise ModelProviderError(
98
+ message=response.error.get("message", "Unknown model error"),
99
+ model_name=self.name,
100
+ model_id=self.id,
101
+ )
102
+
103
+ # Get response message
104
+ response_message = response.choices[0].message
105
+
106
+ # Add role
107
+ if response_message.role is not None:
108
+ model_response.role = response_message.role
109
+
110
+ # Add content
111
+ if response_message.content is not None:
112
+ model_response.content = response_message.content
113
+
114
+ # Add tool calls
115
+ if response_message.tool_calls is not None and len(response_message.tool_calls) > 0:
116
+ try:
117
+ model_response.tool_calls = [t.model_dump() for t in response_message.tool_calls]
118
+ except Exception as e:
119
+ log_warning(f"Error processing tool calls: {e}")
120
+
121
+ # Add citations if present
122
+ if hasattr(response, "citations") and response.citations is not None:
123
+ model_response.citations = Citations(
124
+ urls=[UrlCitation(url=c) for c in response.citations],
125
+ )
126
+
127
+ if response.usage is not None:
128
+ model_response.response_usage = self._get_metrics(response.usage)
129
+
130
+ return model_response
131
+
132
+ def parse_provider_response_delta(self, response_delta: ChatCompletionChunk) -> ModelResponse:
133
+ """
134
+ Parse the Perplexity streaming response into a ModelResponse.
135
+
136
+ Args:
137
+ response_delta: Raw response chunk from Perplexity
138
+
139
+ Returns:
140
+ ProviderResponse: Iterator of parsed response data
141
+ """
142
+ model_response = ModelResponse()
143
+ if response_delta.choices and len(response_delta.choices) > 0:
144
+ choice_delta: ChoiceDelta = response_delta.choices[0].delta
145
+
146
+ if choice_delta:
147
+ # Add content
148
+ if choice_delta.content is not None:
149
+ model_response.content = choice_delta.content
150
+
151
+ # Add tool calls
152
+ if choice_delta.tool_calls is not None:
153
+ model_response.tool_calls = choice_delta.tool_calls # type: ignore
154
+
155
+ # Add citations if present
156
+ if hasattr(response_delta, "citations") and response_delta.citations is not None:
157
+ model_response.citations = Citations(
158
+ urls=[UrlCitation(url=c) for c in response_delta.citations],
159
+ )
160
+
161
+ # Add usage metrics if present
162
+ if response_delta.usage is not None:
163
+ model_response.response_usage = self._get_metrics(response_delta.usage)
164
+
165
+ return model_response
166
+
167
+ def _get_metrics(self, response_usage: CompletionUsage) -> Metrics:
168
+ """
169
+ Parse the given Perplexity usage into an Agno Metrics object.
170
+ """
171
+ metrics = Metrics()
172
+
173
+ metrics.input_tokens = response_usage.prompt_tokens or 0
174
+ metrics.output_tokens = response_usage.completion_tokens or 0
175
+ metrics.total_tokens = response_usage.total_tokens or 0
176
+
177
+ # Add the prompt_tokens_details field
178
+ if prompt_token_details := response_usage.prompt_tokens_details:
179
+ metrics.audio_input_tokens = prompt_token_details.audio_tokens or 0
180
+ metrics.cache_read_tokens = prompt_token_details.cached_tokens or 0
181
+
182
+ # Add the completion_tokens_details field
183
+ if completion_tokens_details := response_usage.completion_tokens_details:
184
+ metrics.audio_output_tokens = completion_tokens_details.audio_tokens or 0
185
+ metrics.reasoning_tokens = completion_tokens_details.reasoning_tokens or 0
186
+
187
+ return metrics
@@ -0,0 +1,3 @@
1
+ from agno.models.portkey.portkey import Portkey
2
+
3
+ __all__ = ["Portkey"]
@@ -0,0 +1,81 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import Any, Dict, Optional, cast
4
+
5
+ from agno.exceptions import ModelProviderError
6
+ from agno.models.openai.like import OpenAILike
7
+
8
+ try:
9
+ from portkey_ai import PORTKEY_GATEWAY_URL, createHeaders
10
+ except ImportError:
11
+ raise ImportError("`portkey-ai` not installed. Please install using `pip install portkey-ai`")
12
+
13
+
14
+ @dataclass
15
+ class Portkey(OpenAILike):
16
+ """
17
+ A class for using models through the Portkey AI Gateway.
18
+
19
+ Attributes:
20
+ id (str): The model id. Defaults to "gpt-4o-mini".
21
+ name (str): The model name. Defaults to "Portkey".
22
+ provider (str): The provider name. Defaults to "Portkey".
23
+ portkey_api_key (Optional[str]): The Portkey API key.
24
+ virtual_key (Optional[str]): The virtual key for model routing.
25
+ config (Optional[Dict[str, Any]]): Portkey configuration for routing, retries, etc.
26
+ base_url (str): The Portkey gateway URL.
27
+ """
28
+
29
+ id: str = "gpt-4o-mini"
30
+ name: str = "Portkey"
31
+ provider: str = "Portkey"
32
+
33
+ portkey_api_key: Optional[str] = field(default_factory=lambda: getenv("PORTKEY_API_KEY"))
34
+ virtual_key: Optional[str] = field(default_factory=lambda: getenv("PORTKEY_VIRTUAL_KEY"))
35
+ config: Optional[Dict[str, Any]] = None
36
+ base_url: str = PORTKEY_GATEWAY_URL
37
+
38
+ def _get_client_params(self) -> Dict[str, Any]:
39
+ # Check for required keys
40
+ if not self.portkey_api_key:
41
+ raise ModelProviderError(
42
+ message="PORTKEY_API_KEY not set. Please set the PORTKEY_API_KEY environment variable.",
43
+ model_name=self.name,
44
+ model_id=self.id,
45
+ )
46
+
47
+ # Create headers using Portkey's createHeaders function
48
+ header_params: Dict[str, Any] = {
49
+ "api_key": self.portkey_api_key,
50
+ "virtual_key": self.virtual_key,
51
+ }
52
+
53
+ if self.config is not None:
54
+ header_params["config"] = self.config
55
+
56
+ portkey_headers = cast(Dict[str, Any], createHeaders(**header_params))
57
+
58
+ # Merge with any existing default headers
59
+ default_headers: Dict[str, Any] = {}
60
+ if self.default_headers and isinstance(self.default_headers, dict):
61
+ default_headers.update(self.default_headers)
62
+ default_headers.update(portkey_headers)
63
+
64
+ # Define base client params
65
+ base_params = {
66
+ "api_key": "not-needed", # We use virtual keys instead
67
+ "organization": self.organization,
68
+ "base_url": self.base_url,
69
+ "timeout": self.timeout,
70
+ "max_retries": self.max_retries,
71
+ "default_headers": default_headers,
72
+ "default_query": self.default_query,
73
+ }
74
+
75
+ # Create client_params dict with non-None values
76
+ client_params = {k: v for k, v in base_params.items() if v is not None}
77
+
78
+ # Add additional client params if provided
79
+ if self.client_params:
80
+ client_params.update(self.client_params)
81
+ return client_params
@@ -0,0 +1,5 @@
1
+ from agno.models.requesty.requesty import Requesty
2
+
3
+ __all__ = [
4
+ "Requesty",
5
+ ]
@@ -0,0 +1,52 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import Any, Dict, List, Optional, Type, Union
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from agno.models.openai.like import OpenAILike
8
+ from agno.run.agent import RunOutput
9
+ from agno.run.team import TeamRunOutput
10
+
11
+
12
+ @dataclass
13
+ class Requesty(OpenAILike):
14
+ """
15
+ A class for using models hosted on Requesty.
16
+
17
+ Attributes:
18
+ id (str): The model id. Defaults to "openai/gpt-4.1".
19
+ provider (str): The provider name. Defaults to "Requesty".
20
+ api_key (Optional[str]): The API key.
21
+ base_url (str): The base URL. Defaults to "https://router.requesty.ai/v1".
22
+ max_tokens (int): The maximum number of tokens. Defaults to 1024.
23
+ """
24
+
25
+ id: str = "openai/gpt-4.1"
26
+ name: str = "Requesty"
27
+ provider: str = "Requesty"
28
+
29
+ api_key: Optional[str] = field(default_factory=lambda: getenv("REQUESTY_API_KEY"))
30
+ base_url: str = "https://router.requesty.ai/v1"
31
+ max_tokens: int = 1024
32
+
33
+ def get_request_params(
34
+ self,
35
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
36
+ tools: Optional[List[Dict[str, Any]]] = None,
37
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
38
+ run_response: Optional[Union[RunOutput, TeamRunOutput]] = None,
39
+ ) -> Dict[str, Any]:
40
+ params = super().get_request_params(
41
+ response_format=response_format, tools=tools, tool_choice=tool_choice, run_response=run_response
42
+ )
43
+
44
+ if "extra_body" not in params:
45
+ params["extra_body"] = {}
46
+ params["extra_body"]["requesty"] = {}
47
+ if run_response and run_response.user_id:
48
+ params["extra_body"]["requesty"]["user_id"] = run_response.user_id
49
+ if run_response and run_response.session_id:
50
+ params["extra_body"]["requesty"]["trace_id"] = run_response.session_id
51
+
52
+ return params
@@ -0,0 +1,199 @@
1
+ from dataclasses import asdict, dataclass, field
2
+ from enum import Enum
3
+ from time import time
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ from agno.media import Audio, File, Image, Video
7
+ from agno.models.message import Citations
8
+ from agno.models.metrics import Metrics
9
+ from agno.tools.function import UserInputField
10
+
11
+
12
+ class ModelResponseEvent(str, Enum):
13
+ """Events that can be sent by the model provider"""
14
+
15
+ tool_call_paused = "ToolCallPaused"
16
+ tool_call_started = "ToolCallStarted"
17
+ tool_call_completed = "ToolCallCompleted"
18
+ assistant_response = "AssistantResponse"
19
+
20
+
21
+ @dataclass
22
+ class ToolExecution:
23
+ """Execution of a tool"""
24
+
25
+ tool_call_id: Optional[str] = None
26
+ tool_name: Optional[str] = None
27
+ tool_args: Optional[Dict[str, Any]] = None
28
+ tool_call_error: Optional[bool] = None
29
+ result: Optional[str] = None
30
+ metrics: Optional[Metrics] = None
31
+
32
+ # In the case where a tool call creates a run of an agent/team/workflow
33
+ child_run_id: Optional[str] = None
34
+
35
+ # If True, the agent will stop executing after this tool call.
36
+ stop_after_tool_call: bool = False
37
+
38
+ created_at: int = int(time())
39
+
40
+ # User control flow requirements
41
+ requires_confirmation: Optional[bool] = None
42
+ confirmed: Optional[bool] = None
43
+ confirmation_note: Optional[str] = None
44
+
45
+ requires_user_input: Optional[bool] = None
46
+ user_input_schema: Optional[List[UserInputField]] = None
47
+ answered: Optional[bool] = None
48
+
49
+ external_execution_required: Optional[bool] = None
50
+
51
+ @property
52
+ def is_paused(self) -> bool:
53
+ return bool(self.requires_confirmation or self.requires_user_input or self.external_execution_required)
54
+
55
+ def to_dict(self) -> Dict[str, Any]:
56
+ _dict = asdict(self)
57
+ if self.metrics is not None:
58
+ _dict["metrics"] = self.metrics.to_dict()
59
+
60
+ if self.user_input_schema is not None:
61
+ _dict["user_input_schema"] = [field.to_dict() for field in self.user_input_schema]
62
+
63
+ return _dict
64
+
65
+ @classmethod
66
+ def from_dict(cls, data: Dict[str, Any]) -> "ToolExecution":
67
+ return cls(
68
+ tool_call_id=data.get("tool_call_id"),
69
+ tool_name=data.get("tool_name"),
70
+ tool_args=data.get("tool_args"),
71
+ tool_call_error=data.get("tool_call_error"),
72
+ result=data.get("result"),
73
+ child_run_id=data.get("child_run_id"),
74
+ stop_after_tool_call=data.get("stop_after_tool_call", False),
75
+ requires_confirmation=data.get("requires_confirmation"),
76
+ confirmed=data.get("confirmed"),
77
+ confirmation_note=data.get("confirmation_note"),
78
+ requires_user_input=data.get("requires_user_input"),
79
+ user_input_schema=[UserInputField.from_dict(field) for field in data.get("user_input_schema") or []]
80
+ if "user_input_schema" in data
81
+ else None,
82
+ external_execution_required=data.get("external_execution_required"),
83
+ metrics=Metrics(**(data.get("metrics", {}) or {})),
84
+ )
85
+
86
+
87
+ @dataclass
88
+ class ModelResponse:
89
+ """Response from the model provider"""
90
+
91
+ role: Optional[str] = None
92
+
93
+ content: Optional[Any] = None
94
+ parsed: Optional[Any] = None
95
+ audio: Optional[Audio] = None
96
+
97
+ # Unified media fields for LLM-generated and tool-generated media artifacts
98
+ images: Optional[List[Image]] = None
99
+ videos: Optional[List[Video]] = None
100
+ audios: Optional[List[Audio]] = None
101
+ files: Optional[List[File]] = None
102
+
103
+ # Model tool calls
104
+ tool_calls: List[Dict[str, Any]] = field(default_factory=list)
105
+
106
+ # Actual tool executions
107
+ tool_executions: Optional[List[ToolExecution]] = field(default_factory=list)
108
+
109
+ event: str = ModelResponseEvent.assistant_response.value
110
+
111
+ provider_data: Optional[Dict[str, Any]] = None
112
+
113
+ redacted_reasoning_content: Optional[str] = None
114
+ reasoning_content: Optional[str] = None
115
+
116
+ citations: Optional[Citations] = None
117
+
118
+ response_usage: Optional[Metrics] = None
119
+
120
+ created_at: int = int(time())
121
+
122
+ extra: Optional[Dict[str, Any]] = None
123
+
124
+ updated_session_state: Optional[Dict[str, Any]] = None
125
+
126
+ def to_dict(self) -> Dict[str, Any]:
127
+ """Serialize ModelResponse to dictionary for caching."""
128
+ _dict = asdict(self)
129
+
130
+ # Handle special serialization for audio
131
+ if self.audio is not None:
132
+ _dict["audio"] = self.audio.to_dict()
133
+
134
+ # Handle lists of media objects
135
+ if self.images is not None:
136
+ _dict["images"] = [img.to_dict() for img in self.images]
137
+ if self.videos is not None:
138
+ _dict["videos"] = [vid.to_dict() for vid in self.videos]
139
+ if self.audios is not None:
140
+ _dict["audios"] = [aud.to_dict() for aud in self.audios]
141
+ if self.files is not None:
142
+ _dict["files"] = [f.to_dict() for f in self.files]
143
+
144
+ # Handle tool executions
145
+ if self.tool_executions is not None:
146
+ _dict["tool_executions"] = [tool_execution.to_dict() for tool_execution in self.tool_executions]
147
+
148
+ # Handle response usage which might be a Pydantic BaseModel
149
+ response_usage = _dict.pop("response_usage", None)
150
+ if response_usage is not None:
151
+ try:
152
+ from pydantic import BaseModel
153
+
154
+ if isinstance(response_usage, BaseModel):
155
+ _dict["response_usage"] = response_usage.model_dump()
156
+ else:
157
+ _dict["response_usage"] = response_usage
158
+ except ImportError:
159
+ _dict["response_usage"] = response_usage
160
+
161
+ return _dict
162
+
163
+ @classmethod
164
+ def from_dict(cls, data: Dict[str, Any]) -> "ModelResponse":
165
+ """Reconstruct ModelResponse from cached dictionary."""
166
+ # Reconstruct media objects
167
+ if data.get("audio"):
168
+ data["audio"] = Audio(**data["audio"])
169
+
170
+ if data.get("images"):
171
+ data["images"] = [Image(**img) for img in data["images"]]
172
+ if data.get("videos"):
173
+ data["videos"] = [Video(**vid) for vid in data["videos"]]
174
+ if data.get("audios"):
175
+ data["audios"] = [Audio(**aud) for aud in data["audios"]]
176
+ if data.get("files"):
177
+ data["files"] = [File(**f) for f in data["files"]]
178
+
179
+ # Reconstruct tool executions
180
+ if data.get("tool_executions"):
181
+ data["tool_executions"] = [ToolExecution.from_dict(te) for te in data["tool_executions"]]
182
+
183
+ # Reconstruct citations
184
+ if data.get("citations") and isinstance(data["citations"], dict):
185
+ data["citations"] = Citations(**data["citations"])
186
+
187
+ # Reconstruct response usage (Metrics)
188
+ if data.get("response_usage") and isinstance(data["response_usage"], dict):
189
+ from agno.models.metrics import Metrics
190
+
191
+ data["response_usage"] = Metrics(**data["response_usage"])
192
+
193
+ return cls(**data)
194
+
195
+
196
+ class FileType(str, Enum):
197
+ MP4 = "mp4"
198
+ GIF = "gif"
199
+ MP3 = "mp3"
@@ -0,0 +1,5 @@
1
+ from agno.models.sambanova.sambanova import Sambanova
2
+
3
+ __all__ = [
4
+ "Sambanova",
5
+ ]
@@ -0,0 +1,28 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import Optional
4
+
5
+ from agno.models.openai.like import OpenAILike
6
+
7
+
8
+ @dataclass
9
+ class Sambanova(OpenAILike):
10
+ """
11
+ A class for interacting with Sambanova API.
12
+
13
+ Attributes:
14
+ id (str): The id of the Sambanova model to use. Default is "Meta-Llama-3.1-8B-Instruct".
15
+ name (str): The name of this chat model instance. Default is "Sambanova"
16
+ provider (str): The provider of the model. Default is "Sambanova".
17
+ api_key (str): The api key to authorize request to Sambanova.
18
+ base_url (str): The base url to which the requests are sent. Defaults to "https://api.sambanova.ai/v1".
19
+ """
20
+
21
+ id: str = "Meta-Llama-3.1-8B-Instruct"
22
+ name: str = "Sambanova"
23
+ provider: str = "Sambanova"
24
+
25
+ api_key: Optional[str] = field(default_factory=lambda: getenv("SAMBANOVA_API_KEY"))
26
+ base_url: str = "https://api.sambanova.ai/v1"
27
+
28
+ supports_native_structured_outputs: bool = False
@@ -0,0 +1,5 @@
1
+ from agno.models.siliconflow.siliconflow import Siliconflow
2
+
3
+ __all__ = [
4
+ "Siliconflow",
5
+ ]
@@ -0,0 +1,25 @@
1
+ from dataclasses import dataclass
2
+ from os import getenv
3
+ from typing import Optional
4
+
5
+ from agno.models.openai.like import OpenAILike
6
+
7
+
8
+ @dataclass
9
+ class Siliconflow(OpenAILike):
10
+ """
11
+ A class for interacting with Siliconflow API.
12
+
13
+ Attributes:
14
+ id (str): The id of the Siliconflow model to use. Default is "Qwen/QwQ-32B".
15
+ name (str): The name of this chat model instance. Default is "Siliconflow".
16
+ provider (str): The provider of the model. Default is "Siliconflow".
17
+ api_key (str): The api key to authorize request to Siliconflow.
18
+ base_url (str): The base url to which the requests are sent. Defaults to "https://api.siliconflow.cn/v1".
19
+ """
20
+
21
+ id: str = "Qwen/QwQ-32B"
22
+ name: str = "Siliconflow"
23
+ provider: str = "Siliconflow"
24
+ api_key: Optional[str] = getenv("SILICONFLOW_API_KEY")
25
+ base_url: str = "https://api.siliconflow.com/v1"
@@ -0,0 +1,5 @@
1
+ from agno.models.together.together import Together
2
+
3
+ __all__ = [
4
+ "Together",
5
+ ]