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/duckdb.py CHANGED
@@ -1,3 +1,4 @@
1
+ from pathlib import Path
1
2
  from typing import Any, Dict, List, Optional, Tuple
2
3
 
3
4
  from agno.tools import Toolkit
@@ -17,11 +18,6 @@ class DuckDbTools(Toolkit):
17
18
  init_commands: Optional[List] = None,
18
19
  read_only: bool = False,
19
20
  config: Optional[dict] = None,
20
- run_queries: bool = True,
21
- inspect_queries: bool = False,
22
- create_tables: bool = True,
23
- summarize_tables: bool = True,
24
- export_tables: bool = False,
25
21
  **kwargs,
26
22
  ):
27
23
  self.db_path: Optional[str] = db_path
@@ -30,26 +26,21 @@ class DuckDbTools(Toolkit):
30
26
  self._connection: Optional[duckdb.DuckDBPyConnection] = connection
31
27
  self.init_commands: Optional[List] = init_commands
32
28
 
33
- tools: List[Any] = []
34
- tools.append(self.show_tables)
35
- tools.append(self.describe_table)
36
- if inspect_queries:
37
- tools.append(self.inspect_query)
38
- if run_queries:
39
- tools.append(self.run_query)
40
- if create_tables:
41
- tools.append(self.create_table_from_path)
42
- if summarize_tables:
43
- tools.append(self.summarize_table)
44
- if export_tables:
45
- tools.append(self.export_table_to_path)
46
-
47
- tools.append(self.load_local_path_to_table)
48
- tools.append(self.load_local_csv_to_table)
49
- tools.append(self.load_s3_path_to_table)
50
- tools.append(self.load_s3_csv_to_table)
51
- tools.append(self.create_fts_index)
52
- tools.append(self.full_text_search)
29
+ tools: List[Any] = [
30
+ self.show_tables,
31
+ self.describe_table,
32
+ self.inspect_query,
33
+ self.run_query,
34
+ self.create_table_from_path,
35
+ self.summarize_table,
36
+ self.export_table_to_path,
37
+ self.load_local_path_to_table,
38
+ self.load_local_csv_to_table,
39
+ self.load_s3_path_to_table,
40
+ self.load_s3_csv_to_table,
41
+ self.create_fts_index,
42
+ self.full_text_search,
43
+ ]
53
44
 
54
45
  super().__init__(name="duckdb_tools", tools=tools, **kwargs)
55
46
 
@@ -177,12 +168,10 @@ class DuckDbTools(Toolkit):
177
168
  :param path: Path to get the table name from
178
169
  :return: Table name
179
170
  """
180
- import os
181
-
182
171
  # Get the file name from the path
183
- file_name = path.split("/")[-1]
172
+ path_obj = Path(path)
184
173
  # Get the file name without extension from the path
185
- table, extension = os.path.splitext(file_name)
174
+ table = path_obj.stem
186
175
  # If the table isn't a valid SQL identifier, we'll need to use something else
187
176
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
188
177
 
@@ -246,15 +235,13 @@ class DuckDbTools(Toolkit):
246
235
  :param table: Optional table name to use
247
236
  :return: Table name, SQL statement used to load the file
248
237
  """
249
- import os
250
-
251
238
  log_debug(f"Loading {path} into duckdb")
252
239
 
253
240
  if table is None:
254
- # Get the file name from the s3 path
255
- file_name = path.split("/")[-1]
256
- # Get the file name without extension from the s3 path
257
- table, extension = os.path.splitext(file_name)
241
+ # Get the file name from the path
242
+ path_obj = Path(path)
243
+ # Get the file name without extension from the path
244
+ table = path_obj.stem
258
245
  # If the table isn't a valid SQL identifier, we'll need to use something else
259
246
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
260
247
 
@@ -274,15 +261,13 @@ class DuckDbTools(Toolkit):
274
261
  :param delimiter: Optional delimiter to use
275
262
  :return: Table name, SQL statement used to load the file
276
263
  """
277
- import os
278
-
279
264
  log_debug(f"Loading {path} into duckdb")
280
265
 
281
266
  if table is None:
282
- # Get the file name from the s3 path
283
- file_name = path.split("/")[-1]
284
- # Get the file name without extension from the s3 path
285
- table, extension = os.path.splitext(file_name)
267
+ # Get the file name from the path
268
+ path_obj = Path(path)
269
+ # Get the file name without extension from the path
270
+ table = path_obj.stem
286
271
  # If the table isn't a valid SQL identifier, we'll need to use something else
287
272
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
288
273
 
@@ -305,15 +290,13 @@ class DuckDbTools(Toolkit):
305
290
  :param table: Optional table name to use
306
291
  :return: Table name, SQL statement used to load the file
307
292
  """
