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

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