agno 1.8.2__py3-none-any.whl → 2.0.0__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 (589) hide show
  1. agno/agent/__init__.py +19 -27
  2. agno/agent/agent.py +3143 -4170
  3. agno/api/agent.py +11 -67
  4. agno/api/api.py +5 -46
  5. agno/api/evals.py +8 -19
  6. agno/api/os.py +17 -0
  7. agno/api/routes.py +6 -41
  8. agno/api/schemas/__init__.py +9 -0
  9. agno/api/schemas/agent.py +5 -21
  10. agno/api/schemas/evals.py +7 -16
  11. agno/api/schemas/os.py +14 -0
  12. agno/api/schemas/team.py +5 -21
  13. agno/api/schemas/utils.py +21 -0
  14. agno/api/schemas/workflows.py +11 -7
  15. agno/api/settings.py +53 -0
  16. agno/api/team.py +11 -66
  17. agno/api/workflow.py +28 -0
  18. agno/cloud/aws/base.py +214 -0
  19. agno/cloud/aws/s3/__init__.py +2 -0
  20. agno/cloud/aws/s3/api_client.py +43 -0
  21. agno/cloud/aws/s3/bucket.py +195 -0
  22. agno/cloud/aws/s3/object.py +57 -0
  23. agno/db/__init__.py +24 -0
  24. agno/db/base.py +245 -0
  25. agno/db/dynamo/__init__.py +3 -0
  26. agno/db/dynamo/dynamo.py +1743 -0
  27. agno/db/dynamo/schemas.py +278 -0
  28. agno/db/dynamo/utils.py +684 -0
  29. agno/db/firestore/__init__.py +3 -0
  30. agno/db/firestore/firestore.py +1432 -0
  31. agno/db/firestore/schemas.py +130 -0
  32. agno/db/firestore/utils.py +278 -0
  33. agno/db/gcs_json/__init__.py +3 -0
  34. agno/db/gcs_json/gcs_json_db.py +1001 -0
  35. agno/db/gcs_json/utils.py +194 -0
  36. agno/db/in_memory/__init__.py +3 -0
  37. agno/db/in_memory/in_memory_db.py +882 -0
  38. agno/db/in_memory/utils.py +172 -0
  39. agno/db/json/__init__.py +3 -0
  40. agno/db/json/json_db.py +1045 -0
  41. agno/db/json/utils.py +196 -0
  42. agno/db/migrations/v1_to_v2.py +162 -0
  43. agno/db/mongo/__init__.py +3 -0
  44. agno/db/mongo/mongo.py +1416 -0
  45. agno/db/mongo/schemas.py +77 -0
  46. agno/db/mongo/utils.py +204 -0
  47. agno/db/mysql/__init__.py +3 -0
  48. agno/db/mysql/mysql.py +1719 -0
  49. agno/db/mysql/schemas.py +124 -0
  50. agno/db/mysql/utils.py +297 -0
  51. agno/db/postgres/__init__.py +3 -0
  52. agno/db/postgres/postgres.py +1710 -0
  53. agno/db/postgres/schemas.py +124 -0
  54. agno/db/postgres/utils.py +280 -0
  55. agno/db/redis/__init__.py +3 -0
  56. agno/db/redis/redis.py +1367 -0
  57. agno/db/redis/schemas.py +109 -0
  58. agno/db/redis/utils.py +288 -0
  59. agno/db/schemas/__init__.py +3 -0
  60. agno/db/schemas/evals.py +33 -0
  61. agno/db/schemas/knowledge.py +40 -0
  62. agno/db/schemas/memory.py +46 -0
  63. agno/db/singlestore/__init__.py +3 -0
  64. agno/db/singlestore/schemas.py +116 -0
  65. agno/db/singlestore/singlestore.py +1712 -0
  66. agno/db/singlestore/utils.py +326 -0
  67. agno/db/sqlite/__init__.py +3 -0
  68. agno/db/sqlite/schemas.py +119 -0
  69. agno/db/sqlite/sqlite.py +1676 -0
  70. agno/db/sqlite/utils.py +268 -0
  71. agno/db/utils.py +88 -0
  72. agno/eval/__init__.py +14 -0
  73. agno/eval/accuracy.py +154 -48
  74. agno/eval/performance.py +88 -23
  75. agno/eval/reliability.py +73 -20
  76. agno/eval/utils.py +23 -13
  77. agno/integrations/discord/__init__.py +3 -0
  78. agno/{app → integrations}/discord/client.py +10 -10
  79. agno/knowledge/__init__.py +2 -2
  80. agno/{document → knowledge}/chunking/agentic.py +2 -2
  81. agno/{document → knowledge}/chunking/document.py +2 -2
  82. agno/{document → knowledge}/chunking/fixed.py +3 -3
  83. agno/{document → knowledge}/chunking/markdown.py +2 -2
  84. agno/{document → knowledge}/chunking/recursive.py +2 -2
  85. agno/{document → knowledge}/chunking/row.py +2 -2
  86. agno/knowledge/chunking/semantic.py +59 -0
  87. agno/knowledge/chunking/strategy.py +121 -0
  88. agno/knowledge/content.py +74 -0
  89. agno/knowledge/document/__init__.py +5 -0
  90. agno/{document → knowledge/document}/base.py +12 -2
  91. agno/knowledge/embedder/__init__.py +5 -0
  92. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  93. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  94. agno/{embedder → knowledge/embedder}/base.py +6 -0
  95. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  96. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  97. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  98. agno/{embedder → knowledge/embedder}/google.py +74 -1
  99. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  100. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  101. agno/knowledge/embedder/langdb.py +22 -0
  102. agno/knowledge/embedder/mistral.py +139 -0
  103. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  104. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  105. agno/knowledge/embedder/openai.py +223 -0
  106. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  107. agno/{embedder → knowledge/embedder}/together.py +1 -1
  108. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  109. agno/knowledge/knowledge.py +1551 -0
  110. agno/knowledge/reader/__init__.py +7 -0
  111. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  112. agno/knowledge/reader/base.py +88 -0
  113. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  114. agno/knowledge/reader/docx_reader.py +83 -0
  115. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  116. agno/{document → knowledge}/reader/json_reader.py +30 -9
  117. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  118. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  119. agno/knowledge/reader/reader_factory.py +268 -0
  120. agno/knowledge/reader/s3_reader.py +101 -0
  121. agno/{document → knowledge}/reader/text_reader.py +31 -10
  122. agno/knowledge/reader/url_reader.py +128 -0
  123. agno/knowledge/reader/web_search_reader.py +366 -0
  124. agno/{document → knowledge}/reader/website_reader.py +37 -10
  125. agno/knowledge/reader/wikipedia_reader.py +59 -0
  126. agno/knowledge/reader/youtube_reader.py +78 -0
  127. agno/knowledge/remote_content/remote_content.py +88 -0
  128. agno/{reranker → knowledge/reranker}/base.py +1 -1
  129. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  130. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  131. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  132. agno/knowledge/types.py +30 -0
  133. agno/knowledge/utils.py +169 -0
  134. agno/media.py +269 -268
  135. agno/memory/__init__.py +2 -10
  136. agno/memory/manager.py +1003 -148
  137. agno/models/aimlapi/__init__.py +2 -2
  138. agno/models/aimlapi/aimlapi.py +6 -6
  139. agno/models/anthropic/claude.py +128 -72
  140. agno/models/aws/bedrock.py +107 -175
  141. agno/models/aws/claude.py +64 -18
  142. agno/models/azure/ai_foundry.py +73 -23
  143. agno/models/base.py +346 -290
  144. agno/models/cerebras/cerebras.py +84 -27
  145. agno/models/cohere/chat.py +106 -98
  146. agno/models/google/gemini.py +105 -46
  147. agno/models/groq/groq.py +97 -35
  148. agno/models/huggingface/huggingface.py +92 -27
  149. agno/models/ibm/watsonx.py +72 -13
  150. agno/models/litellm/chat.py +85 -13
  151. agno/models/message.py +46 -151
  152. agno/models/meta/llama.py +85 -49
  153. agno/models/metrics.py +120 -0
  154. agno/models/mistral/mistral.py +90 -21
  155. agno/models/ollama/__init__.py +0 -2
  156. agno/models/ollama/chat.py +85 -47
  157. agno/models/openai/chat.py +154 -37
  158. agno/models/openai/responses.py +178 -105
  159. agno/models/perplexity/perplexity.py +26 -2
  160. agno/models/portkey/portkey.py +0 -7
  161. agno/models/response.py +15 -9
  162. agno/models/utils.py +20 -0
  163. agno/models/vercel/__init__.py +2 -2
  164. agno/models/vercel/v0.py +1 -1
  165. agno/models/vllm/__init__.py +2 -2
  166. agno/models/vllm/vllm.py +3 -3
  167. agno/models/xai/xai.py +10 -10
  168. agno/os/__init__.py +3 -0
  169. agno/os/app.py +497 -0
  170. agno/os/auth.py +47 -0
  171. agno/os/config.py +103 -0
  172. agno/os/interfaces/agui/__init__.py +3 -0
  173. agno/os/interfaces/agui/agui.py +31 -0
  174. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  175. agno/{app → os/interfaces}/agui/utils.py +65 -28
  176. agno/os/interfaces/base.py +21 -0
  177. agno/os/interfaces/slack/__init__.py +3 -0
  178. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  179. agno/os/interfaces/slack/slack.py +32 -0
  180. agno/os/interfaces/whatsapp/__init__.py +3 -0
  181. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  182. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  183. agno/os/mcp.py +235 -0
  184. agno/os/router.py +1400 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +393 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +850 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +410 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +178 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +536 -0
  201. agno/os/schema.py +945 -0
  202. agno/{app/playground → os}/settings.py +7 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/agent.py +633 -0
  212. agno/run/base.py +53 -77
  213. agno/run/cancel.py +81 -0
  214. agno/run/team.py +243 -96
  215. agno/run/workflow.py +550 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +3260 -4824
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +43 -23
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +20 -17
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +22 -12
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +17 -8
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +62 -62
  252. agno/tools/eleven_labs.py +36 -29
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +30 -30
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +17 -18
  260. agno/tools/function.py +127 -18
  261. agno/tools/giphy.py +23 -11
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +32 -20
  276. agno/tools/mcp.py +1 -2
  277. agno/tools/mem0.py +18 -12
  278. agno/tools/memori.py +14 -10
  279. agno/tools/mlx_transcribe.py +3 -2
  280. agno/tools/models/azure_openai.py +33 -15
  281. agno/tools/models/gemini.py +59 -32
  282. agno/tools/models/groq.py +30 -23
  283. agno/tools/models/nebius.py +28 -12
  284. agno/tools/models_labs.py +40 -16
  285. agno/tools/moviepy_video.py +7 -6
  286. agno/tools/neo4j.py +10 -8
  287. agno/tools/newspaper.py +7 -2
  288. agno/tools/newspaper4k.py +8 -3
  289. agno/tools/openai.py +58 -32
  290. agno/tools/openbb.py +12 -11
  291. agno/tools/opencv.py +63 -47
  292. agno/tools/openweather.py +14 -12
  293. agno/tools/pandas.py +11 -3
  294. agno/tools/postgres.py +4 -12
  295. agno/tools/pubmed.py +4 -1
  296. agno/tools/python.py +9 -22
  297. agno/tools/reasoning.py +35 -27
  298. agno/tools/reddit.py +11 -26
  299. agno/tools/replicate.py +55 -42
  300. agno/tools/resend.py +4 -1
  301. agno/tools/scrapegraph.py +15 -14
  302. agno/tools/searxng.py +10 -23
  303. agno/tools/serpapi.py +6 -3
  304. agno/tools/serper.py +13 -4
  305. agno/tools/shell.py +9 -2
  306. agno/tools/slack.py +12 -11
  307. agno/tools/sleep.py +3 -2
  308. agno/tools/spider.py +24 -4
  309. agno/tools/sql.py +7 -6
  310. agno/tools/tavily.py +6 -4
  311. agno/tools/telegram.py +12 -4
  312. agno/tools/todoist.py +11 -31
  313. agno/tools/toolkit.py +1 -1
  314. agno/tools/trafilatura.py +22 -6
  315. agno/tools/trello.py +9 -22
  316. agno/tools/twilio.py +10 -3
  317. agno/tools/user_control_flow.py +6 -1
  318. agno/tools/valyu.py +34 -5
  319. agno/tools/visualization.py +19 -28
  320. agno/tools/webbrowser.py +4 -3
  321. agno/tools/webex.py +11 -7
  322. agno/tools/website.py +15 -46
  323. agno/tools/webtools.py +12 -4
  324. agno/tools/whatsapp.py +5 -9
  325. agno/tools/wikipedia.py +20 -13
  326. agno/tools/x.py +14 -13
  327. agno/tools/yfinance.py +13 -40
  328. agno/tools/youtube.py +26 -20
  329. agno/tools/zendesk.py +7 -2
  330. agno/tools/zep.py +10 -7
  331. agno/tools/zoom.py +10 -9
  332. agno/utils/common.py +1 -19
  333. agno/utils/events.py +100 -123
  334. agno/utils/gemini.py +1 -1
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/log.py +54 -4
  337. agno/utils/mcp.py +68 -10
  338. agno/utils/media.py +39 -0
  339. agno/utils/message.py +12 -1
  340. agno/utils/models/aws_claude.py +1 -1
  341. agno/utils/models/claude.py +6 -12
  342. agno/utils/models/cohere.py +1 -1
  343. agno/utils/models/mistral.py +8 -7
  344. agno/utils/models/schema_utils.py +3 -3
  345. agno/utils/models/watsonx.py +1 -1
  346. agno/utils/openai.py +1 -1
  347. agno/utils/pprint.py +33 -32
  348. agno/utils/print_response/agent.py +779 -0
  349. agno/utils/print_response/team.py +1669 -0
  350. agno/utils/print_response/workflow.py +1451 -0
  351. agno/utils/prompts.py +14 -14
  352. agno/utils/reasoning.py +87 -0
  353. agno/utils/response.py +42 -42
  354. agno/utils/streamlit.py +481 -0
  355. agno/utils/string.py +8 -22
  356. agno/utils/team.py +50 -0
  357. agno/utils/timer.py +2 -2
  358. agno/vectordb/base.py +33 -21
  359. agno/vectordb/cassandra/cassandra.py +287 -23
  360. agno/vectordb/chroma/chromadb.py +482 -59
  361. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  362. agno/vectordb/couchbase/couchbase.py +309 -29
  363. agno/vectordb/lancedb/lance_db.py +360 -21
  364. agno/vectordb/langchaindb/__init__.py +5 -0
  365. agno/vectordb/langchaindb/langchaindb.py +145 -0
  366. agno/vectordb/lightrag/__init__.py +5 -0
  367. agno/vectordb/lightrag/lightrag.py +374 -0
  368. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  369. agno/vectordb/milvus/milvus.py +242 -32
  370. agno/vectordb/mongodb/mongodb.py +200 -24
  371. agno/vectordb/pgvector/pgvector.py +319 -37
  372. agno/vectordb/pineconedb/pineconedb.py +221 -27
  373. agno/vectordb/qdrant/qdrant.py +334 -14
  374. agno/vectordb/singlestore/singlestore.py +286 -29
  375. agno/vectordb/surrealdb/surrealdb.py +187 -7
  376. agno/vectordb/upstashdb/upstashdb.py +342 -26
  377. agno/vectordb/weaviate/weaviate.py +227 -165
  378. agno/workflow/__init__.py +17 -13
  379. agno/workflow/{v2/condition.py → condition.py} +135 -32
  380. agno/workflow/{v2/loop.py → loop.py} +115 -28
  381. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  382. agno/workflow/{v2/router.py → router.py} +133 -32
  383. agno/workflow/{v2/step.py → step.py} +207 -49
  384. agno/workflow/{v2/steps.py → steps.py} +147 -66
  385. agno/workflow/types.py +482 -0
  386. agno/workflow/workflow.py +2410 -696
  387. agno-2.0.0.dist-info/METADATA +494 -0
  388. agno-2.0.0.dist-info/RECORD +515 -0
  389. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  390. agno/agent/metrics.py +0 -110
  391. agno/api/app.py +0 -35
  392. agno/api/playground.py +0 -92
  393. agno/api/schemas/app.py +0 -12
  394. agno/api/schemas/playground.py +0 -22
  395. agno/api/schemas/user.py +0 -35
  396. agno/api/schemas/workspace.py +0 -46
  397. agno/api/user.py +0 -160
  398. agno/api/workflows.py +0 -33
  399. agno/api/workspace.py +0 -175
  400. agno/app/agui/__init__.py +0 -3
  401. agno/app/agui/app.py +0 -17
  402. agno/app/agui/sync_router.py +0 -120
  403. agno/app/base.py +0 -186
  404. agno/app/discord/__init__.py +0 -3
  405. agno/app/fastapi/__init__.py +0 -3
  406. agno/app/fastapi/app.py +0 -107
  407. agno/app/fastapi/async_router.py +0 -457
  408. agno/app/fastapi/sync_router.py +0 -448
  409. agno/app/playground/app.py +0 -228
  410. agno/app/playground/async_router.py +0 -1053
  411. agno/app/playground/deploy.py +0 -249
  412. agno/app/playground/operator.py +0 -183
  413. agno/app/playground/schemas.py +0 -223
  414. agno/app/playground/serve.py +0 -55
  415. agno/app/playground/sync_router.py +0 -1045
  416. agno/app/playground/utils.py +0 -46
  417. agno/app/settings.py +0 -15
  418. agno/app/slack/__init__.py +0 -3
  419. agno/app/slack/app.py +0 -19
  420. agno/app/slack/sync_router.py +0 -92
  421. agno/app/utils.py +0 -54
  422. agno/app/whatsapp/__init__.py +0 -3
  423. agno/app/whatsapp/app.py +0 -15
  424. agno/app/whatsapp/sync_router.py +0 -197
  425. agno/cli/auth_server.py +0 -249
  426. agno/cli/config.py +0 -274
  427. agno/cli/console.py +0 -88
  428. agno/cli/credentials.py +0 -23
  429. agno/cli/entrypoint.py +0 -571
  430. agno/cli/operator.py +0 -357
  431. agno/cli/settings.py +0 -96
  432. agno/cli/ws/ws_cli.py +0 -817
  433. agno/constants.py +0 -13
  434. agno/document/__init__.py +0 -5
  435. agno/document/chunking/semantic.py +0 -45
  436. agno/document/chunking/strategy.py +0 -31
  437. agno/document/reader/__init__.py +0 -5
  438. agno/document/reader/base.py +0 -47
  439. agno/document/reader/docx_reader.py +0 -60
  440. agno/document/reader/gcs/pdf_reader.py +0 -44
  441. agno/document/reader/s3/pdf_reader.py +0 -59
  442. agno/document/reader/s3/text_reader.py +0 -63
  443. agno/document/reader/url_reader.py +0 -59
  444. agno/document/reader/youtube_reader.py +0 -58
  445. agno/embedder/__init__.py +0 -5
  446. agno/embedder/langdb.py +0 -80
  447. agno/embedder/mistral.py +0 -82
  448. agno/embedder/openai.py +0 -78
  449. agno/file/__init__.py +0 -5
  450. agno/file/file.py +0 -16
  451. agno/file/local/csv.py +0 -32
  452. agno/file/local/txt.py +0 -19
  453. agno/infra/app.py +0 -240
  454. agno/infra/base.py +0 -144
  455. agno/infra/context.py +0 -20
  456. agno/infra/db_app.py +0 -52
  457. agno/infra/resource.py +0 -205
  458. agno/infra/resources.py +0 -55
  459. agno/knowledge/agent.py +0 -702
  460. agno/knowledge/arxiv.py +0 -33
  461. agno/knowledge/combined.py +0 -36
  462. agno/knowledge/csv.py +0 -144
  463. agno/knowledge/csv_url.py +0 -124
  464. agno/knowledge/document.py +0 -223
  465. agno/knowledge/docx.py +0 -137
  466. agno/knowledge/firecrawl.py +0 -34
  467. agno/knowledge/gcs/__init__.py +0 -0
  468. agno/knowledge/gcs/base.py +0 -39
  469. agno/knowledge/gcs/pdf.py +0 -125
  470. agno/knowledge/json.py +0 -137
  471. agno/knowledge/langchain.py +0 -71
  472. agno/knowledge/light_rag.py +0 -273
  473. agno/knowledge/llamaindex.py +0 -66
  474. agno/knowledge/markdown.py +0 -154
  475. agno/knowledge/pdf.py +0 -164
  476. agno/knowledge/pdf_bytes.py +0 -42
  477. agno/knowledge/pdf_url.py +0 -148
  478. agno/knowledge/s3/__init__.py +0 -0
  479. agno/knowledge/s3/base.py +0 -64
  480. agno/knowledge/s3/pdf.py +0 -33
  481. agno/knowledge/s3/text.py +0 -34
  482. agno/knowledge/text.py +0 -141
  483. agno/knowledge/url.py +0 -46
  484. agno/knowledge/website.py +0 -179
  485. agno/knowledge/wikipedia.py +0 -32
  486. agno/knowledge/youtube.py +0 -35
  487. agno/memory/agent.py +0 -423
  488. agno/memory/classifier.py +0 -104
  489. agno/memory/db/__init__.py +0 -5
  490. agno/memory/db/base.py +0 -42
  491. agno/memory/db/mongodb.py +0 -189
  492. agno/memory/db/postgres.py +0 -203
  493. agno/memory/db/sqlite.py +0 -193
  494. agno/memory/memory.py +0 -22
  495. agno/memory/row.py +0 -36
  496. agno/memory/summarizer.py +0 -201
  497. agno/memory/summary.py +0 -19
  498. agno/memory/team.py +0 -415
  499. agno/memory/v2/__init__.py +0 -2
  500. agno/memory/v2/db/__init__.py +0 -1
  501. agno/memory/v2/db/base.py +0 -42
  502. agno/memory/v2/db/firestore.py +0 -339
  503. agno/memory/v2/db/mongodb.py +0 -196
  504. agno/memory/v2/db/postgres.py +0 -214
  505. agno/memory/v2/db/redis.py +0 -187
  506. agno/memory/v2/db/schema.py +0 -54
  507. agno/memory/v2/db/sqlite.py +0 -209
  508. agno/memory/v2/manager.py +0 -437
  509. agno/memory/v2/memory.py +0 -1097
  510. agno/memory/v2/schema.py +0 -55
  511. agno/memory/v2/summarizer.py +0 -215
  512. agno/memory/workflow.py +0 -38
  513. agno/models/ollama/tools.py +0 -430
  514. agno/models/qwen/__init__.py +0 -5
  515. agno/playground/__init__.py +0 -10
  516. agno/playground/deploy.py +0 -3
  517. agno/playground/playground.py +0 -3
  518. agno/playground/serve.py +0 -3
  519. agno/playground/settings.py +0 -3
  520. agno/reranker/__init__.py +0 -0
  521. agno/run/response.py +0 -467
  522. agno/run/v2/__init__.py +0 -0
  523. agno/run/v2/workflow.py +0 -567
  524. agno/storage/__init__.py +0 -0
  525. agno/storage/agent/__init__.py +0 -0
  526. agno/storage/agent/dynamodb.py +0 -1
  527. agno/storage/agent/json.py +0 -1
  528. agno/storage/agent/mongodb.py +0 -1
  529. agno/storage/agent/postgres.py +0 -1
  530. agno/storage/agent/singlestore.py +0 -1
  531. agno/storage/agent/sqlite.py +0 -1
  532. agno/storage/agent/yaml.py +0 -1
  533. agno/storage/base.py +0 -60
  534. agno/storage/dynamodb.py +0 -673
  535. agno/storage/firestore.py +0 -297
  536. agno/storage/gcs_json.py +0 -261
  537. agno/storage/in_memory.py +0 -234
  538. agno/storage/json.py +0 -237
  539. agno/storage/mongodb.py +0 -328
  540. agno/storage/mysql.py +0 -685
  541. agno/storage/postgres.py +0 -682
  542. agno/storage/redis.py +0 -336
  543. agno/storage/session/__init__.py +0 -16
  544. agno/storage/session/agent.py +0 -64
  545. agno/storage/session/team.py +0 -63
  546. agno/storage/session/v2/__init__.py +0 -5
  547. agno/storage/session/workflow.py +0 -61
  548. agno/storage/singlestore.py +0 -606
  549. agno/storage/sqlite.py +0 -646
  550. agno/storage/workflow/__init__.py +0 -0
  551. agno/storage/workflow/mongodb.py +0 -1
  552. agno/storage/workflow/postgres.py +0 -1
  553. agno/storage/workflow/sqlite.py +0 -1
  554. agno/storage/yaml.py +0 -241
  555. agno/tools/thinking.py +0 -73
  556. agno/utils/defaults.py +0 -57
  557. agno/utils/filesystem.py +0 -39
  558. agno/utils/git.py +0 -52
  559. agno/utils/json_io.py +0 -30
  560. agno/utils/load_env.py +0 -19
  561. agno/utils/py_io.py +0 -19
  562. agno/utils/pyproject.py +0 -18
  563. agno/utils/resource_filter.py +0 -31
  564. agno/workflow/v2/__init__.py +0 -21
  565. agno/workflow/v2/types.py +0 -357
  566. agno/workflow/v2/workflow.py +0 -3313
  567. agno/workspace/__init__.py +0 -0
  568. agno/workspace/config.py +0 -325
  569. agno/workspace/enums.py +0 -6
  570. agno/workspace/helpers.py +0 -52
  571. agno/workspace/operator.py +0 -757
  572. agno/workspace/settings.py +0 -158
  573. agno-1.8.2.dist-info/METADATA +0 -982
  574. agno-1.8.2.dist-info/RECORD +0 -566
  575. agno-1.8.2.dist-info/entry_points.txt +0 -3
  576. agno-1.8.2.dist-info/licenses/LICENSE +0 -375
  577. /agno/{app → db/migrations}/__init__.py +0 -0
  578. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  579. /agno/{cli → integrations}/__init__.py +0 -0
  580. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  581. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  582. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  583. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  584. /agno/{app → os/interfaces}/slack/security.py +0 -0
  585. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  586. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  587. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  588. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  589. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/tools/opencv.py CHANGED
