agno 1.8.2__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (589) hide show
  1. agno/agent/__init__.py +19 -27
  2. agno/agent/agent.py +3143 -4170
  3. agno/api/agent.py +11 -67
  4. agno/api/api.py +5 -46
  5. agno/api/evals.py +8 -19
  6. agno/api/os.py +17 -0
  7. agno/api/routes.py +6 -41
  8. agno/api/schemas/__init__.py +9 -0
  9. agno/api/schemas/agent.py +5 -21
  10. agno/api/schemas/evals.py +7 -16
  11. agno/api/schemas/os.py +14 -0
  12. agno/api/schemas/team.py +5 -21
  13. agno/api/schemas/utils.py +21 -0
  14. agno/api/schemas/workflows.py +11 -7
  15. agno/api/settings.py +53 -0
  16. agno/api/team.py +11 -66
  17. agno/api/workflow.py +28 -0
  18. agno/cloud/aws/base.py +214 -0
  19. agno/cloud/aws/s3/__init__.py +2 -0
  20. agno/cloud/aws/s3/api_client.py +43 -0
  21. agno/cloud/aws/s3/bucket.py +195 -0
  22. agno/cloud/aws/s3/object.py +57 -0
  23. agno/db/__init__.py +24 -0
  24. agno/db/base.py +245 -0
  25. agno/db/dynamo/__init__.py +3 -0
  26. agno/db/dynamo/dynamo.py +1743 -0
  27. agno/db/dynamo/schemas.py +278 -0
  28. agno/db/dynamo/utils.py +684 -0
  29. agno/db/firestore/__init__.py +3 -0
  30. agno/db/firestore/firestore.py +1432 -0
  31. agno/db/firestore/schemas.py +130 -0
  32. agno/db/firestore/utils.py +278 -0
  33. agno/db/gcs_json/__init__.py +3 -0
  34. agno/db/gcs_json/gcs_json_db.py +1001 -0
  35. agno/db/gcs_json/utils.py +194 -0
  36. agno/db/in_memory/__init__.py +3 -0
  37. agno/db/in_memory/in_memory_db.py +882 -0
  38. agno/db/in_memory/utils.py +172 -0
  39. agno/db/json/__init__.py +3 -0
  40. agno/db/json/json_db.py +1045 -0
  41. agno/db/json/utils.py +196 -0
  42. agno/db/migrations/v1_to_v2.py +162 -0
  43. agno/db/mongo/__init__.py +3 -0
  44. agno/db/mongo/mongo.py +1416 -0
  45. agno/db/mongo/schemas.py +77 -0
  46. agno/db/mongo/utils.py +204 -0
  47. agno/db/mysql/__init__.py +3 -0
  48. agno/db/mysql/mysql.py +1719 -0
  49. agno/db/mysql/schemas.py +124 -0
  50. agno/db/mysql/utils.py +297 -0
  51. agno/db/postgres/__init__.py +3 -0
  52. agno/db/postgres/postgres.py +1710 -0
  53. agno/db/postgres/schemas.py +124 -0
  54. agno/db/postgres/utils.py +280 -0
  55. agno/db/redis/__init__.py +3 -0
  56. agno/db/redis/redis.py +1367 -0
  57. agno/db/redis/schemas.py +109 -0
  58. agno/db/redis/utils.py +288 -0
  59. agno/db/schemas/__init__.py +3 -0
  60. agno/db/schemas/evals.py +33 -0
  61. agno/db/schemas/knowledge.py +40 -0
  62. agno/db/schemas/memory.py +46 -0
  63. agno/db/singlestore/__init__.py +3 -0
  64. agno/db/singlestore/schemas.py +116 -0
  65. agno/db/singlestore/singlestore.py +1712 -0
  66. agno/db/singlestore/utils.py +326 -0
  67. agno/db/sqlite/__init__.py +3 -0
  68. agno/db/sqlite/schemas.py +119 -0
  69. agno/db/sqlite/sqlite.py +1676 -0
  70. agno/db/sqlite/utils.py +268 -0
  71. agno/db/utils.py +88 -0
  72. agno/eval/__init__.py +14 -0
  73. agno/eval/accuracy.py +154 -48
  74. agno/eval/performance.py +88 -23
  75. agno/eval/reliability.py +73 -20
  76. agno/eval/utils.py +23 -13
  77. agno/integrations/discord/__init__.py +3 -0
  78. agno/{app → integrations}/discord/client.py +10 -10
  79. agno/knowledge/__init__.py +2 -2
  80. agno/{document → knowledge}/chunking/agentic.py +2 -2
  81. agno/{document → knowledge}/chunking/document.py +2 -2
  82. agno/{document → knowledge}/chunking/fixed.py +3 -3
  83. agno/{document → knowledge}/chunking/markdown.py +2 -2
  84. agno/{document → knowledge}/chunking/recursive.py +2 -2
  85. agno/{document → knowledge}/chunking/row.py +2 -2
  86. agno/knowledge/chunking/semantic.py +59 -0
  87. agno/knowledge/chunking/strategy.py +121 -0
  88. agno/knowledge/content.py +74 -0
  89. agno/knowledge/document/__init__.py +5 -0
  90. agno/{document → knowledge/document}/base.py +12 -2
  91. agno/knowledge/embedder/__init__.py +5 -0
  92. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  93. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  94. agno/{embedder → knowledge/embedder}/base.py +6 -0
  95. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  96. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  97. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  98. agno/{embedder → knowledge/embedder}/google.py +74 -1
  99. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  100. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  101. agno/knowledge/embedder/langdb.py +22 -0
  102. agno/knowledge/embedder/mistral.py +139 -0
  103. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  104. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  105. agno/knowledge/embedder/openai.py +223 -0
  106. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  107. agno/{embedder → knowledge/embedder}/together.py +1 -1
  108. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  109. agno/knowledge/knowledge.py +1551 -0
  110. agno/knowledge/reader/__init__.py +7 -0
  111. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  112. agno/knowledge/reader/base.py +88 -0
  113. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  114. agno/knowledge/reader/docx_reader.py +83 -0
  115. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  116. agno/{document → knowledge}/reader/json_reader.py +30 -9
  117. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  118. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  119. agno/knowledge/reader/reader_factory.py +268 -0
  120. agno/knowledge/reader/s3_reader.py +101 -0
  121. agno/{document → knowledge}/reader/text_reader.py +31 -10
  122. agno/knowledge/reader/url_reader.py +128 -0
  123. agno/knowledge/reader/web_search_reader.py +366 -0
  124. agno/{document → knowledge}/reader/website_reader.py +37 -10
  125. agno/knowledge/reader/wikipedia_reader.py +59 -0
  126. agno/knowledge/reader/youtube_reader.py +78 -0
  127. agno/knowledge/remote_content/remote_content.py +88 -0
  128. agno/{reranker → knowledge/reranker}/base.py +1 -1
  129. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  130. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  131. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  132. agno/knowledge/types.py +30 -0
  133. agno/knowledge/utils.py +169 -0
  134. agno/media.py +269 -268
  135. agno/memory/__init__.py +2 -10
  136. agno/memory/manager.py +1003 -148
  137. agno/models/aimlapi/__init__.py +2 -2
  138. agno/models/aimlapi/aimlapi.py +6 -6
  139. agno/models/anthropic/claude.py +128 -72
  140. agno/models/aws/bedrock.py +107 -175
  141. agno/models/aws/claude.py +64 -18
  142. agno/models/azure/ai_foundry.py +73 -23
  143. agno/models/base.py +346 -290
  144. agno/models/cerebras/cerebras.py +84 -27
  145. agno/models/cohere/chat.py +106 -98
  146. agno/models/google/gemini.py +105 -46
  147. agno/models/groq/groq.py +97 -35
  148. agno/models/huggingface/huggingface.py +92 -27
  149. agno/models/ibm/watsonx.py +72 -13
  150. agno/models/litellm/chat.py +85 -13
  151. agno/models/message.py +46 -151
  152. agno/models/meta/llama.py +85 -49
  153. agno/models/metrics.py +120 -0
  154. agno/models/mistral/mistral.py +90 -21
  155. agno/models/ollama/__init__.py +0 -2
  156. agno/models/ollama/chat.py +85 -47
  157. agno/models/openai/chat.py +154 -37
  158. agno/models/openai/responses.py +178 -105
  159. agno/models/perplexity/perplexity.py +26 -2
  160. agno/models/portkey/portkey.py +0 -7
  161. agno/models/response.py +15 -9
  162. agno/models/utils.py +20 -0
  163. agno/models/vercel/__init__.py +2 -2
  164. agno/models/vercel/v0.py +1 -1
  165. agno/models/vllm/__init__.py +2 -2
  166. agno/models/vllm/vllm.py +3 -3
  167. agno/models/xai/xai.py +10 -10
  168. agno/os/__init__.py +3 -0
  169. agno/os/app.py +497 -0
  170. agno/os/auth.py +47 -0
  171. agno/os/config.py +103 -0
  172. agno/os/interfaces/agui/__init__.py +3 -0
  173. agno/os/interfaces/agui/agui.py +31 -0
  174. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  175. agno/{app → os/interfaces}/agui/utils.py +65 -28
  176. agno/os/interfaces/base.py +21 -0
  177. agno/os/interfaces/slack/__init__.py +3 -0
  178. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  179. agno/os/interfaces/slack/slack.py +32 -0
  180. agno/os/interfaces/whatsapp/__init__.py +3 -0
  181. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  182. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  183. agno/os/mcp.py +235 -0
  184. agno/os/router.py +1400 -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 +393 -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 +850 -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 +410 -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 +178 -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 +536 -0
  201. agno/os/schema.py +945 -0
  202. agno/{app/playground → os}/settings.py +7 -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/agent.py +633 -0
  212. agno/run/base.py +53 -77
  213. agno/run/cancel.py +81 -0
  214. agno/run/team.py +243 -96
  215. agno/run/workflow.py +550 -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 +3260 -4824
  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 +43 -23
  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 +20 -17
  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 +22 -12
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +17 -8
  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 +62 -62
  252. agno/tools/eleven_labs.py +36 -29
  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 +30 -30
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +17 -18
  260. agno/tools/function.py +127 -18
  261. agno/tools/giphy.py +23 -11
  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 +32 -20
  276. agno/tools/mcp.py +1 -2
  277. agno/tools/mem0.py +18 -12
  278. agno/tools/memori.py +14 -10
  279. agno/tools/mlx_transcribe.py +3 -2
  280. agno/tools/models/azure_openai.py +33 -15
  281. agno/tools/models/gemini.py +59 -32
  282. agno/tools/models/groq.py +30 -23
  283. agno/tools/models/nebius.py +28 -12
  284. agno/tools/models_labs.py +40 -16
  285. agno/tools/moviepy_video.py +7 -6
  286. agno/tools/neo4j.py +10 -8
  287. agno/tools/newspaper.py +7 -2
  288. agno/tools/newspaper4k.py +8 -3
  289. agno/tools/openai.py +58 -32
  290. agno/tools/openbb.py +12 -11
  291. agno/tools/opencv.py +63 -47
  292. agno/tools/openweather.py +14 -12
  293. agno/tools/pandas.py +11 -3
  294. agno/tools/postgres.py +4 -12
  295. agno/tools/pubmed.py +4 -1
  296. agno/tools/python.py +9 -22
  297. agno/tools/reasoning.py +35 -27
  298. agno/tools/reddit.py +11 -26
  299. agno/tools/replicate.py +55 -42
  300. agno/tools/resend.py +4 -1
  301. agno/tools/scrapegraph.py +15 -14
  302. agno/tools/searxng.py +10 -23
  303. agno/tools/serpapi.py +6 -3
  304. agno/tools/serper.py +13 -4
  305. agno/tools/shell.py +9 -2
  306. agno/tools/slack.py +12 -11
  307. agno/tools/sleep.py +3 -2
  308. agno/tools/spider.py +24 -4
  309. agno/tools/sql.py +7 -6
  310. agno/tools/tavily.py +6 -4
  311. agno/tools/telegram.py +12 -4
  312. agno/tools/todoist.py +11 -31
  313. agno/tools/toolkit.py +1 -1
  314. agno/tools/trafilatura.py +22 -6
  315. agno/tools/trello.py +9 -22
  316. agno/tools/twilio.py +10 -3
  317. agno/tools/user_control_flow.py +6 -1
  318. agno/tools/valyu.py +34 -5
  319. agno/tools/visualization.py +19 -28
  320. agno/tools/webbrowser.py +4 -3
  321. agno/tools/webex.py +11 -7
  322. agno/tools/website.py +15 -46
  323. agno/tools/webtools.py +12 -4
  324. agno/tools/whatsapp.py +5 -9
  325. agno/tools/wikipedia.py +20 -13
  326. agno/tools/x.py +14 -13
  327. agno/tools/yfinance.py +13 -40
  328. agno/tools/youtube.py +26 -20
  329. agno/tools/zendesk.py +7 -2
  330. agno/tools/zep.py +10 -7
  331. agno/tools/zoom.py +10 -9
  332. agno/utils/common.py +1 -19
  333. agno/utils/events.py +100 -123
  334. agno/utils/gemini.py +1 -1
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/log.py +54 -4
  337. agno/utils/mcp.py +68 -10
  338. agno/utils/media.py +39 -0
  339. agno/utils/message.py +12 -1
  340. agno/utils/models/aws_claude.py +1 -1
  341. agno/utils/models/claude.py +6 -12
  342. agno/utils/models/cohere.py +1 -1
  343. agno/utils/models/mistral.py +8 -7
  344. agno/utils/models/schema_utils.py +3 -3
  345. agno/utils/models/watsonx.py +1 -1
  346. agno/utils/openai.py +1 -1
  347. agno/utils/pprint.py +33 -32
  348. agno/utils/print_response/agent.py +779 -0
  349. agno/utils/print_response/team.py +1669 -0
  350. agno/utils/print_response/workflow.py +1451 -0
  351. agno/utils/prompts.py +14 -14
  352. agno/utils/reasoning.py +87 -0
  353. agno/utils/response.py +42 -42
  354. agno/utils/streamlit.py +481 -0
  355. agno/utils/string.py +8 -22
  356. agno/utils/team.py +50 -0
  357. agno/utils/timer.py +2 -2
  358. agno/vectordb/base.py +33 -21
  359. agno/vectordb/cassandra/cassandra.py +287 -23
  360. agno/vectordb/chroma/chromadb.py +482 -59
  361. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  362. agno/vectordb/couchbase/couchbase.py +309 -29
  363. agno/vectordb/lancedb/lance_db.py +360 -21
  364. agno/vectordb/langchaindb/__init__.py +5 -0
  365. agno/vectordb/langchaindb/langchaindb.py +145 -0
  366. agno/vectordb/lightrag/__init__.py +5 -0
  367. agno/vectordb/lightrag/lightrag.py +374 -0
  368. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  369. agno/vectordb/milvus/milvus.py +242 -32
  370. agno/vectordb/mongodb/mongodb.py +200 -24
  371. agno/vectordb/pgvector/pgvector.py +319 -37
  372. agno/vectordb/pineconedb/pineconedb.py +221 -27
  373. agno/vectordb/qdrant/qdrant.py +334 -14
  374. agno/vectordb/singlestore/singlestore.py +286 -29
  375. agno/vectordb/surrealdb/surrealdb.py +187 -7
  376. agno/vectordb/upstashdb/upstashdb.py +342 -26
  377. agno/vectordb/weaviate/weaviate.py +227 -165
  378. agno/workflow/__init__.py +17 -13
  379. agno/workflow/{v2/condition.py → condition.py} +135 -32
  380. agno/workflow/{v2/loop.py → loop.py} +115 -28
  381. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  382. agno/workflow/{v2/router.py → router.py} +133 -32
  383. agno/workflow/{v2/step.py → step.py} +207 -49
  384. agno/workflow/{v2/steps.py → steps.py} +147 -66
  385. agno/workflow/types.py +482 -0
  386. agno/workflow/workflow.py +2410 -696
  387. agno-2.0.0.dist-info/METADATA +494 -0
  388. agno-2.0.0.dist-info/RECORD +515 -0
  389. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  390. agno/agent/metrics.py +0 -110
  391. agno/api/app.py +0 -35
  392. agno/api/playground.py +0 -92
  393. agno/api/schemas/app.py +0 -12
  394. agno/api/schemas/playground.py +0 -22
  395. agno/api/schemas/user.py +0 -35
  396. agno/api/schemas/workspace.py +0 -46
  397. agno/api/user.py +0 -160
  398. agno/api/workflows.py +0 -33
  399. agno/api/workspace.py +0 -175
  400. agno/app/agui/__init__.py +0 -3
  401. agno/app/agui/app.py +0 -17
  402. agno/app/agui/sync_router.py +0 -120
  403. agno/app/base.py +0 -186
  404. agno/app/discord/__init__.py +0 -3
  405. agno/app/fastapi/__init__.py +0 -3
  406. agno/app/fastapi/app.py +0 -107
  407. agno/app/fastapi/async_router.py +0 -457
  408. agno/app/fastapi/sync_router.py +0 -448
  409. agno/app/playground/app.py +0 -228
  410. agno/app/playground/async_router.py +0 -1053
  411. agno/app/playground/deploy.py +0 -249
  412. agno/app/playground/operator.py +0 -183
  413. agno/app/playground/schemas.py +0 -223
  414. agno/app/playground/serve.py +0 -55
  415. agno/app/playground/sync_router.py +0 -1045
  416. agno/app/playground/utils.py +0 -46
  417. agno/app/settings.py +0 -15
  418. agno/app/slack/__init__.py +0 -3
  419. agno/app/slack/app.py +0 -19
  420. agno/app/slack/sync_router.py +0 -92
  421. agno/app/utils.py +0 -54
  422. agno/app/whatsapp/__init__.py +0 -3
  423. agno/app/whatsapp/app.py +0 -15
  424. agno/app/whatsapp/sync_router.py +0 -197
  425. agno/cli/auth_server.py +0 -249
  426. agno/cli/config.py +0 -274
  427. agno/cli/console.py +0 -88
  428. agno/cli/credentials.py +0 -23
  429. agno/cli/entrypoint.py +0 -571
  430. agno/cli/operator.py +0 -357
  431. agno/cli/settings.py +0 -96
  432. agno/cli/ws/ws_cli.py +0 -817
  433. agno/constants.py +0 -13
  434. agno/document/__init__.py +0 -5
  435. agno/document/chunking/semantic.py +0 -45
  436. agno/document/chunking/strategy.py +0 -31
  437. agno/document/reader/__init__.py +0 -5
  438. agno/document/reader/base.py +0 -47
  439. agno/document/reader/docx_reader.py +0 -60
  440. agno/document/reader/gcs/pdf_reader.py +0 -44
  441. agno/document/reader/s3/pdf_reader.py +0 -59
  442. agno/document/reader/s3/text_reader.py +0 -63
  443. agno/document/reader/url_reader.py +0 -59
  444. agno/document/reader/youtube_reader.py +0 -58
  445. agno/embedder/__init__.py +0 -5
  446. agno/embedder/langdb.py +0 -80
  447. agno/embedder/mistral.py +0 -82
  448. agno/embedder/openai.py +0 -78
  449. agno/file/__init__.py +0 -5
  450. agno/file/file.py +0 -16
  451. agno/file/local/csv.py +0 -32
  452. agno/file/local/txt.py +0 -19
  453. agno/infra/app.py +0 -240
  454. agno/infra/base.py +0 -144
  455. agno/infra/context.py +0 -20
  456. agno/infra/db_app.py +0 -52
  457. agno/infra/resource.py +0 -205
  458. agno/infra/resources.py +0 -55
  459. agno/knowledge/agent.py +0 -702
  460. agno/knowledge/arxiv.py +0 -33
  461. agno/knowledge/combined.py +0 -36
  462. agno/knowledge/csv.py +0 -144
  463. agno/knowledge/csv_url.py +0 -124
  464. agno/knowledge/document.py +0 -223
  465. agno/knowledge/docx.py +0 -137
  466. agno/knowledge/firecrawl.py +0 -34
  467. agno/knowledge/gcs/__init__.py +0 -0
  468. agno/knowledge/gcs/base.py +0 -39
  469. agno/knowledge/gcs/pdf.py +0 -125
  470. agno/knowledge/json.py +0 -137
  471. agno/knowledge/langchain.py +0 -71
  472. agno/knowledge/light_rag.py +0 -273
  473. agno/knowledge/llamaindex.py +0 -66
  474. agno/knowledge/markdown.py +0 -154
  475. agno/knowledge/pdf.py +0 -164
  476. agno/knowledge/pdf_bytes.py +0 -42
  477. agno/knowledge/pdf_url.py +0 -148
  478. agno/knowledge/s3/__init__.py +0 -0
  479. agno/knowledge/s3/base.py +0 -64
  480. agno/knowledge/s3/pdf.py +0 -33
  481. agno/knowledge/s3/text.py +0 -34
  482. agno/knowledge/text.py +0 -141
  483. agno/knowledge/url.py +0 -46
  484. agno/knowledge/website.py +0 -179
  485. agno/knowledge/wikipedia.py +0 -32
  486. agno/knowledge/youtube.py +0 -35
  487. agno/memory/agent.py +0 -423
  488. agno/memory/classifier.py +0 -104
  489. agno/memory/db/__init__.py +0 -5
  490. agno/memory/db/base.py +0 -42
  491. agno/memory/db/mongodb.py +0 -189
  492. agno/memory/db/postgres.py +0 -203
  493. agno/memory/db/sqlite.py +0 -193
  494. agno/memory/memory.py +0 -22
  495. agno/memory/row.py +0 -36
  496. agno/memory/summarizer.py +0 -201
  497. agno/memory/summary.py +0 -19
  498. agno/memory/team.py +0 -415
  499. agno/memory/v2/__init__.py +0 -2
  500. agno/memory/v2/db/__init__.py +0 -1
  501. agno/memory/v2/db/base.py +0 -42
  502. agno/memory/v2/db/firestore.py +0 -339
  503. agno/memory/v2/db/mongodb.py +0 -196
  504. agno/memory/v2/db/postgres.py +0 -214
  505. agno/memory/v2/db/redis.py +0 -187
  506. agno/memory/v2/db/schema.py +0 -54
  507. agno/memory/v2/db/sqlite.py +0 -209
  508. agno/memory/v2/manager.py +0 -437
  509. agno/memory/v2/memory.py +0 -1097
  510. agno/memory/v2/schema.py +0 -55
  511. agno/memory/v2/summarizer.py +0 -215
  512. agno/memory/workflow.py +0 -38
  513. agno/models/ollama/tools.py +0 -430
  514. agno/models/qwen/__init__.py +0 -5
  515. agno/playground/__init__.py +0 -10
  516. agno/playground/deploy.py +0 -3
  517. agno/playground/playground.py +0 -3
  518. agno/playground/serve.py +0 -3
  519. agno/playground/settings.py +0 -3
  520. agno/reranker/__init__.py +0 -0
  521. agno/run/response.py +0 -467
  522. agno/run/v2/__init__.py +0 -0
  523. agno/run/v2/workflow.py +0 -567
  524. agno/storage/__init__.py +0 -0
  525. agno/storage/agent/__init__.py +0 -0
  526. agno/storage/agent/dynamodb.py +0 -1
  527. agno/storage/agent/json.py +0 -1
  528. agno/storage/agent/mongodb.py +0 -1
  529. agno/storage/agent/postgres.py +0 -1
  530. agno/storage/agent/singlestore.py +0 -1
  531. agno/storage/agent/sqlite.py +0 -1
  532. agno/storage/agent/yaml.py +0 -1
  533. agno/storage/base.py +0 -60
  534. agno/storage/dynamodb.py +0 -673
  535. agno/storage/firestore.py +0 -297
  536. agno/storage/gcs_json.py +0 -261
  537. agno/storage/in_memory.py +0 -234
  538. agno/storage/json.py +0 -237
  539. agno/storage/mongodb.py +0 -328
  540. agno/storage/mysql.py +0 -685
  541. agno/storage/postgres.py +0 -682
  542. agno/storage/redis.py +0 -336
  543. agno/storage/session/__init__.py +0 -16
  544. agno/storage/session/agent.py +0 -64
  545. agno/storage/session/team.py +0 -63
  546. agno/storage/session/v2/__init__.py +0 -5
  547. agno/storage/session/workflow.py +0 -61
  548. agno/storage/singlestore.py +0 -606
  549. agno/storage/sqlite.py +0 -646
  550. agno/storage/workflow/__init__.py +0 -0
  551. agno/storage/workflow/mongodb.py +0 -1
  552. agno/storage/workflow/postgres.py +0 -1
  553. agno/storage/workflow/sqlite.py +0 -1
  554. agno/storage/yaml.py +0 -241
  555. agno/tools/thinking.py +0 -73
  556. agno/utils/defaults.py +0 -57
  557. agno/utils/filesystem.py +0 -39
  558. agno/utils/git.py +0 -52
  559. agno/utils/json_io.py +0 -30
  560. agno/utils/load_env.py +0 -19
  561. agno/utils/py_io.py +0 -19
  562. agno/utils/pyproject.py +0 -18
  563. agno/utils/resource_filter.py +0 -31
  564. agno/workflow/v2/__init__.py +0 -21
  565. agno/workflow/v2/types.py +0 -357
  566. agno/workflow/v2/workflow.py +0 -3313
  567. agno/workspace/__init__.py +0 -0
  568. agno/workspace/config.py +0 -325
  569. agno/workspace/enums.py +0 -6
  570. agno/workspace/helpers.py +0 -52
  571. agno/workspace/operator.py +0 -757
  572. agno/workspace/settings.py +0 -158
  573. agno-1.8.2.dist-info/METADATA +0 -982
  574. agno-1.8.2.dist-info/RECORD +0 -566
  575. agno-1.8.2.dist-info/entry_points.txt +0 -3
  576. agno-1.8.2.dist-info/licenses/LICENSE +0 -375
  577. /agno/{app → db/migrations}/__init__.py +0 -0
  578. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  579. /agno/{cli → integrations}/__init__.py +0 -0
  580. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  581. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  582. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  583. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  584. /agno/{app → os/interfaces}/slack/security.py +0 -0
  585. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  586. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  587. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  588. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  589. {agno-1.8.2.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/tools/models/groq.py CHANGED
@@ -1,12 +1,12 @@
1
- import base64
2
- import os
3
1
  from os import getenv
4
- from typing import Optional
2
+ from pathlib import Path
3
+ from typing import Any, List, Optional
5
4
  from uuid import uuid4
6
5
 
7
6
  from agno.agent import Agent
8
- from agno.media import AudioArtifact
7
+ from agno.media import Audio
9
8
  from agno.tools import Toolkit
9
+ from agno.tools.function import ToolResult
10
10
  from agno.utils.log import log_debug, log_error
11
11
 
12
12
  try:
@@ -25,11 +25,21 @@ class GroqTools(Toolkit):
25
25
  translation_model: str = "whisper-large-v3",
26
26
  tts_model: str = "playai-tts",
27
27
  tts_voice: str = "Chip-PlayAI",
28
+ enable_transcribe_audio: bool = True,
29
+ enable_translate_audio: bool = True,
30
+ enable_generate_speech: bool = True,
31
+ all: bool = False,
28
32
  **kwargs,
29
33
  ):
