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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +9 -64
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1749 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1438 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +888 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1051 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1417 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +10 -10
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1515 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +38 -144
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +84 -46
  158. agno/models/openai/chat.py +121 -23
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +14 -8
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +393 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +65 -28
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +33 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  184. agno/os/router.py +843 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +204 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +413 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +179 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +58 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +2961 -4253
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +42 -22
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +18 -13
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/tools/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
 
agno/tools/slack.py CHANGED
@@ -1,8 +1,8 @@
1
1
  import json
2
- import os
2
+ from os import getenv
3
3
  from typing import Any, Dict, List, Optional
4
4
 
5
- from agno.tools.toolkit import Toolkit
5
+ from agno.tools import Toolkit
6
6
  from agno.utils.log import logger
7
7
 
8
8
  try:
@@ -16,25 +16,26 @@ class SlackTools(Toolkit):
16
16
  def __init__(
17
17
  self,
18
18
  token: Optional[str] = None,
19
- send_message: bool = True,
20
- send_message_thread: bool = True,
21
- list_channels: bool = True,
22
- get_channel_history: bool = True,
19
+ enable_send_message: bool = True,
20
+ enable_send_message_thread: bool = True,
21
+ enable_list_channels: bool = True,
22
+ enable_get_channel_history: bool = True,
23
+ all: bool = False,
23
24
  **kwargs,
24
25
  ):
25
- self.token: Optional[str] = token or os.getenv("SLACK_TOKEN")
26
+ self.token: Optional[str] = token or getenv("SLACK_TOKEN")
26
27
  if self.token is None or self.token == "":
27
28
  raise ValueError("SLACK_TOKEN is not set")
28
29
  self.client = WebClient(token=self.token)
29
30
 
30
31
  tools: List[Any] = []
31
- if send_message:
32
+ if enable_send_message or all:
32
33
  tools.append(self.send_message)
33
- if send_message_thread:
34
+ if enable_send_message_thread or all:
34
35
  tools.append(self.send_message_thread)
35
- if list_channels:
36
+ if enable_list_channels or all:
36
37
  tools.append(self.list_channels)
37
- if get_channel_history:
38
+ if enable_get_channel_history or all:
38
39
  tools.append(self.get_channel_history)
39
40
 
40
41
  super().__init__(name="slack", tools=tools, **kwargs)
agno/tools/sleep.py CHANGED
@@ -5,9 +5,10 @@ from agno.utils.log import log_info
5
5
 
6
6
 
7
7
  class SleepTools(Toolkit):
8
- def __init__(self, **kwargs):
8
+ def __init__(self, enable_sleep: bool = True, all: bool = False, **kwargs):
9
9
  tools = []
10
- tools.append(self.sleep)
10
+ if all or enable_sleep:
11
+ tools.append(self.sleep)
11
12
 
12
13
  super().__init__(name="sleep", tools=tools, **kwargs)
13
14
 
agno/tools/spider.py CHANGED
@@ -7,16 +7,33 @@ except ImportError:
7
7
 
8
8
  from typing import Any, List, Optional
9
9
 
10
- from agno.tools.toolkit import Toolkit
10
+ from agno.tools import Toolkit
11
11
  from agno.utils.log import log_info, logger
12
12
 
13
13
 
14
14
  class SpiderTools(Toolkit):
15
+ """
16
+ Spider is a toolkit for web searching, scraping, and crawling.
17
+
18
+ Args:
19
+ enable_search (bool): Enable web search functionality. Default is True.
20
+ enable_scrape (bool): Enable web scraping functionality. Default is True.
21
+ enable_crawl (bool): Enable web crawling functionality. Default is True.
22
+ all (bool): Enable all tools. Overrides individual flags when True. Default is False.
23
+ max_results (Optional[int]): Default maximum number of results.
24
+ url (Optional[str]): Default URL for operations.
25
+ optional_params (Optional[dict]): Additional parameters for operations.
26
+ """
27
+
15
28
  def __init__(
16
29
  self,
17
30
  max_results: Optional[int] = None,
18
31
  url: Optional[str] = None,
19
32
  optional_params: Optional[dict] = None,
33
+ enable_search: bool = True,
34
+ enable_scrape: bool = True,
35
+ enable_crawl: bool = True,
36
+ all: bool = False,
20
37
  **kwargs,
21
38
  ):
22
39
  self.max_results = max_results
@@ -24,9 +41,12 @@ class SpiderTools(Toolkit):
24
41
  self.optional_params = optional_params or {}
25
42
 
26
43
  tools: List[Any] = []
27
- tools.append(self.search)
28
- tools.append(self.scrape)
29
- tools.append(self.crawl)
44
+ if enable_search or all:
45
+ tools.append(self.search)
46
+ if enable_scrape or all:
47
+ tools.append(self.scrape)
48
+ if enable_crawl or all:
49
+ tools.append(self.crawl)
30
50
 
31
51
  super().__init__(name="spider", tools=tools, **kwargs)
32
52
 
agno/tools/sql.py CHANGED
@@ -25,9 +25,10 @@ class SQLTools(Toolkit):
25
25
  schema: Optional[str] = None,
26
26
  dialect: Optional[str] = None,
27
27
  tables: Optional[Dict[str, Any]] = None,
28
- list_tables: bool = True,
29
- describe_table: bool = True,
30
- run_sql_query: bool = True,
28
+ enable_list_tables: bool = True,
29
+ enable_describe_table: bool = True,
30
+ enable_run_sql_query: bool = True,
31
+ all: bool = False,
31
32
  **kwargs,
32
33
  ):
33
34
  # Get the database engine
@@ -53,11 +54,11 @@ class SQLTools(Toolkit):
53
54
  self.tables: Optional[Dict[str, Any]] = tables
54
55
 
55
56
  tools: List[Any] = []
56
- if list_tables:
57
+ if enable_list_tables or all:
57
58
  tools.append(self.list_tables)
58
- if describe_table:
59
+ if enable_describe_table or all:
59
60
  tools.append(self.describe_table)
60
- if run_sql_query:
61
+ if enable_run_sql_query or all:
61
62
  tools.append(self.run_sql_query)
62
63
 
63
64
  super().__init__(name="sql_tools", tools=tools, **kwargs)