agno 1.8.0__py3-none-any.whl → 2.0.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (583) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2781 -4126
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +9 -64
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1749 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1438 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +888 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1051 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1417 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +10 -10
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1515 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  136. agno/media.py +2 -2
  137. agno/memory/__init__.py +2 -10
  138. agno/memory/manager.py +1003 -148
  139. agno/models/aimlapi/__init__.py +2 -2
  140. agno/models/aimlapi/aimlapi.py +6 -6
  141. agno/models/anthropic/claude.py +129 -82
  142. agno/models/aws/bedrock.py +107 -175
  143. agno/models/aws/claude.py +64 -18
  144. agno/models/azure/ai_foundry.py +73 -23
  145. agno/models/base.py +347 -287
  146. agno/models/cerebras/cerebras.py +84 -27
  147. agno/models/cohere/chat.py +106 -98
  148. agno/models/dashscope/dashscope.py +14 -5
  149. agno/models/google/gemini.py +123 -53
  150. agno/models/groq/groq.py +97 -35
  151. agno/models/huggingface/huggingface.py +92 -27
  152. agno/models/ibm/watsonx.py +72 -13
  153. agno/models/litellm/chat.py +85 -13
  154. agno/models/message.py +38 -144
  155. agno/models/meta/llama.py +85 -49
  156. agno/models/metrics.py +120 -0
  157. agno/models/mistral/mistral.py +90 -21
  158. agno/models/ollama/__init__.py +0 -2
  159. agno/models/ollama/chat.py +84 -46
  160. agno/models/openai/chat.py +135 -27
  161. agno/models/openai/responses.py +233 -115
  162. agno/models/perplexity/perplexity.py +26 -2
  163. agno/models/portkey/portkey.py +0 -7
  164. agno/models/response.py +14 -8
  165. agno/models/utils.py +20 -0
  166. agno/models/vercel/__init__.py +2 -2
  167. agno/models/vercel/v0.py +1 -1
  168. agno/models/vllm/__init__.py +2 -2
  169. agno/models/vllm/vllm.py +3 -3
  170. agno/models/xai/xai.py +10 -10
  171. agno/os/__init__.py +3 -0
  172. agno/os/app.py +393 -0
  173. agno/os/auth.py +47 -0
  174. agno/os/config.py +103 -0
  175. agno/os/interfaces/agui/__init__.py +3 -0
  176. agno/os/interfaces/agui/agui.py +31 -0
  177. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  178. agno/{app → os/interfaces}/agui/utils.py +65 -28
  179. agno/os/interfaces/base.py +21 -0
  180. agno/os/interfaces/slack/__init__.py +3 -0
  181. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  182. agno/os/interfaces/slack/slack.py +33 -0
  183. agno/os/interfaces/whatsapp/__init__.py +3 -0
  184. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  185. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  186. agno/os/router.py +843 -0
  187. agno/os/routers/__init__.py +3 -0
  188. agno/os/routers/evals/__init__.py +3 -0
  189. agno/os/routers/evals/evals.py +204 -0
  190. agno/os/routers/evals/schemas.py +142 -0
  191. agno/os/routers/evals/utils.py +161 -0
  192. agno/os/routers/knowledge/__init__.py +3 -0
  193. agno/os/routers/knowledge/knowledge.py +413 -0
  194. agno/os/routers/knowledge/schemas.py +118 -0
  195. agno/os/routers/memory/__init__.py +3 -0
  196. agno/os/routers/memory/memory.py +179 -0
  197. agno/os/routers/memory/schemas.py +58 -0
  198. agno/os/routers/metrics/__init__.py +3 -0
  199. agno/os/routers/metrics/metrics.py +58 -0
  200. agno/os/routers/metrics/schemas.py +47 -0
  201. agno/os/routers/session/__init__.py +3 -0
  202. agno/os/routers/session/session.py +163 -0
  203. agno/os/schema.py +892 -0
  204. agno/{app/playground → os}/settings.py +8 -15
  205. agno/os/utils.py +270 -0
  206. agno/reasoning/azure_ai_foundry.py +4 -4
  207. agno/reasoning/deepseek.py +4 -4
  208. agno/reasoning/default.py +6 -11
  209. agno/reasoning/groq.py +4 -4
  210. agno/reasoning/helpers.py +4 -6
  211. agno/reasoning/ollama.py +4 -4
  212. agno/reasoning/openai.py +4 -4
  213. agno/run/{response.py → agent.py} +144 -72
  214. agno/run/base.py +44 -58
  215. agno/run/cancel.py +83 -0
  216. agno/run/team.py +133 -77
  217. agno/run/workflow.py +537 -12
  218. agno/session/__init__.py +10 -0
  219. agno/session/agent.py +244 -0
  220. agno/session/summary.py +225 -0
  221. agno/session/team.py +262 -0
  222. agno/{storage/session/v2 → session}/workflow.py +47 -24
  223. agno/team/__init__.py +15 -16
  224. agno/team/team.py +2967 -4243
  225. agno/tools/agentql.py +14 -5
  226. agno/tools/airflow.py +9 -4
  227. agno/tools/api.py +7 -3
  228. agno/tools/apify.py +2 -46
  229. agno/tools/arxiv.py +8 -3
  230. agno/tools/aws_lambda.py +7 -5
  231. agno/tools/aws_ses.py +7 -1
  232. agno/tools/baidusearch.py +4 -1
  233. agno/tools/bitbucket.py +4 -4
  234. agno/tools/brandfetch.py +14 -11
  235. agno/tools/bravesearch.py +4 -1
  236. agno/tools/brightdata.py +42 -22
  237. agno/tools/browserbase.py +13 -4
  238. agno/tools/calcom.py +12 -10
  239. agno/tools/calculator.py +10 -27
  240. agno/tools/cartesia.py +18 -13
  241. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  242. agno/tools/confluence.py +71 -18
  243. agno/tools/crawl4ai.py +7 -1
  244. agno/tools/csv_toolkit.py +9 -8
  245. agno/tools/dalle.py +18 -11
  246. agno/tools/daytona.py +13 -16
  247. agno/tools/decorator.py +6 -3
  248. agno/tools/desi_vocal.py +16 -7
  249. agno/tools/discord.py +11 -8
  250. agno/tools/docker.py +30 -42
  251. agno/tools/duckdb.py +34 -53
  252. agno/tools/duckduckgo.py +8 -7
  253. agno/tools/e2b.py +62 -62
  254. agno/tools/eleven_labs.py +35 -28
  255. agno/tools/email.py +4 -1
  256. agno/tools/evm.py +7 -1
  257. agno/tools/exa.py +19 -14
  258. agno/tools/fal.py +29 -29
  259. agno/tools/file.py +9 -8
  260. agno/tools/financial_datasets.py +25 -44
  261. agno/tools/firecrawl.py +22 -22
  262. agno/tools/function.py +68 -17
  263. agno/tools/giphy.py +22 -10
  264. agno/tools/github.py +48 -126
  265. agno/tools/gmail.py +46 -62
  266. agno/tools/google_bigquery.py +7 -6
  267. agno/tools/google_maps.py +11 -26
  268. agno/tools/googlesearch.py +7 -2
  269. agno/tools/googlesheets.py +21 -17
  270. agno/tools/hackernews.py +9 -5
  271. agno/tools/jina.py +5 -4
  272. agno/tools/jira.py +18 -9
  273. agno/tools/knowledge.py +31 -32
  274. agno/tools/linear.py +18 -33
  275. agno/tools/linkup.py +5 -1
  276. agno/tools/local_file_system.py +8 -5
  277. agno/tools/lumalab.py +31 -19
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +32 -14
  282. agno/tools/models/gemini.py +58 -31
  283. agno/tools/models/groq.py +29 -20
  284. agno/tools/models/nebius.py +27 -11
  285. agno/tools/models_labs.py +39 -15
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +134 -0
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +57 -26
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +62 -46
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +54 -41
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +95 -118
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/location.py +2 -2
  337. agno/utils/log.py +2 -2
  338. agno/utils/mcp.py +11 -5
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/claude.py +6 -4
  342. agno/utils/models/mistral.py +8 -7
  343. agno/utils/models/schema_utils.py +3 -3
  344. agno/utils/pprint.py +33 -32
  345. agno/utils/print_response/agent.py +779 -0
  346. agno/utils/print_response/team.py +1565 -0
  347. agno/utils/print_response/workflow.py +1451 -0
  348. agno/utils/prompts.py +14 -14
  349. agno/utils/reasoning.py +87 -0
  350. agno/utils/response.py +42 -42
  351. agno/utils/string.py +8 -22
  352. agno/utils/team.py +50 -0
  353. agno/utils/timer.py +2 -2
  354. agno/vectordb/base.py +33 -21
  355. agno/vectordb/cassandra/cassandra.py +287 -23
  356. agno/vectordb/chroma/chromadb.py +482 -59
  357. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  358. agno/vectordb/couchbase/couchbase.py +309 -29
  359. agno/vectordb/lancedb/lance_db.py +360 -21
  360. agno/vectordb/langchaindb/__init__.py +5 -0
  361. agno/vectordb/langchaindb/langchaindb.py +145 -0
  362. agno/vectordb/lightrag/__init__.py +5 -0
  363. agno/vectordb/lightrag/lightrag.py +374 -0
  364. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  365. agno/vectordb/milvus/milvus.py +242 -32
  366. agno/vectordb/mongodb/mongodb.py +200 -24
  367. agno/vectordb/pgvector/pgvector.py +319 -37
  368. agno/vectordb/pineconedb/pineconedb.py +221 -27
  369. agno/vectordb/qdrant/qdrant.py +356 -14
  370. agno/vectordb/singlestore/singlestore.py +286 -29
  371. agno/vectordb/surrealdb/surrealdb.py +187 -7
  372. agno/vectordb/upstashdb/upstashdb.py +342 -26
  373. agno/vectordb/weaviate/weaviate.py +227 -165
  374. agno/workflow/__init__.py +17 -13
  375. agno/workflow/{v2/condition.py → condition.py} +135 -32
  376. agno/workflow/{v2/loop.py → loop.py} +115 -28
  377. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  378. agno/workflow/{v2/router.py → router.py} +133 -32
  379. agno/workflow/{v2/step.py → step.py} +200 -42
  380. agno/workflow/{v2/steps.py → steps.py} +147 -66
  381. agno/workflow/types.py +482 -0
  382. agno/workflow/workflow.py +2394 -696
  383. agno-2.0.0a1.dist-info/METADATA +355 -0
  384. agno-2.0.0a1.dist-info/RECORD +514 -0
  385. agno/agent/metrics.py +0 -107
  386. agno/api/app.py +0 -35
  387. agno/api/playground.py +0 -92
  388. agno/api/schemas/app.py +0 -12
  389. agno/api/schemas/playground.py +0 -22
  390. agno/api/schemas/user.py +0 -35
  391. agno/api/schemas/workspace.py +0 -46
  392. agno/api/user.py +0 -160
  393. agno/api/workflows.py +0 -33
  394. agno/api/workspace.py +0 -175
  395. agno/app/agui/__init__.py +0 -3
  396. agno/app/agui/app.py +0 -17
  397. agno/app/agui/sync_router.py +0 -120
  398. agno/app/base.py +0 -186
  399. agno/app/discord/__init__.py +0 -3
  400. agno/app/fastapi/__init__.py +0 -3
  401. agno/app/fastapi/app.py +0 -107
  402. agno/app/fastapi/async_router.py +0 -457
  403. agno/app/fastapi/sync_router.py +0 -448
  404. agno/app/playground/app.py +0 -228
  405. agno/app/playground/async_router.py +0 -1050
  406. agno/app/playground/deploy.py +0 -249
  407. agno/app/playground/operator.py +0 -183
  408. agno/app/playground/schemas.py +0 -220
  409. agno/app/playground/serve.py +0 -55
  410. agno/app/playground/sync_router.py +0 -1042
  411. agno/app/playground/utils.py +0 -46
  412. agno/app/settings.py +0 -15
  413. agno/app/slack/__init__.py +0 -3
  414. agno/app/slack/app.py +0 -19
  415. agno/app/slack/sync_router.py +0 -92
  416. agno/app/utils.py +0 -54
  417. agno/app/whatsapp/__init__.py +0 -3
  418. agno/app/whatsapp/app.py +0 -15
  419. agno/app/whatsapp/sync_router.py +0 -197
  420. agno/cli/auth_server.py +0 -249
  421. agno/cli/config.py +0 -274
  422. agno/cli/console.py +0 -88
  423. agno/cli/credentials.py +0 -23
  424. agno/cli/entrypoint.py +0 -571
  425. agno/cli/operator.py +0 -357
  426. agno/cli/settings.py +0 -96
  427. agno/cli/ws/ws_cli.py +0 -817
  428. agno/constants.py +0 -13
  429. agno/document/__init__.py +0 -5
  430. agno/document/chunking/semantic.py +0 -45
  431. agno/document/chunking/strategy.py +0 -31
  432. agno/document/reader/__init__.py +0 -5
  433. agno/document/reader/base.py +0 -47
  434. agno/document/reader/docx_reader.py +0 -60
  435. agno/document/reader/gcs/pdf_reader.py +0 -44
  436. agno/document/reader/s3/pdf_reader.py +0 -59
  437. agno/document/reader/s3/text_reader.py +0 -63
  438. agno/document/reader/url_reader.py +0 -59
  439. agno/document/reader/youtube_reader.py +0 -58
  440. agno/embedder/__init__.py +0 -5
  441. agno/embedder/langdb.py +0 -80
  442. agno/embedder/mistral.py +0 -82
  443. agno/embedder/openai.py +0 -78
  444. agno/file/__init__.py +0 -5
  445. agno/file/file.py +0 -16
  446. agno/file/local/csv.py +0 -32
  447. agno/file/local/txt.py +0 -19
  448. agno/infra/app.py +0 -240
  449. agno/infra/base.py +0 -144
  450. agno/infra/context.py +0 -20
  451. agno/infra/db_app.py +0 -52
  452. agno/infra/resource.py +0 -205
  453. agno/infra/resources.py +0 -55
  454. agno/knowledge/agent.py +0 -698
  455. agno/knowledge/arxiv.py +0 -33
  456. agno/knowledge/combined.py +0 -36
  457. agno/knowledge/csv.py +0 -144
  458. agno/knowledge/csv_url.py +0 -124
  459. agno/knowledge/document.py +0 -223
  460. agno/knowledge/docx.py +0 -137
  461. agno/knowledge/firecrawl.py +0 -34
  462. agno/knowledge/gcs/__init__.py +0 -0
  463. agno/knowledge/gcs/base.py +0 -39
  464. agno/knowledge/gcs/pdf.py +0 -125
  465. agno/knowledge/json.py +0 -137
  466. agno/knowledge/langchain.py +0 -71
  467. agno/knowledge/light_rag.py +0 -273
  468. agno/knowledge/llamaindex.py +0 -66
  469. agno/knowledge/markdown.py +0 -154
  470. agno/knowledge/pdf.py +0 -164
  471. agno/knowledge/pdf_bytes.py +0 -42
  472. agno/knowledge/pdf_url.py +0 -148
  473. agno/knowledge/s3/__init__.py +0 -0
  474. agno/knowledge/s3/base.py +0 -64
  475. agno/knowledge/s3/pdf.py +0 -33
  476. agno/knowledge/s3/text.py +0 -34
  477. agno/knowledge/text.py +0 -141
  478. agno/knowledge/url.py +0 -46
  479. agno/knowledge/website.py +0 -179
  480. agno/knowledge/wikipedia.py +0 -32
  481. agno/knowledge/youtube.py +0 -35
  482. agno/memory/agent.py +0 -423
  483. agno/memory/classifier.py +0 -104
  484. agno/memory/db/__init__.py +0 -5
  485. agno/memory/db/base.py +0 -42
  486. agno/memory/db/mongodb.py +0 -189
  487. agno/memory/db/postgres.py +0 -203
  488. agno/memory/db/sqlite.py +0 -193
  489. agno/memory/memory.py +0 -22
  490. agno/memory/row.py +0 -36
  491. agno/memory/summarizer.py +0 -201
  492. agno/memory/summary.py +0 -19
  493. agno/memory/team.py +0 -415
  494. agno/memory/v2/__init__.py +0 -2
  495. agno/memory/v2/db/__init__.py +0 -1
  496. agno/memory/v2/db/base.py +0 -42
  497. agno/memory/v2/db/firestore.py +0 -339
  498. agno/memory/v2/db/mongodb.py +0 -196
  499. agno/memory/v2/db/postgres.py +0 -214
  500. agno/memory/v2/db/redis.py +0 -187
  501. agno/memory/v2/db/schema.py +0 -54
  502. agno/memory/v2/db/sqlite.py +0 -209
  503. agno/memory/v2/manager.py +0 -437
  504. agno/memory/v2/memory.py +0 -1097
  505. agno/memory/v2/schema.py +0 -55
  506. agno/memory/v2/summarizer.py +0 -215
  507. agno/memory/workflow.py +0 -38
  508. agno/models/ollama/tools.py +0 -430
  509. agno/models/qwen/__init__.py +0 -5
  510. agno/playground/__init__.py +0 -10
  511. agno/playground/deploy.py +0 -3
  512. agno/playground/playground.py +0 -3
  513. agno/playground/serve.py +0 -3
  514. agno/playground/settings.py +0 -3
  515. agno/reranker/__init__.py +0 -0
  516. agno/run/v2/__init__.py +0 -0
  517. agno/run/v2/workflow.py +0 -567
  518. agno/storage/__init__.py +0 -0
  519. agno/storage/agent/__init__.py +0 -0
  520. agno/storage/agent/dynamodb.py +0 -1
  521. agno/storage/agent/json.py +0 -1
  522. agno/storage/agent/mongodb.py +0 -1
  523. agno/storage/agent/postgres.py +0 -1
  524. agno/storage/agent/singlestore.py +0 -1
  525. agno/storage/agent/sqlite.py +0 -1
  526. agno/storage/agent/yaml.py +0 -1
  527. agno/storage/base.py +0 -60
  528. agno/storage/dynamodb.py +0 -673
  529. agno/storage/firestore.py +0 -297
  530. agno/storage/gcs_json.py +0 -261
  531. agno/storage/in_memory.py +0 -234
  532. agno/storage/json.py +0 -237
  533. agno/storage/mongodb.py +0 -328
  534. agno/storage/mysql.py +0 -685
  535. agno/storage/postgres.py +0 -682
  536. agno/storage/redis.py +0 -336
  537. agno/storage/session/__init__.py +0 -16
  538. agno/storage/session/agent.py +0 -64
  539. agno/storage/session/team.py +0 -63
  540. agno/storage/session/v2/__init__.py +0 -5
  541. agno/storage/session/workflow.py +0 -61
  542. agno/storage/singlestore.py +0 -606
  543. agno/storage/sqlite.py +0 -646
  544. agno/storage/workflow/__init__.py +0 -0
  545. agno/storage/workflow/mongodb.py +0 -1
  546. agno/storage/workflow/postgres.py +0 -1
  547. agno/storage/workflow/sqlite.py +0 -1
  548. agno/storage/yaml.py +0 -241
  549. agno/tools/thinking.py +0 -73
  550. agno/utils/defaults.py +0 -57
  551. agno/utils/filesystem.py +0 -39
  552. agno/utils/git.py +0 -52
  553. agno/utils/json_io.py +0 -30
  554. agno/utils/load_env.py +0 -19
  555. agno/utils/py_io.py +0 -19
  556. agno/utils/pyproject.py +0 -18
  557. agno/utils/resource_filter.py +0 -31
  558. agno/workflow/v2/__init__.py +0 -21
  559. agno/workflow/v2/types.py +0 -357
  560. agno/workflow/v2/workflow.py +0 -3312
  561. agno/workspace/__init__.py +0 -0
  562. agno/workspace/config.py +0 -325
  563. agno/workspace/enums.py +0 -6
  564. agno/workspace/helpers.py +0 -52
  565. agno/workspace/operator.py +0 -757
  566. agno/workspace/settings.py +0 -158
  567. agno-1.8.0.dist-info/METADATA +0 -979
  568. agno-1.8.0.dist-info/RECORD +0 -565
  569. agno-1.8.0.dist-info/entry_points.txt +0 -3
  570. /agno/{app → db/migrations}/__init__.py +0 -0
  571. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  572. /agno/{cli → integrations}/__init__.py +0 -0
  573. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  574. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  575. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  576. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  577. /agno/{app → os/interfaces}/slack/security.py +0 -0
  578. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  579. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  580. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  581. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  582. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  583. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/tools/pandas.py CHANGED