@@ -1,10 +1,12 @@
1
- import base64
2
1
  import time
2
+ from pathlib import Path
3
+ from typing import Callable, List
3
4
  from uuid import uuid4
4
5
 
5
6
  from agno.agent import Agent
6
- from agno.media import ImageArtifact, VideoArtifact
7
- from agno.tools.toolkit import Toolkit
7
+ from agno.media import Image, Video
8
+ from agno.tools import Toolkit
9
+ from agno.tools.function import ToolResult
8
10
  from agno.utils.log import log_debug, log_error, log_info
9
11
 
10
12
  try:
@@ -16,30 +18,40 @@ except ImportError:
16
18
  class OpenCVTools(Toolkit):
17
19
  """Tools for capturing images and videos from the webcam using OpenCV"""
18
20
 
19
- def __init__(self, show_preview=False, **kwargs):
21
+ def __init__(
22
+ self,
23
+ show_preview=False,
24
+ enable_capture_image: bool = True,
25
+ enable_capture_video: bool = True,
26
+ all: bool = False,
27
+ **kwargs,
28
+ ):
29
+ self.show_preview = show_preview
30
+
31
+ tools: List[Callable] = []
32
+ if all or enable_capture_image:
33
+ tools.append(self.capture_image)
34
+ if all or enable_capture_video:
35
+ tools.append(self.capture_video)
36
+
20
37
  super().__init__(
21
38
  name="opencv_tools",
22
- tools=[
23
- self.capture_image,
24
- self.capture_video,
25
- ],
39
+ tools=tools,
26
40
  **kwargs,
27
41
  )
