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,389 @@
1
+ from dataclasses import dataclass
2
+ from os import getenv
3
+ from typing import Any, AsyncIterator, Dict, Iterator, List, Optional, Tuple, Type, Union
4
+
5
+ from pydantic import BaseModel
6
+
7
+ from agno.exceptions import ModelProviderError
8
+ from agno.models.base import Model
9
+ from agno.models.message import Message
10
+ from agno.models.metrics import Metrics
11
+ from agno.models.response import ModelResponse
12
+ from agno.run.agent import RunOutput
13
+ from agno.utils.log import log_debug, log_error
14
+ from agno.utils.models.cohere import format_messages
15
+
16
+ try:
17
+ from cohere import AsyncClientV2 as CohereAsyncClient
18
+ from cohere import ClientV2 as CohereClient
19
+ from cohere.v2.types.v2chat_response import V2ChatResponse
20
+ from cohere.v2.types.v2chat_stream_response import V2ChatStreamResponse
21
+ except ImportError:
22
+ raise ImportError("`cohere` not installed. Please install using `pip install cohere`")
23
+
24
+
25
+ @dataclass
26
+ class Cohere(Model):
27
+ """
28
+ A class representing the Cohere model.
29
+
30
+ For more information, see: https://docs.cohere.com/docs/chat-api
31
+ """
32
+
33
+ id: str = "command-r-plus"
34
+ name: str = "cohere"
35
+ provider: str = "Cohere"
36
+
37
+ # -*- Request parameters
38
+ temperature: Optional[float] = None
39
+ max_tokens: Optional[int] = None
40
+ top_k: Optional[int] = None
41
+ top_p: Optional[float] = None
42
+ seed: Optional[int] = None
43
+ frequency_penalty: Optional[float] = None
44
+ presence_penalty: Optional[float] = None
45
+ logprobs: Optional[bool] = None
46
+ request_params: Optional[Dict[str, Any]] = None
47
+ strict_tools: bool = False
48
+ # Add chat history to the cohere messages instead of using the conversation_id
49
+ add_chat_history: bool = False
50
+ # -*- Client parameters
51
+ api_key: Optional[str] = None
52
+ client_params: Optional[Dict[str, Any]] = None
53
+ # -*- Provide the Cohere client manually
54
+ client: Optional[CohereClient] = None
55
+ async_client: Optional[CohereAsyncClient] = None
56
+
57
+ def get_client(self) -> CohereClient:
58
+ if self.client:
59
+ return self.client
60
+
61
+ _client_params: Dict[str, Any] = {}
62
+
63
+ self.api_key = self.api_key or getenv("CO_API_KEY")
64
+ if not self.api_key:
65
+ log_error("CO_API_KEY not set. Please set the CO_API_KEY environment variable.")
66
+
67
+ _client_params["api_key"] = self.api_key
68
+
69
+ self.client = CohereClient(**_client_params)
70
+ return self.client # type: ignore
71
+
72
+ def get_async_client(self) -> CohereAsyncClient:
73
+ if self.async_client:
74
+ return self.async_client
75
+
76
+ _client_params: Dict[str, Any] = {}
77
+
78
+ self.api_key = self.api_key or getenv("CO_API_KEY")
79
+
80
+ if not self.api_key:
81
+ log_error("CO_API_KEY not set. Please set the CO_API_KEY environment variable.")
82
+
83
+ _client_params["api_key"] = self.api_key
84
+
85
+ self.async_client = CohereAsyncClient(**_client_params)
86
+ return self.async_client # type: ignore
87
+
88
+ def get_request_params(
89
+ self,
90
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
91
+ tools: Optional[List[Dict[str, Any]]] = None,
92
+ ) -> Dict[str, Any]:
93
+ _request_params: Dict[str, Any] = {}
94
+ if self.temperature:
95
+ _request_params["temperature"] = self.temperature
96
+ if self.max_tokens:
97
+ _request_params["max_tokens"] = self.max_tokens
98
+ if self.top_k:
99
+ _request_params["k"] = self.top_k
100
+ if self.top_p:
101
+ _request_params["p"] = self.top_p
102
+ if self.seed:
103
+ _request_params["seed"] = self.seed
104
+ if self.logprobs:
105
+ _request_params["logprobs"] = self.logprobs
106
+ if self.frequency_penalty:
107
+ _request_params["frequency_penalty"] = self.frequency_penalty
108
+ if self.presence_penalty:
109
+ _request_params["presence_penalty"] = self.presence_penalty
110
+
111
+ if response_format:
112
+ _request_params["response_format"] = response_format
113
+
114
+ # Format tools
115
+ if tools is not None and len(tools) > 0:
116
+ formatted_tools = []
117
+ for tool in tools:
118
+ if tool.get("type") == "function" and "function" in tool:
119
+ # Extract only the fields that Cohere supports
120
+ filtered_tool = {
121
+ "type": "function",
122
+ "function": {
123
+ "name": tool["function"]["name"],
124
+ "description": tool["function"]["description"],
125
+ "parameters": tool["function"]["parameters"],
126
+ },
127
+ }
128
+ formatted_tools.append(filtered_tool)
129
+ else:
130
+ # For non-function tools, pass them through as-is
131
+ formatted_tools.append(tool)
132
+
133
+ _request_params["tools"] = formatted_tools
134
+ # Fix optional parameters where the "type" is [type, null]
135
+ for tool in _request_params["tools"]: # type: ignore
136
+ if "parameters" in tool["function"] and "properties" in tool["function"]["parameters"]: # type: ignore
137
+ params = tool["function"]["parameters"]
138
+ # Cohere requires at least one required parameter, so if unset, set it to all parameters
139
+ if len(params.get("required", [])) == 0:
140
+ params["required"] = list(params["properties"].keys())
141
+ _request_params["strict_tools"] = self.strict_tools
142
+
143
+ if self.request_params:
144
+ _request_params.update(self.request_params)
145
+
146
+ if _request_params:
147
+ log_debug(f"Calling {self.provider} with request parameters: {_request_params}", log_level=2)
148
+ return _request_params
149
+
150
+ def invoke(
151
+ self,
152
+ messages: List[Message],
153
+ assistant_message: Message,
154
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
155
+ tools: Optional[List[Dict[str, Any]]] = None,
156
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
157
+ run_response: Optional[RunOutput] = None,
158
+ ) -> ModelResponse:
159
+ """
160
+ Invoke a non-streamed chat response from the Cohere API.
161
+ """
162
+ request_kwargs = self.get_request_params(response_format=response_format, tools=tools)
163
+
164
+ try:
165
+ if run_response and run_response.metrics:
166
+ run_response.metrics.set_time_to_first_token()
167
+
168
+ assistant_message.metrics.start_timer()
169
+ provider_response = self.get_client().chat(
170
+ model=self.id,
171
+ messages=format_messages(messages), # type: ignore
172
+ **request_kwargs,
173
+ ) # type: ignore
174
+ assistant_message.metrics.stop_timer()
175
+
176
+ model_response = self._parse_provider_response(provider_response, response_format=response_format)
177
+
178
+ return model_response
179
+
180
+ except Exception as e:
181
+ log_error(f"Unexpected error calling Cohere API: {str(e)}")
182
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
183
+
184
+ def invoke_stream(
185
+ self,
186
+ messages: List[Message],
187
+ assistant_message: Message,
188
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
189
+ tools: Optional[List[Dict[str, Any]]] = None,
190
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
191
+ run_response: Optional[RunOutput] = None,
192
+ ) -> Iterator[ModelResponse]:
193
+ """
194
+ Invoke a streamed chat response from the Cohere API.
195
+ """
196
+ request_kwargs = self.get_request_params(response_format=response_format, tools=tools)
197
+
198
+ try:
199
+ if run_response and run_response.metrics:
200
+ run_response.metrics.set_time_to_first_token()
201
+
202
+ tool_use: Dict[str, Any] = {}
203
+
204
+ assistant_message.metrics.start_timer()
205
+
206
+ for response in self.get_client().chat_stream(
207
+ model=self.id,
208
+ messages=format_messages(messages), # type: ignore
209
+ **request_kwargs,
210
+ ):
211
+ model_response, tool_use = self._parse_provider_response_delta(response, tool_use=tool_use)
212
+ yield model_response
213
+
214
+ assistant_message.metrics.stop_timer()
215
+
216
+ except Exception as e:
217
+ log_error(f"Unexpected error calling Cohere API: {str(e)}")
218
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
219
+
220
+ async def ainvoke(
221
+ self,
222
+ messages: List[Message],
223
+ assistant_message: Message,
224
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
225
+ tools: Optional[List[Dict[str, Any]]] = None,
226
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
227
+ run_response: Optional[RunOutput] = None,
228
+ ) -> ModelResponse:
229
+ """
230
+ Asynchronously invoke a non-streamed chat response from the Cohere API.
231
+ """
232
+ request_kwargs = self.get_request_params(response_format=response_format, tools=tools)
233
+
234
+ try:
235
+ if run_response and run_response.metrics:
236
+ run_response.metrics.set_time_to_first_token()
237
+
238
+ assistant_message.metrics.start_timer()
239
+ provider_response = await self.get_async_client().chat(
240
+ model=self.id,
241
+ messages=format_messages(messages), # type: ignore
242
+ **request_kwargs,
243
+ )
244
+ assistant_message.metrics.stop_timer()
245
+
246
+ model_response = self._parse_provider_response(provider_response, response_format=response_format)
247
+
248
+ return model_response
249
+
250
+ except Exception as e:
251
+ log_error(f"Unexpected error calling Cohere API: {str(e)}")
252
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
253
+
254
+ async def ainvoke_stream(
255
+ self,
256
+ messages: List[Message],
257
+ assistant_message: Message,
258
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
259
+ tools: Optional[List[Dict[str, Any]]] = None,
260
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
261
+ run_response: Optional[RunOutput] = None,
262
+ ) -> AsyncIterator[ModelResponse]:
263
+ """
264
+ Asynchronously invoke a streamed chat response from the Cohere API.
265
+ """
266
+ request_kwargs = self.get_request_params(response_format=response_format, tools=tools)
267
+
268
+ try:
269
+ if run_response and run_response.metrics:
270
+ run_response.metrics.set_time_to_first_token()
271
+
272
+ tool_use: Dict[str, Any] = {}
273
+
274
+ assistant_message.metrics.start_timer()
275
+
276
+ async for response in self.get_async_client().chat_stream(
277
+ model=self.id,
278
+ messages=format_messages(messages), # type: ignore
279
+ **request_kwargs,
280
+ ):
281
+ model_response, tool_use = self._parse_provider_response_delta(response, tool_use=tool_use)
282
+ yield model_response
283
+
284
+ assistant_message.metrics.stop_timer()
285
+
286
+ except Exception as e:
287
+ log_error(f"Unexpected error calling Cohere API: {str(e)}")
288
+ raise ModelProviderError(message=str(e), model_name=self.name, model_id=self.id) from e
289
+
290
+ def _parse_provider_response(self, response: V2ChatResponse, **kwargs) -> ModelResponse:
291
+ """
292
+ Parse the model provider response.
293
+
294
+ Args:
295
+ response (V2ChatResponse): The response from the Cohere API.
296
+ """
297
+ model_response = ModelResponse()
298
+
299
+ model_response.role = response.message.role
300
+
301
+ response_message = response.message
302
+ if response_message.content is not None:
303
+ full_content = ""
304
+ for item in response_message.content:
305
+ if hasattr(item, "text") and item.text is not None: # type: ignore
306
+ full_content += item.text # type: ignore
307
+ model_response.content = full_content
308
+
309
+ if response_message.tool_calls is not None:
310
+ model_response.tool_calls = [t.model_dump() for t in response_message.tool_calls]
311
+
312
+ if response.usage is not None:
313
+ model_response.response_usage = self._get_metrics(response.usage)
314
+
315
+ return model_response
316
+
317
+ def _parse_provider_response_delta(
318
+ self, response: V2ChatStreamResponse, tool_use: Dict[str, Any]
319
+ ) -> Tuple[ModelResponse, Dict[str, Any]]: # type: ignore
320
+ """
321
+ Parse the streaming response from the model provider into ModelResponse objects.
322
+
323
+ Args:
324
+ response: Raw response chunk from the model provider
325
+
326
+ Returns:
327
+ ModelResponse: Parsed response delta
328
+ """
329
+ model_response = ModelResponse()
330
+
331
+ # 1. Add content
332
+ if (
333
+ response.type == "content-delta"
334
+ and response.delta is not None
335
+ and response.delta.message is not None
336
+ and response.delta.message.content is not None
337
+ and response.delta.message.content.text is not None
338
+ ):
339
+ model_response.content = response.delta.message.content.text
340
+
341
+ # 2. Add tool calls information
342
+
343
+ # 2.1 Add starting tool call
344
+ elif response.type == "tool-call-start" and response.delta is not None:
345
+ if response.delta.message is not None and response.delta.message.tool_calls is not None:
346
+ tool_use = response.delta.message.tool_calls.model_dump()
347
+
348
+ # 2.2 Add tool call delta
349
+ elif response.type == "tool-call-delta" and response.delta is not None:
350
+ if (
351
+ response.delta.message is not None
352
+ and response.delta.message.tool_calls is not None
353
+ and response.delta.message.tool_calls.function is not None
354
+ and response.delta.message.tool_calls.function.arguments is not None
355
+ ):
356
+ tool_use["function"]["arguments"] += response.delta.message.tool_calls.function.arguments
357
+
358
+ # 2.3 Add ending tool call
359
+ elif response.type == "tool-call-end":
360
+ model_response.tool_calls = [tool_use]
361
+
362
+ # 3. Add metrics
363
+ elif (
364
+ response.type == "message-end"
365
+ and response.delta is not None
366
+ and response.delta.usage is not None
367
+ and response.delta.usage.tokens is not None
368
+ ):
369
+ model_response.response_usage = self._get_metrics(response.delta.usage) # type: ignore
370
+
371
+ return model_response, tool_use
372
+
373
+ def _get_metrics(self, response_usage) -> Metrics:
374
+ """
375
+ Parse the given Cohere usage into an Agno Metrics object.
376
+
377
+ Args:
378
+ response_usage: Usage data from Cohere
379
+
380
+ Returns:
381
+ Metrics: Parsed metrics data
382
+ """
383
+ metrics = Metrics()
384
+
385
+ metrics.input_tokens = response_usage.tokens.input_tokens or 0
386
+ metrics.output_tokens = response_usage.tokens.output_tokens or 0
387
+ metrics.total_tokens = metrics.input_tokens + metrics.output_tokens
388
+
389
+ return metrics
@@ -0,0 +1,5 @@
1
+ from agno.models.cometapi.cometapi import CometAPI
2
+
3
+ __all__ = [
4
+ "CometAPI",
5
+ ]
@@ -0,0 +1,57 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import List, Optional
4
+
5
+ import httpx
6
+
7
+ from agno.models.openai.like import OpenAILike
8
+ from agno.utils.log import log_debug
9
+
10
+
11
+ @dataclass
12
+ class CometAPI(OpenAILike):
13
+ """
14
+ The CometAPI class provides access to multiple AI model providers
15
+ (GPT, Claude, Gemini, DeepSeek, etc.) through OpenAI-compatible endpoints.
16
+
17
+ Args:
18
+ id (str): The id of the CometAPI model to use. Default is "gpt-5-mini".
19
+ name (str): The name for this model. Defaults to "CometAPI".
20
+ api_key (str): The API key for CometAPI. Defaults to COMETAPI_KEY environment variable.
21
+ base_url (str): The base URL for CometAPI. Defaults to "https://api.cometapi.com/v1".
22
+ """
23
+
24
+ name: str = "CometAPI"
25
+ id: str = "gpt-5-mini"
26
+ api_key: Optional[str] = field(default_factory=lambda: getenv("COMETAPI_KEY"))
27
+ base_url: str = "https://api.cometapi.com/v1"
28
+
29
+ def get_available_models(self) -> List[str]:
30
+ """
31
+ Fetch available chat models from CometAPI, filtering out non-chat models.
32
+
33
+ Returns:
34
+ List of available chat model IDs
35
+ """
36
+ if not self.api_key:
37
+ log_debug("No API key provided, returning empty model list")
38
+ return []
39
+
40
+ try:
41
+ with httpx.Client() as client:
42
+ response = client.get(
43
+ f"{self.base_url}/models",
44
+ headers={"Authorization": f"Bearer {self.api_key}", "Accept": "application/json"},
45
+ timeout=30.0,
46
+ )
47
+ response.raise_for_status()
48
+
49
+ data = response.json()
50
+ all_models = data.get("data", [])
51
+
52
+ log_debug(f"Found {len(all_models)} total models")
53
+ return sorted(all_models)
54
+
55
+ except Exception as e:
56
+ log_debug(f"Error fetching models from CometAPI: {e}")
57
+ return []
@@ -0,0 +1,5 @@
1
+ from agno.models.dashscope.dashscope import DashScope
2
+
3
+ __all__ = [
4
+ "DashScope",
5
+ ]
@@ -0,0 +1,91 @@
1
+ from dataclasses import dataclass
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.exceptions import ModelProviderError
8
+ from agno.models.openai.like import OpenAILike
9
+
10
+
11
+ @dataclass
12
+ class DashScope(OpenAILike):
13
+ """
14
+ A class for interacting with Qwen models via DashScope API.
15
+
16
+ Attributes:
17
+ id (str): The model id. Defaults to "qwen-plus".
18
+ name (str): The model name. Defaults to "Qwen".
19
+ provider (str): The provider name. Defaults to "Qwen".
20
+ api_key (Optional[str]): The DashScope API key.
21
+ base_url (str): The base URL. Defaults to "https://dashscope-intl.aliyuncs.com/compatible-mode/v1".
22
+ enable_thinking (bool): Enable thinking process (DashScope native parameter). Defaults to False.
23
+ include_thoughts (Optional[bool]): Include thinking process in response (alternative parameter). Defaults to None.
24
+ """
25
+
26
+ id: str = "qwen-plus"
27
+ name: str = "Qwen"
28
+ provider: str = "Dashscope"
29
+
30
+ api_key: Optional[str] = getenv("DASHSCOPE_API_KEY") or getenv("QWEN_API_KEY")
31
+ base_url: str = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
32
+
33
+ # Thinking parameters
34
+ enable_thinking: bool = False
35
+ include_thoughts: Optional[bool] = None
36
+ thinking_budget: Optional[int] = None
37
+
38
+ # DashScope supports structured outputs
39
+ supports_native_structured_outputs: bool = True
40
+ supports_json_schema_outputs: bool = True
41
+
42
+ def _get_client_params(self) -> Dict[str, Any]:
43
+ if not self.api_key:
44
+ self.api_key = getenv("DASHSCOPE_API_KEY")
45
+ if not self.api_key:
46
+ raise ModelProviderError(
47
+ message="DASHSCOPE_API_KEY not set. Please set the DASHSCOPE_API_KEY environment variable.",
48
+ model_name=self.name,
49
+ model_id=self.id,
50
+ )
51
+
52
+ # Define base client params
53
+ base_params = {
54
+ "api_key": self.api_key,
55
+ "organization": self.organization,
56
+ "base_url": self.base_url,
57
+ "timeout": self.timeout,
58
+ "max_retries": self.max_retries,
59
+ "default_headers": self.default_headers,
60
+ "default_query": self.default_query,
61
+ }
62
+
63
+ # Create client_params dict with non-None values
64
+ client_params = {k: v for k, v in base_params.items() if v is not None}
65
+
66
+ # Add additional client params if provided
67
+ if self.client_params:
68
+ client_params.update(self.client_params)
69
+ return client_params
70
+
71
+ def get_request_params(
72
+ self,
73
+ response_format: Optional[Union[Dict, Type[BaseModel]]] = None,
74
+ tools: Optional[List[Dict[str, Any]]] = None,
75
+ tool_choice: Optional[Union[str, Dict[str, Any]]] = None,
76
+ **kwargs: Any,
77
+ ) -> Dict[str, Any]:
78
+ params = super().get_request_params(response_format=response_format, tools=tools, tool_choice=tool_choice)
79
+
80
+ if self.include_thoughts is not None:
81
+ self.enable_thinking = self.include_thoughts
82
+
83
+ if self.enable_thinking is not None:
84
+ params["extra_body"] = {
85
+ "enable_thinking": self.enable_thinking,
86
+ }
87
+
88
+ if self.thinking_budget is not None:
89
+ params["extra_body"]["thinking_budget"] = self.thinking_budget
90
+
91
+ return params
@@ -0,0 +1,5 @@
1
+ from agno.models.deepinfra.deepinfra import DeepInfra
2
+
3
+ __all__ = [
4
+ "DeepInfra",
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 DeepInfra(OpenAILike):
10
+ """
11
+ A class for interacting with DeepInfra models.
12
+
13
+ Attributes:
14
+ id (str): The model id. Defaults to "meta-llama/Llama-2-70b-chat-hf".
15
+ name (str): The model name. Defaults to "DeepInfra".
16
+ provider (str): The provider name. Defaults to "DeepInfra".
17
+ api_key (Optional[str]): The API key.
18
+ base_url (str): The base URL. Defaults to "https://api.deepinfra.com/v1/openai".
19
+ """
20
+
21
+ id: str = "meta-llama/Llama-2-70b-chat-hf"
22
+ name: str = "DeepInfra"
23
+ provider: str = "DeepInfra"
24
+
25
+ api_key: Optional[str] = field(default_factory=lambda: getenv("DEEPINFRA_API_KEY"))
26
+ base_url: str = "https://api.deepinfra.com/v1/openai"
27
+
28
+ supports_native_structured_outputs: bool = False
@@ -0,0 +1,5 @@
1
+ from agno.models.deepseek.deepseek import DeepSeek
2
+
3
+ __all__ = [
4
+ "DeepSeek",
5
+ ]
@@ -0,0 +1,61 @@
1
+ from dataclasses import dataclass, field
2
+ from os import getenv
3
+ from typing import Any, Dict, Optional
4
+
5
+ from agno.exceptions import ModelProviderError
6
+ from agno.models.openai.like import OpenAILike
7
+
8
+
9
+ @dataclass
10
+ class DeepSeek(OpenAILike):
11
+ """
12
+ A class for interacting with DeepSeek models.
13
+
14
+ Attributes:
15
+ id (str): The model id. Defaults to "deepseek-chat".
16
+ name (str): The model name. Defaults to "DeepSeek".
17
+ provider (str): The provider name. Defaults to "DeepSeek".
18
+ api_key (Optional[str]): The API key.
19
+ base_url (str): The base URL. Defaults to "https://api.deepseek.com".
20
+ """
21
+
22
+ id: str = "deepseek-chat"
23
+ name: str = "DeepSeek"
24
+ provider: str = "DeepSeek"
25
+
26
+ api_key: Optional[str] = field(default_factory=lambda: getenv("DEEPSEEK_API_KEY"))
27
+ base_url: str = "https://api.deepseek.com"
28
+
29
+ # Their support for structured outputs is currently broken
30
+ supports_native_structured_outputs: bool = False
31
+
32
+ def _get_client_params(self) -> Dict[str, Any]:
33
+ # Fetch API key from env if not already set
34
+ if not self.api_key:
35
+ self.api_key = getenv("DEEPSEEK_API_KEY")
36
+ if not self.api_key:
37
+ # Raise error immediately if key is missing
38
+ raise ModelProviderError(
39
+ message="DEEPSEEK_API_KEY not set. Please set the DEEPSEEK_API_KEY environment variable.",
40
+ model_name=self.name,
41
+ model_id=self.id,
42
+ )
43
+
44
+ # Define base client params
45
+ base_params = {
46
+ "api_key": self.api_key,
47
+ "organization": self.organization,
48
+ "base_url": self.base_url,
49
+ "timeout": self.timeout,
50
+ "max_retries": self.max_retries,
51
+ "default_headers": self.default_headers,
52
+ "default_query": self.default_query,
53
+ }
54
+
55
+ # Create client_params dict with non-None values
56
+ client_params = {k: v for k, v in base_params.items() if v is not None}
57
+
58
+ # Add additional client params if provided
59
+ if self.client_params:
60
+ client_params.update(self.client_params)
61
+ return client_params
@@ -0,0 +1 @@
1
+ DEFAULT_OPENAI_MODEL_ID: str = "gpt-4o"
@@ -0,0 +1,5 @@
1
+ from agno.models.fireworks.fireworks import Fireworks
2
+
3
+ __all__ = [
4
+ "Fireworks",
5
+ ]