30
- super().__init__(
31
- name="groq_tools", tools=[self.transcribe_audio, self.translate_audio, self.generate_speech], **kwargs
32
- )
34
+ tools: List[Any] = []
35
+ if all or enable_transcribe_audio:
36
+ tools.append(self.transcribe_audio)
37
+ if all or enable_translate_audio:
38
+ tools.append(self.translate_audio)
39
+ if all or enable_generate_speech:
40
+ tools.append(self.generate_speech)
41
+
42
+ super().__init__(name="groq_tools", tools=tools, **kwargs)
33
43
 
34
44
  self.api_key = api_key or getenv("GROQ_API_KEY")
35
45
  if not self.api_key:
@@ -52,7 +62,7 @@ class GroqTools(Toolkit):
52
62
  log_debug(f"Transcribing audio from {audio_source} using Groq model {self.transcription_model}")
53
63
  try:
54
64
  # Check if the audio source as a local file or a URL
55
- if not os.path.exists(audio_source):
65
+ if not Path(audio_source).exists():
56
66
  log_debug(f"Audio source '{audio_source}' not found locally, attempting as URL.")
57
67
  transcription_text = self.client.audio.transcriptions.create(
58
68
  url=audio_source,
@@ -63,7 +73,7 @@ class GroqTools(Toolkit):
63
73
  log_debug(f"Transcribing local file: {audio_source}")
64
74
  with open(audio_source, "rb") as audio_file:
65
75
  transcription_text = self.client.audio.transcriptions.create(
66
- file=(os.path.basename(audio_source), audio_file.read()),
76
+ file=(Path(audio_source).name, audio_file.read()),
67
77
  model=self.transcription_model,
68
78
  response_format="text",
69
79
  )
@@ -83,7 +93,7 @@ class GroqTools(Toolkit):
83
93
  """
84
94
  log_debug(f"Translating audio from {audio_source} to English using Groq model {self.translation_model}")
85
95
  try:
86
- if not os.path.exists(audio_source):
96
+ if not Path(audio_source).exists():
87
97
  log_debug(f"Audio source '{audio_source}' not found locally.")
88
98
  translation = self.client.audio.translations.create(
89
99
  url=audio_source,
@@ -94,7 +104,7 @@ class GroqTools(Toolkit):
94
104
  log_debug(f"Translating local file: {audio_source}")
95
105
  with open(audio_source, "rb") as audio_file:
96
106
  translation = self.client.audio.translations.create(
97
- file=(os.path.basename(audio_source), audio_file.read()),
107
+ file=(Path(audio_source).name, audio_file.read()),
98
108
  model=self.translation_model,
99
109
  response_format="text",
100
110
  )
@@ -109,14 +119,13 @@ class GroqTools(Toolkit):
109
119
  self,
110
120
  agent: Agent,
111
121
  text_input: str,
112
- ) -> str:
122
+ ) -> ToolResult:
113
123
  """Generate speech from text using Groq's Text-to-Speech API.
114
- Adds the generated audio as an AudioArtifact to the agent.
115
124
 
116
125
  Args:
117
126
  text_input: The text to synthesize into speech.
118
127
  Returns:
119
- str: A success message with the audio artifact ID or an error message.
128
+ ToolResult: Contains the generated audio artifact or error message.
120
129
  """
121
130
  log_debug(
122
131
  f"Generating speech for text: '{text_input[:50]}...' using Groq model {self.tts_model}, voice {self.tts_voice}"
@@ -133,19 +142,17 @@ class GroqTools(Toolkit):
133
142
  log_debug(f"Groq TTS Response: {response}")
134
143
 
135
144
  audio_data: bytes = response.read()
136
- base64_encoded_audio = base64.b64encode(audio_data).decode("utf-8")
137
145
 
138
146
  media_id = str(uuid4())
139
- agent.add_audio(
140
- AudioArtifact(
141
- id=media_id,
142
- base64_audio=base64_encoded_audio,
143
- mime_type="audio/wav",
144
- )
147
+ audio_artifact = Audio(
148
+ id=media_id,
149
+ content=audio_data,
150
+ mime_type="audio/wav",
145
151
  )
152
+
146
153
  log_debug(f"Successfully generated speech artifact with ID: {media_id}")
147
- return f"Speech generated successfully with ID: {media_id}"
154
+ return ToolResult(content=f"Speech generated successfully with ID: {media_id}", audios=[audio_artifact])
148
155
 
149
156
  except Exception as e:
150
157
  log_error(f"Failed to generate speech with Groq: {str(e)}")
151
- return f"Failed to generate speech with Groq: {str(e)}"
158
+ return ToolResult(content=f"Failed to generate speech with Groq: {str(e)}")
@@ -4,9 +4,10 @@ from typing import Optional
4
4
  from uuid import uuid4
5
5
 
6
6
  from agno.agent import Agent
7
- from agno.media import ImageArtifact
7
+ from agno.media import Image
8
8
  from agno.models.nebius import Nebius
9
9
  from agno.tools import Toolkit
10
+ from agno.tools.function import ToolResult
10
11
  from agno.utils.log import log_error, log_warning
11
12
 
12
13
 
@@ -21,6 +22,8 @@ class NebiusTools(Toolkit):
21
22
  image_quality: Optional[str] = "standard",
22
23
  image_size: Optional[str] = "1024x1024",
23
24
  image_style: Optional[str] = None,
25
+ enable_generate_image: bool = True,
26
+ all: bool = False,
24
27
  **kwargs,
25
28
  ):
26
29
  """Initialize Nebius AI Studio text-to-image tools.
@@ -35,9 +38,15 @@ class NebiusTools(Toolkit):
35
38
  image_quality: Image quality. Options: "standard", "hd".
36
39
  image_size: Image size in format "WIDTHxHEIGHT". Max supported: 2000x2000.
37
40
  image_style: Optional style preset to apply.
41
+ enable_generate_image: Enable image generation functionality.
42
+ all: Enable all functions.
38
43
  **kwargs: Additional arguments to pass to Toolkit.
39
44
  """
40
- super().__init__(name="nebius_tools", tools=[self.generate_image], **kwargs)
45
+ tools = []
46
+ if all or enable_generate_image:
47
+ tools.append(self.generate_image)
48
+
49
+ super().__init__(name="nebius_tools", tools=tools, **kwargs)
41
50
 
42
51
  self.api_key = api_key or getenv("NEBIUS_API_KEY")
43
52
  if not self.api_key:
@@ -59,7 +68,7 @@ class NebiusTools(Toolkit):
59
68
  self,
60
69
  agent: Agent,
61
70
  prompt: str,
62
- ) -> str:
71
+ ) -> ToolResult:
63
72
  """Generate images based on a text prompt using Nebius AI Studio.
64
73
 
65
74
  Args:
@@ -67,7 +76,7 @@ class NebiusTools(Toolkit):
67
76
  prompt: The text prompt to generate images from.
68
77
 
69
78
  Returns:
70
- A message indicating success or failure.
79
+ ToolResult: A ToolResult containing the generated image or error message.
71
80
  """
72
81
  try:
73
82
  extra_params = {
@@ -91,18 +100,25 @@ class NebiusTools(Toolkit):
91
100
  data = response.data[0]
92
101
  if data is None:
93
102
  log_warning("Nebius API did not return any data.")
94
- return "Failed to generate image: No data received from API."
103
+ return ToolResult(content="Failed to generate image: No data received from API.")
104
+
95
105
  if hasattr(data, "b64_json") and data.b64_json:
96
106
  image_base64 = data.b64_json
97
107
  image_content_bytes = base64.b64decode(image_base64)
98
108
  media_id = str(uuid4())
99
- agent.add_image(
100
- ImageArtifact(
101
- id=media_id, content=image_content_bytes, mime_type="image/png", original_prompt=prompt
102
- )
109
+
110
+ # Create ImageArtifact with raw bytes
111
+ image_artifact = Image(
112
+ id=media_id, content=image_content_bytes, mime_type="image/png", original_prompt=prompt
103
113
  )
104
- return "Image generated successfully."
105
- return "Failed to generate image: No content received from API."
114
+
115
+ return ToolResult(
116
+ content="Image generated successfully.",
117
+ images=[image_artifact],
118
+ )
119
+
120
+ return ToolResult(content="Failed to generate image: No content received from API.")
121
+
106
122
  except Exception as e:
107
123
  log_error(f"Failed to generate image using {self.image_model}: {e}")
108
- return f"Failed to generate image: {e}"
124
+ return ToolResult(content=f"Failed to generate image: {e}")
agno/tools/models_labs.py CHANGED
@@ -5,10 +5,11 @@ from typing import Any, Dict, List, Optional, Union
5
5
  from uuid import uuid4
6
6
 
7
7
  from agno.agent import Agent
8
- from agno.media import AudioArtifact, ImageArtifact, VideoArtifact
8
+ from agno.media import Audio, Image, Video
9
9
  from agno.models.response import FileType
10
10
  from agno.team import Team
11
11
  from agno.tools import Toolkit
12
+ from agno.tools.function import ToolResult
12
13
  from agno.utils.log import log_debug, log_info, logger
13
14
 
14
15
  try:
@@ -86,16 +87,25 @@ class ModelsLabTools(Toolkit):
86
87
 
87
88
  return base_payload
88
89
 
89
- def _add_media_artifact(
90
- self, agent: Union[Agent, Team], media_id: str, media_url: str, eta: Optional[str] = None
91
- ) -> None:
92
- """Add appropriate media artifact based on file type."""
90
+ def _create_media_artifacts(self, media_id: str, media_url: str, eta: Optional[str] = None) -> Dict[str, List]:
91
+ """Create appropriate media artifacts based on file type."""
92
+ artifacts: Dict[str, List[Union[Image, Video, Audio]]] = {
93
+ "images": [],
94
+ "videos": [],
95
+ "audios": [],
96
+ }
97
+
93
98
  if self.file_type == FileType.MP4:
94
- agent.add_video(VideoArtifact(id=str(media_id), url=media_url, eta=str(eta)))
99
+ video_artifact = Video(id=str(media_id), url=media_url, eta=str(eta))
100
+ artifacts["videos"].append(video_artifact)
95
101
  elif self.file_type == FileType.GIF:
96
- agent.add_image(ImageArtifact(id=str(media_id), url=media_url))
102
+ image_artifact = Image(id=str(media_id), url=media_url)
103
+ artifacts["images"].append(image_artifact)
97
104
  elif self.file_type == FileType.MP3:
98
- agent.add_audio(AudioArtifact(id=str(media_id), url=media_url))
105
+ audio_artifact = Audio(id=str(media_id), url=media_url)
106
+ artifacts["audios"].append(audio_artifact)
107
+
108
+ return artifacts
99
109
 
100
110
  def _wait_for_media(self, media_id: str, eta: int) -> bool:
101
111
  """Wait for media generation to complete."""
@@ -121,10 +131,10 @@ class ModelsLabTools(Toolkit):
121
131
 
122
132
  return False
123
133
 
124
- def generate_media(self, agent: Union[Agent, Team], prompt: str) -> str:
134
+ def generate_media(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
125
135
  """Generate media (video, image, or audio) given a prompt."""
126
136
  if not self.api_key:
127
- return "Please set the MODELS_LAB_API_KEY"
137
+ return ToolResult(content="Please set the MODELS_LAB_API_KEY")
128
138
 
129
139
  try:
130
140
  payload = json.dumps(self._create_payload(prompt))
@@ -139,19 +149,27 @@ class ModelsLabTools(Toolkit):
139
149
  status = result.get("status")
140
150
  if status == "error":
141
151
  logger.error(f"Error in response: {result.get('message')}")
142
- return f"Error: {result.get('message')}"
152
+ return ToolResult(content=f"Error: {result.get('message')}")
143
153
 
144
154
  if "error" in result:
145
155
  error_msg = f"Failed to generate {self.file_type.value}: {result['error']}"
146
156
  logger.error(error_msg)
147
- return f"Error: {result['error']}"
157
+ return ToolResult(content=f"Error: {result['error']}")
148
158
 
149
159
  eta = result.get("eta")
150
160
  url_links = result.get("future_links")
151
161
  media_id = str(uuid4())
152
162
 
163
+ # Collect all media artifacts
164
+ all_images = []
165
+ all_videos = []
166
+ all_audios = []
167
+
153
168
  for media_url in url_links:
154
- self._add_media_artifact(agent, media_id, media_url, str(eta))
169
+ artifacts = self._create_media_artifacts(media_id, media_url, str(eta))
170
+ all_images.extend(artifacts["images"])
171
+ all_videos.extend(artifacts["videos"])
172
+ all_audios.extend(artifacts["audios"])
155
173
 
156
174
  if self.wait_for_completion and isinstance(eta, int):
157
175
  if self._wait_for_media(media_id, eta):
@@ -159,13 +177,19 @@ class ModelsLabTools(Toolkit):
159
177
  else:
160
178
  logger.warning("Media generation timed out")
161
179
 
162
- return f"{self.file_type.value.capitalize()} has been generated successfully and will be ready in {eta} seconds"
180
+ # Return ToolResult with appropriate media artifacts
181
+ return ToolResult(
182
+ content=f"{self.file_type.value.capitalize()} has been generated successfully and will be ready in {eta} seconds",
183
+ images=all_images if all_images else None,
184
+ videos=all_videos if all_videos else None,
185
+ audios=all_audios if all_audios else None,
186
+ )
163
187
 
164
188
  except RequestException as e:
165
189
  error_msg = f"Network error while generating {self.file_type.value}: {e}"
166
190
  logger.error(error_msg)
167
- return f"Error: {error_msg}"
191
+ return ToolResult(content=f"Error: {error_msg}")
168
192
  except Exception as e:
169
193
  error_msg = f"Unexpected error while generating {self.file_type.value}: {e}"
170
194
  logger.error(error_msg)
171
- return f"Error: {error_msg}"
195
+ return ToolResult(content=f"Error: {error_msg}")
@@ -14,17 +14,18 @@ class MoviePyVideoTools(Toolkit):
14
14
 
15
15
  def __init__(
16
16
  self,
17
- process_video: bool = True,
18
- generate_captions: bool = True,
19
- embed_captions: bool = True,
17
+ enable_process_video: bool = True,
18
+ enable_generate_captions: bool = True,
19
+ enable_embed_captions: bool = True,
20
+ all: bool = False,
20
21
  **kwargs,
21
22
  ):
22
23
  tools: List[Any] = []
23
- if process_video:
24
+ if enable_process_video or all:
24
25
  tools.append(self.extract_audio)
25
- if generate_captions:
26
+ if enable_generate_captions or all:
26
27
  tools.append(self.create_srt)
27
- if embed_captions:
28
+ if enable_embed_captions or all:
28
29
  tools.append(self.embed_captions)
29
30
 
30
31
  super().__init__(name="video_tools", tools=tools, **kwargs)
agno/tools/neo4j.py CHANGED
@@ -17,10 +17,12 @@ class Neo4jTools(Toolkit):
17
17
  user: Optional[str] = None,
18
18
  password: Optional[str] = None,
19
19
  database: Optional[str] = None,
20
- list_labels: bool = True,
21
- list_relationships: bool = True,
22
- get_schema: bool = True,
23
- run_cypher: bool = True,
20
+ # Enable flags for <6 functions
21
+ enable_list_labels: bool = True,
22
+ enable_list_relationships: bool = True,
23
+ enable_get_schema: bool = True,
24
+ enable_run_cypher: bool = True,
25
+ all: bool = False,
24
26
  **kwargs,
25
27
  ):
26
28
  """
@@ -62,13 +64,13 @@ class Neo4jTools(Toolkit):
62
64
 
63
65
  # Register toolkit methods as tools
64
66
  tools: List[Any] = []
65
- if list_labels:
67
+ if all or enable_list_labels:
66
68
  tools.append(self.list_labels)
67
- if list_relationships:
69
+ if all or enable_list_relationships:
68
70
  tools.append(self.list_relationship_types)
69
- if get_schema:
71
+ if all or enable_get_schema:
70
72
  tools.append(self.get_schema)
71
- if run_cypher:
73
+ if all or enable_run_cypher:
72
74
  tools.append(self.run_cypher_query)
73
75
  super().__init__(name="neo4j_tools", tools=tools, **kwargs)
74
76
 
agno/tools/newspaper.py CHANGED
@@ -14,9 +14,14 @@ class NewspaperTools(Toolkit):
14
14
  get_article_text (bool): Whether to get the text of an article from a URL.
15
15
  """
16
16
 
17
- def __init__(self, get_article_text: bool = True, **kwargs):
17
+ def __init__(
18
+ self,
19
+ enable_get_article_text: bool = True,
20
+ all: bool = False,
21
+ **kwargs,
22
+ ):
18
23
  tools = []
19
- if get_article_text:
24
+ if all or enable_get_article_text:
20
25
  tools.append(self.get_article_text)
21
26
 
22
27
  super().__init__(name="newspaper_toolkit", tools=tools, **kwargs)
agno/tools/newspaper4k.py CHANGED
@@ -14,19 +14,24 @@ class Newspaper4kTools(Toolkit):
14
14
  """
15
15
  Newspaper4kTools is a toolkit for getting the text of an article from a URL.
16
16
  Args:
17
- read_article (bool): Whether to read an article from a URL.
17
+ enable_read_article (bool): Whether to read an article from a URL.
18
18
  include_summary (bool): Whether to include the summary of an article.
19
19
  article_length (Optional[int]): The length of the article to read.
20
20
  """
21
21
 
22
22
  def __init__(
23
- self, read_article: bool = True, include_summary: bool = False, article_length: Optional[int] = None, **kwargs
23
+ self,
24
+ include_summary: bool = False,
25
+ article_length: Optional[int] = None,
26
+ enable_read_article: bool = True,
27
+ all: bool = False,
28
+ **kwargs,
24
29
  ):
25
30
  self.include_summary: bool = include_summary
26
31
  self.article_length: Optional[int] = article_length
27
32
 
28
33
  tools = []
29
- if read_article:
34
+ if all or enable_read_article:
30
35
  tools.append(self.read_article)
31
36
 
32
37
  super().__init__(name="newspaper4k_tools", tools=tools, **kwargs)
agno/tools/openai.py CHANGED
@@ -3,9 +3,10 @@ from typing import Any, List, Literal, Optional, Union
3
3
  from uuid import uuid4
4
4
 
5
5
  from agno.agent import Agent
6
- from agno.media import AudioArtifact, ImageArtifact
6
+ from agno.media import Audio, Image
7
7
  from agno.team.team import Team
8
8
  from agno.tools import Toolkit
9
+ from agno.tools.function import ToolResult
9
10
  from agno.utils.log import log_debug, log_error, log_warning
10
11
 
11
12
  try:
@@ -20,7 +21,23 @@ OpenAITTSFormat = Literal["mp3", "opus", "aac", "flac", "wav", "pcm"]
20
21
 
21
22
 
22
23
  class OpenAITools(Toolkit):
23
- """Tools for interacting with OpenAIChat API"""
24
+ """Tools for interacting with OpenAI API.
25
+
26
+ Args:
27
+ api_key (str, optional): OpenAI API key. Retrieved from OPENAI_API_KEY env variable if not provided.
28
+ enable_transcription (bool): Enable audio transcription functionality. Default is True.
29
+ enable_image_generation (bool): Enable image generation functionality. Default is True.
30
+ enable_speech_generation (bool): Enable speech generation functionality. Default is True.
31
+ all (bool): Enable all tools. Overrides individual flags when True. Default is False.
32
+ transcription_model (str): Model to use for transcription. Default is "whisper-1".
33
+ text_to_speech_voice (OpenAIVoice): Voice to use for TTS. Default is "alloy".
34
+ text_to_speech_model (OpenAITTSModel): Model to use for TTS. Default is "tts-1".
35
+ text_to_speech_format (OpenAITTSFormat): Audio format for TTS. Default is "mp3".
36
+ image_model (str, optional): Model to use for image generation. Default is "dall-e-3".
37
+ image_quality (str, optional): Quality setting for image generation.
38
+ image_size (str, optional): Size setting for image generation.
39
+ image_style (str, optional): Style setting for image generation.
40
+ """
24
41
 
25
42
  def __init__(
26
43
  self,
@@ -28,6 +45,7 @@ class OpenAITools(Toolkit):
28
45
  enable_transcription: bool = True,
29
46
  enable_image_generation: bool = True,
30
47
  enable_speech_generation: bool = True,
48
+ all: bool = False,
31
49
  transcription_model: str = "whisper-1",
32
50
  text_to_speech_voice: OpenAIVoice = "alloy",
33
51
  text_to_speech_model: OpenAITTSModel = "tts-1",
@@ -53,11 +71,11 @@ class OpenAITools(Toolkit):
53
71
  self.image_size = image_size
54
72
 
55
73
  tools: List[Any] = []
56
- if enable_transcription:
74
+ if all or enable_transcription:
57
75
  tools.append(self.transcribe_audio)
58
- if enable_image_generation:
76
+ if all or enable_image_generation:
59
77
  tools.append(self.generate_image)
60
- if enable_speech_generation:
78
+ if all or enable_speech_generation:
61
79
  tools.append(self.generate_speech)
62
80
 
63
81
  super().__init__(name="openai_tools", tools=tools, **kwargs)
@@ -85,14 +103,15 @@ class OpenAITools(Toolkit):
85
103
 
86
104
  def generate_image(
87
105
  self,
88
- agent: Union[Agent, Team],
89
106
  prompt: str,
90
- ) -> str:
107
+ ) -> ToolResult:
91
108
  """Generate images based on a text prompt.
92
109
  Args:
93
110
  prompt (str): The text prompt to generate the image from.
94
111
  """
95
112
  try:
113
+ import base64
114
+
96
115
  extra_params = {
97
116
  "size": self.image_size,
98
117
  "quality": self.image_quality,
@@ -120,36 +139,43 @@ class OpenAITools(Toolkit):
120
139
  data = response.data[0]
121
140
  if data is None:
122
141
  log_warning("OpenAI API did not return any data.")
123
- return "Failed to generate image: No data received from API."
142
+ return ToolResult(content="Failed to generate image: No data received from API.")
143
+
124
144
  if hasattr(data, "b64_json") and data.b64_json:
125
145
  image_base64 = data.b64_json
126
146
  media_id = str(uuid4())
127
- # Store base64-encoded content as bytes for later saving
128
- agent.add_image(
129
- ImageArtifact(
130
- id=media_id,
131
- content=image_base64.encode("utf-8"),
132
- mime_type="image/png",
133
- )
147
+
148
+ # Decode base64 to bytes for proper storage
149
+ image_bytes = base64.b64decode(image_base64)
150
+
151
+ # Create ImageArtifact and return in ToolResult
152
+ image_artifact = Image(
153
+ id=media_id,
154
+ content=image_bytes, # ← Store as bytes, not encoded string
155
+ mime_type="image/png",
156
+ original_prompt=prompt,
157
+ )
158
+
159
+ return ToolResult(
160
+ content="Image generated successfully.",
161
+ images=[image_artifact],
134
162
  )
135
- return "Image generated successfully."
136
- return "Failed to generate image: No content received from API."
163
+
164
+ return ToolResult(content="Failed to generate image: No content received from API.")
137
165
  except Exception as e:
138
166
  log_error(f"Failed to generate image using {self.image_model}: {e}")
139
- return f"Failed to generate image: {e}"
167
+ return ToolResult(content=f"Failed to generate image: {e}")
140
168
 
141
169
  def generate_speech(
142
170
  self,
143
171
  agent: Union[Agent, Team],
144
172
  text_input: str,
145
- ) -> str:
173
+ ) -> ToolResult: # Changed return type
146
174
  """Generate speech from text using OpenAI's Text-to-Speech API.
147
175
  Args:
148
176
  text_input (str): The text to synthesize into speech.
149
177
  """
150
178
  try:
151
- import base64
152
-
153
179
  response = OpenAIClient(api_key=self.api_key).audio.speech.create(
154
180
  model=self.tts_model,
155
181
  voice=self.tts_voice,
@@ -160,17 +186,17 @@ class OpenAITools(Toolkit):
160
186
  # Get raw audio data for artifact creation before potentially saving
161
187
  audio_data: bytes = response.content
162
188
 
163
- # Base64 encode the audio data
164
- base64_encoded_audio = base64.b64encode(audio_data).decode("utf-8")
165
-
166
- # Create and add AudioArtifact using base64_audio field
189
+ # Create AudioArtifact and return in ToolResult
167
190
  media_id = str(uuid4())
168
- agent.add_audio(
169
- AudioArtifact(
170
- id=media_id,
171
- base64_audio=base64_encoded_audio,
172
- )
191
+ audio_artifact = Audio(
192
+ id=media_id,
193
+ content=audio_data,
194
+ mime_type=f"audio/{self.tts_format}",
195
+ )
196
+
197
+ return ToolResult(
198
+ content=f"Speech generated successfully with ID: {media_id}",
199
+ audios=[audio_artifact],
173
200
  )
174
- return f"Speech generated successfully with ID: {media_id}"
175
201
  except Exception as e:
176
- return f"Failed to generate speech: {str(e)}"
202
+ return ToolResult(content=f"Failed to generate speech: {str(e)}")
agno/tools/openbb.py CHANGED
@@ -17,11 +17,12 @@ class OpenBBTools(Toolkit):
17
17
  obb: Optional[Any] = None,
18
18
  openbb_pat: Optional[str] = None,
19
19
  provider: Literal["benzinga", "fmp", "intrinio", "polygon", "tiingo", "tmx", "yfinance"] = "yfinance",
20
- stock_price: bool = True,
21
- search_symbols: bool = False,
22
- company_news: bool = False,
23
- company_profile: bool = False,
24
- price_targets: bool = False,
20
+ enable_get_stock_price: bool = True,
21
+ enable_search_company_symbol: bool = False,
22
+ enable_get_company_news: bool = False,
23
+ enable_get_company_profile: bool = False,
24
+ enable_get_price_targets: bool = False,
25
+ all: bool = False,
25
26
  **kwargs,
26
27
  ):
27
28
  self.obb = obb or openbb_app
@@ -34,18 +35,18 @@ class OpenBBTools(Toolkit):
34
35
  self.provider: Literal["benzinga", "fmp", "intrinio", "polygon", "tiingo", "tmx", "yfinance"] = provider
35
36
 
36
37
  tools: List[Any] = []
37
- if stock_price:
38
+ if enable_get_stock_price or all:
38
39
  tools.append(self.get_stock_price)
39
- if search_symbols:
40
+ if enable_search_company_symbol or all:
40
41
  tools.append(self.search_company_symbol)
41
- if company_news:
42
+ if enable_get_company_news or all:
42
43
  tools.append(self.get_company_news)
43
- if company_profile:
44
+ if enable_get_company_profile or all:
44
45
  tools.append(self.get_company_profile)
45
- if price_targets:
46
+ if enable_get_price_targets or all:
46
47
  tools.append(self.get_price_targets)
47
48
 
48
- super().__init__(name="yfinance_tools", tools=tools, **kwargs)
49
+ super().__init__(name="openbb_tools", tools=tools, **kwargs)
49
50
 
50
51
  def get_stock_price(self, symbol: str) -> str:
51
52
  """Use this function to get the current stock price for a stock symbol or list of symbols.