agno 1.8.0__py3-none-any.whl → 2.0.0a1__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 (583) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2781 -4126
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  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 +9 -64
  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 +1749 -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 +1438 -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 +888 -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 +1051 -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 +1417 -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 +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -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 +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  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 +10 -10
  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 +1515 -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 +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  136. agno/media.py +2 -2
  137. agno/memory/__init__.py +2 -10
  138. agno/memory/manager.py +1003 -148
  139. agno/models/aimlapi/__init__.py +2 -2
  140. agno/models/aimlapi/aimlapi.py +6 -6
  141. agno/models/anthropic/claude.py +129 -82
  142. agno/models/aws/bedrock.py +107 -175
  143. agno/models/aws/claude.py +64 -18
  144. agno/models/azure/ai_foundry.py +73 -23
  145. agno/models/base.py +347 -287
  146. agno/models/cerebras/cerebras.py +84 -27
  147. agno/models/cohere/chat.py +106 -98
  148. agno/models/dashscope/dashscope.py +14 -5
  149. agno/models/google/gemini.py +123 -53
  150. agno/models/groq/groq.py +97 -35
  151. agno/models/huggingface/huggingface.py +92 -27
  152. agno/models/ibm/watsonx.py +72 -13
  153. agno/models/litellm/chat.py +85 -13
  154. agno/models/message.py +38 -144
  155. agno/models/meta/llama.py +85 -49
  156. agno/models/metrics.py +120 -0
  157. agno/models/mistral/mistral.py +90 -21
  158. agno/models/ollama/__init__.py +0 -2
  159. agno/models/ollama/chat.py +84 -46
  160. agno/models/openai/chat.py +135 -27
  161. agno/models/openai/responses.py +233 -115
  162. agno/models/perplexity/perplexity.py +26 -2
  163. agno/models/portkey/portkey.py +0 -7
  164. agno/models/response.py +14 -8
  165. agno/models/utils.py +20 -0
  166. agno/models/vercel/__init__.py +2 -2
  167. agno/models/vercel/v0.py +1 -1
  168. agno/models/vllm/__init__.py +2 -2
  169. agno/models/vllm/vllm.py +3 -3
  170. agno/models/xai/xai.py +10 -10
  171. agno/os/__init__.py +3 -0
  172. agno/os/app.py +393 -0
  173. agno/os/auth.py +47 -0
  174. agno/os/config.py +103 -0
  175. agno/os/interfaces/agui/__init__.py +3 -0
  176. agno/os/interfaces/agui/agui.py +31 -0
  177. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  178. agno/{app → os/interfaces}/agui/utils.py +65 -28
  179. agno/os/interfaces/base.py +21 -0
  180. agno/os/interfaces/slack/__init__.py +3 -0
  181. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  182. agno/os/interfaces/slack/slack.py +33 -0
  183. agno/os/interfaces/whatsapp/__init__.py +3 -0
  184. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  185. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  186. agno/os/router.py +843 -0
  187. agno/os/routers/__init__.py +3 -0
  188. agno/os/routers/evals/__init__.py +3 -0
  189. agno/os/routers/evals/evals.py +204 -0
  190. agno/os/routers/evals/schemas.py +142 -0
  191. agno/os/routers/evals/utils.py +161 -0
  192. agno/os/routers/knowledge/__init__.py +3 -0
  193. agno/os/routers/knowledge/knowledge.py +413 -0
  194. agno/os/routers/knowledge/schemas.py +118 -0
  195. agno/os/routers/memory/__init__.py +3 -0
  196. agno/os/routers/memory/memory.py +179 -0
  197. agno/os/routers/memory/schemas.py +58 -0
  198. agno/os/routers/metrics/__init__.py +3 -0
  199. agno/os/routers/metrics/metrics.py +58 -0
  200. agno/os/routers/metrics/schemas.py +47 -0
  201. agno/os/routers/session/__init__.py +3 -0
  202. agno/os/routers/session/session.py +163 -0
  203. agno/os/schema.py +892 -0
  204. agno/{app/playground → os}/settings.py +8 -15
  205. agno/os/utils.py +270 -0
  206. agno/reasoning/azure_ai_foundry.py +4 -4
  207. agno/reasoning/deepseek.py +4 -4
  208. agno/reasoning/default.py +6 -11
  209. agno/reasoning/groq.py +4 -4
  210. agno/reasoning/helpers.py +4 -6
  211. agno/reasoning/ollama.py +4 -4
  212. agno/reasoning/openai.py +4 -4
  213. agno/run/{response.py → agent.py} +144 -72
  214. agno/run/base.py +44 -58
  215. agno/run/cancel.py +83 -0
  216. agno/run/team.py +133 -77
  217. agno/run/workflow.py +537 -12
  218. agno/session/__init__.py +10 -0
  219. agno/session/agent.py +244 -0
  220. agno/session/summary.py +225 -0
  221. agno/session/team.py +262 -0
  222. agno/{storage/session/v2 → session}/workflow.py +47 -24
  223. agno/team/__init__.py +15 -16
  224. agno/team/team.py +2967 -4243
  225. agno/tools/agentql.py +14 -5
  226. agno/tools/airflow.py +9 -4
  227. agno/tools/api.py +7 -3
  228. agno/tools/apify.py +2 -46
  229. agno/tools/arxiv.py +8 -3
  230. agno/tools/aws_lambda.py +7 -5
  231. agno/tools/aws_ses.py +7 -1
  232. agno/tools/baidusearch.py +4 -1
  233. agno/tools/bitbucket.py +4 -4
  234. agno/tools/brandfetch.py +14 -11
  235. agno/tools/bravesearch.py +4 -1
  236. agno/tools/brightdata.py +42 -22
  237. agno/tools/browserbase.py +13 -4
  238. agno/tools/calcom.py +12 -10
  239. agno/tools/calculator.py +10 -27
  240. agno/tools/cartesia.py +18 -13
  241. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  242. agno/tools/confluence.py +71 -18
  243. agno/tools/crawl4ai.py +7 -1
  244. agno/tools/csv_toolkit.py +9 -8
  245. agno/tools/dalle.py +18 -11
  246. agno/tools/daytona.py +13 -16
  247. agno/tools/decorator.py +6 -3
  248. agno/tools/desi_vocal.py +16 -7
  249. agno/tools/discord.py +11 -8
  250. agno/tools/docker.py +30 -42
  251. agno/tools/duckdb.py +34 -53
  252. agno/tools/duckduckgo.py +8 -7
  253. agno/tools/e2b.py +62 -62
  254. agno/tools/eleven_labs.py +35 -28
  255. agno/tools/email.py +4 -1
  256. agno/tools/evm.py +7 -1
  257. agno/tools/exa.py +19 -14
  258. agno/tools/fal.py +29 -29
  259. agno/tools/file.py +9 -8
  260. agno/tools/financial_datasets.py +25 -44
  261. agno/tools/firecrawl.py +22 -22
  262. agno/tools/function.py +68 -17
  263. agno/tools/giphy.py +22 -10
  264. agno/tools/github.py +48 -126
  265. agno/tools/gmail.py +46 -62
  266. agno/tools/google_bigquery.py +7 -6
  267. agno/tools/google_maps.py +11 -26
  268. agno/tools/googlesearch.py +7 -2
  269. agno/tools/googlesheets.py +21 -17
  270. agno/tools/hackernews.py +9 -5
  271. agno/tools/jina.py +5 -4
  272. agno/tools/jira.py +18 -9
  273. agno/tools/knowledge.py +31 -32
  274. agno/tools/linear.py +18 -33
  275. agno/tools/linkup.py +5 -1
  276. agno/tools/local_file_system.py +8 -5
  277. agno/tools/lumalab.py +31 -19
  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 +32 -14
  282. agno/tools/models/gemini.py +58 -31
  283. agno/tools/models/groq.py +29 -20
  284. agno/tools/models/nebius.py +27 -11
  285. agno/tools/models_labs.py +39 -15
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +134 -0
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +57 -26
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +62 -46
  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 +54 -41
  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 +95 -118
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/location.py +2 -2
  337. agno/utils/log.py +2 -2
  338. agno/utils/mcp.py +11 -5
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/claude.py +6 -4
  342. agno/utils/models/mistral.py +8 -7
  343. agno/utils/models/schema_utils.py +3 -3
  344. agno/utils/pprint.py +33 -32
  345. agno/utils/print_response/agent.py +779 -0
  346. agno/utils/print_response/team.py +1565 -0
  347. agno/utils/print_response/workflow.py +1451 -0
  348. agno/utils/prompts.py +14 -14
  349. agno/utils/reasoning.py +87 -0
  350. agno/utils/response.py +42 -42
  351. agno/utils/string.py +8 -22
  352. agno/utils/team.py +50 -0
  353. agno/utils/timer.py +2 -2
  354. agno/vectordb/base.py +33 -21
  355. agno/vectordb/cassandra/cassandra.py +287 -23
  356. agno/vectordb/chroma/chromadb.py +482 -59
  357. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  358. agno/vectordb/couchbase/couchbase.py +309 -29
  359. agno/vectordb/lancedb/lance_db.py +360 -21
  360. agno/vectordb/langchaindb/__init__.py +5 -0
  361. agno/vectordb/langchaindb/langchaindb.py +145 -0
  362. agno/vectordb/lightrag/__init__.py +5 -0
  363. agno/vectordb/lightrag/lightrag.py +374 -0
  364. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  365. agno/vectordb/milvus/milvus.py +242 -32
  366. agno/vectordb/mongodb/mongodb.py +200 -24
  367. agno/vectordb/pgvector/pgvector.py +319 -37
  368. agno/vectordb/pineconedb/pineconedb.py +221 -27
  369. agno/vectordb/qdrant/qdrant.py +356 -14
  370. agno/vectordb/singlestore/singlestore.py +286 -29
  371. agno/vectordb/surrealdb/surrealdb.py +187 -7
  372. agno/vectordb/upstashdb/upstashdb.py +342 -26
  373. agno/vectordb/weaviate/weaviate.py +227 -165
  374. agno/workflow/__init__.py +17 -13
  375. agno/workflow/{v2/condition.py → condition.py} +135 -32
  376. agno/workflow/{v2/loop.py → loop.py} +115 -28
  377. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  378. agno/workflow/{v2/router.py → router.py} +133 -32
  379. agno/workflow/{v2/step.py → step.py} +200 -42
  380. agno/workflow/{v2/steps.py → steps.py} +147 -66
  381. agno/workflow/types.py +482 -0
  382. agno/workflow/workflow.py +2394 -696
  383. agno-2.0.0a1.dist-info/METADATA +355 -0
  384. agno-2.0.0a1.dist-info/RECORD +514 -0
  385. agno/agent/metrics.py +0 -107
  386. agno/api/app.py +0 -35
  387. agno/api/playground.py +0 -92
  388. agno/api/schemas/app.py +0 -12
  389. agno/api/schemas/playground.py +0 -22
  390. agno/api/schemas/user.py +0 -35
  391. agno/api/schemas/workspace.py +0 -46
  392. agno/api/user.py +0 -160
  393. agno/api/workflows.py +0 -33
  394. agno/api/workspace.py +0 -175
  395. agno/app/agui/__init__.py +0 -3
  396. agno/app/agui/app.py +0 -17
  397. agno/app/agui/sync_router.py +0 -120
  398. agno/app/base.py +0 -186
  399. agno/app/discord/__init__.py +0 -3
  400. agno/app/fastapi/__init__.py +0 -3
  401. agno/app/fastapi/app.py +0 -107
  402. agno/app/fastapi/async_router.py +0 -457
  403. agno/app/fastapi/sync_router.py +0 -448
  404. agno/app/playground/app.py +0 -228
  405. agno/app/playground/async_router.py +0 -1050
  406. agno/app/playground/deploy.py +0 -249
  407. agno/app/playground/operator.py +0 -183
  408. agno/app/playground/schemas.py +0 -220
  409. agno/app/playground/serve.py +0 -55
  410. agno/app/playground/sync_router.py +0 -1042
  411. agno/app/playground/utils.py +0 -46
  412. agno/app/settings.py +0 -15
  413. agno/app/slack/__init__.py +0 -3
  414. agno/app/slack/app.py +0 -19
  415. agno/app/slack/sync_router.py +0 -92
  416. agno/app/utils.py +0 -54
  417. agno/app/whatsapp/__init__.py +0 -3
  418. agno/app/whatsapp/app.py +0 -15
  419. agno/app/whatsapp/sync_router.py +0 -197
  420. agno/cli/auth_server.py +0 -249
  421. agno/cli/config.py +0 -274
  422. agno/cli/console.py +0 -88
  423. agno/cli/credentials.py +0 -23
  424. agno/cli/entrypoint.py +0 -571
  425. agno/cli/operator.py +0 -357
  426. agno/cli/settings.py +0 -96
  427. agno/cli/ws/ws_cli.py +0 -817
  428. agno/constants.py +0 -13
  429. agno/document/__init__.py +0 -5
  430. agno/document/chunking/semantic.py +0 -45
  431. agno/document/chunking/strategy.py +0 -31
  432. agno/document/reader/__init__.py +0 -5
  433. agno/document/reader/base.py +0 -47
  434. agno/document/reader/docx_reader.py +0 -60
  435. agno/document/reader/gcs/pdf_reader.py +0 -44
  436. agno/document/reader/s3/pdf_reader.py +0 -59
  437. agno/document/reader/s3/text_reader.py +0 -63
  438. agno/document/reader/url_reader.py +0 -59
  439. agno/document/reader/youtube_reader.py +0 -58
  440. agno/embedder/__init__.py +0 -5
  441. agno/embedder/langdb.py +0 -80
  442. agno/embedder/mistral.py +0 -82
  443. agno/embedder/openai.py +0 -78
  444. agno/file/__init__.py +0 -5
  445. agno/file/file.py +0 -16
  446. agno/file/local/csv.py +0 -32
  447. agno/file/local/txt.py +0 -19
  448. agno/infra/app.py +0 -240
  449. agno/infra/base.py +0 -144
  450. agno/infra/context.py +0 -20
  451. agno/infra/db_app.py +0 -52
  452. agno/infra/resource.py +0 -205
  453. agno/infra/resources.py +0 -55
  454. agno/knowledge/agent.py +0 -698
  455. agno/knowledge/arxiv.py +0 -33
  456. agno/knowledge/combined.py +0 -36
  457. agno/knowledge/csv.py +0 -144
  458. agno/knowledge/csv_url.py +0 -124
  459. agno/knowledge/document.py +0 -223
  460. agno/knowledge/docx.py +0 -137
  461. agno/knowledge/firecrawl.py +0 -34
  462. agno/knowledge/gcs/__init__.py +0 -0
  463. agno/knowledge/gcs/base.py +0 -39
  464. agno/knowledge/gcs/pdf.py +0 -125
  465. agno/knowledge/json.py +0 -137
  466. agno/knowledge/langchain.py +0 -71
  467. agno/knowledge/light_rag.py +0 -273
  468. agno/knowledge/llamaindex.py +0 -66
  469. agno/knowledge/markdown.py +0 -154
  470. agno/knowledge/pdf.py +0 -164
  471. agno/knowledge/pdf_bytes.py +0 -42
  472. agno/knowledge/pdf_url.py +0 -148
  473. agno/knowledge/s3/__init__.py +0 -0
  474. agno/knowledge/s3/base.py +0 -64
  475. agno/knowledge/s3/pdf.py +0 -33
  476. agno/knowledge/s3/text.py +0 -34
  477. agno/knowledge/text.py +0 -141
  478. agno/knowledge/url.py +0 -46
  479. agno/knowledge/website.py +0 -179
  480. agno/knowledge/wikipedia.py +0 -32
  481. agno/knowledge/youtube.py +0 -35
  482. agno/memory/agent.py +0 -423
  483. agno/memory/classifier.py +0 -104
  484. agno/memory/db/__init__.py +0 -5
  485. agno/memory/db/base.py +0 -42
  486. agno/memory/db/mongodb.py +0 -189
  487. agno/memory/db/postgres.py +0 -203
  488. agno/memory/db/sqlite.py +0 -193
  489. agno/memory/memory.py +0 -22
  490. agno/memory/row.py +0 -36
  491. agno/memory/summarizer.py +0 -201
  492. agno/memory/summary.py +0 -19
  493. agno/memory/team.py +0 -415
  494. agno/memory/v2/__init__.py +0 -2
  495. agno/memory/v2/db/__init__.py +0 -1
  496. agno/memory/v2/db/base.py +0 -42
  497. agno/memory/v2/db/firestore.py +0 -339
  498. agno/memory/v2/db/mongodb.py +0 -196
  499. agno/memory/v2/db/postgres.py +0 -214
  500. agno/memory/v2/db/redis.py +0 -187
  501. agno/memory/v2/db/schema.py +0 -54
  502. agno/memory/v2/db/sqlite.py +0 -209
  503. agno/memory/v2/manager.py +0 -437
  504. agno/memory/v2/memory.py +0 -1097
  505. agno/memory/v2/schema.py +0 -55
  506. agno/memory/v2/summarizer.py +0 -215
  507. agno/memory/workflow.py +0 -38
  508. agno/models/ollama/tools.py +0 -430
  509. agno/models/qwen/__init__.py +0 -5
  510. agno/playground/__init__.py +0 -10
  511. agno/playground/deploy.py +0 -3
  512. agno/playground/playground.py +0 -3
  513. agno/playground/serve.py +0 -3
  514. agno/playground/settings.py +0 -3
  515. agno/reranker/__init__.py +0 -0
  516. agno/run/v2/__init__.py +0 -0
  517. agno/run/v2/workflow.py +0 -567
  518. agno/storage/__init__.py +0 -0
  519. agno/storage/agent/__init__.py +0 -0
  520. agno/storage/agent/dynamodb.py +0 -1
  521. agno/storage/agent/json.py +0 -1
  522. agno/storage/agent/mongodb.py +0 -1
  523. agno/storage/agent/postgres.py +0 -1
  524. agno/storage/agent/singlestore.py +0 -1
  525. agno/storage/agent/sqlite.py +0 -1
  526. agno/storage/agent/yaml.py +0 -1
  527. agno/storage/base.py +0 -60
  528. agno/storage/dynamodb.py +0 -673
  529. agno/storage/firestore.py +0 -297
  530. agno/storage/gcs_json.py +0 -261
  531. agno/storage/in_memory.py +0 -234
  532. agno/storage/json.py +0 -237
  533. agno/storage/mongodb.py +0 -328
  534. agno/storage/mysql.py +0 -685
  535. agno/storage/postgres.py +0 -682
  536. agno/storage/redis.py +0 -336
  537. agno/storage/session/__init__.py +0 -16
  538. agno/storage/session/agent.py +0 -64
  539. agno/storage/session/team.py +0 -63
  540. agno/storage/session/v2/__init__.py +0 -5
  541. agno/storage/session/workflow.py +0 -61
  542. agno/storage/singlestore.py +0 -606
  543. agno/storage/sqlite.py +0 -646
  544. agno/storage/workflow/__init__.py +0 -0
  545. agno/storage/workflow/mongodb.py +0 -1
  546. agno/storage/workflow/postgres.py +0 -1
  547. agno/storage/workflow/sqlite.py +0 -1
  548. agno/storage/yaml.py +0 -241
  549. agno/tools/thinking.py +0 -73
  550. agno/utils/defaults.py +0 -57
  551. agno/utils/filesystem.py +0 -39
  552. agno/utils/git.py +0 -52
  553. agno/utils/json_io.py +0 -30
  554. agno/utils/load_env.py +0 -19
  555. agno/utils/py_io.py +0 -19
  556. agno/utils/pyproject.py +0 -18
  557. agno/utils/resource_filter.py +0 -31
  558. agno/workflow/v2/__init__.py +0 -21
  559. agno/workflow/v2/types.py +0 -357
  560. agno/workflow/v2/workflow.py +0 -3312
  561. agno/workspace/__init__.py +0 -0
  562. agno/workspace/config.py +0 -325
  563. agno/workspace/enums.py +0 -6
  564. agno/workspace/helpers.py +0 -52
  565. agno/workspace/operator.py +0 -757
  566. agno/workspace/settings.py +0 -158
  567. agno-1.8.0.dist-info/METADATA +0 -979
  568. agno-1.8.0.dist-info/RECORD +0 -565
  569. agno-1.8.0.dist-info/entry_points.txt +0 -3
  570. /agno/{app → db/migrations}/__init__.py +0 -0
  571. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  572. /agno/{cli → integrations}/__init__.py +0 -0
  573. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  574. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  575. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  576. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  577. /agno/{app → os/interfaces}/slack/security.py +0 -0
  578. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  579. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  580. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  581. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  582. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  583. {agno-1.8.0.dist-info → agno-2.0.0a1.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
@@ -11,6 +11,7 @@ from agno.agent import Agent
11
11
  from agno.media import ImageArtifact
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
  """
@@ -58,7 +46,7 @@ class E2BTools(Toolkit):
58
46
 
59
47
  # According to official docs, the parameter is 'timeout' (in seconds), not 'timeout_ms'
60
48
  try:
61
- self.sandbox = Sandbox(api_key=self.api_key, timeout=timeout, **self.sandbox_options)
49
+ self.sandbox = Sandbox.create(api_key=self.api_key, timeout=timeout, **self.sandbox_options)
62
50
  except Exception as e:
63
51
  logger.error(f"Warning: Could not create sandbox: {e}")
64
52
  raise e
@@ -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 ImageArtifact.
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 ImageArtifact
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 = ImageArtifact(
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 ImageArtifact
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 = ImageArtifact(
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
@@ -9,6 +9,7 @@ from agno.agent import Agent
9
9
  from agno.media import AudioArtifact
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 = AudioArtifact(
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 = AudioArtifact(
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.