agno 1.8.1__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 (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  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 +11 -66
  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 +1743 -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 +1432 -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 +882 -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 +1045 -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 +1416 -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 +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -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 +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  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 +15 -11
  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 +1551 -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 +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  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 +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  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 +46 -151
  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 +85 -47
  158. agno/models/openai/chat.py +154 -37
  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 +15 -9
  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 +497 -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 +77 -33
  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 +32 -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 +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.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}")