agno 1.8.1__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 (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  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/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 +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  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 +38 -144
  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 +84 -46
  158. agno/models/openai/chat.py +121 -23
  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 +14 -8
  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 +393 -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 +65 -28
  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 +33 -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 +30 -0
  184. agno/os/router.py +843 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +204 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +413 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +179 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +58 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +2961 -4253
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +42 -22
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +18 -13
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
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
  """
@@ -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.
agno/tools/exa.py CHANGED
@@ -19,11 +19,15 @@ class ExaTools(Toolkit):
19
19
  functionalities to perform categorized searches and retrieve structured results.
20
20
 
21
21
  Args:
22
+ enable_search (bool): Enable search functionality. Default is True.
23
+ enable_get_contents (bool): Enable get contents functionality. Default is True.
24
+ enable_find_similar (bool): Enable find similar functionality. Default is True.
25
+ enable_answer (bool): Enable answer generation. Default is True.
26
+ enable_research (bool): Enable research tool functionality. Default is False.
27
+ all (bool): Enable all tools. Overrides individual flags when True. Default is False.
22
28
  text (bool): Retrieve text content from results. Default is True.
23
29
  text_length_limit (int): Max length of text content per result. Default is 1000.
24
30
  highlights (bool): Include highlighted snippets. Default is True.
25
- answer (bool): Enable answer generation. Default is True.
26
- research (bool): Enable research tool functionality. Default is True.
27
31
  api_key (Optional[str]): Exa API key. Retrieved from `EXA_API_KEY` env variable if not provided.
28
32
  num_results (Optional[int]): Default number of search results. Overrides individual searches if set.
29
33
  start_crawl_date (Optional[str]): Include results crawled on/after this date (`YYYY-MM-DD`).
@@ -42,11 +46,12 @@ class ExaTools(Toolkit):
42
46
 
43
47
  def __init__(
44
48
  self,
45
- search: bool = True,
46
- get_contents: bool = True,
47
- find_similar: bool = True,
48
- answer: bool = True,
49
- research: bool = False,
49
+ enable_search: bool = True,
50
+ enable_get_contents: bool = True,
51
+ enable_find_similar: bool = True,
52
+ enable_answer: bool = True,
53
+ enable_research: bool = False,
54
+ all: bool = False,
50
55
  text: bool = True,
51
56
  text_length_limit: int = 1000,
52
57
  highlights: bool = True,
@@ -96,15 +101,15 @@ class ExaTools(Toolkit):
96
101
  self.research_model: Literal["exa-research", "exa-research-pro"] = research_model
97
102
 
98
103
  tools: List[Any] = []
99
- if search:
104
+ if all or enable_search:
100
105
  tools.append(self.search_exa)
101
- if get_contents:
106
+ if all or enable_get_contents:
102
107
  tools.append(self.get_contents)
103
- if find_similar:
108
+ if all or enable_find_similar:
104
109
  tools.append(self.find_similar)
105
- if answer:
110
+ if all or enable_answer:
106
111
  tools.append(self.exa_answer)
107
- if research:
112
+ if all or enable_research:
108
113
  tools.append(self.research)
109
114
 
110
115
  super().__init__(name="exa", tools=tools, **kwargs)
@@ -353,14 +358,14 @@ class ExaTools(Toolkit):
353
358
  else:
354
359
  task_kwargs["output_infer_schema"] = True
355
360
 
356
- task_result = self._execute_with_timeout(self.exa.research.create_task, **task_kwargs)
361
+ task_result = self._execute_with_timeout(self.exa.research.create_task, **task_kwargs) # type: ignore
357
362
  task_id = task_result.id
358
363
 
359
364
  if self.show_results:
360
365
  log_info(f"Research task created with ID: {task_id}")
361
366
 
362
367
  # Step 2: Poll until complete (using default polling settings)
363
- task = self.exa.research.poll_task(task_id)
368
+ task = self.exa.research.poll_task(task_id) # type: ignore
364
369
 
365
370
  # Step 3: Format and return results
366
371
  result: Dict[str, Any] = {"data": task.data, "citations": {}}
agno/tools/fal.py CHANGED
@@ -10,6 +10,7 @@ from agno.agent import Agent
10
10
  from agno.media import ImageArtifact, VideoArtifact
11
11
  from agno.team.team import Team
12
12
  from agno.tools import Toolkit
13
+ from agno.tools.function import ToolResult
13
14
  from agno.utils.log import log_info, logger
14
15
 
15
16
  try:
@@ -23,16 +24,22 @@ class FalTools(Toolkit):
23
24
  self,
24
25
  api_key: Optional[str] = None,
25
26
  model: str = "fal-ai/hunyuan-video",
27
+ enable_generate_media: bool = True,
28
+ enable_image_to_image: bool = False,
29
+ all: bool = False,
26
30
  **kwargs,
27
31
  ):
28
- self.api_key = api_key or getenv("FAL_KEY")
32
+ self.api_key = api_key or getenv("FAL_API_KEY")
29
33
  if not self.api_key:
30
- logger.error("FAL_KEY not set. Please set the FAL_KEY environment variable.")
34
+ logger.error("FAL_API_KEY not set. Please set the FAL_API_KEY environment variable.")
31
35
  self.model = model
32
36
  self.seen_logs: set[str] = set()
33
37
 
34
38
  tools = []
35
- tools.append(self.generate_media)
39
+ if all or enable_generate_media:
40
+ tools.append(self.generate_media)
41
+ if all or enable_image_to_image:
42
+ tools.append(self.image_to_image)
36
43
 
37
44
  super().__init__(name="fal-tools", tools=tools, **kwargs)
38
45
 
@@ -44,14 +51,14 @@ class FalTools(Toolkit):
44
51
  log_info(message)
45
52
  self.seen_logs.add(message)
46
53
 
47
- def generate_media(self, agent: Union[Agent, Team], prompt: str) -> str:
54
+ def generate_media(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
48
55
  """
49
56
  Use this function to run a model with a given prompt.
50
57
 
51
58
  Args:
52
59
  prompt (str): A text description of the task.
53
60
  Returns:
54
- str: Return the result of the model.
61
+ ToolResult: Contains the generated media and success message.
55
62
  """
56
63
  try:
57
64
  result = fal_client.subscribe(
@@ -65,32 +72,27 @@ class FalTools(Toolkit):
65
72
 
66
73
  if "image" in result:
67
74
  url = result.get("image", {}).get("url", "")
68
- agent.add_image(
69
- ImageArtifact(
70
- id=media_id,
71
- url=url,
72
- )
75
+ image_artifact = ImageArtifact(
76
+ id=media_id,
77
+ url=url,
73
78
  )
74
- media_type = "image"
79
+ return ToolResult(content=f"Image generated successfully at {url}", images=[image_artifact])
75
80
  elif "video" in result:
76
81
  url = result.get("video", {}).get("url", "")
77
- agent.add_video(
78
- VideoArtifact(
79
- id=media_id,
80
- url=url,
81
- )
82
+ video_artifact = VideoArtifact(
83
+ id=media_id,
84
+ url=url,
82
85
  )
83
- media_type = "video"
86
+ return ToolResult(content=f"Video generated successfully at {url}", videos=[video_artifact])
84
87
  else:
85
88
  logger.error(f"Unsupported type in result: {result}")
86
- return f"Unsupported type in result: {result}"
89
+ return ToolResult(content=f"Unsupported type in result: {result}")
87
90
 
88
- return f"{media_type.capitalize()} generated successfully at {url}"
89
91
  except Exception as e:
90
92
  logger.error(f"Failed to run model: {e}")
91
- return f"Error: {e}"
93
+ return ToolResult(content=f"Error: {e}")
92
94
 
93
- def image_to_image(self, agent: Union[Agent, Team], prompt: str, image_url: Optional[str] = None) -> str:
95
+ def image_to_image(self, agent: Union[Agent, Team], prompt: str, image_url: Optional[str] = None) -> ToolResult:
94
96
  """
95
97
  Use this function to transform an input image based on a text prompt using the Fal AI image-to-image model.
96
98
  The model takes an existing image and generates a new version modified according to your prompt.
@@ -101,7 +103,7 @@ class FalTools(Toolkit):
101
103
  image_url (str): The URL of the image to use for the generation.
102
104
 
103
105
  Returns:
104
- str: Return the result of the model.
106
+ ToolResult: Contains the generated image and success message.
105
107
  """
106
108
 
107
109
  try:
@@ -113,15 +115,13 @@ class FalTools(Toolkit):
113
115
  )
114
116
  url = result.get("images", [{}])[0].get("url", "")
115
117
  media_id = str(uuid4())
116
- agent.add_image(
117
- ImageArtifact(
118
- id=media_id,
119
- url=url,
120
- )
118
+ image_artifact = ImageArtifact(
119
+ id=media_id,
120
+ url=url,
121
121
  )
122
122
 
123
- return f"Image generated successfully at {url}"
123
+ return ToolResult(content=f"Image generated successfully at {url}", images=[image_artifact])
124
124
 
125
125
  except Exception as e:
126
126
  logger.error(f"Failed to generate image: {e}")
127
- return f"Error: {e}"
127
+ return ToolResult(content=f"Error: {e}")