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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +9 -64
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1749 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1438 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +888 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1051 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1417 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +10 -10
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1515 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +38 -144
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +84 -46
  158. agno/models/openai/chat.py +121 -23
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +14 -8
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +393 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +65 -28
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +33 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  184. agno/os/router.py +843 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +204 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +413 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +179 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +58 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +2961 -4253
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +42 -22
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +18 -13
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  import json
2
- import os
3
2
  import re
3
+ from os import getenv
4
4
  from typing import Any, Dict, List, Optional
5
5
 
6
6
  from agno.tools import Toolkit
@@ -17,17 +17,10 @@ class ClickUpTools(Toolkit):
17
17
  self,
18
18
  api_key: Optional[str] = None,
19
19
  master_space_id: Optional[str] = None,
20
- list_tasks: bool = True,
21
- create_task: bool = True,
22
- get_task: bool = True,
23
- update_task: bool = True,
24
- delete_task: bool = True,
25
- list_spaces: bool = True,
26
- list_lists: bool = True,
27
20
  **kwargs,
28
21
  ):
29
- self.api_key = api_key or os.getenv("CLICKUP_API_KEY")
30
- self.master_space_id = master_space_id or os.getenv("MASTER_SPACE_ID")
22
+ self.api_key = api_key or getenv("CLICKUP_API_KEY")
23
+ self.master_space_id = master_space_id or getenv("MASTER_SPACE_ID")
31
24
  self.base_url = "https://api.clickup.com/api/v2"
32
25
  self.headers = {"Authorization": self.api_key}
33
26
 
@@ -36,21 +29,15 @@ class ClickUpTools(Toolkit):
36
29
  if not self.master_space_id:
37
30
  raise ValueError("MASTER_SPACE_ID not set. Please set the MASTER_SPACE_ID environment variable.")
38
31
 
39
- tools: List[Any] = []
40
- if list_tasks:
41
- tools.append(self.list_tasks)
42
- if create_task:
43
- tools.append(self.create_task)
44
- if get_task:
45
- tools.append(self.get_task)
46
- if update_task:
47
- tools.append(self.update_task)
48
- if delete_task:
49
- tools.append(self.delete_task)
50
- if list_spaces:
51
- tools.append(self.list_spaces)
52
- if list_lists:
53
- tools.append(self.list_lists)
32
+ tools: List[Any] = [
33
+ self.list_tasks,
34
+ self.create_task,
35
+ self.get_task,
36
+ self.update_task,
37
+ self.delete_task,
38
+ self.list_spaces,
39
+ self.list_lists,
40
+ ]
54
41
 
55
42
  super().__init__(name="clickup", tools=tools, **kwargs)
56
43
 
agno/tools/confluence.py CHANGED
@@ -39,7 +39,6 @@ class ConfluenceTools(Toolkit):
39
39
  - CONFLUENCE_API_KEY
