agno 1.8.1__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 (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1416 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1551 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.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