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/cartesia.py CHANGED
@@ -1,13 +1,13 @@
1
1
  import json
2
- from base64 import b64encode
3
2
  from os import getenv
4
3
  from typing import Any, Dict, List, Optional, Union
5
4
  from uuid import uuid4
6
5
 
7
6
  from agno.agent import Agent
8
- from agno.media import AudioArtifact
7
+ from agno.media import Audio
9
8
  from agno.team.team import Team
10
9
  from agno.tools import Toolkit
10
+ from agno.tools.function import ToolResult
11
11
  from agno.utils.log import log_debug, log_error, log_info
12
12
 
13
13
  try:
@@ -22,9 +22,10 @@ class CartesiaTools(Toolkit):
22
22
  api_key: Optional[str] = None,
23
23
  model_id: str = "sonic-2",
24
24
  default_voice_id: str = "78ab82d5-25be-4f7d-82b3-7ad64e5b85b2",
25
- text_to_speech_enabled: bool = True,
26
- list_voices_enabled: bool = True,
27
- voice_localize_enabled: bool = False,
25
+ enable_text_to_speech: bool = True,
26
+ enable_list_voices: bool = True,
27
+ enable_localize_voice: bool = False,
28
+ all: bool = False,
28
29
  **kwargs,
29
30
  ):
30
31
  self.api_key = api_key or getenv("CARTESIA_API_KEY")
@@ -37,11 +38,11 @@ class CartesiaTools(Toolkit):
37
38
  self.default_voice_id = default_voice_id
38
39
 
39
40
  tools: List[Any] = []
40
- if voice_localize_enabled:
41
+ if all or enable_localize_voice:
41
42
  tools.append(self.localize_voice)
42
- if text_to_speech_enabled:
43
+ if all or enable_text_to_speech:
43
44
  tools.append(self.text_to_speech)
44
- if list_voices_enabled:
45
+ if all or enable_list_voices:
45
46
  tools.append(self.list_voices)
46
47
 
47
48
  super().__init__(name="cartesia_tools", tools=tools, **kwargs)
@@ -131,15 +132,15 @@ class CartesiaTools(Toolkit):
131
132
  agent: Union[Agent, Team],
132
133
  transcript: str,
133
134
  voice_id: Optional[str] = None,
134
- ) -> str:
135
+ ) -> ToolResult:
135
136
  """
136
- Convert text to speechß.
137
+ Convert text to speech.
137
138
  Args:
138
139
  transcript: The text to convert to speech
139
140
  voice_id (optional): The ID of the voice to use for the text-to-speech. If None, uses the default voice ID configured in the tool. Defaults to None.
140
141
 
141
142
  Returns:
142
- str: Success or error message.
143
+ ToolResult: A ToolResult containing the generated audio or error message.
143
144
  """
144
145
 
145
146
  try:
@@ -168,17 +169,19 @@ class CartesiaTools(Toolkit):
168
169
 
169
170
  audio_iterator = self.client.tts.bytes(**params)
170
171
  audio_data = b"".join(chunk for chunk in audio_iterator)
171
- base64_audio = b64encode(audio_data).decode("utf-8")
172
172
 
173
- artifact = AudioArtifact(
173
+ # Create AudioArtifact
174
+ audio_artifact = Audio(
174
175
  id=str(uuid4()),
175
- base64_audio=base64_audio,
176
+ content=audio_data,
176
177
  mime_type=mime_type, # Hardcoded to audio/mpeg
177
178
  )
178
- agent.add_audio(artifact)
179
179
 
180
- return "Audio generated and attached successfully."
180
+ return ToolResult(
181
+ content="Audio generated and attached successfully.",
182
+ audios=[audio_artifact],
183
+ )
181
184
 
182
185
  except Exception as e:
183
186
  log_error(f"Error generating speech with Cartesia: {e}", exc_info=True)
184
- return f"Error generating speech: {e}"
187
+ return ToolResult(content=f"Error generating speech: {e}")
@@ -1,6 +1,6 @@
1
1
  import json
2
- import os
3
2
  import re
3
+ from os import getenv
4
4
  from typing import Any, Dict, List, Optional
5
5
 
6
6
  from agno.tools import Toolkit
@@ -17,17 +17,10 @@ class ClickUpTools(Toolkit):
17
17
  self,
18
18
  api_key: Optional[str] = None,
19
19
  master_space_id: Optional[str] = None,
20
- list_tasks: bool = True,
21
- create_task: bool = True,
22
- get_task: bool = True,
23
- update_task: bool = True,
24
- delete_task: bool = True,
25
- list_spaces: bool = True,
26
- list_lists: bool = True,
27
20
  **kwargs,
28
21
  ):