40
40
  """
41
41
 
42
- super().__init__(name="confluence_tools", **kwargs)
43
42
  self.url = url or getenv("CONFLUENCE_URL")
44
43
  self.username = username or getenv("CONFLUENCE_USERNAME")
45
44
  self.password = api_key or getenv("CONFLUENCE_API_KEY") or password or getenv("CONFLUENCE_PASSWORD")
@@ -73,13 +72,14 @@ class ConfluenceTools(Toolkit):
73
72
  session=session,
74
73
  )
75
74
 
76
- tools: List[Any] = []
77
- tools.append(self.get_page_content)
78
- tools.append(self.get_space_key)
79
- tools.append(self.create_page)
80
- tools.append(self.update_page)
81
- tools.append(self.get_all_space_detail)
82
- tools.append(self.get_all_page_from_space)
75
+ tools: List[Any] = [
76
+ self.get_page_content,
77
+ self.get_space_key,
78
+ self.create_page,
79
+ self.update_page,
80
+ self.get_all_space_detail,
81
+ self.get_all_page_from_space,
82
+ ]
83
83
 
84
84
  super().__init__(name="confluence_tools", tools=tools, **kwargs)
85
85
 
agno/tools/crawl4ai.py CHANGED
@@ -20,9 +20,15 @@ class Crawl4aiTools(Toolkit):
20
20
  bm25_threshold: float = 1.0,
21
21
  headless: bool = True,
22
22
  wait_until: str = "domcontentloaded",
23
+ enable_crawl: bool = True,
24
+ all: bool = False,
23
25
  **kwargs,
24
26
  ):
25
- super().__init__(name="crawl4ai_tools", tools=[self.crawl], **kwargs)
27
+ tools = []
28
+ if all or enable_crawl:
29
+ tools.append(self.crawl)
30
+
31
+ super().__init__(name="crawl4ai_tools", tools=tools, **kwargs)
26
32
  self.max_length = max_length
27
33
  self.timeout = timeout
28
34
  self.use_pruning = use_pruning
agno/tools/csv_toolkit.py CHANGED
@@ -12,12 +12,13 @@ class CsvTools(Toolkit):
12
12
  self,
13
13
  csvs: Optional[List[Union[str, Path]]] = None,
14
14
  row_limit: Optional[int] = None,
15
- read_csvs: bool = True,
16
- list_csvs: bool = True,
17
- query_csvs: bool = True,
18
- read_column_names: bool = True,
19
15
  duckdb_connection: Optional[Any] = None,
20
16
  duckdb_kwargs: Optional[Dict[str, Any]] = None,
17
+ enable_read_csv_file: bool = True,
18
+ enable_list_csv_files: bool = True,
19
+ enable_get_columns: bool = True,
20
+ enable_query_csv_file: bool = True,
21
+ all: bool = False,
21
22
  **kwargs,
22
23
  ):
23
24
  self.csvs: List[Path] = []
@@ -34,13 +35,13 @@ class CsvTools(Toolkit):
34
35
  self.duckdb_kwargs: Optional[Dict[str, Any]] = duckdb_kwargs
35
36
 
36
37
  tools: List[Any] = []
37
- if read_csvs:
38
+ if all or enable_read_csv_file:
38
39
  tools.append(self.read_csv_file)
39
- if list_csvs:
40
+ if all or enable_list_csv_files:
40
41
  tools.append(self.list_csv_files)
41
- if read_column_names:
42
+ if all or enable_get_columns:
42
43
  tools.append(self.get_columns)
43
- if query_csvs:
44
+ if all or enable_query_csv_file:
44
45
  try:
45
46
  import duckdb # noqa: F401
46
47
 
agno/tools/dalle.py CHANGED
@@ -6,6 +6,7 @@ from agno.agent import Agent
6
6
  from agno.media import ImageArtifact
7
7
  from agno.team.team import Team
8
8
  from agno.tools import Toolkit
9
+ from agno.tools.function import ToolResult
9
10
  from agno.utils.log import log_debug, logger
10
11
 
11
12
  try:
@@ -24,6 +25,8 @@ class DalleTools(Toolkit):
24
25
  quality: Literal["standard", "hd"] = "standard",
25
26
  style: Literal["vivid", "natural"] = "vivid",
26
27
  api_key: Optional[str] = None,
28
+ enable_create_image: bool = True,
29
+ all: bool = False,
27
30
  **kwargs,
28
31
  ):
29
32
  self.model = model
@@ -51,7 +54,8 @@ class DalleTools(Toolkit):
51
54
  logger.error("OPENAI_API_KEY not set. Please set the OPENAI_API_KEY environment variable.")
52
55
 
53
56
  tools: List[Any] = []
54
- tools.append(self.create_image)
57
+ if all or enable_create_image:
58
+ tools.append(self.create_image)
55
59
 
56
60
  super().__init__(name="dalle", tools=tools, **kwargs)
57
61
 
@@ -60,17 +64,17 @@ class DalleTools(Toolkit):
60
64
  # - Add support for saving images
61
65
  # - Add support for editing images
62
66
 
63
- def create_image(self, agent: Union[Agent, Team], prompt: str) -> str:
67
+ def create_image(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
64
68
  """Use this function to generate an image for a prompt.