28
42
 
29
- self.show_preview = show_preview
30
-
31
43
  def capture_image(
32
44
  self,
33
45
  agent: Agent,
34
46
  prompt: str = "Webcam capture",
35
- ) -> str:
47
+ ) -> ToolResult:
36
48
  """Capture an image from the webcam.
37
49
 
38
50
  Args:
39
51
  prompt (str): Description of the image capture. Defaults to "Webcam capture".
40
52
 
41
53
  Returns:
42
- str: A message indicating success or failure.
54
+ ToolResult: A ToolResult containing the captured image or error message.
43
55
  """
44
56
  try:
45
57
  log_debug("Initializing webcam for image capture...")
@@ -55,7 +67,7 @@ class OpenCVTools(Toolkit):
55
67
  if not cam.isOpened():
56
68
  error_msg = "Could not open webcam. Please ensure your terminal has camera permissions and the camera is not being used by another application."
57
69
  log_error(error_msg)
58
- return error_msg
70
+ return ToolResult(content=error_msg)
59
71
 
60
72
  try:
61
73
  cam.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
@@ -73,7 +85,7 @@ class OpenCVTools(Toolkit):
73
85
  if not ret:
74
86
  error_msg = "Failed to read frame from webcam"
75
87
  log_error(error_msg)
76
- return error_msg
88
+ return ToolResult(content=error_msg)
77
89
 