29
- self.api_key = api_key or os.getenv("CLICKUP_API_KEY")
30
- self.master_space_id = master_space_id or os.getenv("MASTER_SPACE_ID")
22
+ self.api_key = api_key or getenv("CLICKUP_API_KEY")
23
+ self.master_space_id = master_space_id or getenv("MASTER_SPACE_ID")
31
24
  self.base_url = "https://api.clickup.com/api/v2"
32
25
  self.headers = {"Authorization": self.api_key}
33
26
 
@@ -36,21 +29,15 @@ class ClickUpTools(Toolkit):
36
29
  if not self.master_space_id:
37
30
  raise ValueError("MASTER_SPACE_ID not set. Please set the MASTER_SPACE_ID environment variable.")
38
31
 
39
- tools: List[Any] = []
40
- if list_tasks:
41
- tools.append(self.list_tasks)
42
- if create_task:
43
- tools.append(self.create_task)
44
- if get_task:
45
- tools.append(self.get_task)
46
- if update_task:
47
- tools.append(self.update_task)
48
- if delete_task:
49
- tools.append(self.delete_task)
50
- if list_spaces:
51
- tools.append(self.list_spaces)
52
- if list_lists:
53
- tools.append(self.list_lists)
32
+ tools: List[Any] = [
33
+ self.list_tasks,
34
+ self.create_task,
35
+ self.get_task,
36
+ self.update_task,
37
+ self.delete_task,
38
+ self.list_spaces,
39
+ self.list_lists,
40
+ ]
54
41
 
55
42
  super().__init__(name="clickup", tools=tools, **kwargs)
56
43
 
agno/tools/confluence.py CHANGED
@@ -39,7 +39,6 @@ class ConfluenceTools(Toolkit):
39
39
  - CONFLUENCE_API_KEY
