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,80 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional
4
+
5
+ from agno.models.base import Model
6
+ from agno.models.message import Message
7
+ from agno.utils.log import logger
8
+
9
+
10
+ def is_anthropic_reasoning_model(reasoning_model: Model) -> bool:
11
+ """Check if the model is an Anthropic Claude model with thinking support."""
12
+ is_claude = reasoning_model.__class__.__name__ == "Claude"
13
+ if not is_claude:
14
+ return False
15
+
16
+ # Check if provider is Anthropic (not VertexAI)
17
+ is_anthropic_provider = hasattr(reasoning_model, "provider") and reasoning_model.provider == "Anthropic"
18
+
19
+ # Check if thinking parameter is set
20
+ has_thinking = hasattr(reasoning_model, "thinking") and reasoning_model.thinking is not None
21
+
22
+ return is_claude and is_anthropic_provider and has_thinking
23
+
24
+
25
+ def get_anthropic_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
26
+ """Get reasoning from an Anthropic Claude model."""
27
+ from agno.run.agent import RunOutput
28
+
29
+ try:
30
+ reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
31
+ except Exception as e:
32
+ logger.warning(f"Reasoning error: {e}")
33
+ return None
34
+
35
+ reasoning_content: str = ""
36
+ redacted_reasoning_content: Optional[str] = None
37
+
38
+ if reasoning_agent_response.messages is not None:
39
+ for msg in reasoning_agent_response.messages:
40
+ if msg.reasoning_content is not None:
41
+ reasoning_content = msg.reasoning_content
42
+ if hasattr(msg, "redacted_reasoning_content") and msg.redacted_reasoning_content is not None:
43
+ redacted_reasoning_content = msg.redacted_reasoning_content
44
+ break
45
+
46
+ return Message(
47
+ role="assistant",
48
+ content=f"<thinking>\n{reasoning_content}\n</thinking>",
49
+ reasoning_content=reasoning_content,
50
+ redacted_reasoning_content=redacted_reasoning_content,
51
+ )
52
+
53
+
54
+ async def aget_anthropic_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
55
+ """Get reasoning from an Anthropic Claude model asynchronously."""
56
+ from agno.run.agent import RunOutput
57
+
58
+ try:
59
+ reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
60
+ except Exception as e:
61
+ logger.warning(f"Reasoning error: {e}")
62
+ return None
63
+
64
+ reasoning_content: str = ""
65
+ redacted_reasoning_content: Optional[str] = None
66
+
67
+ if reasoning_agent_response.messages is not None:
68
+ for msg in reasoning_agent_response.messages:
69
+ if msg.reasoning_content is not None:
70
+ reasoning_content = msg.reasoning_content
71
+ if hasattr(msg, "redacted_reasoning_content") and msg.redacted_reasoning_content is not None:
72
+ redacted_reasoning_content = msg.redacted_reasoning_content
73
+ break
74
+
75
+ return Message(
76
+ role="assistant",
77
+ content=f"<thinking>\n{reasoning_content}\n</thinking>",
78
+ reasoning_content=reasoning_content,
79
+ redacted_reasoning_content=redacted_reasoning_content,
80
+ )
@@ -0,0 +1,67 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional
4
+
5
+ from agno.models.base import Model
6
+ from agno.models.message import Message
7
+ from agno.utils.log import logger
8
+
9
+
10
+ def is_ai_foundry_reasoning_model(reasoning_model: Model) -> bool:
11
+ return reasoning_model.__class__.__name__ == "AzureAIFoundry" and (
12
+ ("deepseek" in reasoning_model.id.lower())
13
+ or ("o1" in reasoning_model.id.lower())
14
+ or ("o3" in reasoning_model.id.lower())
15
+ or ("o4" in reasoning_model.id.lower())
16
+ )
17
+
18
+
19
+ def get_ai_foundry_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
20
+ from agno.run.agent import RunOutput
21
+
22
+ try:
23
+ reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
24
+ except Exception as e:
25
+ logger.warning(f"Reasoning error: {e}")
26
+ return None
27
+
28
+ reasoning_content: str = ""
29
+ # We use the normal content as no reasoning content is returned
30
+ if reasoning_agent_response.content is not None:
31
+ # Extract content between <think> tags if present
32
+ content = reasoning_agent_response.content
33
+ if "<think>" in content and "</think>" in content:
34
+ start_idx = content.find("<think>") + len("<think>")
35
+ end_idx = content.find("</think>")
36
+ reasoning_content = content[start_idx:end_idx].strip()
37
+ else:
38
+ reasoning_content = content
39
+
40
+ return Message(
41
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
42
+ )
43
+
44
+
45
+ async def aget_ai_foundry_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
46
+ from agno.run.agent import RunOutput
47
+
48
+ try:
49
+ reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
50
+ except Exception as e:
51
+ logger.warning(f"Reasoning error: {e}")
52
+ return None
53
+
54
+ reasoning_content: str = ""
55
+ if reasoning_agent_response.content is not None:
56
+ # Extract content between <think> tags if present
57
+ content = reasoning_agent_response.content
58
+ if "<think>" in content and "</think>" in content:
59
+ start_idx = content.find("<think>") + len("<think>")
60
+ end_idx = content.find("</think>")
61
+ reasoning_content = content[start_idx:end_idx].strip()
62
+ else:
63
+ reasoning_content = content
64
+
65
+ return Message(
66
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
67
+ )
@@ -0,0 +1,63 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional
4
+
5
+ from agno.models.base import Model
6
+ from agno.models.message import Message
7
+ from agno.utils.log import logger
8
+
9
+
10
+ def is_deepseek_reasoning_model(reasoning_model: Model) -> bool:
11
+ return reasoning_model.__class__.__name__ == "DeepSeek" and reasoning_model.id.lower() == "deepseek-reasoner"
12
+
13
+
14
+ def get_deepseek_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
15
+ from agno.run.agent import RunOutput
16
+
17
+ # Update system message role to "system"
18
+ for message in messages:
19
+ if message.role == "developer":
20
+ message.role = "system"
21
+
22
+ try:
23
+ reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
24
+ except Exception as e:
25
+ logger.warning(f"Reasoning error: {e}")
26
+ return None
27
+
28
+ reasoning_content: str = ""
29
+ if reasoning_agent_response.messages is not None:
30
+ for msg in reasoning_agent_response.messages:
31
+ if msg.reasoning_content is not None:
32
+ reasoning_content = msg.reasoning_content
33
+ break
34
+
35
+ return Message(
36
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
37
+ )
38
+
39
+
40
+ async def aget_deepseek_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
41
+ from agno.run.agent import RunOutput
42
+
43
+ # Update system message role to "system"
44
+ for message in messages:
45
+ if message.role == "developer":
46
+ message.role = "system"
47
+
48
+ try:
49
+ reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
50
+ except Exception as e:
51
+ logger.warning(f"Reasoning error: {e}")
52
+ return None
53
+
54
+ reasoning_content: str = ""
55
+ if reasoning_agent_response.messages is not None:
56
+ for msg in reasoning_agent_response.messages:
57
+ if msg.reasoning_content is not None:
58
+ reasoning_content = msg.reasoning_content
59
+ break
60
+
61
+ return Message(
62
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
63
+ )
@@ -0,0 +1,97 @@
1
+ from __future__ import annotations
2
+
3
+ from textwrap import dedent
4
+ from typing import Any, Callable, Dict, List, Literal, Optional, Union
5
+
6
+ from agno.models.base import Model
7
+ from agno.reasoning.step import ReasoningSteps
8
+ from agno.tools import Toolkit
9
+ from agno.tools.function import Function
10
+
11
+
12
+ def get_default_reasoning_agent(
13
+ reasoning_model: Model,
14
+ min_steps: int,
15
+ max_steps: int,
16
+ tools: Optional[List[Union[Toolkit, Callable, Function, Dict]]] = None,
17
+ tool_call_limit: Optional[int] = None,
18
+ use_json_mode: bool = False,
19
+ telemetry: bool = True,
20
+ debug_mode: bool = False,
21
+ debug_level: Literal[1, 2] = 1,
22
+ session_state: Optional[Dict[str, Any]] = None,
23
+ dependencies: Optional[Dict[str, Any]] = None,
24
+ metadata: Optional[Dict[str, Any]] = None,
25
+ ) -> Optional["Agent"]: # type: ignore # noqa: F821
26
+ from agno.agent import Agent
27
+
28
+ agent = Agent(
29
+ model=reasoning_model,
30
+ description="You are a meticulous, thoughtful, and logical Reasoning Agent who solves complex problems through clear, structured, step-by-step analysis.",
31
+ instructions=dedent(f"""\
32
+ Step 1 - Problem Analysis:
33
+ - Restate the user's task clearly in your own words to ensure full comprehension.
34
+ - Identify explicitly what information is required and what tools or resources might be necessary.
35
+
36
+ Step 2 - Decompose and Strategize:
37
+ - Break down the problem into clearly defined subtasks.
38
+ - Develop at least two distinct strategies or approaches to solving the problem to ensure thoroughness.
39
+
40
+ Step 3 - Intent Clarification and Planning:
41
+ - Clearly articulate the user's intent behind their request.
42
+ - Select the most suitable strategy from Step 2, clearly justifying your choice based on alignment with the user's intent and task constraints.
43
+ - Formulate a detailed step-by-step action plan outlining the sequence of actions needed to solve the problem.
44
+
45
+ Step 4 - Execute the Action Plan:
46
+ For each planned step, document:
47
+ 1. **Title**: Concise title summarizing the step.
48
+ 2. **Action**: Explicitly state your next action in the first person ('I will...').
49
+ 3. **Result**: Execute your action using necessary tools and provide a concise summary of the outcome.
50
+ 4. **Reasoning**: Clearly explain your rationale, covering:
51
+ - Necessity: Why this action is required.
52
+ - Considerations: Highlight key considerations, potential challenges, and mitigation strategies.
53
+ - Progression: How this step logically follows from or builds upon previous actions.
54
+ - Assumptions: Explicitly state any assumptions made and justify their validity.
55
+ 5. **Next Action**: Clearly select your next step from:
56
+ - **continue**: If further steps are needed.
57
+ - **validate**: When you reach a potential answer, signaling it's ready for validation.
58
+ - **final_answer**: Only if you have confidently validated the solution.
59
+ - **reset**: Immediately restart analysis if a critical error or incorrect result is identified.
60
+ 6. **Confidence Score**: Provide a numeric confidence score (0.0–1.0) indicating your certainty in the step's correctness and its outcome.
61
+
62
+ Step 5 - Validation (mandatory before finalizing an answer):
63
+ - Explicitly validate your solution by:
64
+ - Cross-verifying with alternative approaches (developed in Step 2).
65
+ - Using additional available tools or methods to independently confirm accuracy.
66
+ - Clearly document validation results and reasoning behind the validation method chosen.
67
+ - If validation fails or discrepancies arise, explicitly identify errors, reset your analysis, and revise your plan accordingly.
68
+
69
+ Step 6 - Provide the Final Answer:
70
+ - Once thoroughly validated and confident, deliver your solution clearly and succinctly.
71
+ - Restate briefly how your answer addresses the user's original intent and resolves the stated task.
72
+
73
+ General Operational Guidelines:
74
+ - Ensure your analysis remains:
75
+ - **Complete**: Address all elements of the task.
76
+ - **Comprehensive**: Explore diverse perspectives and anticipate potential outcomes.
77
+ - **Logical**: Maintain coherence between all steps.
78
+ - **Actionable**: Present clearly implementable steps and actions.
79
+ - **Insightful**: Offer innovative and unique perspectives where applicable.
80
+ - Always explicitly handle errors and mistakes by resetting or revising steps immediately.
81
+ - Adhere strictly to a minimum of {min_steps} and maximum of {max_steps} steps to ensure effective task resolution.
82
+ - Execute necessary tools proactively and without hesitation, clearly documenting tool usage.
83
+ - Only create a single instance of ReasoningSteps for your response.\
84
+ """),
85
+ tools=tools,
86
+ tool_call_limit=tool_call_limit,
87
+ output_schema=ReasoningSteps,
88
+ use_json_mode=use_json_mode,
89
+ telemetry=telemetry,
90
+ debug_mode=debug_mode,
91
+ debug_level=debug_level,
92
+ session_state=session_state,
93
+ dependencies=dependencies,
94
+ metadata=metadata,
95
+ )
96
+
97
+ return agent
@@ -0,0 +1,73 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional
4
+
5
+ from agno.models.base import Model
6
+ from agno.models.message import Message
7
+ from agno.utils.log import logger
8
+
9
+
10
+ def is_gemini_reasoning_model(reasoning_model: Model) -> bool:
11
+ """Check if the model is a Gemini model with thinking support."""
12
+ is_gemini_class = reasoning_model.__class__.__name__ == "Gemini"
13
+ if not is_gemini_class:
14
+ return False
15
+
16
+ # Check if it's a Gemini 2.5+ model (supports thinking)
17
+ model_id = reasoning_model.id.lower()
18
+ has_thinking_support = "2.5" in model_id
19
+
20
+ # Also check if thinking parameters are set
21
+ # Note: thinking_budget=0 explicitly disables thinking mode per Google's API docs
22
+ has_thinking_budget = (
23
+ hasattr(reasoning_model, "thinking_budget")
24
+ and reasoning_model.thinking_budget is not None
25
+ and reasoning_model.thinking_budget > 0
26
+ )
27
+ has_include_thoughts = hasattr(reasoning_model, "include_thoughts") and reasoning_model.include_thoughts is not None
28
+
29
+ return is_gemini_class and (has_thinking_support or has_thinking_budget or has_include_thoughts)
30
+
31
+
32
+ def get_gemini_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
33
+ """Get reasoning from a Gemini model."""
34
+ from agno.run.agent import RunOutput
35
+
36
+ try:
37
+ reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
38
+ except Exception as e:
39
+ logger.warning(f"Reasoning error: {e}")
40
+ return None
41
+
42
+ reasoning_content: str = ""
43
+ if reasoning_agent_response.messages is not None:
44
+ for msg in reasoning_agent_response.messages:
45
+ if msg.reasoning_content is not None:
46
+ reasoning_content = msg.reasoning_content
47
+ break
48
+
49
+ return Message(
50
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
51
+ )
52
+
53
+
54
+ async def aget_gemini_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
55
+ """Get reasoning from a Gemini model asynchronously."""
56
+ from agno.run.agent import RunOutput
57
+
58
+ try:
59
+ reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
60
+ except Exception as e:
61
+ logger.warning(f"Reasoning error: {e}")
62
+ return None
63
+
64
+ reasoning_content: str = ""
65
+ if reasoning_agent_response.messages is not None:
66
+ for msg in reasoning_agent_response.messages:
67
+ if msg.reasoning_content is not None:
68
+ reasoning_content = msg.reasoning_content
69
+ break
70
+
71
+ return Message(
72
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
73
+ )
agno/reasoning/groq.py ADDED
@@ -0,0 +1,71 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional
4
+
5
+ from agno.models.base import Model
6
+ from agno.models.message import Message
7
+ from agno.utils.log import logger
8
+
9
+
10
+ def is_groq_reasoning_model(reasoning_model: Model) -> bool:
11
+ return reasoning_model.__class__.__name__ == "Groq" and "deepseek" in reasoning_model.id.lower()
12
+
13
+
14
+ def get_groq_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
15
+ from agno.run.agent import RunOutput
16
+
17
+ # Update system message role to "system"
18
+ for message in messages:
19
+ if message.role == "developer":
20
+ message.role = "system"
21
+
22
+ try:
23
+ reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
24
+ except Exception as e:
25
+ logger.warning(f"Reasoning error: {e}")
26
+ return None
27
+
28
+ reasoning_content: str = ""
29
+ if reasoning_agent_response.content is not None:
30
+ # Extract content between <think> tags if present
31
+ content = reasoning_agent_response.content
32
+ if "<think>" in content and "</think>" in content:
33
+ start_idx = content.find("<think>") + len("<think>")
34
+ end_idx = content.find("</think>")
35
+ reasoning_content = content[start_idx:end_idx].strip()
36
+ else:
37
+ reasoning_content = content
38
+
39
+ return Message(
40
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
41
+ )
42
+
43
+
44
+ async def aget_groq_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
45
+ from agno.run.agent import RunOutput
46
+
47
+ # Update system message role to "system"
48
+ for message in messages:
49
+ if message.role == "developer":
50
+ message.role = "system"
51
+
52
+ try:
53
+ reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
54
+ except Exception as e:
55
+ logger.warning(f"Reasoning error: {e}")
56
+ return None
57
+
58
+ reasoning_content: str = ""
59
+ if reasoning_agent_response.content is not None:
60
+ # Extract content between <think> tags if present
61
+ content = reasoning_agent_response.content
62
+ if "<think>" in content and "</think>" in content:
63
+ start_idx = content.find("<think>") + len("<think>")
64
+ end_idx = content.find("</think>")
65
+ reasoning_content = content[start_idx:end_idx].strip()
66
+ else:
67
+ reasoning_content = content
68
+
69
+ return Message(
70
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
71
+ )
@@ -0,0 +1,63 @@
1
+ from typing import Any, Dict, List, Literal, Optional
2
+
3
+ from agno.models.base import Model
4
+ from agno.models.message import Message
5
+ from agno.reasoning.step import NextAction, ReasoningStep
6
+ from agno.run.messages import RunMessages
7
+ from agno.utils.log import logger
8
+
9
+
10
+ def get_reasoning_agent(
11
+ reasoning_model: Model,
12
+ telemetry: bool = False,
13
+ debug_mode: bool = False,
14
+ debug_level: Literal[1, 2] = 1,
15
+ session_state: Optional[Dict[str, Any]] = None,
16
+ dependencies: Optional[Dict[str, Any]] = None,
17
+ metadata: Optional[Dict[str, Any]] = None,
18
+ ) -> "Agent": # type: ignore # noqa: F821
19
+ from agno.agent import Agent
20
+
21
+ return Agent(
22
+ model=reasoning_model,
23
+ telemetry=telemetry,
24
+ debug_mode=debug_mode,
25
+ debug_level=debug_level,
26
+ session_state=session_state,
27
+ dependencies=dependencies,
28
+ metadata=metadata,
29
+ )
30
+
31
+
32
+ def get_next_action(reasoning_step: ReasoningStep) -> NextAction:
33
+ next_action = reasoning_step.next_action or NextAction.FINAL_ANSWER
34
+ if isinstance(next_action, str):
35
+ try:
36
+ return NextAction(next_action)
37
+ except ValueError:
38
+ logger.warning(f"Reasoning error. Invalid next action: {next_action}")
39
+ return NextAction.FINAL_ANSWER
40
+ return next_action
41
+
42
+
43
+ def update_messages_with_reasoning(
44
+ run_messages: RunMessages,
45
+ reasoning_messages: List[Message],
46
+ ) -> None:
47
+ run_messages.messages.append(
48
+ Message(
49
+ role="assistant",
50
+ content="I have worked through this problem in-depth, running all necessary tools and have included my raw, step by step research. ",
51
+ add_to_agent_memory=False,
52
+ )
53
+ )
54
+ for message in reasoning_messages:
55
+ message.add_to_agent_memory = False
56
+ run_messages.messages.extend(reasoning_messages)
57
+ run_messages.messages.append(
58
+ Message(
59
+ role="assistant",
60
+ content="Now I will summarize my reasoning and provide a final answer. I will skip any tool calls already executed and steps that are not relevant to the final answer.",
61
+ add_to_agent_memory=False,
62
+ )
63
+ )
@@ -0,0 +1,67 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional
4
+
5
+ from agno.models.base import Model
6
+ from agno.models.message import Message
7
+ from agno.utils.log import logger
8
+
9
+
10
+ def is_ollama_reasoning_model(reasoning_model: Model) -> bool:
11
+ return reasoning_model.__class__.__name__ == "Ollama" and (
12
+ "qwq" in reasoning_model.id
13
+ or "deepseek-r1" in reasoning_model.id
14
+ or "qwen2.5-coder" in reasoning_model.id
15
+ or "openthinker" in reasoning_model.id
16
+ )
17
+
18
+
19
+ def get_ollama_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
20
+ from agno.run.agent import RunOutput
21
+
22
+ try:
23
+ reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
24
+ except Exception as e:
25
+ logger.warning(f"Reasoning error: {e}")
26
+ return None
27
+
28
+ reasoning_content: str = ""
29
+ # We use the normal content as no reasoning content is returned
30
+ if reasoning_agent_response.content is not None:
31
+ # Extract content between <think> tags if present
32
+ content = reasoning_agent_response.content
33
+ if "<think>" in content and "</think>" in content:
34
+ start_idx = content.find("<think>") + len("<think>")
35
+ end_idx = content.find("</think>")
36
+ reasoning_content = content[start_idx:end_idx].strip()
37
+ else:
38
+ reasoning_content = content
39
+
40
+ return Message(
41
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
42
+ )
43
+
44
+
45
+ async def aget_ollama_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
46
+ from agno.run.agent import RunOutput
47
+
48
+ try:
49
+ reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
50
+ except Exception as e:
51
+ logger.warning(f"Reasoning error: {e}")
52
+ return None
53
+
54
+ reasoning_content: str = ""
55
+ if reasoning_agent_response.content is not None:
56
+ # Extract content between <think> tags if present
57
+ content = reasoning_agent_response.content
58
+ if "<think>" in content and "</think>" in content:
59
+ start_idx = content.find("<think>") + len("<think>")
60
+ end_idx = content.find("</think>")
61
+ reasoning_content = content[start_idx:end_idx].strip()
62
+ else:
63
+ reasoning_content = content
64
+
65
+ return Message(
66
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
67
+ )
@@ -0,0 +1,86 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional
4
+
5
+ from agno.models.base import Model
6
+ from agno.models.message import Message
7
+ from agno.models.openai.like import OpenAILike
8
+ from agno.utils.log import logger
9
+
10
+
11
+ def is_openai_reasoning_model(reasoning_model: Model) -> bool:
12
+ return (
13
+ (
14
+ reasoning_model.__class__.__name__ == "OpenAIChat"
15
+ or reasoning_model.__class__.__name__ == "OpenAIResponses"
16
+ or reasoning_model.__class__.__name__ == "AzureOpenAI"
17
+ )
18
+ and (
19
+ ("o4" in reasoning_model.id)
20
+ or ("o3" in reasoning_model.id)
21
+ or ("o1" in reasoning_model.id)
22
+ or ("4.1" in reasoning_model.id)
23
+ or ("4.5" in reasoning_model.id)
24
+ )
25
+ ) or (isinstance(reasoning_model, OpenAILike) and "deepseek-r1" in reasoning_model.id.lower())
26
+
27
+
28
+ def get_openai_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
29
+ from agno.run.agent import RunOutput
30
+
31
+ # Update system message role to "system"
32
+ for message in messages:
33
+ if message.role == "developer":
34
+ message.role = "system"
35
+
36
+ try:
37
+ reasoning_agent_response: RunOutput = reasoning_agent.run(input=messages)
38
+ except Exception as e:
39
+ logger.warning(f"Reasoning error: {e}")
40
+ return None
41
+
42
+ reasoning_content: str = ""
43
+ # We use the normal content as no reasoning content is returned
44
+ if reasoning_agent_response.content is not None:
45
+ # Extract content between <think> tags if present
46
+ content = reasoning_agent_response.content
47
+ if "<think>" in content and "</think>" in content:
48
+ start_idx = content.find("<think>") + len("<think>")
49
+ end_idx = content.find("</think>")
50
+ reasoning_content = content[start_idx:end_idx].strip()
51
+ else:
52
+ reasoning_content = content
53
+
54
+ return Message(
55
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
56
+ )
57
+
58
+
59
+ async def aget_openai_reasoning(reasoning_agent: "Agent", messages: List[Message]) -> Optional[Message]: # type: ignore # noqa: F821
60
+ from agno.run.agent import RunOutput
61
+
62
+ # Update system message role to "system"
63
+ for message in messages:
64
+ if message.role == "developer":
65
+ message.role = "system"
66
+
67
+ try:
68
+ reasoning_agent_response: RunOutput = await reasoning_agent.arun(input=messages)
69
+ except Exception as e:
70
+ logger.warning(f"Reasoning error: {e}")
71
+ return None
72
+
73
+ reasoning_content: str = ""
74
+ if reasoning_agent_response.content is not None:
75
+ # Extract content between <think> tags if present
76
+ content = reasoning_agent_response.content
77
+ if "<think>" in content and "</think>" in content:
78
+ start_idx = content.find("<think>") + len("<think>")
79
+ end_idx = content.find("</think>")
80
+ reasoning_content = content[start_idx:end_idx].strip()
81
+ else:
82
+ reasoning_content = content
83
+
84
+ return Message(
85
+ role="assistant", content=f"<thinking>\n{reasoning_content}\n</thinking>", reasoning_content=reasoning_content
86
+ )