78
90
  cv2.imshow('Camera Preview - Press "c" to capture, "q" to quit', frame)
79
91
 
@@ -84,41 +96,42 @@ class OpenCVTools(Toolkit):
84
96
  break
85
97
  elif key == ord("q"):
86
98
  log_info("Capture cancelled by user")
87
- return "Image capture cancelled by user"
99
+ return ToolResult(content="Image capture cancelled by user")
88
100
  else:
89
101
  ret, captured_frame = cam.read()
90
102
  if not ret:
91
103
  error_msg = "Failed to capture image from webcam"
92
104
  log_error(error_msg)
93
- return error_msg
105
+ return ToolResult(content=error_msg)
94
106
 
95
107
  if captured_frame is None:
96
108
  error_msg = "No frame captured"
97
109
  log_error(error_msg)
98
- return error_msg
110
+ return ToolResult(content=error_msg)
99
111
 
100
112
  success, encoded_image = cv2.imencode(".png", captured_frame)
101
113
 
102
114
  if not success:
103
115
  error_msg = "Failed to encode captured image"
104
116
  log_error(error_msg)
105
- return error_msg
117
+ return ToolResult(content=error_msg)
106
118
 
107
119
  image_bytes = encoded_image.tobytes()
108
- base64_encoded_image = base64.b64encode(image_bytes)
109
-
110
120
  media_id = str(uuid4())