65
69
 
66
70
  Args:
67
71
  prompt (str): A text description of the desired image.
68
72
 
69
73
  Returns:
70
- str: str: A message indicating if the image has been generated successfully or an error message.
74
+ ToolResult: Result containing the message and generated images.
71
75
  """
72
76
  if not self.api_key:
73
- return "Please set the OPENAI_API_KEY"
77
+ return ToolResult(content="Please set the OPENAI_API_KEY")
74
78
 
75
79
  try:
76
80
  client = OpenAI(api_key=self.api_key)
@@ -85,18 +89,21 @@ class DalleTools(Toolkit):
85
89
  )
86
90
  log_debug("Image generated successfully")
87
91
 
88
- # Update the run response with the image URLs
92
+ generated_images = []
89
93
  response_str = ""
90
94
  if response.data:
91
95
  for img in response.data:
92
96
  if img.url:
93
- agent.add_image(
94
- ImageArtifact(
95
- id=str(uuid4()), url=img.url, original_prompt=prompt, revised_prompt=img.revised_prompt
96
- )
97
+ image_artifact = ImageArtifact(
98
+ id=str(uuid4()), url=img.url, original_prompt=prompt, revised_prompt=img.revised_prompt
97
99
  )
100
+ generated_images.append(image_artifact)
98
101
  response_str += f"Image has been generated at the URL {img.url}\n"
99
- return response_str or "No images were generated"
102
+
103
+ return ToolResult(
104
+ content=response_str or "No images were generated",
105
+ images=generated_images if generated_images else None,
106
+ )
100
107
  except Exception as e:
101
108
  logger.error(f"Failed to generate image: {e}")
102
- return f"Error: {e}"
109
+ return ToolResult(content=f"Error: {e}")
agno/tools/daytona.py CHANGED
@@ -2,7 +2,7 @@ import json
2
2
  from os import getenv
3
3
  from pathlib import Path
4
4
  from textwrap import dedent
5
- from typing import Dict, Optional, Union
5
+ from typing import Any, Dict, List, Optional, Union
6
6
 
7
7
  from agno.agent import Agent
8
8
  from agno.team import Team
@@ -24,7 +24,6 @@ except ImportError:
24
24
  DEFAULT_INSTRUCTIONS = dedent(
25
25
  """\
26
26
  You have access to a persistent Daytona sandbox for code execution. The sandbox maintains state across interactions.
27
-
28
27
  Available tools:
29
28
  - `run_code`: Execute code in the sandbox
30
29
  - `run_shell_command`: Execute shell commands (bash)