@@ -10,12 +10,20 @@ except ImportError:
10
10
 
11
11
 
12
12
  class PandasTools(Toolkit):
13
- def __init__(self, **kwargs):
13
+ def __init__(
14
+ self,
15
+ enable_create_pandas_dataframe: bool = True,
16
+ enable_run_dataframe_operation: bool = True,
17
+ all: bool = False,
18
+ **kwargs,
19
+ ):
14
20
  self.dataframes: Dict[str, pd.DataFrame] = {}
15
21
 
16
22
  tools: List[Any] = []
17
- tools.append(self.create_pandas_dataframe)
18
- tools.append(self.run_dataframe_operation)
23
+ if all or enable_create_pandas_dataframe:
24
+ tools.append(self.create_pandas_dataframe)
25
+ if all or enable_run_dataframe_operation:
26
+ tools.append(self.run_dataframe_operation)
19
27
 
20
28
  super().__init__(name="pandas_tools", tools=tools, **kwargs)
21
29
 
agno/tools/postgres.py CHANGED
@@ -22,10 +22,6 @@ class PostgresTools(Toolkit):
22
22
  password: Optional[str] = None,
23
23
  host: Optional[str] = None,
24
24
  port: Optional[int] = None,
25
- run_queries: bool = True,
26
- inspect_queries: bool = False,
27
- summarize_tables: bool = True,
28
- export_tables: bool = False,
29
25
  table_schema: str = "public",