111
- agent.add_image(
112
- ImageArtifact(
113
- id=media_id,
114
- content=base64_encoded_image,
115
- original_prompt=prompt,
116
- mime_type="image/png",
117
- )
121
+
122
+ # Create ImageArtifact with raw bytes (not base64 encoded)
123
+ image_artifact = Image(
124
+ id=media_id,
125
+ content=image_bytes, # Store as raw bytes
126
+ original_prompt=prompt,
127
+ mime_type="image/png",
118
128
  )
119
129
 
120
130
  log_debug(f"Successfully captured and attached image {media_id}")
121
- return "Image captured successfully"
131
+ return ToolResult(
132
+ content="Image captured successfully",
133
+ images=[image_artifact],
134
+ )
122
135
 
123
136
  finally:
124
137
  # Release the camera and close windows
@@ -129,14 +142,14 @@ class OpenCVTools(Toolkit):
129
142
  except Exception as e:
130
143
  error_msg = f"Error capturing image: {str(e)}"
131
144
  log_error(error_msg)
132
- return error_msg
145
+ return ToolResult(content=error_msg)
133
146
 
134
147
  def capture_video(
135
148
  self,
136
149
  agent: Agent,
137
150
  duration: int = 10,
138
151
  prompt: str = "Webcam video capture",
139
- ) -> str:
152
+ ) -> ToolResult:
140
153
  """Capture a video from the webcam.
141
154
 
142
155
  Args:
@@ -144,7 +157,7 @@ class OpenCVTools(Toolkit):
144
157
  prompt (str): Description of the video capture. Defaults to "Webcam video capture".
145
158
 
146
159
  Returns:
147
- str: A message indicating success or failure.
160
+ ToolResult: A ToolResult containing the captured video or error message.
148
161
  """