308
- import os
309
-
310
293
  log_debug(f"Loading {path} into duckdb")
311
294
 
312
295
  if table is None:
313
- # Get the file name from the s3 path
314
- file_name = path.split("/")[-1]
315
- # Get the file name without extension from the s3 path
316
- table, extension = os.path.splitext(file_name)
296
+ # Get the file name from the path
297
+ path_obj = Path(path)
298
+ # Get the file name without extension from the path
299
+ table = path_obj.stem
317
300
  # If the table isn't a valid SQL identifier, we'll need to use something else
318
301
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
319
302
 
@@ -332,15 +315,13 @@ class DuckDbTools(Toolkit):
332
315
  :param table: Optional table name to use
333
316
  :return: Table name, SQL statement used to load the file
334
317
  """
335
- import os
336
-
337
318
  log_debug(f"Loading {path} into duckdb")
338
319
 
339
320
  if table is None:
340
- # Get the file name from the s3 path
341
- file_name = path.split("/")[-1]
342
- # Get the file name without extension from the s3 path
343
- table, extension = os.path.splitext(file_name)
321
+ # Get the file name from the path
322
+ path_obj = Path(path)
323
+ # Get the file name without extension from the path
324
+ table = path_obj.stem
344
325
  # If the table isn't a valid SQL identifier, we'll need to use something else
345
326
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
346
327
 
agno/tools/duckduckgo.py CHANGED
@@ -7,7 +7,7 @@ from agno.utils.log import log_debug
7
7
  try:
8
8
  from ddgs import DDGS
9
9
  except ImportError:
10
- raise ImportError("`duckduckgo-search` not installed. Please install using `pip install ddgs`")
10
+ raise ImportError("`ddgs` not installed. Please install using `pip install ddgs`")
11
11
 
12
12
 
13
13
  class DuckDuckGoTools(Toolkit):
@@ -25,8 +25,9 @@ class DuckDuckGoTools(Toolkit):
25
25
 
26
26
  def __init__(
27
27
  self,
28
- search: bool = True,
29
- news: bool = True,
28
+ enable_search: bool = True,
29
+ enable_news: bool = True,
30
+ all: bool = False,
30
31
  modifier: Optional[str] = None,
31
32
  fixed_max_results: Optional[int] = None,
32
33
  proxy: Optional[str] = None,
@@ -41,9 +42,9 @@ class DuckDuckGoTools(Toolkit):
41
42
  self.verify_ssl: bool = verify_ssl
42
43
 
43
44
  tools: List[Any] = []
44
- if search:
45
+ if all or enable_search:
45
46
  tools.append(self.duckduckgo_search)
46
- if news:
47
+ if all or enable_news:
47
48
  tools.append(self.duckduckgo_news)
48
49
 
49
50
  super().__init__(name="duckduckgo", tools=tools, **kwargs)
@@ -63,7 +64,7 @@ class DuckDuckGoTools(Toolkit):
63
64
 
64
65
  log_debug(f"Searching DDG for: {search_query}")
65
66
  with DDGS(proxy=self.proxy, timeout=self.timeout, verify=self.verify_ssl) as ddgs:
66
- results = ddgs.text(search_query, max_results=actual_max_results)
67
+ results = ddgs.text(query=search_query, max_results=actual_max_results)
67
68
 
68
69
  return json.dumps(results, indent=2)
69
70
 
@@ -81,6 +82,6 @@ class DuckDuckGoTools(Toolkit):
81
82
 
82
83
  log_debug(f"Searching DDG news for: {query}")
83
84
  with DDGS(proxy=self.proxy, timeout=self.timeout, verify=self.verify_ssl) as ddgs:
84
- results = ddgs.news(query, max_results=actual_max_results)
85
+ results = ddgs.news(query=query, max_results=actual_max_results)
85
86
 
86
87
  return json.dumps(results, indent=2)
agno/tools/e2b.py CHANGED
@@ -8,9 +8,10 @@ from typing import Any, Callable, Dict, List, Optional, Union
8
8
  from uuid import uuid4
9
9
 
10
10
  from agno.agent import Agent
11
- from agno.media import ImageArtifact
11
+ from agno.media import Image
12
12
  from agno.team.team import Team
13
13
  from agno.tools import Toolkit
14
+ from agno.tools.function import ToolResult
14
15
  from agno.utils.code_execution import prepare_python_code
15
16
  from agno.utils.log import logger
16
17
 
@@ -24,27 +25,14 @@ class E2BTools(Toolkit):
24
25
  def __init__(
25
26
  self,
26
27
  api_key: Optional[str] = None,
27
- run_code: bool = True,
28
- upload_file: bool = True,
29
- download_result: bool = True,
30
- filesystem: bool = False,
31
- internet_access: bool = False,
32
- sandbox_management: bool = False,
33
28
  timeout: int = 300, # 5 minutes default timeout
34
29
  sandbox_options: Optional[Dict[str, Any]] = None,
35
- command_execution: bool = False,
36
30
  **kwargs,
37
31
  ):
38
32
  """Initialize E2B toolkit for code interpretation and running Python code in a sandbox.