@@ -33,21 +32,19 @@ DEFAULT_INSTRUCTIONS = dedent(
33
32
  - `list_files`: List directory contents
34
33
  - `delete_file`: Delete files or directories
35
34
  - `change_directory`: Change the working directory
36
-
37
35
  MANDATORY: When users ask for code (Python, JavaScript, TypeScript, etc.), you MUST:
38
36
  1. Write the code
39
37
  2. Execute it using run_code tool
40
38
  3. Show the actual output/results
41
39
  4. Never just provide code without executing it
42
-
43
40
  CRITICAL WORKFLOW:
44
41
  1. Before running Python scripts, check if required packages are installed
45
42
  2. Install missing packages with: run_shell_command("pip install package1 package2")
46
43
  3. When running scripts, capture both output AND errors
47
44
  4. If a script produces no output, check for errors or add print statements
48
-
45
+
49
46
  IMPORTANT: Always use single quotes for the content parameter when creating files
50
-
47
+
51
48
  Remember: Your job is to provide working, executed code examples, not just code snippets!
52
49
  """
53
50
  )
@@ -110,18 +107,18 @@ class DaytonaTools(Toolkit):
110
107
  )
111
108
 
112
109
  self.daytona = Daytona(self.config)
113
-
110
+ tools: List[Any] = [
111
+ self.run_code,
112
+ self.run_shell_command,
113
+ self.create_file,
114
+ self.read_file,
115
+ self.list_files,
116
+ self.delete_file,
117
+ self.change_directory,
118
+ ]
114
119
  super().__init__(
115
120
  name="daytona_tools",
116
- tools=[
117
- self.run_code,
118
- self.run_shell_command,
119
- self.create_file,
120
- self.read_file,
121
- self.list_files,
122
- self.delete_file,
123
- self.change_directory,
124
- ],
121
+ tools=tools,
125
122
  instructions=self.instructions,
126
123
  add_instructions=add_instructions,
127
124
  **kwargs,
agno/tools/decorator.py CHANGED
@@ -64,7 +64,6 @@ def tool(
64
64
  strict: Optional[bool] = None,
65
65
  instructions: Optional[str] = None,
66
66
  add_instructions: bool = True,
67
- sanitize_arguments: Optional[bool] = None,
68
67
  show_result: Optional[bool] = None,
69
68
  stop_after_tool_call: Optional[bool] = None,
70
69
  requires_confirmation: Optional[bool] = None,
@@ -91,7 +90,6 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
91
90
  name: Optional[str] - Override for the function name
92
91
  description: Optional[str] - Override for the function description
93
92
  strict: Optional[bool] - Flag for strict parameter checking
94
- sanitize_arguments: Optional[bool] - If True, arguments are sanitized before passing to function (Deprecated)
95
93
  instructions: Optional[str] - Instructions for using the tool
96
94
  add_instructions: bool - If True, add instructions to the system message
97
95
  show_result: Optional[bool] - If True, shows the result after function call
@@ -131,7 +129,6 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
131
129
  "strict",
132
130
  "instructions",
133
131
  "add_instructions",
134
- "sanitize_arguments",
135
132
  "show_result",
136
133
  "stop_after_tool_call",
137
134
  "requires_confirmation",
@@ -248,6 +245,12 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
248
245
  and v is not None
249
246
  },
250
247
  }
248
+
249
+ # Automatically set show_result=True if stop_after_tool_call=True (unless explicitly set to False)
250
+ if kwargs.get("stop_after_tool_call") is True:
251
+ if "show_result" not in kwargs or kwargs.get("show_result") is None:
252
+ tool_config["show_result"] = True
253
+
251
254
  return Function(**tool_config)
252
255
 
253
256
  # Handle both @tool and @tool() cases
agno/tools/desi_vocal.py CHANGED
@@ -8,6 +8,7 @@ from agno.agent import Agent
8
8
  from agno.media import AudioArtifact
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
 
@@ -16,6 +17,9 @@ class DesiVocalTools(Toolkit):
16
17
  self,
17
18
  api_key: Optional[str] = None,
18
19
  voice_id: Optional[str] = "f27d74e5-ea71-4697-be3e-f04bbd80c1a8",
20
+ enable_get_voices: bool = True,
21
+ enable_text_to_speech: bool = True,
22
+ all: bool = False,
19
23
  **kwargs,
20
24
  ):
21
25
  self.api_key = api_key or getenv("DESI_VOCAL_API_KEY")
@@ -25,8 +29,10 @@ class DesiVocalTools(Toolkit):
25
29
  self.voice_id = voice_id
26
30
 
27
31
  tools: List[Any] = []
28
- tools.append(self.get_voices)
29
- tools.append(self.text_to_speech)
32
+ if all or enable_get_voices:
33
+ tools.append(self.get_voices)
34
+ if all or enable_text_to_speech:
35
+ tools.append(self.text_to_speech)
30
36
 
31
37
  super().__init__(name="desi_vocal_tools", tools=tools, **kwargs)
32
38
 
@@ -63,13 +69,13 @@ class DesiVocalTools(Toolkit):
63
69
  logger.error(f"Failed to get voices: {e}")
64
70
  return f"Error: {e}"
65
71
 
66
- def text_to_speech(self, agent: Union[Agent, Team], prompt: str, voice_id: Optional[str] = None) -> str:
72
+ def text_to_speech(self, agent: Union[Agent, Team], prompt: str, voice_id: Optional[str] = None) -> ToolResult:
67
73
  """
68
74
  Use this function to generate audio from text.
69
75
  Args:
70
76
  prompt (str): The text to generate audio from.
71
77
  Returns:
72
- result (str): The URL of the generated audio.
78
+ ToolResult: A ToolResult containing the generated audio or error message.
73
79
  """
74
80
  try:
75
81
  url = "https://prod-api2.desivocal.com/dv/api/v0/tts_api/generate"
@@ -91,9 +97,12 @@ class DesiVocalTools(Toolkit):
91
97
  response_json = response.json()
92
98
  audio_url = response_json["s3_path"]
93
99
 
94
- agent.add_audio(AudioArtifact(id=str(uuid4()), url=audio_url))
100
+ audio_artifact = AudioArtifact(id=str(uuid4()), url=audio_url)
95
101
 
96
- return audio_url
102
+ return ToolResult(
103
+ content=f"Audio generated successfully: {audio_url}",
104
+ audios=[audio_artifact],
105
+ )
97
106
  except Exception as e:
98
107
  logger.error(f"Failed to generate audio: {e}")
99
- return f"Error: {e}"
108
+ return ToolResult(content=f"Error: {e}")
agno/tools/discord.py CHANGED
@@ -14,10 +14,12 @@ class DiscordTools(Toolkit):
14
14
  def __init__(
15
15
  self,
16
16
  bot_token: Optional[str] = None,
17
- enable_messaging: bool = True,
18
- enable_history: bool = True,
19
- enable_channel_management: bool = True,
20
- enable_message_management: bool = True,
17
+ enable_send_message: bool = True,
18
+ enable_get_channel_messages: bool = True,
19
+ enable_get_channel_info: bool = True,
20
+ enable_list_channels: bool = True,
21
+ enable_delete_message: bool = True,
22
+ all: bool = False,
21
23
  **kwargs,
22
24
  ):
23
25
  self.bot_token = bot_token or getenv("DISCORD_BOT_TOKEN")
@@ -32,14 +34,15 @@ class DiscordTools(Toolkit):
32
34
  }
33
35
 
34
36
  tools: List[Any] = []
35
- if enable_messaging:
37
+ if enable_send_message or all:
36
38
  tools.append(self.send_message)
37
- if enable_history:
39
+ if enable_get_channel_messages or all:
38
40
  tools.append(self.get_channel_messages)
39
- if enable_channel_management:
41
+ if enable_get_channel_info or all:
40
42
  tools.append(self.get_channel_info)
43
+ if enable_list_channels or all:
41
44
  tools.append(self.list_channels)
42
- if enable_message_management:
45
+ if enable_delete_message or all:
43
46
  tools.append(self.delete_message)
44
47
 
45
48
  super().__init__(name="discord", tools=tools, **kwargs)
agno/tools/docker.py CHANGED
@@ -58,10 +58,6 @@ except ImportError:
58
58
  class DockerTools(Toolkit):
59
59
  def __init__(
60
60
  self,
61
- enable_container_management: bool = True,
62
- enable_image_management: bool = True,
63
- enable_volume_management: bool = False,
64
- enable_network_management: bool = False,
65
61
  **kwargs,
66
62
  ):
67
63
  self._check_docker_availability()
@@ -80,44 +76,36 @@ class DockerTools(Toolkit):
80
76
  except Exception as e:
81
77
  logger.error(f"Error connecting to Docker: {e}")
82
78
 
83
- tools: List[Any] = []
84
- if enable_container_management:
85
- tools.extend(
86
- [
87
- self.list_containers,
88
- self.start_container,
89
- self.stop_container,
90
- self.remove_container,
91
- self.get_container_logs,
92
- self.inspect_container,
93
- self.run_container,
94
- self.exec_in_container,
95
- ]
96
- )
97
- if enable_image_management:
98
- tools.extend(
99
- [
100
- self.list_images,
101
- self.pull_image,
102
- self.remove_image,
103
- self.build_image,
104
- self.tag_image,
105
- self.inspect_image,
106
- ]
107
- )
108
- if enable_volume_management:
109
- tools.extend([self.list_volumes, self.create_volume, self.remove_volume, self.inspect_volume])
110
- if enable_network_management:
111
- tools.extend(
112
- [
113
- self.list_networks,
114
- self.create_network,
115
- self.remove_network,
116
- self.inspect_network,
117
- self.connect_container_to_network,
118
- self.disconnect_container_from_network,
119
- ]
120
- )
79
+ tools: List[Any] = [
80
+ # Container management
81
+ self.list_containers,
82
+ self.start_container,
83
+ self.stop_container,
84
+ self.remove_container,
85
+ self.get_container_logs,
86
+ self.inspect_container,
87
+ self.run_container,
88
+ self.exec_in_container,
89
+ # Image management
90
+ self.list_images,
91
+ self.pull_image,
92
+ self.remove_image,
93
+ self.build_image,
94
+ self.tag_image,
95
+ self.inspect_image,
96
+ # Volume management
97
+ self.list_volumes,
98
+ self.create_volume,
99
+ self.remove_volume,
100
+ self.inspect_volume,
101
+ # Network management
102
+ self.list_networks,
103
+ self.create_network,
104
+ self.remove_network,
105
+ self.inspect_network,
106
+ self.connect_container_to_network,
107
+ self.disconnect_container_from_network,
108
+ ]
121
109
 
122
110
  super().__init__(name="docker_tools", tools=tools, **kwargs)
123
111
 
agno/tools/duckdb.py CHANGED
@@ -1,3 +1,4 @@
1
+ from pathlib import Path
1
2
  from typing import Any, Dict, List, Optional, Tuple
2
3
 
3
4
  from agno.tools import Toolkit
@@ -17,11 +18,6 @@ class DuckDbTools(Toolkit):
17
18
  init_commands: Optional[List] = None,
18
19
  read_only: bool = False,
19
20
  config: Optional[dict] = None,
20
- run_queries: bool = True,
21
- inspect_queries: bool = False,
22
- create_tables: bool = True,
23
- summarize_tables: bool = True,
24
- export_tables: bool = False,
25
21
  **kwargs,
26
22
  ):
27
23
  self.db_path: Optional[str] = db_path
@@ -30,26 +26,21 @@ class DuckDbTools(Toolkit):
30
26
  self._connection: Optional[duckdb.DuckDBPyConnection] = connection
31
27
  self.init_commands: Optional[List] = init_commands
32
28
 
33
- tools: List[Any] = []
34
- tools.append(self.show_tables)
35
- tools.append(self.describe_table)
36
- if inspect_queries:
37
- tools.append(self.inspect_query)
38
- if run_queries:
39
- tools.append(self.run_query)
40
- if create_tables:
41
- tools.append(self.create_table_from_path)
42
- if summarize_tables:
43
- tools.append(self.summarize_table)
44
- if export_tables:
45
- tools.append(self.export_table_to_path)
46
-
47
- tools.append(self.load_local_path_to_table)
48
- tools.append(self.load_local_csv_to_table)
49
- tools.append(self.load_s3_path_to_table)
50
- tools.append(self.load_s3_csv_to_table)
51
- tools.append(self.create_fts_index)
52
- tools.append(self.full_text_search)
29
+ tools: List[Any] = [
30
+ self.show_tables,
31
+ self.describe_table,
32
+ self.inspect_query,
33
+ self.run_query,
34
+ self.create_table_from_path,
35
+ self.summarize_table,
36
+ self.export_table_to_path,
37
+ self.load_local_path_to_table,
38
+ self.load_local_csv_to_table,
39
+ self.load_s3_path_to_table,
40
+ self.load_s3_csv_to_table,
41
+ self.create_fts_index,
42
+ self.full_text_search,
43
+ ]
53
44
 
54
45
  super().__init__(name="duckdb_tools", tools=tools, **kwargs)
55
46
 
@@ -177,12 +168,10 @@ class DuckDbTools(Toolkit):
177
168
  :param path: Path to get the table name from
178
169
  :return: Table name
179
170
  """
180
- import os
181
-
182
171
  # Get the file name from the path
183
- file_name = path.split("/")[-1]
172
+ path_obj = Path(path)
184
173
  # Get the file name without extension from the path
185
- table, extension = os.path.splitext(file_name)
174
+ table = path_obj.stem
186
175
  # If the table isn't a valid SQL identifier, we'll need to use something else
187
176
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
188
177
 
@@ -246,15 +235,13 @@ class DuckDbTools(Toolkit):
246
235
  :param table: Optional table name to use
247
236
  :return: Table name, SQL statement used to load the file
248
237
  """
249
- import os
250
-
251
238
  log_debug(f"Loading {path} into duckdb")
252
239
 
253
240
  if table is None:
254
- # Get the file name from the s3 path
255
- file_name = path.split("/")[-1]
256
- # Get the file name without extension from the s3 path
257
- table, extension = os.path.splitext(file_name)
241
+ # Get the file name from the path
242
+ path_obj = Path(path)
243
+ # Get the file name without extension from the path
244
+ table = path_obj.stem
258
245
  # If the table isn't a valid SQL identifier, we'll need to use something else
259
246
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
260
247
 
@@ -274,15 +261,13 @@ class DuckDbTools(Toolkit):
274
261
  :param delimiter: Optional delimiter to use
275
262
  :return: Table name, SQL statement used to load the file
276
263
  """
277
- import os
278
-
279
264
  log_debug(f"Loading {path} into duckdb")
280
265
 
281
266
  if table is None:
282
- # Get the file name from the s3 path
283
- file_name = path.split("/")[-1]
284
- # Get the file name without extension from the s3 path
285
- table, extension = os.path.splitext(file_name)
267
+ # Get the file name from the path
268
+ path_obj = Path(path)
269
+ # Get the file name without extension from the path
270
+ table = path_obj.stem
286
271
  # If the table isn't a valid SQL identifier, we'll need to use something else
287
272
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
288
273
 
@@ -305,15 +290,13 @@ class DuckDbTools(Toolkit):
305
290
  :param table: Optional table name to use
306
291
  :return: Table name, SQL statement used to load the file
307
292
  """
308
- import os
309
-
310
293
  log_debug(f"Loading {path} into duckdb")
311
294
 
312
295
  if table is None:
313
- # Get the file name from the s3 path
314
- file_name = path.split("/")[-1]
315
- # Get the file name without extension from the s3 path
316
- table, extension = os.path.splitext(file_name)
296
+ # Get the file name from the path
297
+ path_obj = Path(path)
298
+ # Get the file name without extension from the path
299
+ table = path_obj.stem
317
300
  # If the table isn't a valid SQL identifier, we'll need to use something else
318
301
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
319
302
 
@@ -332,15 +315,13 @@ class DuckDbTools(Toolkit):
332
315
  :param table: Optional table name to use
333
316
  :return: Table name, SQL statement used to load the file
334
317
  """
335
- import os
336
-
337
318
  log_debug(f"Loading {path} into duckdb")
338
319
 
339
320
  if table is None:
340
- # Get the file name from the s3 path
341
- file_name = path.split("/")[-1]
342
- # Get the file name without extension from the s3 path
343
- table, extension = os.path.splitext(file_name)
321
+ # Get the file name from the path
322
+ path_obj = Path(path)
323
+ # Get the file name without extension from the path
324
+ table = path_obj.stem
344
325
  # If the table isn't a valid SQL identifier, we'll need to use something else
345
326
  table = table.replace("-", "_").replace(".", "_").replace(" ", "_").replace("/", "_")
346
327