149
162
  try:
150
163
  log_debug("Initializing webcam for video capture...")
@@ -161,7 +174,7 @@ class OpenCVTools(Toolkit):
161
174
  if not cap.isOpened():
162
175
  error_msg = "Could not open webcam. Please ensure your terminal has camera permissions and the camera is not being used by another application."
163
176
  log_error(error_msg)
164
- return error_msg
177
+ return ToolResult(content=error_msg)
165
178
 
166
179
  try:
167
180
  frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
@@ -211,7 +224,7 @@ class OpenCVTools(Toolkit):
211
224
  if not out or not out.isOpened():
212
225
  error_msg = "Failed to initialize video writer with any codec"
213
226
  log_error(error_msg)
214
- return error_msg
227
+ return ToolResult(content=error_msg)
215
228
 
216
229
  start_time = time.time()
217
230
  frame_count = 0
@@ -227,7 +240,7 @@ class OpenCVTools(Toolkit):
227
240
  if not ret:
228
241
  error_msg = "Failed to capture video frame"
229
242
  log_error(error_msg)
230
- return error_msg
243
+ return ToolResult(content=error_msg)
231
244
 
232
245
  # Write the frame to the output file
233
246
  out.write(frame)
@@ -263,10 +276,11 @@ class OpenCVTools(Toolkit):
263
276
  out.release()
264
277
 
265
278
  # Verify the file was created and has content
266
- if not os.path.exists(temp_filepath) or os.path.getsize(temp_filepath) == 0:
279
+ temp_path = Path(temp_filepath)
280
+ if not temp_path.exists() or temp_path.stat().st_size == 0:
267
281
  error_msg = "Video file was not created or is empty"
268
282
  log_error(error_msg)
269
- return error_msg
283
+ return ToolResult(content=error_msg)
270
284
 
271
285
  # Read the video file and encode to base64
272
286
  with open(temp_filepath, "rb") as video_file:
@@ -275,23 +289,25 @@ class OpenCVTools(Toolkit):
275
289
  # Clean up temporary file
276
290
  os.unlink(temp_filepath)
277
291
 
278
- base64_encoded_video = base64.b64encode(video_bytes)
279
-
280
292
  media_id = str(uuid4())
