agno 2.2.13__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 (575) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +51 -0
  3. agno/agent/agent.py +10405 -0
  4. agno/api/__init__.py +0 -0
  5. agno/api/agent.py +28 -0
  6. agno/api/api.py +40 -0
  7. agno/api/evals.py +22 -0
  8. agno/api/os.py +17 -0
  9. agno/api/routes.py +13 -0
  10. agno/api/schemas/__init__.py +9 -0
  11. agno/api/schemas/agent.py +16 -0
  12. agno/api/schemas/evals.py +16 -0
  13. agno/api/schemas/os.py +14 -0
  14. agno/api/schemas/response.py +6 -0
  15. agno/api/schemas/team.py +16 -0
  16. agno/api/schemas/utils.py +21 -0
  17. agno/api/schemas/workflows.py +16 -0
  18. agno/api/settings.py +53 -0
  19. agno/api/team.py +30 -0
  20. agno/api/workflow.py +28 -0
  21. agno/cloud/aws/base.py +214 -0
  22. agno/cloud/aws/s3/__init__.py +2 -0
  23. agno/cloud/aws/s3/api_client.py +43 -0
  24. agno/cloud/aws/s3/bucket.py +195 -0
  25. agno/cloud/aws/s3/object.py +57 -0
  26. agno/culture/__init__.py +3 -0
  27. agno/culture/manager.py +956 -0
  28. agno/db/__init__.py +24 -0
  29. agno/db/async_postgres/__init__.py +3 -0
  30. agno/db/base.py +598 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2042 -0
  33. agno/db/dynamo/schemas.py +314 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +1795 -0
  37. agno/db/firestore/schemas.py +140 -0
  38. agno/db/firestore/utils.py +376 -0
  39. agno/db/gcs_json/__init__.py +3 -0
  40. agno/db/gcs_json/gcs_json_db.py +1335 -0
  41. agno/db/gcs_json/utils.py +228 -0
  42. agno/db/in_memory/__init__.py +3 -0
  43. agno/db/in_memory/in_memory_db.py +1160 -0
  44. agno/db/in_memory/utils.py +230 -0
  45. agno/db/json/__init__.py +3 -0
  46. agno/db/json/json_db.py +1328 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/__init__.py +0 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/mongo/__init__.py +17 -0
  51. agno/db/mongo/async_mongo.py +2026 -0
  52. agno/db/mongo/mongo.py +1982 -0
  53. agno/db/mongo/schemas.py +87 -0
  54. agno/db/mongo/utils.py +259 -0
  55. agno/db/mysql/__init__.py +3 -0
  56. agno/db/mysql/mysql.py +2308 -0
  57. agno/db/mysql/schemas.py +138 -0
  58. agno/db/mysql/utils.py +355 -0
  59. agno/db/postgres/__init__.py +4 -0
  60. agno/db/postgres/async_postgres.py +1927 -0
  61. agno/db/postgres/postgres.py +2260 -0
  62. agno/db/postgres/schemas.py +139 -0
  63. agno/db/postgres/utils.py +442 -0
  64. agno/db/redis/__init__.py +3 -0
  65. agno/db/redis/redis.py +1660 -0
  66. agno/db/redis/schemas.py +123 -0
  67. agno/db/redis/utils.py +346 -0
  68. agno/db/schemas/__init__.py +4 -0
  69. agno/db/schemas/culture.py +120 -0
  70. agno/db/schemas/evals.py +33 -0
  71. agno/db/schemas/knowledge.py +40 -0
  72. agno/db/schemas/memory.py +46 -0
  73. agno/db/schemas/metrics.py +0 -0
  74. agno/db/singlestore/__init__.py +3 -0
  75. agno/db/singlestore/schemas.py +130 -0
  76. agno/db/singlestore/singlestore.py +2272 -0
  77. agno/db/singlestore/utils.py +384 -0
  78. agno/db/sqlite/__init__.py +4 -0
  79. agno/db/sqlite/async_sqlite.py +2293 -0
  80. agno/db/sqlite/schemas.py +133 -0
  81. agno/db/sqlite/sqlite.py +2288 -0
  82. agno/db/sqlite/utils.py +431 -0
  83. agno/db/surrealdb/__init__.py +3 -0
  84. agno/db/surrealdb/metrics.py +292 -0
  85. agno/db/surrealdb/models.py +309 -0
  86. agno/db/surrealdb/queries.py +71 -0
  87. agno/db/surrealdb/surrealdb.py +1353 -0
  88. agno/db/surrealdb/utils.py +147 -0
  89. agno/db/utils.py +116 -0
  90. agno/debug.py +18 -0
  91. agno/eval/__init__.py +14 -0
  92. agno/eval/accuracy.py +834 -0
  93. agno/eval/performance.py +773 -0
  94. agno/eval/reliability.py +306 -0
  95. agno/eval/utils.py +119 -0
  96. agno/exceptions.py +161 -0
  97. agno/filters.py +354 -0
  98. agno/guardrails/__init__.py +6 -0
  99. agno/guardrails/base.py +19 -0
  100. agno/guardrails/openai.py +144 -0
  101. agno/guardrails/pii.py +94 -0
  102. agno/guardrails/prompt_injection.py +52 -0
  103. agno/integrations/__init__.py +0 -0
  104. agno/integrations/discord/__init__.py +3 -0
  105. agno/integrations/discord/client.py +203 -0
  106. agno/knowledge/__init__.py +5 -0
  107. agno/knowledge/chunking/__init__.py +0 -0
  108. agno/knowledge/chunking/agentic.py +79 -0
  109. agno/knowledge/chunking/document.py +91 -0
  110. agno/knowledge/chunking/fixed.py +57 -0
  111. agno/knowledge/chunking/markdown.py +151 -0
  112. agno/knowledge/chunking/recursive.py +63 -0
  113. agno/knowledge/chunking/row.py +39 -0
  114. agno/knowledge/chunking/semantic.py +86 -0
  115. agno/knowledge/chunking/strategy.py +165 -0
  116. agno/knowledge/content.py +74 -0
  117. agno/knowledge/document/__init__.py +5 -0
  118. agno/knowledge/document/base.py +58 -0
  119. agno/knowledge/embedder/__init__.py +5 -0
  120. agno/knowledge/embedder/aws_bedrock.py +343 -0
  121. agno/knowledge/embedder/azure_openai.py +210 -0
  122. agno/knowledge/embedder/base.py +23 -0
  123. agno/knowledge/embedder/cohere.py +323 -0
  124. agno/knowledge/embedder/fastembed.py +62 -0
  125. agno/knowledge/embedder/fireworks.py +13 -0
  126. agno/knowledge/embedder/google.py +258 -0
  127. agno/knowledge/embedder/huggingface.py +94 -0
  128. agno/knowledge/embedder/jina.py +182 -0
  129. agno/knowledge/embedder/langdb.py +22 -0
  130. agno/knowledge/embedder/mistral.py +206 -0
  131. agno/knowledge/embedder/nebius.py +13 -0
  132. agno/knowledge/embedder/ollama.py +154 -0
  133. agno/knowledge/embedder/openai.py +195 -0
  134. agno/knowledge/embedder/sentence_transformer.py +63 -0
  135. agno/knowledge/embedder/together.py +13 -0
  136. agno/knowledge/embedder/vllm.py +262 -0
  137. agno/knowledge/embedder/voyageai.py +165 -0
  138. agno/knowledge/knowledge.py +1988 -0
  139. agno/knowledge/reader/__init__.py +7 -0
  140. agno/knowledge/reader/arxiv_reader.py +81 -0
  141. agno/knowledge/reader/base.py +95 -0
  142. agno/knowledge/reader/csv_reader.py +166 -0
  143. agno/knowledge/reader/docx_reader.py +82 -0
  144. agno/knowledge/reader/field_labeled_csv_reader.py +292 -0
  145. agno/knowledge/reader/firecrawl_reader.py +201 -0
  146. agno/knowledge/reader/json_reader.py +87 -0
  147. agno/knowledge/reader/markdown_reader.py +137 -0
  148. agno/knowledge/reader/pdf_reader.py +431 -0
  149. agno/knowledge/reader/pptx_reader.py +101 -0
  150. agno/knowledge/reader/reader_factory.py +313 -0
  151. agno/knowledge/reader/s3_reader.py +89 -0
  152. agno/knowledge/reader/tavily_reader.py +194 -0
  153. agno/knowledge/reader/text_reader.py +115 -0
  154. agno/knowledge/reader/web_search_reader.py +372 -0
  155. agno/knowledge/reader/website_reader.py +455 -0
  156. agno/knowledge/reader/wikipedia_reader.py +59 -0
  157. agno/knowledge/reader/youtube_reader.py +78 -0
  158. agno/knowledge/remote_content/__init__.py +0 -0
  159. agno/knowledge/remote_content/remote_content.py +88 -0
  160. agno/knowledge/reranker/__init__.py +3 -0
  161. agno/knowledge/reranker/base.py +14 -0
  162. agno/knowledge/reranker/cohere.py +64 -0
  163. agno/knowledge/reranker/infinity.py +195 -0
  164. agno/knowledge/reranker/sentence_transformer.py +54 -0
  165. agno/knowledge/types.py +39 -0
  166. agno/knowledge/utils.py +189 -0
  167. agno/media.py +462 -0
  168. agno/memory/__init__.py +3 -0
  169. agno/memory/manager.py +1327 -0
  170. agno/models/__init__.py +0 -0
  171. agno/models/aimlapi/__init__.py +5 -0
  172. agno/models/aimlapi/aimlapi.py +45 -0
  173. agno/models/anthropic/__init__.py +5 -0
  174. agno/models/anthropic/claude.py +757 -0
  175. agno/models/aws/__init__.py +15 -0
  176. agno/models/aws/bedrock.py +701 -0
  177. agno/models/aws/claude.py +378 -0
  178. agno/models/azure/__init__.py +18 -0
  179. agno/models/azure/ai_foundry.py +485 -0
  180. agno/models/azure/openai_chat.py +131 -0
  181. agno/models/base.py +2175 -0
  182. agno/models/cerebras/__init__.py +12 -0
  183. agno/models/cerebras/cerebras.py +501 -0
  184. agno/models/cerebras/cerebras_openai.py +112 -0
  185. agno/models/cohere/__init__.py +5 -0
  186. agno/models/cohere/chat.py +389 -0
  187. agno/models/cometapi/__init__.py +5 -0
  188. agno/models/cometapi/cometapi.py +57 -0
  189. agno/models/dashscope/__init__.py +5 -0
  190. agno/models/dashscope/dashscope.py +91 -0
  191. agno/models/deepinfra/__init__.py +5 -0
  192. agno/models/deepinfra/deepinfra.py +28 -0
  193. agno/models/deepseek/__init__.py +5 -0
  194. agno/models/deepseek/deepseek.py +61 -0
  195. agno/models/defaults.py +1 -0
  196. agno/models/fireworks/__init__.py +5 -0
  197. agno/models/fireworks/fireworks.py +26 -0
  198. agno/models/google/__init__.py +5 -0
  199. agno/models/google/gemini.py +1085 -0
  200. agno/models/groq/__init__.py +5 -0
  201. agno/models/groq/groq.py +556 -0
  202. agno/models/huggingface/__init__.py +5 -0
  203. agno/models/huggingface/huggingface.py +491 -0
  204. agno/models/ibm/__init__.py +5 -0
  205. agno/models/ibm/watsonx.py +422 -0
  206. agno/models/internlm/__init__.py +3 -0
  207. agno/models/internlm/internlm.py +26 -0
  208. agno/models/langdb/__init__.py +1 -0
  209. agno/models/langdb/langdb.py +48 -0
  210. agno/models/litellm/__init__.py +14 -0
  211. agno/models/litellm/chat.py +468 -0
  212. agno/models/litellm/litellm_openai.py +25 -0
  213. agno/models/llama_cpp/__init__.py +5 -0
  214. agno/models/llama_cpp/llama_cpp.py +22 -0
  215. agno/models/lmstudio/__init__.py +5 -0
  216. agno/models/lmstudio/lmstudio.py +25 -0
  217. agno/models/message.py +434 -0
  218. agno/models/meta/__init__.py +12 -0
  219. agno/models/meta/llama.py +475 -0
  220. agno/models/meta/llama_openai.py +78 -0
  221. agno/models/metrics.py +120 -0
  222. agno/models/mistral/__init__.py +5 -0
  223. agno/models/mistral/mistral.py +432 -0
  224. agno/models/nebius/__init__.py +3 -0
  225. agno/models/nebius/nebius.py +54 -0
  226. agno/models/nexus/__init__.py +3 -0
  227. agno/models/nexus/nexus.py +22 -0
  228. agno/models/nvidia/__init__.py +5 -0
  229. agno/models/nvidia/nvidia.py +28 -0
  230. agno/models/ollama/__init__.py +5 -0
  231. agno/models/ollama/chat.py +441 -0
  232. agno/models/openai/__init__.py +9 -0
  233. agno/models/openai/chat.py +883 -0
  234. agno/models/openai/like.py +27 -0
  235. agno/models/openai/responses.py +1050 -0
  236. agno/models/openrouter/__init__.py +5 -0
  237. agno/models/openrouter/openrouter.py +66 -0
  238. agno/models/perplexity/__init__.py +5 -0
  239. agno/models/perplexity/perplexity.py +187 -0
  240. agno/models/portkey/__init__.py +3 -0
  241. agno/models/portkey/portkey.py +81 -0
  242. agno/models/requesty/__init__.py +5 -0
  243. agno/models/requesty/requesty.py +52 -0
  244. agno/models/response.py +199 -0
  245. agno/models/sambanova/__init__.py +5 -0
  246. agno/models/sambanova/sambanova.py +28 -0
  247. agno/models/siliconflow/__init__.py +5 -0
  248. agno/models/siliconflow/siliconflow.py +25 -0
  249. agno/models/together/__init__.py +5 -0
  250. agno/models/together/together.py +25 -0
  251. agno/models/utils.py +266 -0
  252. agno/models/vercel/__init__.py +3 -0
  253. agno/models/vercel/v0.py +26 -0
  254. agno/models/vertexai/__init__.py +0 -0
  255. agno/models/vertexai/claude.py +70 -0
  256. agno/models/vllm/__init__.py +3 -0
  257. agno/models/vllm/vllm.py +78 -0
  258. agno/models/xai/__init__.py +3 -0
  259. agno/models/xai/xai.py +113 -0
  260. agno/os/__init__.py +3 -0
  261. agno/os/app.py +876 -0
  262. agno/os/auth.py +57 -0
  263. agno/os/config.py +104 -0
  264. agno/os/interfaces/__init__.py +1 -0
  265. agno/os/interfaces/a2a/__init__.py +3 -0
  266. agno/os/interfaces/a2a/a2a.py +42 -0
  267. agno/os/interfaces/a2a/router.py +250 -0
  268. agno/os/interfaces/a2a/utils.py +924 -0
  269. agno/os/interfaces/agui/__init__.py +3 -0
  270. agno/os/interfaces/agui/agui.py +47 -0
  271. agno/os/interfaces/agui/router.py +144 -0
  272. agno/os/interfaces/agui/utils.py +534 -0
  273. agno/os/interfaces/base.py +25 -0
  274. agno/os/interfaces/slack/__init__.py +3 -0
  275. agno/os/interfaces/slack/router.py +148 -0
  276. agno/os/interfaces/slack/security.py +30 -0
  277. agno/os/interfaces/slack/slack.py +47 -0
  278. agno/os/interfaces/whatsapp/__init__.py +3 -0
  279. agno/os/interfaces/whatsapp/router.py +211 -0
  280. agno/os/interfaces/whatsapp/security.py +53 -0
  281. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  282. agno/os/mcp.py +292 -0
  283. agno/os/middleware/__init__.py +7 -0
  284. agno/os/middleware/jwt.py +233 -0
  285. agno/os/router.py +1763 -0
  286. agno/os/routers/__init__.py +3 -0
  287. agno/os/routers/evals/__init__.py +3 -0
  288. agno/os/routers/evals/evals.py +430 -0
  289. agno/os/routers/evals/schemas.py +142 -0
  290. agno/os/routers/evals/utils.py +162 -0
  291. agno/os/routers/health.py +31 -0
  292. agno/os/routers/home.py +52 -0
  293. agno/os/routers/knowledge/__init__.py +3 -0
  294. agno/os/routers/knowledge/knowledge.py +997 -0
  295. agno/os/routers/knowledge/schemas.py +178 -0
  296. agno/os/routers/memory/__init__.py +3 -0
  297. agno/os/routers/memory/memory.py +515 -0
  298. agno/os/routers/memory/schemas.py +62 -0
  299. agno/os/routers/metrics/__init__.py +3 -0
  300. agno/os/routers/metrics/metrics.py +190 -0
  301. agno/os/routers/metrics/schemas.py +47 -0
  302. agno/os/routers/session/__init__.py +3 -0
  303. agno/os/routers/session/session.py +997 -0
  304. agno/os/schema.py +1055 -0
  305. agno/os/settings.py +43 -0
  306. agno/os/utils.py +630 -0
  307. agno/py.typed +0 -0
  308. agno/reasoning/__init__.py +0 -0
  309. agno/reasoning/anthropic.py +80 -0
  310. agno/reasoning/azure_ai_foundry.py +67 -0
  311. agno/reasoning/deepseek.py +63 -0
  312. agno/reasoning/default.py +97 -0
  313. agno/reasoning/gemini.py +73 -0
  314. agno/reasoning/groq.py +71 -0
  315. agno/reasoning/helpers.py +63 -0
  316. agno/reasoning/ollama.py +67 -0
  317. agno/reasoning/openai.py +86 -0
  318. agno/reasoning/step.py +31 -0
  319. agno/reasoning/vertexai.py +76 -0
  320. agno/run/__init__.py +6 -0
  321. agno/run/agent.py +787 -0
  322. agno/run/base.py +229 -0
  323. agno/run/cancel.py +81 -0
  324. agno/run/messages.py +32 -0
  325. agno/run/team.py +753 -0
  326. agno/run/workflow.py +708 -0
  327. agno/session/__init__.py +10 -0
  328. agno/session/agent.py +295 -0
  329. agno/session/summary.py +265 -0
  330. agno/session/team.py +392 -0
  331. agno/session/workflow.py +205 -0
  332. agno/team/__init__.py +37 -0
  333. agno/team/team.py +8793 -0
  334. agno/tools/__init__.py +10 -0
  335. agno/tools/agentql.py +120 -0
  336. agno/tools/airflow.py +69 -0
  337. agno/tools/api.py +122 -0
  338. agno/tools/apify.py +314 -0
  339. agno/tools/arxiv.py +127 -0
  340. agno/tools/aws_lambda.py +53 -0
  341. agno/tools/aws_ses.py +66 -0
  342. agno/tools/baidusearch.py +89 -0
  343. agno/tools/bitbucket.py +292 -0
  344. agno/tools/brandfetch.py +213 -0
  345. agno/tools/bravesearch.py +106 -0
  346. agno/tools/brightdata.py +367 -0
  347. agno/tools/browserbase.py +209 -0
  348. agno/tools/calcom.py +255 -0
  349. agno/tools/calculator.py +151 -0
  350. agno/tools/cartesia.py +187 -0
  351. agno/tools/clickup.py +244 -0
  352. agno/tools/confluence.py +240 -0
  353. agno/tools/crawl4ai.py +158 -0
  354. agno/tools/csv_toolkit.py +185 -0
  355. agno/tools/dalle.py +110 -0
  356. agno/tools/daytona.py +475 -0
  357. agno/tools/decorator.py +262 -0
  358. agno/tools/desi_vocal.py +108 -0
  359. agno/tools/discord.py +161 -0
  360. agno/tools/docker.py +716 -0
  361. agno/tools/duckdb.py +379 -0
  362. agno/tools/duckduckgo.py +91 -0
  363. agno/tools/e2b.py +703 -0
  364. agno/tools/eleven_labs.py +196 -0
  365. agno/tools/email.py +67 -0
  366. agno/tools/evm.py +129 -0
  367. agno/tools/exa.py +396 -0
  368. agno/tools/fal.py +127 -0
  369. agno/tools/file.py +240 -0
  370. agno/tools/file_generation.py +350 -0
  371. agno/tools/financial_datasets.py +288 -0
  372. agno/tools/firecrawl.py +143 -0
  373. agno/tools/function.py +1187 -0
  374. agno/tools/giphy.py +93 -0
  375. agno/tools/github.py +1760 -0
  376. agno/tools/gmail.py +922 -0
  377. agno/tools/google_bigquery.py +117 -0
  378. agno/tools/google_drive.py +270 -0
  379. agno/tools/google_maps.py +253 -0
  380. agno/tools/googlecalendar.py +674 -0
  381. agno/tools/googlesearch.py +98 -0
  382. agno/tools/googlesheets.py +377 -0
  383. agno/tools/hackernews.py +77 -0
  384. agno/tools/jina.py +101 -0
  385. agno/tools/jira.py +170 -0
  386. agno/tools/knowledge.py +218 -0
  387. agno/tools/linear.py +426 -0
  388. agno/tools/linkup.py +58 -0
  389. agno/tools/local_file_system.py +90 -0
  390. agno/tools/lumalab.py +183 -0
  391. agno/tools/mcp/__init__.py +10 -0
  392. agno/tools/mcp/mcp.py +331 -0
  393. agno/tools/mcp/multi_mcp.py +347 -0
  394. agno/tools/mcp/params.py +24 -0
  395. agno/tools/mcp_toolbox.py +284 -0
  396. agno/tools/mem0.py +193 -0
  397. agno/tools/memori.py +339 -0
  398. agno/tools/memory.py +419 -0
  399. agno/tools/mlx_transcribe.py +139 -0
  400. agno/tools/models/__init__.py +0 -0
  401. agno/tools/models/azure_openai.py +190 -0
  402. agno/tools/models/gemini.py +203 -0
  403. agno/tools/models/groq.py +158 -0
  404. agno/tools/models/morph.py +186 -0
  405. agno/tools/models/nebius.py +124 -0
  406. agno/tools/models_labs.py +195 -0
  407. agno/tools/moviepy_video.py +349 -0
  408. agno/tools/neo4j.py +134 -0
  409. agno/tools/newspaper.py +46 -0
  410. agno/tools/newspaper4k.py +93 -0
  411. agno/tools/notion.py +204 -0
  412. agno/tools/openai.py +202 -0
  413. agno/tools/openbb.py +160 -0
  414. agno/tools/opencv.py +321 -0
  415. agno/tools/openweather.py +233 -0
  416. agno/tools/oxylabs.py +385 -0
  417. agno/tools/pandas.py +102 -0
  418. agno/tools/parallel.py +314 -0
  419. agno/tools/postgres.py +257 -0
  420. agno/tools/pubmed.py +188 -0
  421. agno/tools/python.py +205 -0
  422. agno/tools/reasoning.py +283 -0
  423. agno/tools/reddit.py +467 -0
  424. agno/tools/replicate.py +117 -0
  425. agno/tools/resend.py +62 -0
  426. agno/tools/scrapegraph.py +222 -0
  427. agno/tools/searxng.py +152 -0
  428. agno/tools/serpapi.py +116 -0
  429. agno/tools/serper.py +255 -0
  430. agno/tools/shell.py +53 -0
  431. agno/tools/slack.py +136 -0
  432. agno/tools/sleep.py +20 -0
  433. agno/tools/spider.py +116 -0
  434. agno/tools/sql.py +154 -0
  435. agno/tools/streamlit/__init__.py +0 -0
  436. agno/tools/streamlit/components.py +113 -0
  437. agno/tools/tavily.py +254 -0
  438. agno/tools/telegram.py +48 -0
  439. agno/tools/todoist.py +218 -0
  440. agno/tools/tool_registry.py +1 -0
  441. agno/tools/toolkit.py +146 -0
  442. agno/tools/trafilatura.py +388 -0
  443. agno/tools/trello.py +274 -0
  444. agno/tools/twilio.py +186 -0
  445. agno/tools/user_control_flow.py +78 -0
  446. agno/tools/valyu.py +228 -0
  447. agno/tools/visualization.py +467 -0
  448. agno/tools/webbrowser.py +28 -0
  449. agno/tools/webex.py +76 -0
  450. agno/tools/website.py +54 -0
  451. agno/tools/webtools.py +45 -0
  452. agno/tools/whatsapp.py +286 -0
  453. agno/tools/wikipedia.py +63 -0
  454. agno/tools/workflow.py +278 -0
  455. agno/tools/x.py +335 -0
  456. agno/tools/yfinance.py +257 -0
  457. agno/tools/youtube.py +184 -0
  458. agno/tools/zendesk.py +82 -0
  459. agno/tools/zep.py +454 -0
  460. agno/tools/zoom.py +382 -0
  461. agno/utils/__init__.py +0 -0
  462. agno/utils/agent.py +820 -0
  463. agno/utils/audio.py +49 -0
  464. agno/utils/certs.py +27 -0
  465. agno/utils/code_execution.py +11 -0
  466. agno/utils/common.py +132 -0
  467. agno/utils/dttm.py +13 -0
  468. agno/utils/enum.py +22 -0
  469. agno/utils/env.py +11 -0
  470. agno/utils/events.py +696 -0
  471. agno/utils/format_str.py +16 -0
  472. agno/utils/functions.py +166 -0
  473. agno/utils/gemini.py +426 -0
  474. agno/utils/hooks.py +57 -0
  475. agno/utils/http.py +74 -0
  476. agno/utils/json_schema.py +234 -0
  477. agno/utils/knowledge.py +36 -0
  478. agno/utils/location.py +19 -0
  479. agno/utils/log.py +255 -0
  480. agno/utils/mcp.py +214 -0
  481. agno/utils/media.py +352 -0
  482. agno/utils/merge_dict.py +41 -0
  483. agno/utils/message.py +118 -0
  484. agno/utils/models/__init__.py +0 -0
  485. agno/utils/models/ai_foundry.py +43 -0
  486. agno/utils/models/claude.py +358 -0
  487. agno/utils/models/cohere.py +87 -0
  488. agno/utils/models/llama.py +78 -0
  489. agno/utils/models/mistral.py +98 -0
  490. agno/utils/models/openai_responses.py +140 -0
  491. agno/utils/models/schema_utils.py +153 -0
  492. agno/utils/models/watsonx.py +41 -0
  493. agno/utils/openai.py +257 -0
  494. agno/utils/pickle.py +32 -0
  495. agno/utils/pprint.py +178 -0
  496. agno/utils/print_response/__init__.py +0 -0
  497. agno/utils/print_response/agent.py +842 -0
  498. agno/utils/print_response/team.py +1724 -0
  499. agno/utils/print_response/workflow.py +1668 -0
  500. agno/utils/prompts.py +111 -0
  501. agno/utils/reasoning.py +108 -0
  502. agno/utils/response.py +163 -0
  503. agno/utils/response_iterator.py +17 -0
  504. agno/utils/safe_formatter.py +24 -0
  505. agno/utils/serialize.py +32 -0
  506. agno/utils/shell.py +22 -0
  507. agno/utils/streamlit.py +487 -0
  508. agno/utils/string.py +231 -0
  509. agno/utils/team.py +139 -0
  510. agno/utils/timer.py +41 -0
  511. agno/utils/tools.py +102 -0
  512. agno/utils/web.py +23 -0
  513. agno/utils/whatsapp.py +305 -0
  514. agno/utils/yaml_io.py +25 -0
  515. agno/vectordb/__init__.py +3 -0
  516. agno/vectordb/base.py +127 -0
  517. agno/vectordb/cassandra/__init__.py +5 -0
  518. agno/vectordb/cassandra/cassandra.py +501 -0
  519. agno/vectordb/cassandra/extra_param_mixin.py +11 -0
  520. agno/vectordb/cassandra/index.py +13 -0
  521. agno/vectordb/chroma/__init__.py +5 -0
  522. agno/vectordb/chroma/chromadb.py +929 -0
  523. agno/vectordb/clickhouse/__init__.py +9 -0
  524. agno/vectordb/clickhouse/clickhousedb.py +835 -0
  525. agno/vectordb/clickhouse/index.py +9 -0
  526. agno/vectordb/couchbase/__init__.py +3 -0
  527. agno/vectordb/couchbase/couchbase.py +1442 -0
  528. agno/vectordb/distance.py +7 -0
  529. agno/vectordb/lancedb/__init__.py +6 -0
  530. agno/vectordb/lancedb/lance_db.py +995 -0
  531. agno/vectordb/langchaindb/__init__.py +5 -0
  532. agno/vectordb/langchaindb/langchaindb.py +163 -0
  533. agno/vectordb/lightrag/__init__.py +5 -0
  534. agno/vectordb/lightrag/lightrag.py +388 -0
  535. agno/vectordb/llamaindex/__init__.py +3 -0
  536. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  537. agno/vectordb/milvus/__init__.py +4 -0
  538. agno/vectordb/milvus/milvus.py +1182 -0
  539. agno/vectordb/mongodb/__init__.py +9 -0
  540. agno/vectordb/mongodb/mongodb.py +1417 -0
  541. agno/vectordb/pgvector/__init__.py +12 -0
  542. agno/vectordb/pgvector/index.py +23 -0
  543. agno/vectordb/pgvector/pgvector.py +1462 -0
  544. agno/vectordb/pineconedb/__init__.py +5 -0
  545. agno/vectordb/pineconedb/pineconedb.py +747 -0
  546. agno/vectordb/qdrant/__init__.py +5 -0
  547. agno/vectordb/qdrant/qdrant.py +1134 -0
  548. agno/vectordb/redis/__init__.py +9 -0
  549. agno/vectordb/redis/redisdb.py +694 -0
  550. agno/vectordb/search.py +7 -0
  551. agno/vectordb/singlestore/__init__.py +10 -0
  552. agno/vectordb/singlestore/index.py +41 -0
  553. agno/vectordb/singlestore/singlestore.py +763 -0
  554. agno/vectordb/surrealdb/__init__.py +3 -0
  555. agno/vectordb/surrealdb/surrealdb.py +699 -0
  556. agno/vectordb/upstashdb/__init__.py +5 -0
  557. agno/vectordb/upstashdb/upstashdb.py +718 -0
  558. agno/vectordb/weaviate/__init__.py +8 -0
  559. agno/vectordb/weaviate/index.py +15 -0
  560. agno/vectordb/weaviate/weaviate.py +1005 -0
  561. agno/workflow/__init__.py +23 -0
  562. agno/workflow/agent.py +299 -0
  563. agno/workflow/condition.py +738 -0
  564. agno/workflow/loop.py +735 -0
  565. agno/workflow/parallel.py +824 -0
  566. agno/workflow/router.py +702 -0
  567. agno/workflow/step.py +1432 -0
  568. agno/workflow/steps.py +592 -0
  569. agno/workflow/types.py +520 -0
  570. agno/workflow/workflow.py +4321 -0
  571. agno-2.2.13.dist-info/METADATA +614 -0
  572. agno-2.2.13.dist-info/RECORD +575 -0
  573. agno-2.2.13.dist-info/WHEEL +5 -0
  574. agno-2.2.13.dist-info/licenses/LICENSE +201 -0
  575. agno-2.2.13.dist-info/top_level.txt +1 -0