40
40
  """
41
41
 
42
- super().__init__(name="confluence_tools", **kwargs)
43
42
  self.url = url or getenv("CONFLUENCE_URL")
44
43
  self.username = username or getenv("CONFLUENCE_USERNAME")
45
44
  self.password = api_key or getenv("CONFLUENCE_API_KEY") or password or getenv("CONFLUENCE_PASSWORD")
@@ -73,13 +72,14 @@ class ConfluenceTools(Toolkit):
73
72
  session=session,
74
73
  )
75
74
 
76
- tools: List[Any] = []
77
- tools.append(self.get_page_content)
78
- tools.append(self.get_space_key)
79
- tools.append(self.create_page)
80
- tools.append(self.update_page)
81
- tools.append(self.get_all_space_detail)
82
- tools.append(self.get_all_page_from_space)
75
+ tools: List[Any] = [
76
+ self.get_page_content,
77
+ self.get_space_key,
78
+ self.create_page,
79
+ self.update_page,
80
+ self.get_all_space_detail,
81
+ self.get_all_page_from_space,
82
+ ]
83
83
 
84
84
  super().__init__(name="confluence_tools", tools=tools, **kwargs)
85
85
 
agno/tools/crawl4ai.py CHANGED
@@ -20,9 +20,15 @@ class Crawl4aiTools(Toolkit):
20
20
  bm25_threshold: float = 1.0,
21
21
  headless: bool = True,
22
22
  wait_until: str = "domcontentloaded",
23
+ enable_crawl: bool = True,
24
+ all: bool = False,
23
25
  **kwargs,
24
26
  ):
25
- super().__init__(name="crawl4ai_tools", tools=[self.crawl], **kwargs)
27
+ tools = []
28
+ if all or enable_crawl:
29
+ tools.append(self.crawl)
30
+
31
+ super().__init__(name="crawl4ai_tools", tools=tools, **kwargs)
26
32
  self.max_length = max_length
27
33
  self.timeout = timeout
28
34
  self.use_pruning = use_pruning
agno/tools/csv_toolkit.py CHANGED
@@ -12,12 +12,13 @@ class CsvTools(Toolkit):
12
12
  self,
13
13
  csvs: Optional[List[Union[str, Path]]] = None,
14
14
  row_limit: Optional[int] = None,
15
- read_csvs: bool = True,
16
- list_csvs: bool = True,
17
- query_csvs: bool = True,
18
- read_column_names: bool = True,
19
15
  duckdb_connection: Optional[Any] = None,
20
16
  duckdb_kwargs: Optional[Dict[str, Any]] = None,
17
+ enable_read_csv_file: bool = True,
18
+ enable_list_csv_files: bool = True,
19
+ enable_get_columns: bool = True,
20
+ enable_query_csv_file: bool = True,
21
+ all: bool = False,
21
22
  **kwargs,
22
23
  ):
23
24
  self.csvs: List[Path] = []
@@ -34,13 +35,13 @@ class CsvTools(Toolkit):
34
35
  self.duckdb_kwargs: Optional[Dict[str, Any]] = duckdb_kwargs
35
36
 
36
37
  tools: List[Any] = []
37
- if read_csvs:
38
+ if all or enable_read_csv_file:
38
39
  tools.append(self.read_csv_file)
39
- if list_csvs:
40
+ if all or enable_list_csv_files:
40
41
  tools.append(self.list_csv_files)
41
- if read_column_names:
42
+ if all or enable_get_columns:
42
43
  tools.append(self.get_columns)
43
- if query_csvs:
44
+ if all or enable_query_csv_file:
44
45
  try:
45
46
  import duckdb # noqa: F401
46
47
 
agno/tools/dalle.py CHANGED
@@ -3,9 +3,10 @@ from typing import Any, List, Literal, Optional, Union
3
3
  from uuid import uuid4
4
4
 
5
5
  from agno.agent import Agent
6
- from agno.media import ImageArtifact
6
+ from agno.media import Image
7
7
  from agno.team.team import Team
8
8
  from agno.tools import Toolkit
9
+ from agno.tools.function import ToolResult
9
10
  from agno.utils.log import log_debug, logger
10
11
 
11
12
  try:
@@ -24,6 +25,8 @@ class DalleTools(Toolkit):
24
25
  quality: Literal["standard", "hd"] = "standard",
25
26
  style: Literal["vivid", "natural"] = "vivid",
26
27
  api_key: Optional[str] = None,
28
+ enable_create_image: bool = True,
29
+ all: bool = False,
27
30
  **kwargs,
28
31
  ):
29
32
  self.model = model
@@ -51,7 +54,8 @@ class DalleTools(Toolkit):
51
54
  logger.error("OPENAI_API_KEY not set. Please set the OPENAI_API_KEY environment variable.")
52
55
 
53
56
  tools: List[Any] = []
54
- tools.append(self.create_image)
57
+ if all or enable_create_image:
58
+ tools.append(self.create_image)
55
59
 
56
60
  super().__init__(name="dalle", tools=tools, **kwargs)
57
61
 
@@ -60,17 +64,17 @@ class DalleTools(Toolkit):
60
64
  # - Add support for saving images
61
65
  # - Add support for editing images
62
66
 
63
- def create_image(self, agent: Union[Agent, Team], prompt: str) -> str:
67
+ def create_image(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
64
68
  """Use this function to generate an image for a prompt.
65
69
 
66
70
  Args:
67
71
  prompt (str): A text description of the desired image.
68
72
 
69
73
  Returns:
70
- str: str: A message indicating if the image has been generated successfully or an error message.
74
+ ToolResult: Result containing the message and generated images.
71
75
  """
72
76
  if not self.api_key:
73
- return "Please set the OPENAI_API_KEY"
77
+ return ToolResult(content="Please set the OPENAI_API_KEY")
74
78
 
75
79
  try:
76
80
  client = OpenAI(api_key=self.api_key)
@@ -85,18 +89,24 @@ class DalleTools(Toolkit):
85
89
  )
86
90
  log_debug("Image generated successfully")
87
91
 
88
- # Update the run response with the image URLs
92
+ generated_images = []
89
93
  response_str = ""
90
94
  if response.data:
91
95
  for img in response.data:
92
96
  if img.url:
93
- agent.add_image(
94
- ImageArtifact(
95
- id=str(uuid4()), url=img.url, original_prompt=prompt, revised_prompt=img.revised_prompt
96
- )
97
+ image = Image(
98
+ id=str(uuid4()),
99
+ url=img.url,
100
+ original_prompt=prompt,
101
+ revised_prompt=img.revised_prompt,
97
102
  )
103
+ generated_images.append(image)
98
104
  response_str += f"Image has been generated at the URL {img.url}\n"
99
- return response_str or "No images were generated"
105
+
106
+ return ToolResult(
107
+ content=response_str or "No images were generated",
108
+ images=generated_images if generated_images else None,
109
+ )
100
110
  except Exception as e:
101
111
  logger.error(f"Failed to generate image: {e}")
102
- return f"Error: {e}"
112
+ return ToolResult(content=f"Error: {e}")
agno/tools/daytona.py CHANGED
@@ -2,7 +2,7 @@ import json
2
2
  from os import getenv
3
3
  from pathlib import Path
4
4
  from textwrap import dedent
5
- from typing import Dict, Optional, Union
5
+ from typing import Any, Dict, List, Optional, Union
6
6
 
7
7
  from agno.agent import Agent
8
8
  from agno.team import Team
@@ -24,7 +24,6 @@ except ImportError:
24
24
  DEFAULT_INSTRUCTIONS = dedent(
25
25
  """\
26
26
  You have access to a persistent Daytona sandbox for code execution. The sandbox maintains state across interactions.
27
-
28
27
  Available tools:
29
28
  - `run_code`: Execute code in the sandbox
30
29
  - `run_shell_command`: Execute shell commands (bash)