281
- agent.add_video(
282
- VideoArtifact(
283
- id=media_id,
284
- content=base64_encoded_video,
285
- original_prompt=prompt,
286
- mime_type="video/mp4",
287
- )
293
+
294
+ # Create VideoArtifact with base64 encoded content
295
+ video_artifact = Video(
296
+ id=media_id,
297
+ content=video_bytes,
298
+ original_prompt=prompt,
299
+ mime_type="video/mp4",
288
300
  )
289
301
 
290
302
  actual_duration = time.time() - start_time
291
303
  log_debug(
292
304
  f"Successfully captured and attached video {media_id} ({actual_duration:.1f}s, {frame_count} frames)"
293
305
  )
294
- return f"Video captured successfully and attached as artifact {media_id} ({actual_duration:.1f}s, {frame_count} frames, {successful_codec} codec)"
306
+
307
+ return ToolResult(
308
+ content=f"Video captured successfully and attached as artifact {media_id} ({actual_duration:.1f}s, {frame_count} frames, {successful_codec} codec)",
309
+ videos=[video_artifact],
310
+ )
295
311
 
296
312
  finally:
297
313
  if "cap" in locals():
@@ -302,4 +318,4 @@ class OpenCVTools(Toolkit):
302
318
  except Exception as e:
303
319
  error_msg = f"Error capturing video: {str(e)}"
304
320
  log_error(error_msg)
305
- return error_msg
321
+ return ToolResult(content=error_msg)
agno/tools/openweather.py CHANGED
@@ -18,20 +18,22 @@ class OpenWeatherTools(Toolkit):
18
18
  Args:
19
19
  api_key (Optional[str]): OpenWeatherMap API key. If not provided, will try to get from OPENWEATHER_API_KEY env var.
20
20
  units (str): Units of measurement. Options are 'standard', 'metric', and 'imperial'. Default is 'metric'.
21
- current_weather (bool): Enable current weather function. Default is True.
22
- forecast (bool): Enable forecast function. Default is True.
23
- air_pollution (bool): Enable air pollution function. Default is True.
24
- geocoding (bool): Enable geocoding function. Default is True.
21
+ enable_current_weather (bool): Enable current weather function. Default is True.
22
+ enable_forecast (bool): Enable forecast function. Default is True.
23
+ enable_air_pollution (bool): Enable air pollution function. Default is True.
24
+ enable_geocoding (bool): Enable geocoding function. Default is True.
25
+ all (bool): Enable all functions. Default is False.
25
26
  """
26
27
 
27
28
  def __init__(
28
29
  self,
29
30
  api_key: Optional[str] = None,
30
31
  units: str = "metric",
31
- current_weather: bool = True,
32
- forecast: bool = True,
33
- air_pollution: bool = True,
34
- geocoding: bool = True,
32
+ enable_current_weather: bool = True,
33
+ enable_forecast: bool = True,
34
+ enable_air_pollution: bool = True,
35
+ enable_geocoding: bool = True,
36
+ all: bool = False,
35
37
  **kwargs,
36
38
  ):
37
39
  self.api_key = api_key or getenv("OPENWEATHER_API_KEY")
@@ -45,13 +47,13 @@ class OpenWeatherTools(Toolkit):
45
47
  self.geo_url = "https://api.openweathermap.org/geo/1.0"
46
48
 
47
49
  tools: List[Any] = []
48
- if current_weather:
50
+ if enable_current_weather or all:
49
51
  tools.append(self.get_current_weather)
50
- if forecast:
52
+ if enable_forecast or all:
51
53
  tools.append(self.get_forecast)
52
- if air_pollution:
54
+ if enable_air_pollution or all:
53
55
  tools.append(self.get_air_pollution)
54
- if geocoding:
56
+ if enable_geocoding or all:
55
57
  tools.append(self.geocode_location)
56
58
 
57
59
  super().__init__(name="openweather_tools", tools=tools, **kwargs)
agno/tools/pandas.py CHANGED
@@ -10,12 +10,20 @@ except ImportError:
10
10
 
11
11
 
12
12
  class PandasTools(Toolkit):
13
- def __init__(self, **kwargs):
13
+ def __init__(
14
+ self,
15
+ enable_create_pandas_dataframe: bool = True,
16
+ enable_run_dataframe_operation: bool = True,
17
+ all: bool = False,
18
+ **kwargs,
19
+ ):
14
20
  self.dataframes: Dict[str, pd.DataFrame] = {}
15
21
 
16
22
  tools: List[Any] = []
17
- tools.append(self.create_pandas_dataframe)
18
- tools.append(self.run_dataframe_operation)
23
+ if all or enable_create_pandas_dataframe:
24
+ tools.append(self.create_pandas_dataframe)
25
+ if all or enable_run_dataframe_operation:
26
+ tools.append(self.run_dataframe_operation)
19
27
 
20
28
  super().__init__(name="pandas_tools", tools=tools, **kwargs)
21
29
 
agno/tools/postgres.py CHANGED
@@ -22,10 +22,6 @@ class PostgresTools(Toolkit):
22
22
  password: Optional[str] = None,
23
23
  host: Optional[str] = None,
24
24
  port: Optional[int] = None,
25
- run_queries: bool = True,
26
- inspect_queries: bool = False,
27
- summarize_tables: bool = True,
28
- export_tables: bool = False,
29
25
  table_schema: str = "public",
30
26
  **kwargs,
31
27
  ):
@@ -40,15 +36,11 @@ class PostgresTools(Toolkit):
40
36
  tools: List[Any] = [
41
37
  self.show_tables,
42
38
  self.describe_table,
39
+ self.summarize_table,
40
+ self.inspect_query,
41
+ self.run_query,
42
+ self.export_table_to_path,
43
43
  ]
44
- if inspect_queries:
45
- tools.append(self.inspect_query)
46
- if run_queries:
47
- tools.append(self.run_query)
48
- if summarize_tables:
49
- tools.append(self.summarize_table)
50
- if export_tables:
51
- tools.append(self.export_table_to_path)
52
44
 
53
45
  super().__init__(name="postgres_tools", tools=tools, **kwargs)
54
46
 
agno/tools/pubmed.py CHANGED
@@ -14,6 +14,8 @@ class PubmedTools(Toolkit):
14
14
  email: str = "your_email@example.com",
15
15
  max_results: Optional[int] = None,
16
16
  results_expanded: bool = False,
17
+ enable_search_pubmed: bool = True,
18
+ all: bool = False,
17
19
  **kwargs,
18
20
  ):
19
21
  self.max_results: Optional[int] = max_results
@@ -21,7 +23,8 @@ class PubmedTools(Toolkit):
21
23
  self.results_expanded: bool = results_expanded
22
24
 
23
25
  tools: List[Any] = []
24
- tools.append(self.search_pubmed)
26
+ if enable_search_pubmed or all:
27
+ tools.append(self.search_pubmed)
25
28
 
26
29
  super().__init__(name="pubmed", tools=tools, **kwargs)
27
30
 
agno/tools/python.py CHANGED
@@ -16,13 +16,6 @@ class PythonTools(Toolkit):
16
16
  def __init__(
17
17
  self,
18
18
  base_dir: Optional[Path] = None,
19
- save_and_run: bool = True,
20
- pip_install: bool = False,
21
- uv_pip_install: bool = False,
22
- run_code: bool = False,
23
- list_files: bool = False,
24
- run_files: bool = False,
25
- read_files: bool = False,
26
19
  safe_globals: Optional[dict] = None,
27
20
  safe_locals: Optional[dict] = None,
28
21
  **kwargs,
@@ -33,21 +26,15 @@ class PythonTools(Toolkit):
33
26
  self.safe_globals: dict = safe_globals or globals()
34
27
  self.safe_locals: dict = safe_locals or locals()
35
28
 
36
- tools: List[Any] = []
37
- if run_code:
38
- tools.append(self.run_python_code)
39
- if save_and_run:
40
- tools.append(self.save_to_file_and_run)
41
- if pip_install:
42
- tools.append(self.pip_install_package)
43
- if uv_pip_install:
44
- tools.append(self.uv_pip_install_package)
45
- if run_files:
46
- tools.append(self.run_python_file_return_variable)
47
- if read_files:
48
- tools.append(self.read_file)
49
- if list_files:
50
- tools.append(self.list_files)
29
+ tools: List[Any] = [
30
+ self.save_to_file_and_run,
31
+ self.run_python_code,
32
+ self.pip_install_package,
33
+ self.uv_pip_install_package,
34
+ self.run_python_file_return_variable,
35
+ self.read_file,
36
+ self.list_files,
37
+ ]
51
38
 
52
39
  super().__init__(name="python_tools", tools=tools, **kwargs)
53
40
 
agno/tools/reasoning.py CHANGED
@@ -1,9 +1,7 @@
1
1
  from textwrap import dedent
2
- from typing import Any, List, Optional, Union
2
+ from typing import Any, Dict, List, Optional
3
3
 
4
- from agno.agent import Agent
5
4
  from agno.reasoning.step import NextAction, ReasoningStep
6
- from agno.team.team import Team
7
5
  from agno.tools import Toolkit
8
6
  from agno.utils.log import log_debug, log_error
9
7
 
@@ -11,8 +9,9 @@ from agno.utils.log import log_debug, log_error
11
9
  class ReasoningTools(Toolkit):
12
10
  def __init__(
13
11
  self,
14
- think: bool = True,
15
- analyze: bool = True,
12
+ enable_think: bool = True,
13
+ enable_analyze: bool = True,
14
+ all: bool = False,
16
15
  instructions: Optional[str] = None,
17
16
  add_instructions: bool = False,
18
17
  add_few_shot: bool = False,
@@ -34,9 +33,10 @@ class ReasoningTools(Toolkit):
34
33
  self.instructions = instructions
35
34
 
36
35
  tools: List[Any] = []
37
- if think:
36
+ # Prefer new flags; fallback to legacy ones
37
+ if all or enable_think:
38
38
  tools.append(self.think)
39
- if analyze:
39
+ if all or enable_analyze:
40
40
  tools.append(self.analyze)
41
41
 
42
42
  super().__init__(
@@ -48,7 +48,12 @@ class ReasoningTools(Toolkit):
48
48
  )
49
49
 
50
50
  def think(
51
- self, agent: Union[Agent, Team], title: str, thought: str, action: Optional[str] = None, confidence: float = 0.8
51
+ self,
52
+ session_state: Dict[str, Any],
53
+ title: str,
54
+ thought: str,
55
+ action: Optional[str] = None,
56
+ confidence: float = 0.8,
52
57
  ) -> str:
53
58
  """Use this tool as a scratchpad to reason about the question and work through it step-by-step.
54
59
  This tool will help you break down complex problems into logical steps and track the reasoning process.
@@ -75,19 +80,21 @@ class ReasoningTools(Toolkit):
75
80
  confidence=confidence,
76
81
  )