30
26
  **kwargs,
31
27
  ):
@@ -40,15 +36,11 @@ class PostgresTools(Toolkit):
40
36
  tools: List[Any] = [
41
37
  self.show_tables,
42
38
  self.describe_table,
39
+ self.summarize_table,
40
+ self.inspect_query,
41
+ self.run_query,
42
+ self.export_table_to_path,
43
43
  ]
44
- if inspect_queries:
45
- tools.append(self.inspect_query)
46
- if run_queries:
47
- tools.append(self.run_query)
48
- if summarize_tables:
49
- tools.append(self.summarize_table)
50
- if export_tables:
51
- tools.append(self.export_table_to_path)
52
44
 
53
45
  super().__init__(name="postgres_tools", tools=tools, **kwargs)
54
46
 
agno/tools/pubmed.py CHANGED
@@ -14,6 +14,8 @@ class PubmedTools(Toolkit):
14
14
  email: str = "your_email@example.com",
15
15
  max_results: Optional[int] = None,
16
16
  results_expanded: bool = False,
17
+ enable_search_pubmed: bool = True,
18
+ all: bool = False,
17
19
  **kwargs,
18
20
  ):
19
21
  self.max_results: Optional[int] = max_results
@@ -21,7 +23,8 @@ class PubmedTools(Toolkit):
21
23
  self.results_expanded: bool = results_expanded