@@ -0,0 +1,262 @@
1
+ from functools import update_wrapper, wraps
2
+ from typing import Any, Callable, Dict, List, Optional, TypeVar, Union, overload
3
+
4
+ from agno.tools.function import Function, get_entrypoint_docstring
5
+ from agno.utils.log import logger
6
+
7
+ # Type variable for better type hints
8
+ F = TypeVar("F", bound=Callable[..., Any])
9
+ ToolConfig = TypeVar("ToolConfig", bound=Dict[str, Any])
10
+
11
+
12
+ def _is_async_function(func: Callable) -> bool:
13
+ """
14
+ Check if a function is async, even when wrapped by decorators like @staticmethod.
15
+
16
+ This function tries to detect async functions by:
17
+ 1. Checking the function directly with inspect functions
18
+ 2. Looking at the original function if it's wrapped
19
+ 3. Checking the function's code object for async indicators
20
+ """
21
+ from inspect import iscoroutine, iscoroutinefunction
22
+
23
+ # First, try the standard inspect functions
24
+ if iscoroutinefunction(func) or iscoroutine(func):
25
+ return True
26
+
27
+ # If the function has a __wrapped__ attribute, check the original function
28
+ if hasattr(func, "__wrapped__"):
29
+ original_func = func.__wrapped__
30
+ if iscoroutinefunction(original_func) or iscoroutine(original_func):
31
+ return True
32
+
33
+ # Check if the function has CO_COROUTINE flag in its code object
34
+ try:
35
+ if hasattr(func, "__code__") and func.__code__.co_flags & 0x80: # CO_COROUTINE flag
36
+ return True
37
+ except (AttributeError, TypeError):
38
+ pass
39
+
40
+ # For static methods, try to get the original function
41
+ try:
42
+ if hasattr(func, "__func__"):
43
+ original_func = func.__func__
44
+ if iscoroutinefunction(original_func) or iscoroutine(original_func):
45
+ return True
46
+ # Check the code object of the original function
47
+ if hasattr(original_func, "__code__") and original_func.__code__.co_flags & 0x80:
48
+ return True
49
+ except (AttributeError, TypeError):
50
+ pass
51
+
52
+ return False
53
+
54
+
55
+ @overload
56
+ def tool() -> Callable[[F], Function]: ...
57
+
58
+
59
+ @overload
60
+ def tool(
61
+ *,
62
+ name: Optional[str] = None,
63
+ description: Optional[str] = None,
64
+ strict: Optional[bool] = None,
65
+ instructions: Optional[str] = None,
66
+ add_instructions: bool = True,
67
+ show_result: Optional[bool] = None,
68
+ stop_after_tool_call: Optional[bool] = None,
69
+ requires_confirmation: Optional[bool] = None,
70
+ requires_user_input: Optional[bool] = None,
71
+ user_input_fields: Optional[List[str]] = None,
72
+ external_execution: Optional[bool] = None,
73
+ pre_hook: Optional[Callable] = None,
74
+ post_hook: Optional[Callable] = None,
75
+ tool_hooks: Optional[List[Callable]] = None,
76
+ cache_results: bool = False,
77
+ cache_dir: Optional[str] = None,
78
+ cache_ttl: int = 3600,
79
+ ) -> Callable[[F], Function]: ...
80
+
81
+
82
+ @overload
83
+ def tool(func: F) -> Function: ...
84
+
85
+
86
+ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
87
+ """Decorator to convert a function into a Function that can be used by an agent.
88
+
89
+ Args:
90
+ name: Optional[str] - Override for the function name
91
+ description: Optional[str] - Override for the function description
92
+ strict: Optional[bool] - Flag for strict parameter checking
93
+ instructions: Optional[str] - Instructions for using the tool
94
+ add_instructions: bool - If True, add instructions to the system message
95
+ show_result: Optional[bool] - If True, shows the result after function call
96
+ stop_after_tool_call: Optional[bool] - If True, the agent will stop after the function call.
97
+ requires_confirmation: Optional[bool] - If True, the function will require user confirmation before execution
98
+ requires_user_input: Optional[bool] - If True, the function will require user input before execution
99
+ user_input_fields: Optional[List[str]] - List of fields that will be provided to the function as user input
100
+ external_execution: Optional[bool] - If True, the function will be executed outside of the agent's context
101
+ pre_hook: Optional[Callable] - Hook that runs before the function is executed.
102
+ post_hook: Optional[Callable] - Hook that runs after the function is executed.
103
+ tool_hooks: Optional[List[Callable]] - List of hooks that run before and after the function is executed.
104
+ cache_results: bool - If True, enable caching of function results
105
+ cache_dir: Optional[str] - Directory to store cache files
106
+ cache_ttl: int - Time-to-live for cached results in seconds
107
+
108
+ Returns:
109
+ Union[Function, Callable[[F], Function]]: Decorated function or decorator
110
+
111
+ Examples:
112
+ @tool
113
+ def my_function():
114
+ pass
115
+
116
+ @tool(name="custom_name", description="Custom description")
117
+ def another_function():
118
+ pass
119
+
120
+ @tool
121
+ async def my_async_function():
122
+ pass
123
+ """
124
+ # Move valid kwargs to a frozen set at module level
125
+ VALID_KWARGS = frozenset(
126
+ {
127
+ "name",
128
+ "description",
129
+ "strict",
130
+ "instructions",
131
+ "add_instructions",
132
+ "show_result",
133
+ "stop_after_tool_call",
134
+ "requires_confirmation",
135
+ "requires_user_input",
136
+ "user_input_fields",
137
+ "external_execution",
138
+ "pre_hook",
139
+ "post_hook",
140
+ "tool_hooks",
141
+ "cache_results",
142
+ "cache_dir",
143
+ "cache_ttl",
144
+ }
145
+ )
146
+
147
+ # Improve error message with more context
148
+ invalid_kwargs = set(kwargs.keys()) - VALID_KWARGS
149
+ if invalid_kwargs:
150
+ raise ValueError(
151
+ f"Invalid tool configuration arguments: {invalid_kwargs}. Valid arguments are: {sorted(VALID_KWARGS)}"
152
+ )
153
+
154
+ # Check that only one of requires_user_input, requires_confirmation, and external_execution is set at the same time
155
+ exclusive_flags = [
156
+ kwargs.get("requires_user_input", False),
157
+ kwargs.get("requires_confirmation", False),
158
+ kwargs.get("external_execution", False),
159
+ ]
160
+ true_flags_count = sum(1 for flag in exclusive_flags if flag)
161
+
162
+ if true_flags_count > 1:
163
+ raise ValueError(
164
+ "Only one of 'requires_user_input', 'requires_confirmation', or 'external_execution' can be set to True at the same time."
165
+ )
166
+
167
+ def decorator(func: F) -> Function:
168
+ from inspect import isasyncgenfunction
169
+
170
+ @wraps(func)
171
+ def sync_wrapper(*args: Any, **kwargs: Any) -> Any:
172
+ try:
173
+ return func(*args, **kwargs)
174
+ except Exception as e:
175
+ logger.error(
176
+ f"Error in tool {func.__name__!r}: {e!r}",
177
+ exc_info=True,
178
+ )
179
+ raise
180
+
181
+ @wraps(func)
182
+ async def async_wrapper(*args: Any, **kwargs: Any) -> Any:
183
+ try:
184
+ return await func(*args, **kwargs)
185
+ except Exception as e:
186
+ logger.error(
187
+ f"Error in async tool {func.__name__!r}: {e!r}",
188
+ exc_info=True,
189
+ )
190
+ raise
191
+
192
+ @wraps(func)
193
+ async def async_gen_wrapper(*args: Any, **kwargs: Any) -> Any:
194
+ try:
195
+ return func(*args, **kwargs)
196
+ except Exception as e:
197
+ logger.error(
198
+ f"Error in async generator tool {func.__name__!r}: {e!r}",
199
+ exc_info=True,
200
+ )
201
+ raise
202
+
203
+ # Choose appropriate wrapper based on function type
204
+ if isasyncgenfunction(func):
205
+ wrapper = async_gen_wrapper
206
+ elif _is_async_function(func):
207
+ wrapper = async_wrapper
208
+ else:
209
+ wrapper = sync_wrapper
210
+
211
+ # Preserve the original signature and metadata
212
+ update_wrapper(wrapper, func)
213
+
214
+ if kwargs.get("requires_user_input", True):
215
+ kwargs["user_input_fields"] = kwargs.get("user_input_fields", [])
216
+
217
+ if kwargs.get("user_input_fields"):
218
+ kwargs["requires_user_input"] = True
219
+
220
+ # Create Function instance with any provided kwargs
221
+ tool_config = {
222
+ "name": kwargs.get("name", func.__name__),
223
+ "description": kwargs.get(
224
+ "description", get_entrypoint_docstring(wrapper)
225
+ ), # Get docstring if description not provided
226
+ "instructions": kwargs.get("instructions"),
227
+ "add_instructions": kwargs.get("add_instructions", True),
228
+ "entrypoint": wrapper,
229
+ "cache_results": kwargs.get("cache_results", False),
230
+ "cache_dir": kwargs.get("cache_dir"),
231
+ "cache_ttl": kwargs.get("cache_ttl", 3600),
232
+ **{
233
+ k: v
234
+ for k, v in kwargs.items()
235
+ if k
236
+ not in [
237
+ "name",
238
+ "description",
239
+ "instructions",
240
+ "add_instructions",
241
+ "cache_results",
242
+ "cache_dir",
243
+ "cache_ttl",
244
+ ]
245
+ and v is not None
246
+ },
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
+ function = Function(**tool_config)
254
+ # Determine parameters for the function
255
+ function.process_entrypoint()
256
+ return function
257
+
258
+ # Handle both @tool and @tool() cases
259
+ if len(args) == 1 and callable(args[0]) and not kwargs:
260
+ return decorator(args[0])
261
+
262
+ return decorator
@@ -0,0 +1,108 @@
1
+ from os import getenv
2
+ from typing import Any, List, Optional, Union
3
+ from uuid import uuid4
4
+
5
+ import requests
6
+
7
+ from agno.agent import Agent
8
+ from agno.media import Audio
9
+ from agno.team.team import Team
10
+ from agno.tools import Toolkit
11
+ from agno.tools.function import ToolResult
12
+ from agno.utils.log import logger
13
+
14
+
15
+ class DesiVocalTools(Toolkit):
16
+ def __init__(
17
+ self,
18
+ api_key: Optional[str] = None,
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,
23
+ **kwargs,
24
+ ):
25
+ self.api_key = api_key or getenv("DESI_VOCAL_API_KEY")
26
+ if not self.api_key:
27
+ logger.error("DESI_VOCAL_API_KEY not set. Please set the DESI_VOCAL_API_KEY environment variable.")
28
+
29
+ self.voice_id = voice_id
30
+
31
+ tools: List[Any] = []
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)
36
+
37
+ super().__init__(name="desi_vocal_tools", tools=tools, **kwargs)
38
+
39
+ def get_voices(self) -> str:
40
+ """
41
+ Use this function to get all the voices available.
42
+ Returns:
43
+ result (list): A list of voices that have an ID, name and description.
44
+ """
45
+ try:
46
+ url = "https://prod-api2.desivocal.com/dv/api/v0/tts_api/voices"
47
+ response = requests.get(url)
48
+ response.raise_for_status()
49
+
50
+ voices_data = response.json()
51
+
52
+ responses = []
53
+ for voice_id, voice_info in voices_data.items():
54
+ responses.append(
55
+ {
56
+ "id": voice_id,
57
+ "name": voice_info["name"],
58
+ "gender": voice_info["audio_gender"],
59
+ "type": voice_info["voice_type"],
60
+ "language": ", ".join(voice_info["languages"]),
61
+ "preview_url": next(iter(voice_info["preview_path"].values()))
62
+ if voice_info["preview_path"]
63
+ else None,
64
+ }
65
+ )
66
+
67
+ return str(responses)
68
+ except Exception as e:
69
+ logger.error(f"Failed to get voices: {e}")
70
+ return f"Error: {e}"
71
+
72
+ def text_to_speech(self, agent: Union[Agent, Team], prompt: str, voice_id: Optional[str] = None) -> ToolResult:
73
+ """
74
+ Use this function to generate audio from text.
75
+ Args:
76
+ prompt (str): The text to generate audio from.
77
+ Returns:
78
+ ToolResult: A ToolResult containing the generated audio or error message.
79
+ """
80
+ try:
81
+ url = "https://prod-api2.desivocal.com/dv/api/v0/tts_api/generate"
82
+
83
+ payload = {
84
+ "text": prompt,
85
+ "voice_id": voice_id or self.voice_id,
86
+ }
87
+
88
+ headers = {
89
+ "X_API_KEY": self.api_key,
90
+ "Content-Type": "application/json",
91
+ }
92
+
93
+ response = requests.post(url, headers=headers, json=payload)
94
+
95
+ response.raise_for_status()
96
+
97
+ response_json = response.json()
98
+ audio_url = response_json["s3_path"]
99
+
100
+ audio_artifact = Audio(id=str(uuid4()), url=audio_url)
101
+
102
+ return ToolResult(
103
+ content=f"Audio generated successfully: {audio_url}",
104
+ audios=[audio_artifact],
105
+ )
106
+ except Exception as e:
107
+ logger.error(f"Failed to generate audio: {e}")
108
+ return ToolResult(content=f"Error: {e}")
agno/tools/discord.py ADDED
@@ -0,0 +1,161 @@
1
+ """Discord integration tools for interacting with Discord channels and servers."""
2
+
3
+ import json
4
+ from os import getenv
5
+ from typing import Any, Dict, List, Optional
6
+
7
+ import requests
8
+
9
+ from agno.tools import Toolkit
10
+ from agno.utils.log import logger
11
+
12
+
13
+ class DiscordTools(Toolkit):
14
+ def __init__(
15
+ self,
16
+ bot_token: Optional[str] = None,
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,
23
+ **kwargs,
24
+ ):
25
+ self.bot_token = bot_token or getenv("DISCORD_BOT_TOKEN")
26
+ if not self.bot_token:
27
+ logger.error("Discord bot token is required")
28
+ raise ValueError("Discord bot token is required")
29
+
30
+ self.base_url = "https://discord.com/api/v10"
31
+ self.headers = {
32
+ "Authorization": f"Bot {self.bot_token}",
33
+ "Content-Type": "application/json",
34
+ }
35
+
36
+ tools: List[Any] = []
37
+ if enable_send_message or all:
38
+ tools.append(self.send_message)
39
+ if enable_get_channel_messages or all:
40
+ tools.append(self.get_channel_messages)
41
+ if enable_get_channel_info or all:
42
+ tools.append(self.get_channel_info)
43
+ if enable_list_channels or all:
44
+ tools.append(self.list_channels)
45
+ if enable_delete_message or all:
46
+ tools.append(self.delete_message)
47
+
48
+ super().__init__(name="discord", tools=tools, **kwargs)
49
+
50
+ def _make_request(self, method: str, endpoint: str, data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
51
+ """Make a request to Discord API."""
52
+ url = f"{self.base_url}{endpoint}"
53
+ response = requests.request(method, url, headers=self.headers, json=data)
54
+ response.raise_for_status()
55
+ return response.json() if response.text else {}
56
+
57
+ def send_message(self, channel_id: str, message: str) -> str:
58
+ """
59
+ Send a message to a Discord channel.
60
+
61
+ Args:
62
+ channel_id (str): The ID of the channel to send the message to.
63
+ message (str): The text of the message to send.
64
+
65
+ Returns:
66
+ str: A success message or error message.
67
+ """
68
+ try:
69
+ data = {"content": message}
70
+ self._make_request("POST", f"/channels/{channel_id}/messages", data)
71
+ return f"Message sent successfully to channel {channel_id}"
72
+ except Exception as e:
73
+ logger.error(f"Error sending message: {e}")
74
+ return f"Error sending message: {str(e)}"
75
+
76
+ def get_channel_info(self, channel_id: str) -> str:
77
+ """
78
+ Get information about a Discord channel.
79
+
80
+ Args:
81
+ channel_id (str): The ID of the channel to get information about.
82
+
83
+ Returns:
84
+ str: A JSON string containing the channel information.
85
+ """
86
+ try:
87
+ response = self._make_request("GET", f"/channels/{channel_id}")
88
+ return json.dumps(response, indent=2)
89
+ except Exception as e:
90
+ logger.error(f"Error getting channel info: {e}")
91
+ return f"Error getting channel info: {str(e)}"
92
+
93
+ def list_channels(self, guild_id: str) -> str:
94
+ """
95
+ List all channels in a Discord server.
96
+
97
+ Args:
98
+ guild_id (str): The ID of the server to list channels from.
99
+
100
+ Returns:
101
+ str: A JSON string containing the list of channels.
102
+ """
103
+ try:
104
+ response = self._make_request("GET", f"/guilds/{guild_id}/channels")
105
+ return json.dumps(response, indent=2)
106
+ except Exception as e:
107
+ logger.error(f"Error listing channels: {e}")
108
+ return f"Error listing channels: {str(e)}"
109
+
110
+ def get_channel_messages(self, channel_id: str, limit: int = 100) -> str:
111
+ """
112
+ Get the message history of a Discord channel.
113
+
114
+ Args:
115
+ channel_id (str): The ID of the channel to fetch messages from.
116
+ limit (int): The maximum number of messages to fetch. Defaults to 100.
117
+
118
+ Returns:
119
+ str: A JSON string containing the channel's message history.
120
+ """
121
+ try:
122
+ response = self._make_request("GET", f"/channels/{channel_id}/messages?limit={limit}")
123
+ return json.dumps(response, indent=2)
124
+ except Exception as e:
125
+ logger.error(f"Error getting messages: {e}")
126
+ return f"Error getting messages: {str(e)}"
127
+
128
+ def delete_message(self, channel_id: str, message_id: str) -> str:
129
+ """
130
+ Delete a message from a Discord channel.
131
+
132
+ Args:
133
+ channel_id (str): The ID of the channel containing the message.
134
+ message_id (str): The ID of the message to delete.
135
+
136
+ Returns:
137
+ str: A success message or error message.
138
+ """
139
+ try:
140
+ self._make_request("DELETE", f"/channels/{channel_id}/messages/{message_id}")
141
+ return f"Message {message_id} deleted successfully from channel {channel_id}"
142
+ except Exception as e:
143
+ logger.error(f"Error deleting message: {e}")
144
+ return f"Error deleting message: {str(e)}"
145
+
146
+ @staticmethod
147
+ def get_tool_name() -> str:
148
+ """Get the name of the tool."""
149
+ return "discord"
150
+
151
+ @staticmethod
152
+ def get_tool_description() -> str:
153
+ """Get the description of the tool."""
154
+ return "Tool for interacting with Discord channels and servers"
155
+
156
+ @staticmethod
157
+ def get_tool_config() -> dict:
158
+ """Get the required configuration for the tool."""
159
+ return {
160
+ "bot_token": {"type": "string", "description": "Discord bot token for authentication", "required": True}
161
+ }