77
82
 
83
+ current_run_id = session_state.get("current_run_id", None)
84
+
78
85
  # Add this step to the Agent's session state
79
- if agent.session_state is None:
80
- agent.session_state = {}
81
- if "reasoning_steps" not in agent.session_state:
82
- agent.session_state["reasoning_steps"] = {}
83
- if agent.run_id not in agent.session_state["reasoning_steps"]:
84
- agent.session_state["reasoning_steps"][agent.run_id] = []
85
- agent.session_state["reasoning_steps"][agent.run_id].append(reasoning_step.model_dump_json())
86
+ if session_state is None:
87
+ session_state = {}
88
+ if "reasoning_steps" not in session_state:
89
+ session_state["reasoning_steps"] = {}
90
+ if current_run_id not in session_state["reasoning_steps"]:
91
+ session_state["reasoning_steps"][current_run_id] = []
92
+ session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
86
93
 
87
94
  # Return all previous reasoning_steps and the new reasoning_step
88
- if "reasoning_steps" in agent.session_state and agent.run_id in agent.session_state["reasoning_steps"]:
95
+ if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
89
96
  formatted_reasoning_steps = ""
90
- for i, step in enumerate(agent.session_state["reasoning_steps"][agent.run_id], 1):
97
+ for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
91
98
  step_parsed = ReasoningStep.model_validate_json(step)
92
99
  step_str = dedent(f"""\
93
100
  Step {i}:
@@ -105,7 +112,7 @@ Confidence: {step_parsed.confidence}
105
112
 
106
113
  def analyze(
107
114
  self,
108
- agent: Union[Agent, Team],
115
+ session_state: Dict[str, Any],
109
116
  title: str,
110
117
  result: str,
111
118
  analysis: str,
@@ -143,19 +150,20 @@ Confidence: {step_parsed.confidence}
143
150
  confidence=confidence,
144
151
  )
145
152
 
153
+ current_run_id = session_state.get("current_run_id", None)
146
154
  # Add this step to the Agent's session state
147
- if agent.session_state is None:
148
- agent.session_state = {}
149
- if "reasoning_steps" not in agent.session_state:
150
- agent.session_state["reasoning_steps"] = {}
151
- if agent.run_id not in agent.session_state["reasoning_steps"]:
152
- agent.session_state["reasoning_steps"][agent.run_id] = []
153
- agent.session_state["reasoning_steps"][agent.run_id].append(reasoning_step.model_dump_json())
155
+ if session_state is None:
156
+ session_state = {}
157
+ if "reasoning_steps" not in session_state:
158
+ session_state["reasoning_steps"] = {}
159
+ if current_run_id not in session_state["reasoning_steps"]:
160
+ session_state["reasoning_steps"][current_run_id] = []
161
+ session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
154
162
 
155
163
  # Return all previous reasoning_steps and the new reasoning_step
156
- if "reasoning_steps" in agent.session_state and agent.run_id in agent.session_state["reasoning_steps"]:
164
+ if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
157
165
  formatted_reasoning_steps = ""
158
- for i, step in enumerate(agent.session_state["reasoning_steps"][agent.run_id], 1):
166
+ for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
159
167
  step_parsed = ReasoningStep.model_validate_json(step)
160
168
  step_str = dedent(f"""\
161
169
  Step {i}:
agno/tools/reddit.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  from os import getenv
3
- from typing import Any, Dict, List, Optional, Union
3
+ from typing import Callable, Dict, List, Optional, Union
4
4
 
5
5
  from agno.tools import Toolkit
6
6
  from agno.utils.log import log_debug, log_info, logger
@@ -20,14 +20,6 @@ class RedditTools(Toolkit):
20
20
  user_agent: Optional[str] = None,
21
21
  username: Optional[str] = None,
22
22
  password: Optional[str] = None,
23
- get_user_info: bool = True,
24
- get_top_posts: bool = True,
25
- get_subreddit_info: bool = True,
26
- get_trending_subreddits: bool = True,
27
- get_subreddit_stats: bool = True,
28
- create_post: bool = True,
29
- reply_to_post: bool = True,
30
- reply_to_comment: bool = True,
31
23
  **kwargs,
32
24
  ):
33
25
  if reddit_instance is not None:
@@ -65,23 +57,16 @@ class RedditTools(Toolkit):
65
57
  else:
66
58
  logger.warning("Missing Reddit API credentials")
67
59
 
68
- tools: List[Any] = []
69
- if get_user_info:
70
- tools.append(self.get_user_info)
71
- if get_top_posts:
72
- tools.append(self.get_top_posts)
73
- if get_subreddit_info:
74
- tools.append(self.get_subreddit_info)
75
- if get_trending_subreddits:
76
- tools.append(self.get_trending_subreddits)
77
- if get_subreddit_stats:
78
- tools.append(self.get_subreddit_stats)
79
- if create_post:
80
- tools.append(self.create_post)
81
- if reply_to_post:
82
- tools.append(self.reply_to_post)
83
- if reply_to_comment:
84
- tools.append(self.reply_to_comment)
60
+ tools: List[Callable] = [
61
+ self.get_user_info,
62
+ self.get_top_posts,
63
+ self.get_subreddit_info,
64
+ self.get_trending_subreddits,
65
+ self.get_subreddit_stats,
66
+ self.create_post,
67
+ self.reply_to_post,
68
+ self.reply_to_comment,
69
+ ]
85
70
 
86
71
  super().__init__(name="reddit", tools=tools, **kwargs)
87
72