22
24
 
23
25
  tools: List[Any] = []
24
- tools.append(self.search_pubmed)
26
+ if enable_search_pubmed or all:
27
+ tools.append(self.search_pubmed)
25
28
 
26
29
  super().__init__(name="pubmed", tools=tools, **kwargs)
27
30
 
agno/tools/python.py CHANGED
@@ -16,13 +16,6 @@ class PythonTools(Toolkit):
16
16
  def __init__(
17
17
  self,
18
18
  base_dir: Optional[Path] = None,
19
- save_and_run: bool = True,
20
- pip_install: bool = False,
21
- uv_pip_install: bool = False,
22
- run_code: bool = False,
23
- list_files: bool = False,
24
- run_files: bool = False,
25
- read_files: bool = False,
26
19
  safe_globals: Optional[dict] = None,
27
20
  safe_locals: Optional[dict] = None,
28
21
  **kwargs,
@@ -33,21 +26,15 @@ class PythonTools(Toolkit):
33
26
  self.safe_globals: dict = safe_globals or globals()
34
27
  self.safe_locals: dict = safe_locals or locals()
35
28
 
36
- tools: List[Any] = []
37
- if run_code:
38
- tools.append(self.run_python_code)
39
- if save_and_run:
40
- tools.append(self.save_to_file_and_run)
41
- if pip_install:
42
- tools.append(self.pip_install_package)
43
- if uv_pip_install:
44
- tools.append(self.uv_pip_install_package)
45
- if run_files:
46
- tools.append(self.run_python_file_return_variable)
47
- if read_files:
48
- tools.append(self.read_file)
49
- if list_files:
50
- tools.append(self.list_files)
29
+ tools: List[Any] = [
30
+ self.save_to_file_and_run,
31
+ self.run_python_code,
32
+ self.pip_install_package,
33
+ self.uv_pip_install_package,
34
+ self.run_python_file_return_variable,
35
+ self.read_file,
36
+ self.list_files,
37
+ ]
51
38
 
52
39
  super().__init__(name="python_tools", tools=tools, **kwargs)
53
40
 
agno/tools/reasoning.py CHANGED
@@ -1,9 +1,7 @@
1
1
  from textwrap import dedent
2
- from typing import Any, List, Optional, Union
2
+ from typing import Any, Dict, List, Optional
3
3
 
4
- from agno.agent import Agent
5
4
  from agno.reasoning.step import NextAction, ReasoningStep
6
- from agno.team.team import Team
7
5
  from agno.tools import Toolkit
8
6
  from agno.utils.log import log_debug, log_error
9
7
 
@@ -11,8 +9,9 @@ from agno.utils.log import log_debug, log_error
11
9
  class ReasoningTools(Toolkit):
12
10
  def __init__(
13
11
  self,
14
- think: bool = True,
15
- analyze: bool = True,
12
+ enable_think: bool = True,
13
+ enable_analyze: bool = True,
14
+ all: bool = False,
16
15
  instructions: Optional[str] = None,
17
16
  add_instructions: bool = False,
18
17
  add_few_shot: bool = False,
@@ -34,9 +33,10 @@ class ReasoningTools(Toolkit):
34
33
  self.instructions = instructions
35
34
 
36
35
  tools: List[Any] = []
37
- if think:
36
+ # Prefer new flags; fallback to legacy ones
37
+ if all or enable_think:
38
38
  tools.append(self.think)
39
- if analyze:
39
+ if all or enable_analyze:
40
40
  tools.append(self.analyze)
41
41
 
42
42
  super().__init__(
@@ -48,7 +48,12 @@ class ReasoningTools(Toolkit):
48
48
  )
49
49
 
50
50
  def think(
51
- self, agent: Union[Agent, Team], title: str, thought: str, action: Optional[str] = None, confidence: float = 0.8
51
+ self,
52
+ session_state: Dict[str, Any],
53
+ title: str,
54
+ thought: str,
55
+ action: Optional[str] = None,
56
+ confidence: float = 0.8,
52
57
  ) -> str:
53
58
  """Use this tool as a scratchpad to reason about the question and work through it step-by-step.
54
59
  This tool will help you break down complex problems into logical steps and track the reasoning process.
@@ -75,19 +80,21 @@ class ReasoningTools(Toolkit):
75
80
  confidence=confidence,
76
81
  )
77
82
 
83
+ current_run_id = session_state.get("current_run_id", None)
84
+
78
85
  # Add this step to the Agent's session state
79
- if agent.session_state is None:
80
- agent.session_state = {}
81
- if "reasoning_steps" not in agent.session_state:
82
- agent.session_state["reasoning_steps"] = {}
83
- if agent.run_id not in agent.session_state["reasoning_steps"]:
84
- agent.session_state["reasoning_steps"][agent.run_id] = []
85
- agent.session_state["reasoning_steps"][agent.run_id].append(reasoning_step.model_dump_json())
86
+ if session_state is None:
87
+ session_state = {}
88
+ if "reasoning_steps" not in session_state:
89
+ session_state["reasoning_steps"] = {}
90
+ if current_run_id not in session_state["reasoning_steps"]:
91
+ session_state["reasoning_steps"][current_run_id] = []
92
+ session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
86
93
 
87
94
  # Return all previous reasoning_steps and the new reasoning_step
88
- if "reasoning_steps" in agent.session_state and agent.run_id in agent.session_state["reasoning_steps"]:
95
+ if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
89
96
  formatted_reasoning_steps = ""
90
- for i, step in enumerate(agent.session_state["reasoning_steps"][agent.run_id], 1):
97
+ for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
91
98
  step_parsed = ReasoningStep.model_validate_json(step)
92
99
  step_str = dedent(f"""\
93
100
  Step {i}:
@@ -105,7 +112,7 @@ Confidence: {step_parsed.confidence}
105
112
 
106
113
  def analyze(
107
114
  self,
108
- agent: Union[Agent, Team],
115
+ session_state: Dict[str, Any],
109
116
  title: str,
110
117
  result: str,
111
118
  analysis: str,
@@ -143,19 +150,20 @@ Confidence: {step_parsed.confidence}
143
150
  confidence=confidence,
144
151
  )
145
152
 
153
+ current_run_id = session_state.get("current_run_id", None)
146
154
  # Add this step to the Agent's session state
147
- if agent.session_state is None:
148
- agent.session_state = {}
149
- if "reasoning_steps" not in agent.session_state:
150
- agent.session_state["reasoning_steps"] = {}
151
- if agent.run_id not in agent.session_state["reasoning_steps"]:
152
- agent.session_state["reasoning_steps"][agent.run_id] = []
153
- agent.session_state["reasoning_steps"][agent.run_id].append(reasoning_step.model_dump_json())
155
+ if session_state is None:
156
+ session_state = {}
157
+ if "reasoning_steps" not in session_state:
158
+ session_state["reasoning_steps"] = {}
159
+ if current_run_id not in session_state["reasoning_steps"]:
160
+ session_state["reasoning_steps"][current_run_id] = []
161
+ session_state["reasoning_steps"][current_run_id].append(reasoning_step.model_dump_json())
154
162
 
155
163
  # Return all previous reasoning_steps and the new reasoning_step
156
- if "reasoning_steps" in agent.session_state and agent.run_id in agent.session_state["reasoning_steps"]:
164
+ if "reasoning_steps" in session_state and current_run_id in session_state["reasoning_steps"]:
157
165
  formatted_reasoning_steps = ""
158
- for i, step in enumerate(agent.session_state["reasoning_steps"][agent.run_id], 1):
166
+ for i, step in enumerate(session_state["reasoning_steps"][current_run_id], 1):
159
167
  step_parsed = ReasoningStep.model_validate_json(step)
160
168
  step_str = dedent(f"""\
161
169
  Step {i}:
agno/tools/reddit.py CHANGED
@@ -1,6 +1,6 @@
1
1
  import json
2
2
  from os import getenv
3
- from typing import Any, Dict, List, Optional, Union
3
+ from typing import Callable, Dict, List, Optional, Union
4
4
 
5
5
  from agno.tools import Toolkit
6
6
  from agno.utils.log import log_debug, log_info, logger
@@ -20,14 +20,6 @@ class RedditTools(Toolkit):
20
20
  user_agent: Optional[str] = None,
21
21
  username: Optional[str] = None,
22
22
  password: Optional[str] = None,
23
- get_user_info: bool = True,
24
- get_top_posts: bool = True,
25
- get_subreddit_info: bool = True,
26
- get_trending_subreddits: bool = True,
27
- get_subreddit_stats: bool = True,
28
- create_post: bool = True,
29
- reply_to_post: bool = True,
30
- reply_to_comment: bool = True,
31
23
  **kwargs,
32
24
  ):
33
25
  if reddit_instance is not None:
@@ -65,23 +57,16 @@ class RedditTools(Toolkit):
65
57
  else:
66
58
  logger.warning("Missing Reddit API credentials")
67
59
 
68
- tools: List[Any] = []
69
- if get_user_info:
70
- tools.append(self.get_user_info)
71
- if get_top_posts:
72
- tools.append(self.get_top_posts)
73
- if get_subreddit_info:
74
- tools.append(self.get_subreddit_info)
75
- if get_trending_subreddits:
76
- tools.append(self.get_trending_subreddits)
77
- if get_subreddit_stats:
78
- tools.append(self.get_subreddit_stats)
79
- if create_post:
80
- tools.append(self.create_post)
81
- if reply_to_post:
82
- tools.append(self.reply_to_post)
83
- if reply_to_comment:
84
- tools.append(self.reply_to_comment)
60
+ tools: List[Callable] = [
61
+ self.get_user_info,
62
+ self.get_top_posts,
63
+ self.get_subreddit_info,
64
+ self.get_trending_subreddits,
65
+ self.get_subreddit_stats,
66
+ self.create_post,
67
+ self.reply_to_post,
68
+ self.reply_to_comment,
69
+ ]
85
70
 
86
71
  super().__init__(name="reddit", tools=tools, **kwargs)
87
72
 
agno/tools/replicate.py CHANGED
@@ -1,6 +1,6 @@
1
- import os
2
1
  from os import getenv
3
- from typing import Any, Iterable, Iterator, List, Optional, Union
2
+ from pathlib import Path
3
+ from typing import Any, Iterable, Iterator, List, Optional, Tuple, Union
4
4
  from urllib.parse import urlparse
5
5
  from uuid import uuid4
6
6
 
@@ -8,6 +8,7 @@ from agno.agent import Agent
8
8
  from agno.media import ImageArtifact, VideoArtifact
9
9
  from agno.team.team import Team
10
10
  from agno.tools import Toolkit
11
+ from agno.tools.function import ToolResult
11
12
  from agno.utils.log import logger
12
13
 
13
14
  try:
@@ -22,83 +23,95 @@ class ReplicateTools(Toolkit):
22
23
  self,
23
24
  api_key: Optional[str] = None,
24
25
  model: str = "minimax/video-01",
26
+ enable_generate_media: bool = True,
27
+ all: bool = False,
25
28
  **kwargs,
26
29
  ):
27
- self.api_key = api_key or getenv("REPLICATE_API_TOKEN")
30
+ self.api_key = api_key or getenv("REPLICATE_API_KEY")
28
31
  if not self.api_key:
29
- logger.error("REPLICATE_API_TOKEN not set. Please set the REPLICATE_API_TOKEN environment variable.")
32
+ logger.error("REPLICATE_API_KEY not set. Please set the REPLICATE_API_KEY environment variable.")
30
33
  self.model = model
31
34
 
32
35
  tools: List[Any] = []
33
- tools.append(self.generate_media)
36
+ if all or enable_generate_media:
37
+ tools.append(self.generate_media)
34
38
 
35
39
  super().__init__(name="replicate_toolkit", tools=tools, **kwargs)
36
40
 
37
- def generate_media(self, agent: Union[Agent, Team], prompt: str) -> str:
41
+ def generate_media(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
38
42
  """
39
43
  Use this function to generate an image or a video using a replicate model.
40
44
  Args:
41
45
  prompt (str): A text description of the content.
42
46
  Returns:
43
- str: Return a URI to the generated video or image.
47
+ ToolResult: A ToolResult containing the generated media or error message.
44
48
  """
45
49
  if not self.api_key:
46
50
  logger.error("API key is not set. Please provide a valid API key.")
47
- return "API key is not set."
51
+ return ToolResult(content="API key is not set.")
48
52
 
49
- outputs = replicate.run(ref=self.model, input={"prompt": prompt})
50
- if isinstance(outputs, FileOutput):
51
- outputs = [outputs]
52
- elif isinstance(outputs, (Iterable, Iterator)) and not isinstance(outputs, str):
53
- outputs = list(outputs)
54
- else:
55
- logger.error(f"Unexpected output type: {type(outputs)}")
56
- return f"Unexpected output type: {type(outputs)}"
53
+ try:
54
+ outputs = replicate.run(ref=self.model, input={"prompt": prompt})
55
+ if isinstance(outputs, FileOutput):
56
+ outputs = [outputs]
57
+ elif isinstance(outputs, (Iterable, Iterator)) and not isinstance(outputs, str):
58
+ outputs = list(outputs)
59
+ else:
60
+ logger.error(f"Unexpected output type: {type(outputs)}")
61
+ return ToolResult(content=f"Unexpected output type: {type(outputs)}")
62
+
63
+ images = []
64
+ videos = []
65
+ results = []
57
66
 
58
- results = []
59
- for output in outputs:
60
- if not isinstance(output, FileOutput):
61
- logger.error(f"Unexpected output type: {type(output)}")
62
- return f"Unexpected output type: {type(output)}"
67
+ for output in outputs:
68
+ if not isinstance(output, FileOutput):
69
+ logger.error(f"Unexpected output type: {type(output)}")
70
+ return ToolResult(content=f"Unexpected output type: {type(output)}")
63
71
 
64
- result = self._parse_output(agent, output)
65
- results.append(result)
66
- return "\n".join(results)
72
+ result_msg, media_artifact = self._parse_output(output)
73
+ results.append(result_msg)
67
74
 
68
- def _parse_output(self, agent: Union[Agent, Team], output: FileOutput) -> str:
75
+ if isinstance(media_artifact, ImageArtifact):
76
+ images.append(media_artifact)
77
+ elif isinstance(media_artifact, VideoArtifact):
78
+ videos.append(media_artifact)
79
+
80
+ content = "\n".join(results)
81
+ return ToolResult(
82
+ content=content,
83
+ images=images if images else None,
84
+ videos=videos if videos else None,
85
+ )
86
+ except Exception as e:
87
+ logger.error(f"Failed to generate media: {e}")
88
+ return ToolResult(content=f"Error: {e}")
89
+
90
+ def _parse_output(self, output: FileOutput) -> Tuple[str, Union[ImageArtifact, VideoArtifact]]:
69
91
  """
70
92
  Parse the outputs from the replicate model.
71
93
  """
72
94
  # Parse the URL to extract the file extension
73
95
  parsed_url = urlparse(output.url)
74
96
  path = parsed_url.path
75
- _, ext = os.path.splitext(path)
76
- ext = ext.lower()
97
+ ext = Path(path).suffix.lower()
77
98
 
78
99
  # Define supported extensions
79
100
  image_extensions = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff", ".webp"}
80
101
  video_extensions = {".mp4", ".mov", ".avi", ".mkv", ".flv", ".wmv", ".webm"}
81
102
 
82
103
  media_id = str(uuid4())
104
+ artifact: Union[ImageArtifact, VideoArtifact]
105
+ media_type: str
83
106
 
84
107
  if ext in image_extensions:
85
- agent.add_image(
86
- ImageArtifact(
87
- id=media_id,
88
- url=output.url,
89
- )
90
- )
108
+ artifact = ImageArtifact(id=media_id, url=output.url)
91
109
  media_type = "image"
92
110
  elif ext in video_extensions:
93
- agent.add_video(
94
- VideoArtifact(
95
- id=media_id,
96
- url=output.url,
97
- )
98
- )
111
+ artifact = VideoArtifact(id=media_id, url=output.url)
99
112
  media_type = "video"
100
113
  else:
101
114
  logger.error(f"Unsupported media type with extension '{ext}' for URL: {output.url}")
102
- return f"Unsupported media type with extension '{ext}'."
115
+ raise ValueError(f"Unsupported media type with extension '{ext}'.")
103
116
 
104
- return f"{media_type.capitalize()} generated successfully at {output.url}"
117
+ return f"{media_type.capitalize()} generated successfully at {output.url}", artifact
agno/tools/resend.py CHANGED
@@ -15,6 +15,8 @@ class ResendTools(Toolkit):
15
15
  self,
16
16
  api_key: Optional[str] = None,
17
17
  from_email: Optional[str] = None,
18
+ enable_send_email: bool = True,
19
+ all: bool = False,
18
20
  **kwargs,
19
21
  ):
20
22
  self.from_email = from_email
@@ -23,7 +25,8 @@ class ResendTools(Toolkit):
23
25
  logger.error("No Resend API key provided")
24
26
 
25
27
  tools: List[Any] = []
26
- tools.append(self.send_email)
28
+ if all or enable_send_email:
29
+ tools.append(self.send_email)
27
30
 
28
31
  super().__init__(name="resend_tools", tools=tools, **kwargs)
29
32
 
agno/tools/scrapegraph.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import json
2
- import os
2
+ from os import getenv
3
3
  from typing import Any, List, Optional
4
4
 
5
5
  from agno.tools import Toolkit
@@ -18,31 +18,32 @@ class ScrapeGraphTools(Toolkit):
18
18
  def __init__(
19
19
  self,
20
20
  api_key: Optional[str] = None,
21
- smartscraper: bool = True,
22
- markdownify: bool = False,
23
- crawl: bool = False,
24
- searchscraper: bool = False,
25
- agentic_crawler: bool = False,
21
+ enable_smartscraper: bool = True,
22
+ enable_markdownify: bool = False,
23
+ enable_crawl: bool = False,
24
+ enable_searchscraper: bool = False,
25
+ enable_agentic_crawler: bool = False,
26
+ all: bool = False,
26
27
  **kwargs,
27
28
  ):
28
- self.api_key: Optional[str] = api_key or os.getenv("SGAI_API_KEY")
29
+ self.api_key: Optional[str] = api_key or getenv("SGAI_API_KEY")
29
30
  self.client = Client(api_key=self.api_key)
30
31
 
31
32
  # Start with smartscraper by default
32
33
  # Only enable markdownify if smartscraper is False
33
- if not smartscraper:
34
- markdownify = True
34
+ if not enable_smartscraper and not all:
35
+ enable_markdownify = True
35
36
 
36
37
  tools: List[Any] = []
37
- if smartscraper:
38
+ if enable_smartscraper or all:
38
39
  tools.append(self.smartscraper)
39
- if markdownify:
40
+ if enable_markdownify or all:
40
41
  tools.append(self.markdownify)
41
- if crawl:
42
+ if enable_crawl or all:
42
43
  tools.append(self.crawl)
43
- if searchscraper:
44
+ if enable_searchscraper or all:
44
45
  tools.append(self.searchscraper)
45
- if agentic_crawler:
46
+ if enable_agentic_crawler or all:
46
47
  tools.append(self.agentic_crawler)
47
48
 
48
49
  super().__init__(name="scrapegraph_tools", tools=tools, **kwargs)
agno/tools/searxng.py CHANGED
@@ -14,35 +14,22 @@ class Searxng(Toolkit):
14
14
  host: str,
15
15
  engines: List[str] = [],
16
16
  fixed_max_results: Optional[int] = None,
17
- images: bool = False,
18
- it: bool = False,
19
- map: bool = False,
20
- music: bool = False,
21
- news: bool = False,
22
- science: bool = False,
23
- videos: bool = False,
24
17
  **kwargs,
25
18
  ):
26
19
  self.host = host
27
20
  self.engines = engines
28
21
  self.fixed_max_results = fixed_max_results
29
22
 
30
- tools: List[Any] = []
31
- tools.append(self.search)
32
- if images:
33
- tools.append(self.image_search)
34
- if it:
35
- tools.append(self.it_search)
36
- if map:
37
- tools.append(self.map_search)
38
- if music:
39
- tools.append(self.music_search)
40
- if news:
41
- tools.append(self.news_search)
42
- if science:
43
- tools.append(self.science_search)
44
- if videos:
45
- tools.append(self.video_search)
23
+ tools: List[Any] = [
24
+ self.search,
25
+ self.image_search,
26
+ self.it_search,
27
+ self.map_search,
28
+ self.music_search,
29
+ self.news_search,
30
+ self.science_search,
31
+ self.video_search,
32
+ ]
46
33
 
47
34
  super().__init__(name="searxng", tools=tools, **kwargs)
48
35
 
agno/tools/serpapi.py CHANGED
@@ -15,7 +15,9 @@ class SerpApiTools(Toolkit):
15
15
  def __init__(
16
16
  self,
17
17
  api_key: Optional[str] = None,
18
- search_youtube: bool = False,
18
+ enable_search_google: bool = True,
19
+ enable_search_youtube: bool = False,
20
+ all: bool = False,
19
21
  **kwargs,
20
22
  ):
21
23
  self.api_key = api_key or getenv("SERP_API_KEY")
@@ -23,8 +25,9 @@ class SerpApiTools(Toolkit):
23
25
  logger.warning("No Serpapi API key provided")
24
26
 
25
27
  tools: List[Any] = []
26
- tools.append(self.search_google)
27
- if search_youtube:
28
+ if all or enable_search_google:
29
+ tools.append(self.search_google)
30
+ if all or enable_search_youtube:
28
31
  tools.append(self.search_youtube)
29
32
 
30
33
  super().__init__(name="serpapi_tools", tools=tools, **kwargs)
agno/tools/serper.py CHANGED
@@ -16,6 +16,11 @@ class SerperTools(Toolkit):
16
16
  language: str = "en",
17
17
  num_results: int = 10,
18
18
  date_range: Optional[str] = None,
19
+ enable_search: bool = True,
20
+ enable_search_news: bool = True,
21
+ enable_search_scholar: bool = True,
22
+ enable_scrape_webpage: bool = True,
23
+ all: bool = False,
19
24
  **kwargs,
20
25
  ):
21
26
  """
@@ -38,10 +43,14 @@ class SerperTools(Toolkit):
38
43
  self.date_range = date_range
39
44
 
40
45
  tools: List[Any] = []
41
- tools.append(self.search)
42
- tools.append(self.search_news)
43
- tools.append(self.search_scholar)
44
- tools.append(self.scrape_webpage)
46
+ if all or enable_search:
47
+ tools.append(self.search)
48
+ if all or enable_search_news:
49
+ tools.append(self.search_news)
50
+ if all or enable_search_scholar:
51
+ tools.append(self.search_scholar)
52
+ if all or enable_scrape_webpage:
53
+ tools.append(self.scrape_webpage)
45
54
 
46
55
  super().__init__(name="serper_tools", tools=tools, **kwargs)
47
56
 
agno/tools/shell.py CHANGED
@@ -6,13 +6,20 @@ from agno.utils.log import log_debug, log_info, logger
6
6
 
7
7
 
8
8
  class ShellTools(Toolkit):
9
- def __init__(self, base_dir: Optional[Union[Path, str]] = None, **kwargs):
9
+ def __init__(
10
+ self,
11
+ base_dir: Optional[Union[Path, str]] = None,
12
+ enable_run_shell_command: bool = True,
13
+ all: bool = False,
14
+ **kwargs,
15
+ ):
10
16
  self.base_dir: Optional[Path] = None
11
17
  if base_dir is not None:
12
18
  self.base_dir = Path(base_dir) if isinstance(base_dir, str) else base_dir
13
19
 
14
20
  tools = []
15
- tools.append(self.run_shell_command)
21
+ if all or enable_run_shell_command:
22
+ tools.append(self.run_shell_command)
16
23
 
17
24
  super().__init__(name="shell_tools", tools=tools, **kwargs)
18
25