39
33
 
40
34
  Args:
41
35
  api_key: E2B API key (defaults to E2B_API_KEY environment variable)
42
- run_code: Whether to register the run_code function
43
- upload_file: Whether to register the upload_file function
44
- download_result: Whether to register the download_result function
45
- filesystem: Whether to register filesystem operations
46
- internet_access: Whether to register internet access functions
47
- sandbox_management: Whether to register sandbox management functions
48
36
  timeout: Timeout in seconds for the sandbox (default: 5 minutes)
49
37
  sandbox_options: Additional options to pass to the Sandbox constructor
50
38
  """
@@ -67,26 +55,33 @@ class E2BTools(Toolkit):
67
55
  self.last_execution = None
68
56
  self.downloaded_files: Dict[int, str] = {}
69
57
 
70
- tools: List[Any] = []
71
-
72
- if run_code:
73
- tools.append(self.run_python_code)
74
- if upload_file:
75
- tools.append(self.upload_file)
76
- if download_result:
77
- tools.extend([self.download_png_result, self.download_chart_data, self.download_file_from_sandbox])
78
- if filesystem:
79
- tools.extend([self.list_files, self.read_file_content, self.write_file_content, self.watch_directory])
80
- if internet_access:
81
- tools.extend([self.get_public_url, self.run_server])
82
- if sandbox_management:
83
- tools.extend(
84
- [self.set_sandbox_timeout, self.get_sandbox_status, self.shutdown_sandbox, self.list_running_sandboxes]
85
- )
86
- if command_execution:
87
- tools.extend(
88
- [self.run_command, self.stream_command, self.run_background_command, self.kill_background_command]
89
- )
58
+ tools: List[Any] = [
59
+ # Code execution
60
+ self.run_python_code,
61
+ # File operations
62
+ self.upload_file,
63
+ self.download_png_result,
64
+ self.download_chart_data,
65
+ self.download_file_from_sandbox,
66
+ # Filesystem operations
67
+ self.list_files,
68
+ self.read_file_content,
69
+ self.write_file_content,
70
+ self.watch_directory,
71
+ # Internet access
72
+ self.get_public_url,
73
+ self.run_server,
74
+ # Sandbox management
75
+ self.set_sandbox_timeout,
76
+ self.get_sandbox_status,
77
+ self.shutdown_sandbox,
78
+ self.list_running_sandboxes,
79
+ # Command execution
80
+ self.run_command,
81
+ self.stream_command,
82
+ self.run_background_command,
83
+ self.kill_background_command,
84
+ ]
90
85
 
91
86
  super().__init__(name="e2b_tools", tools=tools, **kwargs)
92
87
 
@@ -164,9 +159,9 @@ class E2BTools(Toolkit):
164
159
 
165
160
  def download_png_result(
166
161
  self, agent: Union[Agent, Team], result_index: int = 0, output_path: Optional[str] = None
167
- ) -> str:
162
+ ) -> ToolResult:
168
163
  """
169
- Add a PNG image result from the last code execution as an ImageArtifact to the agent.
164
+ Add a PNG image result from the last code execution as an Image object.
170
165
 
171
166
  Args:
172
167
  agent: The agent to add the image artifact to
@@ -174,21 +169,23 @@ class E2BTools(Toolkit):
174
169
  output_path (str, optional): Optional path to also save the PNG file. If not provided, image is only added as artifact.
175
170
 
176
171
  Returns:
177
- str: Success message or error message
172
+ ToolResult: Contains the PNG image or error message.
178
173
  """
179
174
  if not self.last_execution:
180
- return "No code has been executed yet"
175
+ return ToolResult(content="No code has been executed yet")
181
176
 
182
177
  try:
183
178
  # Check if the result exists
184
179
  if result_index >= len(self.last_execution.results):
185
- return f"Result index {result_index} is out of range. Only {len(self.last_execution.results)} results available."
180
+ return ToolResult(
181
+ content=f"Result index {result_index} is out of range. Only {len(self.last_execution.results)} results available."
182
+ )
186
183
 
187
184
  result = self.last_execution.results[result_index]
188
185
 
189
186
  # Check if the result has a PNG
190
187
  if not result.png:
191
- return f"Result at index {result_index} is not a PNG image"
188
+ return ToolResult(content=f"Result at index {result_index} is not a PNG image")
192
189
 
193
190
  # Decode PNG data from base64
194
191
  png_data = base64.b64decode(result.png)
@@ -200,7 +197,6 @@ class E2BTools(Toolkit):
200
197
  self.downloaded_files[result_index] = output_path
201
198
 
202
199
  # Create a temporary file to store the image for URL access
203
-
204
200
  # Create a temp file with .png extension
205
201
  fd, temp_path = tempfile.mkstemp(suffix=".png")
206
202
  with fdopen(fd, "wb") as tmp:
@@ -209,28 +205,28 @@ class E2BTools(Toolkit):
209
205
  # Generate a file:// URL for the temp file
210
206
  file_url = f"file://{temp_path}"
211
207
 
212
- # Add image artifact to the agent
208
+ # Create Image object
213
209
  image_id = str(uuid4())
214
- agent.add_image(
215
- ImageArtifact(
216
- id=image_id, url=file_url, original_prompt=f"Generated from code execution result {result_index}"
217
- )
210
+ image_artifact = Image(
211
+ id=image_id, url=file_url, original_prompt=f"Generated from code execution result {result_index}"
218
212
  )
219
213
 
220
214
  if output_path:
221
- return f"Image added as artifact with ID {image_id} and saved to {output_path}"
215
+ content_msg = f"Image added as artifact with ID {image_id} and saved to {output_path}"
222
216
  else:
223
- return f"Image added as artifact with ID {image_id}"
217
+ content_msg = f"Image added as artifact with ID {image_id}"
218
+
219
+ return ToolResult(content=content_msg, images=[image_artifact])
224
220
 
225
221
  except Exception as e:
226
- return json.dumps({"status": "error", "message": f"Error processing PNG: {str(e)}"})
222
+ return ToolResult(content=f"Error processing PNG: {str(e)}")
227
223
 
228
224
  def download_chart_data(
229
225
  self, agent: Agent, result_index: int = 0, output_path: Optional[str] = None, add_as_artifact: bool = True
230
- ) -> str:
226
+ ) -> ToolResult:
231
227
  """
232
228
  Extract chart data from an interactive chart in the execution results.
233
- Optionally add the chart as an image artifact to the agent.
229
+ Optionally add the chart as an image artifact.
234
230
 
235
231
  Args:
236
232
  agent: The agent to add the chart artifact to
@@ -239,21 +235,23 @@ class E2BTools(Toolkit):
239
235
  add_as_artifact (bool): Whether to add the chart as an image artifact (default: True)
240
236
 
241
237
  Returns:
242
- str: Information about the extracted chart data or error message
238
+ ToolResult: Contains chart information and optionally the chart image.
243
239
  """
244
240
  if not self.last_execution:
245
- return "No code has been executed yet"
241
+ return ToolResult(content="No code has been executed yet")
246
242
 
247
243
  try:
248
244
  # Check if the result exists
249
245
  if result_index >= len(self.last_execution.results):
250
- return f"Result index {result_index} is out of range. Only {len(self.last_execution.results)} results available."
246
+ return ToolResult(
247
+ content=f"Result index {result_index} is out of range. Only {len(self.last_execution.results)} results available."
248
+ )
251
249
 
252
250
  result = self.last_execution.results[result_index]
253
251
 
254
252
  # Check if the result has chart data
255
253
  if not result.chart:
256
- return f"Result at index {result_index} does not contain interactive chart data"
254
+ return ToolResult(content=f"Result at index {result_index} does not contain interactive chart data")
257
255
 
258
256
  # Format chart data
259
257
  chart_data = result.chart
@@ -276,6 +274,7 @@ class E2BTools(Toolkit):
276
274
  if "y_label" in chart_data:
277
275
  summary += f"Y-axis: {chart_data['y_label']}\n"
278
276
 
277
+ image_artifact = None
279
278
  # Add as an image artifact if requested
280
279
  if add_as_artifact and result.png:
281
280
  # Decode PNG data from base64
@@ -293,20 +292,21 @@ class E2BTools(Toolkit):
293
292
  # Generate a file:// URL for the temp file
294
293
  file_url = f"file://{temp_path}"
295
294
 
296
- # Add image artifact to the agent
295
+ # Create Image object
297
296
  image_id = str(uuid4())
298
- agent.add_image(
299
- ImageArtifact(
300
- id=image_id, url=file_url, original_prompt=f"Interactive {chart_type} chart from code execution"
301
- )
297
+ image_artifact = Image(
298
+ id=image_id, url=file_url, original_prompt=f"Interactive {chart_type} chart from code execution"
302
299
  )
303
300
 
304
301
  summary += f"\nChart image added as artifact with ID {image_id}"
305
302
 
306
- return summary
303
+ if image_artifact:
304
+ return ToolResult(content=summary, images=[image_artifact])
305
+ else:
306
+ return ToolResult(content=summary)
307
307
 
308
308
  except Exception as e:
309
- return json.dumps({"status": "error", "message": f"Error extracting chart data: {str(e)}"})
309
+ return ToolResult(content=f"Error extracting chart data: {str(e)}")
310
310
 
311
311
  def download_file_from_sandbox(self, sandbox_path: str, local_path: Optional[str] = None) -> str:
312
312
  """
agno/tools/eleven_labs.py CHANGED
@@ -6,9 +6,10 @@ from typing import Any, Iterator, List, Literal, Optional, Union
6
6
  from uuid import uuid4
7
7
 
8
8
  from agno.agent import Agent
9
- from agno.media import AudioArtifact
9
+ from agno.media import Audio
10
10
  from agno.team.team import Team
11
11
  from agno.tools import Toolkit
12
+ from agno.tools.function import ToolResult
12
13
  from agno.utils.log import logger
13
14
 
14
15
  try:
@@ -39,6 +40,10 @@ class ElevenLabsTools(Toolkit):
39
40
  target_directory: Optional[str] = None,
40
41
  model_id: str = "eleven_multilingual_v2",
41
42
  output_format: ElevenLabsAudioOutputFormat = "mp3_44100_64",
43
+ enable_get_voices: bool = True,
44
+ enable_generate_sound_effect: bool = True,
45
+ enable_text_to_speech: bool = True,
46
+ all: bool = False,
42
47
  **kwargs,
43
48
  ):
44
49
  self.api_key = api_key or getenv("ELEVEN_LABS_API_KEY")
@@ -57,10 +62,12 @@ class ElevenLabsTools(Toolkit):
57
62
  self.eleven_labs_client = ElevenLabs(api_key=self.api_key)
58
63
 
59
64
  tools: List[Any] = []
60
-
61
- tools.append(self.get_voices)
62
- tools.append(self.generate_sound_effect)
63
- tools.append(self.text_to_speech)
65
+ if all or enable_get_voices:
66
+ tools.append(self.get_voices)
67
+ if all or enable_generate_sound_effect:
68
+ tools.append(self.generate_sound_effect)
69
+ if all or enable_text_to_speech:
70
+ tools.append(self.text_to_speech)
64
71
 
65
72
  super().__init__(name="elevenlabs_tools", tools=tools, **kwargs)
66
73
 
@@ -122,9 +129,7 @@ class ElevenLabsTools(Toolkit):
122
129
 
123
130
  return base64_audio
124
131
 
125
- def generate_sound_effect(
126
- self, agent: Union[Agent, Team], prompt: str, duration_seconds: Optional[float] = None
127
- ) -> str:
132
+ def generate_sound_effect(self, prompt: str, duration_seconds: Optional[float] = None) -> ToolResult:
128
133
  """
129
134
  Use this function to generate sound effect audio from a text prompt.
130
135
 
@@ -132,7 +137,7 @@ class ElevenLabsTools(Toolkit):
132
137
  prompt (str): Text to generate audio from.
133
138
  duration_seconds (Optional[float]): Duration in seconds to generate audio from. Has to be between 0.5 and 22.
134
139
  Returns:
135
- str: Return the path to the generated audio file.
140
+ ToolResult: A ToolResult containing the generated audio or error message.
136
141
  """
137
142
  try:
138
143
  audio_generator = self.eleven_labs_client.text_to_sound_effects.convert(
@@ -141,29 +146,30 @@ class ElevenLabsTools(Toolkit):
141
146
 
142
147
  base64_audio = self._process_audio(audio_generator)
143
148
 
144
- # Attach to the agent
145
- agent.add_audio(
146
- AudioArtifact(
147
- id=str(uuid4()),
148
- base64_audio=base64_audio,
149
- mime_type="audio/mpeg",
150
- )
149
+ # Create AudioArtifact
150
+ audio_artifact = Audio(
151
+ id=str(uuid4()),
152
+ base64_audio=base64_audio,
153
+ mime_type="audio/mpeg",
151
154
  )
152
155
 
153
- return "Audio generated successfully"
156
+ return ToolResult(
157
+ content="Audio generated successfully",
158
+ audios=[audio_artifact],
159
+ )
154
160
 
155
161
  except Exception as e:
156
162
  logger.error(f"Failed to generate audio: {e}")
157
- return f"Error: {e}"
163
+ return ToolResult(content=f"Error: {e}")
158
164
 
159
- def text_to_speech(self, agent: Union[Agent, Team], prompt: str) -> str:
165
+ def text_to_speech(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
160
166
  """
161
167
  Use this function to convert text to speech audio.
162
168
 
163
169
  Args:
164
170
  prompt (str): Text to generate audio from.
165
171
  Returns:
166
- str: Return the path to the generated audio file.
172
+ ToolResult: A ToolResult containing the generated audio or error message.
167
173
  """
168
174
  try:
169
175
  audio_generator = self.eleven_labs_client.text_to_speech.convert(
@@ -175,17 +181,18 @@ class ElevenLabsTools(Toolkit):
175
181
 
176
182
  base64_audio = self._process_audio(audio_generator)
177
183
 
178
- # Attach to the agent
179
- agent.add_audio(
180
- AudioArtifact(
181
- id=str(uuid4()),
182
- base64_audio=base64_audio,
183
- mime_type="audio/mpeg",
184
- )
184
+ # Create AudioArtifact
185
+ audio_artifact = Audio(
186
+ id=str(uuid4()),
187
+ base64_audio=base64_audio,
188
+ mime_type="audio/mpeg",
185
189
  )
186
190
 
187
- return "Audio generated successfully"
191
+ return ToolResult(
192
+ content="Audio generated successfully",
193
+ audios=[audio_artifact],
194
+ )
188
195
 
189
196
  except Exception as e:
190
197
  logger.error(f"Failed to generate audio: {e}")
191
- return f"Error: {e}"
198
+ return ToolResult(content=f"Error: {e}")
agno/tools/email.py CHANGED
@@ -11,6 +11,8 @@ class EmailTools(Toolkit):
11
11
  sender_name: Optional[str] = None,
12
12
  sender_email: Optional[str] = None,
13
13
  sender_passkey: Optional[str] = None,
14
+ enable_email_user: bool = True,
15
+ all: bool = False,
14
16
  **kwargs,
15
17
  ):
16
18
  self.receiver_email: Optional[str] = receiver_email
@@ -19,7 +21,8 @@ class EmailTools(Toolkit):
19
21
  self.sender_passkey: Optional[str] = sender_passkey
20
22
 
21
23
  tools = []
22
- tools.append(self.email_user)
24
+ if all or enable_email_user:
25
+ tools.append(self.email_user)
23
26
 
24
27
  # Call superclass with tools list
25
28
  super().__init__(name="email_tools", tools=tools, **kwargs)
agno/tools/evm.py CHANGED
@@ -21,6 +21,8 @@ class EvmTools(Toolkit):
21
21
  self,
22
22
  private_key: Optional[str] = None,
23
23
  rpc_url: Optional[str] = None,
24
+ enable_send_transaction: bool = True,
25
+ all: bool = False,
24
26
  **kwargs,
25
27
  ):
26
28
  """Initialize EVM tools for blockchain interactions.
@@ -50,7 +52,11 @@ class EvmTools(Toolkit):
50
52
  self.account: "LocalAccount" = self.web3_client.eth.account.from_key(self.private_key)
51
53
  log_debug(f"Your wallet address is: {self.account.address}")
52
54
 
53
- super().__init__(name="evm_tools", tools=[self.send_transaction], **kwargs)
55
+ tools = []
56
+ if all or enable_send_transaction:
57
+ tools.append(self.send_transaction)
58
+
59
+ super().__init__(name="evm_tools", tools=tools, **kwargs)
54
60
 
55
61
  def get_max_priority_fee_per_gas(self) -> int:
56
62
  """Get the max priority fee per gas for the transaction.