@@ -33,21 +32,19 @@ DEFAULT_INSTRUCTIONS = dedent(
33
32
  - `list_files`: List directory contents
34
33
  - `delete_file`: Delete files or directories
35
34
  - `change_directory`: Change the working directory
36
-
37
35
  MANDATORY: When users ask for code (Python, JavaScript, TypeScript, etc.), you MUST:
38
36
  1. Write the code
39
37
  2. Execute it using run_code tool
40
38
  3. Show the actual output/results
41
39
  4. Never just provide code without executing it
42
-
43
40
  CRITICAL WORKFLOW:
44
41
  1. Before running Python scripts, check if required packages are installed
45
42
  2. Install missing packages with: run_shell_command("pip install package1 package2")
46
43
  3. When running scripts, capture both output AND errors
47
44
  4. If a script produces no output, check for errors or add print statements
48
-
45
+
49
46
  IMPORTANT: Always use single quotes for the content parameter when creating files
50
-
47
+
51
48
  Remember: Your job is to provide working, executed code examples, not just code snippets!
52
49
  """
53
50
  )
@@ -110,18 +107,18 @@ class DaytonaTools(Toolkit):
110
107
  )
111
108
 
112
109
  self.daytona = Daytona(self.config)
113
-
110
+ tools: List[Any] = [
111
+ self.run_code,
112
+ self.run_shell_command,
113
+ self.create_file,
114
+ self.read_file,
115
+ self.list_files,
116
+ self.delete_file,
117
+ self.change_directory,
118
+ ]
114
119
  super().__init__(
115
120
  name="daytona_tools",
116
- tools=[
117
- self.run_code,
118
- self.run_shell_command,
119
- self.create_file,
120
- self.read_file,
121
- self.list_files,
122
- self.delete_file,
123
- self.change_directory,
124
- ],
121
+ tools=tools,
125
122
  instructions=self.instructions,
126
123
  add_instructions=add_instructions,
127
124
  **kwargs,
agno/tools/decorator.py CHANGED
@@ -64,7 +64,6 @@ def tool(
64
64
  strict: Optional[bool] = None,
65
65
  instructions: Optional[str] = None,
66
66
  add_instructions: bool = True,
67
- sanitize_arguments: Optional[bool] = None,
68
67
  show_result: Optional[bool] = None,
69
68
  stop_after_tool_call: Optional[bool] = None,
70
69
  requires_confirmation: Optional[bool] = None,
@@ -91,7 +90,6 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
91
90
  name: Optional[str] - Override for the function name
92
91
  description: Optional[str] - Override for the function description
93
92
  strict: Optional[bool] - Flag for strict parameter checking
94
- sanitize_arguments: Optional[bool] - If True, arguments are sanitized before passing to function (Deprecated)
95
93
  instructions: Optional[str] - Instructions for using the tool
96
94
  add_instructions: bool - If True, add instructions to the system message
97
95
  show_result: Optional[bool] - If True, shows the result after function call
@@ -131,7 +129,6 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
131
129
  "strict",
132
130
  "instructions",
133
131
  "add_instructions",
134
- "sanitize_arguments",
135
132
  "show_result",
136
133
  "stop_after_tool_call",
137
134
  "requires_confirmation",
@@ -248,6 +245,12 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
248
245
  and v is not None
249
246
  },
250
247
  }
248
+
249
+ # Automatically set show_result=True if stop_after_tool_call=True (unless explicitly set to False)
250
+ if kwargs.get("stop_after_tool_call") is True:
251
+ if "show_result" not in kwargs or kwargs.get("show_result") is None:
252
+ tool_config["show_result"] = True
253
+
251
254
  return Function(**tool_config)
252
255
 
253
256
  # Handle both @tool and @tool() cases
agno/tools/desi_vocal.py CHANGED
@@ -5,9 +5,10 @@ from uuid import uuid4
5
5
  import requests
6
6
 
7
7
  from agno.agent import Agent
8
- from agno.media import AudioArtifact
8
+ from agno.media import Audio
9
9
  from agno.team.team import Team
10
10
  from agno.tools import Toolkit
11
+ from agno.tools.function import ToolResult
11
12
  from agno.utils.log import logger
12
13
 
13
14
 
@@ -16,6 +17,9 @@ class DesiVocalTools(Toolkit):
16
17
  self,
17
18
  api_key: Optional[str] = None,
18
19
  voice_id: Optional[str] = "f27d74e5-ea71-4697-be3e-f04bbd80c1a8",
20
+ enable_get_voices: bool = True,
21
+ enable_text_to_speech: bool = True,
22
+ all: bool = False,
19
23
  **kwargs,
20
24
  ):
21
25
  self.api_key = api_key or getenv("DESI_VOCAL_API_KEY")
@@ -25,8 +29,10 @@ class DesiVocalTools(Toolkit):
25
29
  self.voice_id = voice_id
26
30
 
27
31
  tools: List[Any] = []
28
- tools.append(self.get_voices)
29
- tools.append(self.text_to_speech)
32
+ if all or enable_get_voices:
33
+ tools.append(self.get_voices)
34
+ if all or enable_text_to_speech:
35
+ tools.append(self.text_to_speech)
30
36
 
31
37
  super().__init__(name="desi_vocal_tools", tools=tools, **kwargs)
32
38
 
@@ -63,13 +69,13 @@ class DesiVocalTools(Toolkit):
63
69
  logger.error(f"Failed to get voices: {e}")
64
70
  return f"Error: {e}"
65
71
 
66
- def text_to_speech(self, agent: Union[Agent, Team], prompt: str, voice_id: Optional[str] = None) -> str:
72
+ def text_to_speech(self, agent: Union[Agent, Team], prompt: str, voice_id: Optional[str] = None) -> ToolResult:
67
73
  """
68
74
  Use this function to generate audio from text.
69
75
  Args:
70
76
  prompt (str): The text to generate audio from.
71
77
  Returns:
72
- result (str): The URL of the generated audio.
78
+ ToolResult: A ToolResult containing the generated audio or error message.
73
79
  """
74
80
  try:
75
81
  url = "https://prod-api2.desivocal.com/dv/api/v0/tts_api/generate"
@@ -91,9 +97,12 @@ class DesiVocalTools(Toolkit):
91
97
  response_json = response.json()
92
98
  audio_url = response_json["s3_path"]
93
99
 
94
- agent.add_audio(AudioArtifact(id=str(uuid4()), url=audio_url))
100
+ audio_artifact = Audio(id=str(uuid4()), url=audio_url)
95
101
 
96
- return audio_url
102
+ return ToolResult(
103
+ content=f"Audio generated successfully: {audio_url}",
104
+ audios=[audio_artifact],
105
+ )
97
106
  except Exception as e:
98
107
  logger.error(f"Failed to generate audio: {e}")
99
- return f"Error: {e}"
108
+ return ToolResult(content=f"Error: {e}")
agno/tools/discord.py CHANGED
@@ -14,10 +14,12 @@ class DiscordTools(Toolkit):
14
14
  def __init__(
15
15
  self,
16
16
  bot_token: Optional[str] = None,
17
- enable_messaging: bool = True,
18
- enable_history: bool = True,
19
- enable_channel_management: bool = True,
20
- enable_message_management: bool = True,
17
+ enable_send_message: bool = True,
18
+ enable_get_channel_messages: bool = True,
19
+ enable_get_channel_info: bool = True,
20
+ enable_list_channels: bool = True,
21
+ enable_delete_message: bool = True,
22
+ all: bool = False,
21
23
  **kwargs,
22
24
  ):
23
25
  self.bot_token = bot_token or getenv("DISCORD_BOT_TOKEN")
@@ -32,14 +34,15 @@ class DiscordTools(Toolkit):
32
34
  }
33
35
 
34
36
  tools: List[Any] = []
35
- if enable_messaging:
37
+ if enable_send_message or all:
36
38
  tools.append(self.send_message)
37
- if enable_history:
39
+ if enable_get_channel_messages or all:
38
40
  tools.append(self.get_channel_messages)
39
- if enable_channel_management:
41
+ if enable_get_channel_info or all:
40
42
  tools.append(self.get_channel_info)
43
+ if enable_list_channels or all:
41
44
  tools.append(self.list_channels)
42
- if enable_message_management:
45
+ if enable_delete_message or all:
43
46
  tools.append(self.delete_message)
44
47
 
45
48
  super().__init__(name="discord", tools=tools, **kwargs)
agno/tools/docker.py CHANGED
@@ -58,10 +58,6 @@ except ImportError:
58
58
  class DockerTools(Toolkit):
59
59
  def __init__(
60
60
  self,
61
- enable_container_management: bool = True,
62
- enable_image_management: bool = True,
63
- enable_volume_management: bool = False,
64
- enable_network_management: bool = False,
65
61
  **kwargs,
66
62
  ):
67
63
  self._check_docker_availability()
@@ -80,44 +76,36 @@ class DockerTools(Toolkit):
80
76
  except Exception as e:
81
77
  logger.error(f"Error connecting to Docker: {e}")
82
78
 
83
- tools: List[Any] = []
84
- if enable_container_management:
85
- tools.extend(
86
- [
87
- self.list_containers,
88
- self.start_container,
89
- self.stop_container,
90
- self.remove_container,
91
- self.get_container_logs,
92
- self.inspect_container,
93
- self.run_container,
94
- self.exec_in_container,
95
- ]
96
- )
97
- if enable_image_management:
98
- tools.extend(
99
- [
100
- self.list_images,
101
- self.pull_image,
102
- self.remove_image,
103
- self.build_image,
104
- self.tag_image,
105
- self.inspect_image,
106
- ]
107
- )
108
- if enable_volume_management:
109
- tools.extend([self.list_volumes, self.create_volume, self.remove_volume, self.inspect_volume])
110
- if enable_network_management:
111
- tools.extend(
112
- [
113
- self.list_networks,
114
- self.create_network,
115
- self.remove_network,
116
- self.inspect_network,
117
- self.connect_container_to_network,
118
- self.disconnect_container_from_network,
119
- ]
120
- )
79
+ tools: List[Any] = [
80
+ # Container management
81
+ self.list_containers,
82
+ self.start_container,
83
+ self.stop_container,
84
+ self.remove_container,
85
+ self.get_container_logs,
86
+ self.inspect_container,
87
+ self.run_container,
88
+ self.exec_in_container,
89
+ # Image management
90
+ self.list_images,
91
+ self.pull_image,
92
+ self.remove_image,
93
+ self.build_image,
94
+ self.tag_image,
95
+ self.inspect_image,
96
+ # Volume management
97
+ self.list_volumes,
98
+ self.create_volume,
99
+ self.remove_volume,
100
+ self.inspect_volume,
101
+ # Network management
102
+ self.list_networks,
103
+ self.create_network,
104
+ self.remove_network,
105
+ self.inspect_network,
106
+ self.connect_container_to_network,
107
+ self.disconnect_container_from_network,
108
+ ]
121
109
 
122
110
  super().__init__(name="docker_tools", tools=tools, **kwargs)
123
111