agno 0.1.2__py3-none-any.whl → 2.3.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 (723) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +44 -5
  3. agno/agent/agent.py +10531 -2975
  4. agno/api/agent.py +14 -53
  5. agno/api/api.py +7 -46
  6. agno/api/evals.py +22 -0
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -25
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +6 -9
  11. agno/api/schemas/evals.py +16 -0
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +10 -10
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +16 -0
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +22 -26
  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/compression/__init__.py +3 -0
  25. agno/compression/manager.py +247 -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 +946 -0
  31. agno/db/dynamo/__init__.py +3 -0
  32. agno/db/dynamo/dynamo.py +2781 -0
  33. agno/db/dynamo/schemas.py +442 -0
  34. agno/db/dynamo/utils.py +743 -0
  35. agno/db/firestore/__init__.py +3 -0
  36. agno/db/firestore/firestore.py +2379 -0
  37. agno/db/firestore/schemas.py +181 -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 +1791 -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 +1312 -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 +1777 -0
  47. agno/db/json/utils.py +230 -0
  48. agno/db/migrations/manager.py +199 -0
  49. agno/db/migrations/v1_to_v2.py +635 -0
  50. agno/db/migrations/versions/v2_3_0.py +938 -0
  51. agno/db/mongo/__init__.py +17 -0
  52. agno/db/mongo/async_mongo.py +2760 -0
  53. agno/db/mongo/mongo.py +2597 -0
  54. agno/db/mongo/schemas.py +119 -0
  55. agno/db/mongo/utils.py +276 -0
  56. agno/db/mysql/__init__.py +4 -0
  57. agno/db/mysql/async_mysql.py +2912 -0
  58. agno/db/mysql/mysql.py +2923 -0
  59. agno/db/mysql/schemas.py +186 -0
  60. agno/db/mysql/utils.py +488 -0
  61. agno/db/postgres/__init__.py +4 -0
  62. agno/db/postgres/async_postgres.py +2579 -0
  63. agno/db/postgres/postgres.py +2870 -0
  64. agno/db/postgres/schemas.py +187 -0
  65. agno/db/postgres/utils.py +442 -0
  66. agno/db/redis/__init__.py +3 -0
  67. agno/db/redis/redis.py +2141 -0
  68. agno/db/redis/schemas.py +159 -0
  69. agno/db/redis/utils.py +346 -0
  70. agno/db/schemas/__init__.py +4 -0
  71. agno/db/schemas/culture.py +120 -0
  72. agno/db/schemas/evals.py +34 -0
  73. agno/db/schemas/knowledge.py +40 -0
  74. agno/db/schemas/memory.py +61 -0
  75. agno/db/singlestore/__init__.py +3 -0
  76. agno/db/singlestore/schemas.py +179 -0
  77. agno/db/singlestore/singlestore.py +2877 -0
  78. agno/db/singlestore/utils.py +384 -0
  79. agno/db/sqlite/__init__.py +4 -0
  80. agno/db/sqlite/async_sqlite.py +2911 -0
  81. agno/db/sqlite/schemas.py +181 -0
  82. agno/db/sqlite/sqlite.py +2908 -0
  83. agno/db/sqlite/utils.py +429 -0
  84. agno/db/surrealdb/__init__.py +3 -0
  85. agno/db/surrealdb/metrics.py +292 -0
  86. agno/db/surrealdb/models.py +334 -0
  87. agno/db/surrealdb/queries.py +71 -0
  88. agno/db/surrealdb/surrealdb.py +1908 -0
  89. agno/db/surrealdb/utils.py +147 -0
  90. agno/db/utils.py +118 -0
  91. agno/eval/__init__.py +24 -0
  92. agno/eval/accuracy.py +666 -276
  93. agno/eval/agent_as_judge.py +861 -0
  94. agno/eval/base.py +29 -0
  95. agno/eval/performance.py +779 -0
  96. agno/eval/reliability.py +241 -62
  97. agno/eval/utils.py +120 -0
  98. agno/exceptions.py +143 -1
  99. agno/filters.py +354 -0
  100. agno/guardrails/__init__.py +6 -0
  101. agno/guardrails/base.py +19 -0
  102. agno/guardrails/openai.py +144 -0
  103. agno/guardrails/pii.py +94 -0
  104. agno/guardrails/prompt_injection.py +52 -0
  105. agno/hooks/__init__.py +3 -0
  106. agno/hooks/decorator.py +164 -0
  107. agno/integrations/discord/__init__.py +3 -0
  108. agno/integrations/discord/client.py +203 -0
  109. agno/knowledge/__init__.py +5 -1
  110. agno/{document → knowledge}/chunking/agentic.py +22 -14
  111. agno/{document → knowledge}/chunking/document.py +2 -2
  112. agno/{document → knowledge}/chunking/fixed.py +7 -6
  113. agno/knowledge/chunking/markdown.py +151 -0
  114. agno/{document → knowledge}/chunking/recursive.py +15 -3
  115. agno/knowledge/chunking/row.py +39 -0
  116. agno/knowledge/chunking/semantic.py +91 -0
  117. agno/knowledge/chunking/strategy.py +165 -0
  118. agno/knowledge/content.py +74 -0
  119. agno/knowledge/document/__init__.py +5 -0
  120. agno/{document → knowledge/document}/base.py +12 -2
  121. agno/knowledge/embedder/__init__.py +5 -0
  122. agno/knowledge/embedder/aws_bedrock.py +343 -0
  123. agno/knowledge/embedder/azure_openai.py +210 -0
  124. agno/{embedder → knowledge/embedder}/base.py +8 -0
  125. agno/knowledge/embedder/cohere.py +323 -0
  126. agno/knowledge/embedder/fastembed.py +62 -0
  127. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  128. agno/knowledge/embedder/google.py +258 -0
  129. agno/knowledge/embedder/huggingface.py +94 -0
  130. agno/knowledge/embedder/jina.py +182 -0
  131. agno/knowledge/embedder/langdb.py +22 -0
  132. agno/knowledge/embedder/mistral.py +206 -0
  133. agno/knowledge/embedder/nebius.py +13 -0
  134. agno/knowledge/embedder/ollama.py +154 -0
  135. agno/knowledge/embedder/openai.py +195 -0
  136. agno/knowledge/embedder/sentence_transformer.py +63 -0
  137. agno/{embedder → knowledge/embedder}/together.py +1 -1
  138. agno/knowledge/embedder/vllm.py +262 -0
  139. agno/knowledge/embedder/voyageai.py +165 -0
  140. agno/knowledge/knowledge.py +3006 -0
  141. agno/knowledge/reader/__init__.py +7 -0
  142. agno/knowledge/reader/arxiv_reader.py +81 -0
  143. agno/knowledge/reader/base.py +95 -0
  144. agno/knowledge/reader/csv_reader.py +164 -0
  145. agno/knowledge/reader/docx_reader.py +82 -0
  146. agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
  147. agno/knowledge/reader/firecrawl_reader.py +201 -0
  148. agno/knowledge/reader/json_reader.py +88 -0
  149. agno/knowledge/reader/markdown_reader.py +137 -0
  150. agno/knowledge/reader/pdf_reader.py +431 -0
  151. agno/knowledge/reader/pptx_reader.py +101 -0
  152. agno/knowledge/reader/reader_factory.py +313 -0
  153. agno/knowledge/reader/s3_reader.py +89 -0
  154. agno/knowledge/reader/tavily_reader.py +193 -0
  155. agno/knowledge/reader/text_reader.py +127 -0
  156. agno/knowledge/reader/web_search_reader.py +325 -0
  157. agno/knowledge/reader/website_reader.py +455 -0
  158. agno/knowledge/reader/wikipedia_reader.py +91 -0
  159. agno/knowledge/reader/youtube_reader.py +78 -0
  160. agno/knowledge/remote_content/remote_content.py +88 -0
  161. agno/knowledge/reranker/__init__.py +3 -0
  162. agno/{reranker → knowledge/reranker}/base.py +1 -1
  163. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  164. agno/knowledge/reranker/infinity.py +195 -0
  165. agno/knowledge/reranker/sentence_transformer.py +54 -0
  166. agno/knowledge/types.py +39 -0
  167. agno/knowledge/utils.py +234 -0
  168. agno/media.py +439 -95
  169. agno/memory/__init__.py +16 -3
  170. agno/memory/manager.py +1474 -123
  171. agno/memory/strategies/__init__.py +15 -0
  172. agno/memory/strategies/base.py +66 -0
  173. agno/memory/strategies/summarize.py +196 -0
  174. agno/memory/strategies/types.py +37 -0
  175. agno/models/aimlapi/__init__.py +5 -0
  176. agno/models/aimlapi/aimlapi.py +62 -0
  177. agno/models/anthropic/__init__.py +4 -0
  178. agno/models/anthropic/claude.py +960 -496
  179. agno/models/aws/__init__.py +15 -0
  180. agno/models/aws/bedrock.py +686 -451
  181. agno/models/aws/claude.py +190 -183
  182. agno/models/azure/__init__.py +18 -1
  183. agno/models/azure/ai_foundry.py +489 -0
  184. agno/models/azure/openai_chat.py +89 -40
  185. agno/models/base.py +2477 -550
  186. agno/models/cerebras/__init__.py +12 -0
  187. agno/models/cerebras/cerebras.py +565 -0
  188. agno/models/cerebras/cerebras_openai.py +131 -0
  189. agno/models/cohere/__init__.py +4 -0
  190. agno/models/cohere/chat.py +306 -492
  191. agno/models/cometapi/__init__.py +5 -0
  192. agno/models/cometapi/cometapi.py +74 -0
  193. agno/models/dashscope/__init__.py +5 -0
  194. agno/models/dashscope/dashscope.py +90 -0
  195. agno/models/deepinfra/__init__.py +5 -0
  196. agno/models/deepinfra/deepinfra.py +45 -0
  197. agno/models/deepseek/__init__.py +4 -0
  198. agno/models/deepseek/deepseek.py +110 -9
  199. agno/models/fireworks/__init__.py +4 -0
  200. agno/models/fireworks/fireworks.py +19 -22
  201. agno/models/google/__init__.py +3 -7
  202. agno/models/google/gemini.py +1717 -662
  203. agno/models/google/utils.py +22 -0
  204. agno/models/groq/__init__.py +4 -0
  205. agno/models/groq/groq.py +391 -666
  206. agno/models/huggingface/__init__.py +4 -0
  207. agno/models/huggingface/huggingface.py +266 -538
  208. agno/models/ibm/__init__.py +5 -0
  209. agno/models/ibm/watsonx.py +432 -0
  210. agno/models/internlm/__init__.py +3 -0
  211. agno/models/internlm/internlm.py +20 -3
  212. agno/models/langdb/__init__.py +1 -0
  213. agno/models/langdb/langdb.py +60 -0
  214. agno/models/litellm/__init__.py +14 -0
  215. agno/models/litellm/chat.py +503 -0
  216. agno/models/litellm/litellm_openai.py +42 -0
  217. agno/models/llama_cpp/__init__.py +5 -0
  218. agno/models/llama_cpp/llama_cpp.py +22 -0
  219. agno/models/lmstudio/__init__.py +5 -0
  220. agno/models/lmstudio/lmstudio.py +25 -0
  221. agno/models/message.py +361 -39
  222. agno/models/meta/__init__.py +12 -0
  223. agno/models/meta/llama.py +502 -0
  224. agno/models/meta/llama_openai.py +79 -0
  225. agno/models/metrics.py +120 -0
  226. agno/models/mistral/__init__.py +4 -0
  227. agno/models/mistral/mistral.py +293 -393
  228. agno/models/nebius/__init__.py +3 -0
  229. agno/models/nebius/nebius.py +53 -0
  230. agno/models/nexus/__init__.py +3 -0
  231. agno/models/nexus/nexus.py +22 -0
  232. agno/models/nvidia/__init__.py +4 -0
  233. agno/models/nvidia/nvidia.py +22 -3
  234. agno/models/ollama/__init__.py +4 -2
  235. agno/models/ollama/chat.py +257 -492
  236. agno/models/openai/__init__.py +7 -0
  237. agno/models/openai/chat.py +725 -770
  238. agno/models/openai/like.py +16 -2
  239. agno/models/openai/responses.py +1121 -0
  240. agno/models/openrouter/__init__.py +4 -0
  241. agno/models/openrouter/openrouter.py +62 -5
  242. agno/models/perplexity/__init__.py +5 -0
  243. agno/models/perplexity/perplexity.py +203 -0
  244. agno/models/portkey/__init__.py +3 -0
  245. agno/models/portkey/portkey.py +82 -0
  246. agno/models/requesty/__init__.py +5 -0
  247. agno/models/requesty/requesty.py +69 -0
  248. agno/models/response.py +177 -7
  249. agno/models/sambanova/__init__.py +4 -0
  250. agno/models/sambanova/sambanova.py +23 -4
  251. agno/models/siliconflow/__init__.py +5 -0
  252. agno/models/siliconflow/siliconflow.py +42 -0
  253. agno/models/together/__init__.py +4 -0
  254. agno/models/together/together.py +21 -164
  255. agno/models/utils.py +266 -0
  256. agno/models/vercel/__init__.py +3 -0
  257. agno/models/vercel/v0.py +43 -0
  258. agno/models/vertexai/__init__.py +0 -1
  259. agno/models/vertexai/claude.py +190 -0
  260. agno/models/vllm/__init__.py +3 -0
  261. agno/models/vllm/vllm.py +83 -0
  262. agno/models/xai/__init__.py +2 -0
  263. agno/models/xai/xai.py +111 -7
  264. agno/os/__init__.py +3 -0
  265. agno/os/app.py +1027 -0
  266. agno/os/auth.py +244 -0
  267. agno/os/config.py +126 -0
  268. agno/os/interfaces/__init__.py +1 -0
  269. agno/os/interfaces/a2a/__init__.py +3 -0
  270. agno/os/interfaces/a2a/a2a.py +42 -0
  271. agno/os/interfaces/a2a/router.py +249 -0
  272. agno/os/interfaces/a2a/utils.py +924 -0
  273. agno/os/interfaces/agui/__init__.py +3 -0
  274. agno/os/interfaces/agui/agui.py +47 -0
  275. agno/os/interfaces/agui/router.py +147 -0
  276. agno/os/interfaces/agui/utils.py +574 -0
  277. agno/os/interfaces/base.py +25 -0
  278. agno/os/interfaces/slack/__init__.py +3 -0
  279. agno/os/interfaces/slack/router.py +148 -0
  280. agno/os/interfaces/slack/security.py +30 -0
  281. agno/os/interfaces/slack/slack.py +47 -0
  282. agno/os/interfaces/whatsapp/__init__.py +3 -0
  283. agno/os/interfaces/whatsapp/router.py +210 -0
  284. agno/os/interfaces/whatsapp/security.py +55 -0
  285. agno/os/interfaces/whatsapp/whatsapp.py +36 -0
  286. agno/os/mcp.py +293 -0
  287. agno/os/middleware/__init__.py +9 -0
  288. agno/os/middleware/jwt.py +797 -0
  289. agno/os/router.py +258 -0
  290. agno/os/routers/__init__.py +3 -0
  291. agno/os/routers/agents/__init__.py +3 -0
  292. agno/os/routers/agents/router.py +599 -0
  293. agno/os/routers/agents/schema.py +261 -0
  294. agno/os/routers/evals/__init__.py +3 -0
  295. agno/os/routers/evals/evals.py +450 -0
  296. agno/os/routers/evals/schemas.py +174 -0
  297. agno/os/routers/evals/utils.py +231 -0
  298. agno/os/routers/health.py +31 -0
  299. agno/os/routers/home.py +52 -0
  300. agno/os/routers/knowledge/__init__.py +3 -0
  301. agno/os/routers/knowledge/knowledge.py +1008 -0
  302. agno/os/routers/knowledge/schemas.py +178 -0
  303. agno/os/routers/memory/__init__.py +3 -0
  304. agno/os/routers/memory/memory.py +661 -0
  305. agno/os/routers/memory/schemas.py +88 -0
  306. agno/os/routers/metrics/__init__.py +3 -0
  307. agno/os/routers/metrics/metrics.py +190 -0
  308. agno/os/routers/metrics/schemas.py +47 -0
  309. agno/os/routers/session/__init__.py +3 -0
  310. agno/os/routers/session/session.py +997 -0
  311. agno/os/routers/teams/__init__.py +3 -0
  312. agno/os/routers/teams/router.py +512 -0
  313. agno/os/routers/teams/schema.py +257 -0
  314. agno/os/routers/traces/__init__.py +3 -0
  315. agno/os/routers/traces/schemas.py +414 -0
  316. agno/os/routers/traces/traces.py +499 -0
  317. agno/os/routers/workflows/__init__.py +3 -0
  318. agno/os/routers/workflows/router.py +624 -0
  319. agno/os/routers/workflows/schema.py +75 -0
  320. agno/os/schema.py +534 -0
  321. agno/os/scopes.py +469 -0
  322. agno/{playground → os}/settings.py +7 -15
  323. agno/os/utils.py +973 -0
  324. agno/reasoning/anthropic.py +80 -0
  325. agno/reasoning/azure_ai_foundry.py +67 -0
  326. agno/reasoning/deepseek.py +63 -0
  327. agno/reasoning/default.py +97 -0
  328. agno/reasoning/gemini.py +73 -0
  329. agno/reasoning/groq.py +71 -0
  330. agno/reasoning/helpers.py +24 -1
  331. agno/reasoning/ollama.py +67 -0
  332. agno/reasoning/openai.py +86 -0
  333. agno/reasoning/step.py +2 -1
  334. agno/reasoning/vertexai.py +76 -0
  335. agno/run/__init__.py +6 -0
  336. agno/run/agent.py +822 -0
  337. agno/run/base.py +247 -0
  338. agno/run/cancel.py +81 -0
  339. agno/run/requirement.py +181 -0
  340. agno/run/team.py +767 -0
  341. agno/run/workflow.py +708 -0
  342. agno/session/__init__.py +10 -0
  343. agno/session/agent.py +260 -0
  344. agno/session/summary.py +265 -0
  345. agno/session/team.py +342 -0
  346. agno/session/workflow.py +501 -0
  347. agno/table.py +10 -0
  348. agno/team/__init__.py +37 -0
  349. agno/team/team.py +9536 -0
  350. agno/tools/__init__.py +7 -0
  351. agno/tools/agentql.py +120 -0
  352. agno/tools/airflow.py +22 -12
  353. agno/tools/api.py +122 -0
  354. agno/tools/apify.py +276 -83
  355. agno/tools/{arxiv_toolkit.py → arxiv.py} +20 -12
  356. agno/tools/aws_lambda.py +28 -7
  357. agno/tools/aws_ses.py +66 -0
  358. agno/tools/baidusearch.py +11 -4
  359. agno/tools/bitbucket.py +292 -0
  360. agno/tools/brandfetch.py +213 -0
  361. agno/tools/bravesearch.py +106 -0
  362. agno/tools/brightdata.py +367 -0
  363. agno/tools/browserbase.py +209 -0
  364. agno/tools/calcom.py +32 -23
  365. agno/tools/calculator.py +24 -37
  366. agno/tools/cartesia.py +187 -0
  367. agno/tools/{clickup_tool.py → clickup.py} +17 -28
  368. agno/tools/confluence.py +91 -26
  369. agno/tools/crawl4ai.py +139 -43
  370. agno/tools/csv_toolkit.py +28 -22
  371. agno/tools/dalle.py +36 -22
  372. agno/tools/daytona.py +475 -0
  373. agno/tools/decorator.py +169 -14
  374. agno/tools/desi_vocal.py +23 -11
  375. agno/tools/discord.py +32 -29
  376. agno/tools/docker.py +716 -0
  377. agno/tools/duckdb.py +76 -81
  378. agno/tools/duckduckgo.py +43 -40
  379. agno/tools/e2b.py +703 -0
  380. agno/tools/eleven_labs.py +65 -54
  381. agno/tools/email.py +13 -5
  382. agno/tools/evm.py +129 -0
  383. agno/tools/exa.py +324 -42
  384. agno/tools/fal.py +39 -35
  385. agno/tools/file.py +196 -30
  386. agno/tools/file_generation.py +356 -0
  387. agno/tools/financial_datasets.py +288 -0
  388. agno/tools/firecrawl.py +108 -33
  389. agno/tools/function.py +960 -122
  390. agno/tools/giphy.py +34 -12
  391. agno/tools/github.py +1294 -97
  392. agno/tools/gmail.py +922 -0
  393. agno/tools/google_bigquery.py +117 -0
  394. agno/tools/google_drive.py +271 -0
  395. agno/tools/google_maps.py +253 -0
  396. agno/tools/googlecalendar.py +607 -107
  397. agno/tools/googlesheets.py +377 -0
  398. agno/tools/hackernews.py +20 -12
  399. agno/tools/jina.py +24 -14
  400. agno/tools/jira.py +48 -19
  401. agno/tools/knowledge.py +218 -0
  402. agno/tools/linear.py +82 -43
  403. agno/tools/linkup.py +58 -0
  404. agno/tools/local_file_system.py +15 -7
  405. agno/tools/lumalab.py +41 -26
  406. agno/tools/mcp/__init__.py +10 -0
  407. agno/tools/mcp/mcp.py +331 -0
  408. agno/tools/mcp/multi_mcp.py +347 -0
  409. agno/tools/mcp/params.py +24 -0
  410. agno/tools/mcp_toolbox.py +284 -0
  411. agno/tools/mem0.py +193 -0
  412. agno/tools/memory.py +419 -0
  413. agno/tools/mlx_transcribe.py +11 -9
  414. agno/tools/models/azure_openai.py +190 -0
  415. agno/tools/models/gemini.py +203 -0
  416. agno/tools/models/groq.py +158 -0
  417. agno/tools/models/morph.py +186 -0
  418. agno/tools/models/nebius.py +124 -0
  419. agno/tools/models_labs.py +163 -82
  420. agno/tools/moviepy_video.py +18 -13
  421. agno/tools/nano_banana.py +151 -0
  422. agno/tools/neo4j.py +134 -0
  423. agno/tools/newspaper.py +15 -4
  424. agno/tools/newspaper4k.py +19 -6
  425. agno/tools/notion.py +204 -0
  426. agno/tools/openai.py +181 -17
  427. agno/tools/openbb.py +27 -20
  428. agno/tools/opencv.py +321 -0
  429. agno/tools/openweather.py +233 -0
  430. agno/tools/oxylabs.py +385 -0
  431. agno/tools/pandas.py +25 -15
  432. agno/tools/parallel.py +314 -0
  433. agno/tools/postgres.py +238 -185
  434. agno/tools/pubmed.py +125 -13
  435. agno/tools/python.py +48 -35
  436. agno/tools/reasoning.py +283 -0
  437. agno/tools/reddit.py +207 -29
  438. agno/tools/redshift.py +406 -0
  439. agno/tools/replicate.py +69 -26
  440. agno/tools/resend.py +11 -6
  441. agno/tools/scrapegraph.py +179 -19
  442. agno/tools/searxng.py +23 -31
  443. agno/tools/serpapi.py +15 -10
  444. agno/tools/serper.py +255 -0
  445. agno/tools/shell.py +23 -12
  446. agno/tools/shopify.py +1519 -0
  447. agno/tools/slack.py +56 -14
  448. agno/tools/sleep.py +8 -6
  449. agno/tools/spider.py +35 -11
  450. agno/tools/spotify.py +919 -0
  451. agno/tools/sql.py +34 -19
  452. agno/tools/tavily.py +158 -8
  453. agno/tools/telegram.py +18 -8
  454. agno/tools/todoist.py +218 -0
  455. agno/tools/toolkit.py +134 -9
  456. agno/tools/trafilatura.py +388 -0
  457. agno/tools/trello.py +25 -28
  458. agno/tools/twilio.py +18 -9
  459. agno/tools/user_control_flow.py +78 -0
  460. agno/tools/valyu.py +228 -0
  461. agno/tools/visualization.py +467 -0
  462. agno/tools/webbrowser.py +28 -0
  463. agno/tools/webex.py +76 -0
  464. agno/tools/website.py +23 -19
  465. agno/tools/webtools.py +45 -0
  466. agno/tools/whatsapp.py +286 -0
  467. agno/tools/wikipedia.py +28 -19
  468. agno/tools/workflow.py +285 -0
  469. agno/tools/{twitter.py → x.py} +142 -46
  470. agno/tools/yfinance.py +41 -39
  471. agno/tools/youtube.py +34 -17
  472. agno/tools/zendesk.py +15 -5
  473. agno/tools/zep.py +454 -0
  474. agno/tools/zoom.py +86 -37
  475. agno/tracing/__init__.py +12 -0
  476. agno/tracing/exporter.py +157 -0
  477. agno/tracing/schemas.py +276 -0
  478. agno/tracing/setup.py +111 -0
  479. agno/utils/agent.py +938 -0
  480. agno/utils/audio.py +37 -1
  481. agno/utils/certs.py +27 -0
  482. agno/utils/code_execution.py +11 -0
  483. agno/utils/common.py +103 -20
  484. agno/utils/cryptography.py +22 -0
  485. agno/utils/dttm.py +33 -0
  486. agno/utils/events.py +700 -0
  487. agno/utils/functions.py +107 -37
  488. agno/utils/gemini.py +426 -0
  489. agno/utils/hooks.py +171 -0
  490. agno/utils/http.py +185 -0
  491. agno/utils/json_schema.py +159 -37
  492. agno/utils/knowledge.py +36 -0
  493. agno/utils/location.py +19 -0
  494. agno/utils/log.py +221 -8
  495. agno/utils/mcp.py +214 -0
  496. agno/utils/media.py +335 -14
  497. agno/utils/merge_dict.py +22 -1
  498. agno/utils/message.py +77 -2
  499. agno/utils/models/ai_foundry.py +50 -0
  500. agno/utils/models/claude.py +373 -0
  501. agno/utils/models/cohere.py +94 -0
  502. agno/utils/models/llama.py +85 -0
  503. agno/utils/models/mistral.py +100 -0
  504. agno/utils/models/openai_responses.py +140 -0
  505. agno/utils/models/schema_utils.py +153 -0
  506. agno/utils/models/watsonx.py +41 -0
  507. agno/utils/openai.py +257 -0
  508. agno/utils/pickle.py +1 -1
  509. agno/utils/pprint.py +124 -8
  510. agno/utils/print_response/agent.py +930 -0
  511. agno/utils/print_response/team.py +1914 -0
  512. agno/utils/print_response/workflow.py +1668 -0
  513. agno/utils/prompts.py +111 -0
  514. agno/utils/reasoning.py +108 -0
  515. agno/utils/response.py +163 -0
  516. agno/utils/serialize.py +32 -0
  517. agno/utils/shell.py +4 -4
  518. agno/utils/streamlit.py +487 -0
  519. agno/utils/string.py +204 -51
  520. agno/utils/team.py +139 -0
  521. agno/utils/timer.py +9 -2
  522. agno/utils/tokens.py +657 -0
  523. agno/utils/tools.py +19 -1
  524. agno/utils/whatsapp.py +305 -0
  525. agno/utils/yaml_io.py +3 -3
  526. agno/vectordb/__init__.py +2 -0
  527. agno/vectordb/base.py +87 -9
  528. agno/vectordb/cassandra/__init__.py +5 -1
  529. agno/vectordb/cassandra/cassandra.py +383 -27
  530. agno/vectordb/chroma/__init__.py +4 -0
  531. agno/vectordb/chroma/chromadb.py +748 -83
  532. agno/vectordb/clickhouse/__init__.py +7 -1
  533. agno/vectordb/clickhouse/clickhousedb.py +554 -53
  534. agno/vectordb/couchbase/__init__.py +3 -0
  535. agno/vectordb/couchbase/couchbase.py +1446 -0
  536. agno/vectordb/lancedb/__init__.py +5 -0
  537. agno/vectordb/lancedb/lance_db.py +730 -98
  538. agno/vectordb/langchaindb/__init__.py +5 -0
  539. agno/vectordb/langchaindb/langchaindb.py +163 -0
  540. agno/vectordb/lightrag/__init__.py +5 -0
  541. agno/vectordb/lightrag/lightrag.py +388 -0
  542. agno/vectordb/llamaindex/__init__.py +3 -0
  543. agno/vectordb/llamaindex/llamaindexdb.py +166 -0
  544. agno/vectordb/milvus/__init__.py +3 -0
  545. agno/vectordb/milvus/milvus.py +966 -78
  546. agno/vectordb/mongodb/__init__.py +9 -1
  547. agno/vectordb/mongodb/mongodb.py +1175 -172
  548. agno/vectordb/pgvector/__init__.py +8 -0
  549. agno/vectordb/pgvector/pgvector.py +599 -115
  550. agno/vectordb/pineconedb/__init__.py +5 -1
  551. agno/vectordb/pineconedb/pineconedb.py +406 -43
  552. agno/vectordb/qdrant/__init__.py +4 -0
  553. agno/vectordb/qdrant/qdrant.py +914 -61
  554. agno/vectordb/redis/__init__.py +9 -0
  555. agno/vectordb/redis/redisdb.py +682 -0
  556. agno/vectordb/singlestore/__init__.py +8 -1
  557. agno/vectordb/singlestore/singlestore.py +771 -0
  558. agno/vectordb/surrealdb/__init__.py +3 -0
  559. agno/vectordb/surrealdb/surrealdb.py +663 -0
  560. agno/vectordb/upstashdb/__init__.py +5 -0
  561. agno/vectordb/upstashdb/upstashdb.py +718 -0
  562. agno/vectordb/weaviate/__init__.py +8 -0
  563. agno/vectordb/weaviate/index.py +15 -0
  564. agno/vectordb/weaviate/weaviate.py +1009 -0
  565. agno/workflow/__init__.py +23 -1
  566. agno/workflow/agent.py +299 -0
  567. agno/workflow/condition.py +759 -0
  568. agno/workflow/loop.py +756 -0
  569. agno/workflow/parallel.py +853 -0
  570. agno/workflow/router.py +723 -0
  571. agno/workflow/step.py +1564 -0
  572. agno/workflow/steps.py +613 -0
  573. agno/workflow/types.py +556 -0
  574. agno/workflow/workflow.py +4327 -514
  575. agno-2.3.13.dist-info/METADATA +639 -0
  576. agno-2.3.13.dist-info/RECORD +613 -0
  577. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +1 -1
  578. agno-2.3.13.dist-info/licenses/LICENSE +201 -0
  579. agno/api/playground.py +0 -91
  580. agno/api/schemas/playground.py +0 -22
  581. agno/api/schemas/user.py +0 -22
  582. agno/api/schemas/workspace.py +0 -46
  583. agno/api/user.py +0 -160
  584. agno/api/workspace.py +0 -151
  585. agno/cli/auth_server.py +0 -118
  586. agno/cli/config.py +0 -275
  587. agno/cli/console.py +0 -88
  588. agno/cli/credentials.py +0 -23
  589. agno/cli/entrypoint.py +0 -571
  590. agno/cli/operator.py +0 -355
  591. agno/cli/settings.py +0 -85
  592. agno/cli/ws/ws_cli.py +0 -817
  593. agno/constants.py +0 -13
  594. agno/document/__init__.py +0 -1
  595. agno/document/chunking/semantic.py +0 -47
  596. agno/document/chunking/strategy.py +0 -31
  597. agno/document/reader/__init__.py +0 -1
  598. agno/document/reader/arxiv_reader.py +0 -41
  599. agno/document/reader/base.py +0 -22
  600. agno/document/reader/csv_reader.py +0 -84
  601. agno/document/reader/docx_reader.py +0 -46
  602. agno/document/reader/firecrawl_reader.py +0 -99
  603. agno/document/reader/json_reader.py +0 -43
  604. agno/document/reader/pdf_reader.py +0 -219
  605. agno/document/reader/s3/pdf_reader.py +0 -46
  606. agno/document/reader/s3/text_reader.py +0 -51
  607. agno/document/reader/text_reader.py +0 -41
  608. agno/document/reader/website_reader.py +0 -175
  609. agno/document/reader/youtube_reader.py +0 -50
  610. agno/embedder/__init__.py +0 -1
  611. agno/embedder/azure_openai.py +0 -86
  612. agno/embedder/cohere.py +0 -72
  613. agno/embedder/fastembed.py +0 -37
  614. agno/embedder/google.py +0 -73
  615. agno/embedder/huggingface.py +0 -54
  616. agno/embedder/mistral.py +0 -80
  617. agno/embedder/ollama.py +0 -57
  618. agno/embedder/openai.py +0 -74
  619. agno/embedder/sentence_transformer.py +0 -38
  620. agno/embedder/voyageai.py +0 -64
  621. agno/eval/perf.py +0 -201
  622. agno/file/__init__.py +0 -1
  623. agno/file/file.py +0 -16
  624. agno/file/local/csv.py +0 -32
  625. agno/file/local/txt.py +0 -19
  626. agno/infra/app.py +0 -240
  627. agno/infra/base.py +0 -144
  628. agno/infra/context.py +0 -20
  629. agno/infra/db_app.py +0 -52
  630. agno/infra/resource.py +0 -205
  631. agno/infra/resources.py +0 -55
  632. agno/knowledge/agent.py +0 -230
  633. agno/knowledge/arxiv.py +0 -22
  634. agno/knowledge/combined.py +0 -22
  635. agno/knowledge/csv.py +0 -28
  636. agno/knowledge/csv_url.py +0 -19
  637. agno/knowledge/document.py +0 -20
  638. agno/knowledge/docx.py +0 -30
  639. agno/knowledge/json.py +0 -28
  640. agno/knowledge/langchain.py +0 -71
  641. agno/knowledge/llamaindex.py +0 -66
  642. agno/knowledge/pdf.py +0 -28
  643. agno/knowledge/pdf_url.py +0 -26
  644. agno/knowledge/s3/base.py +0 -60
  645. agno/knowledge/s3/pdf.py +0 -21
  646. agno/knowledge/s3/text.py +0 -23
  647. agno/knowledge/text.py +0 -30
  648. agno/knowledge/website.py +0 -88
  649. agno/knowledge/wikipedia.py +0 -31
  650. agno/knowledge/youtube.py +0 -22
  651. agno/memory/agent.py +0 -392
  652. agno/memory/classifier.py +0 -104
  653. agno/memory/db/__init__.py +0 -1
  654. agno/memory/db/base.py +0 -42
  655. agno/memory/db/mongodb.py +0 -189
  656. agno/memory/db/postgres.py +0 -203
  657. agno/memory/db/sqlite.py +0 -193
  658. agno/memory/memory.py +0 -15
  659. agno/memory/row.py +0 -36
  660. agno/memory/summarizer.py +0 -192
  661. agno/memory/summary.py +0 -19
  662. agno/memory/workflow.py +0 -38
  663. agno/models/google/gemini_openai.py +0 -26
  664. agno/models/ollama/hermes.py +0 -221
  665. agno/models/ollama/tools.py +0 -362
  666. agno/models/vertexai/gemini.py +0 -595
  667. agno/playground/__init__.py +0 -3
  668. agno/playground/async_router.py +0 -421
  669. agno/playground/deploy.py +0 -249
  670. agno/playground/operator.py +0 -92
  671. agno/playground/playground.py +0 -91
  672. agno/playground/schemas.py +0 -76
  673. agno/playground/serve.py +0 -55
  674. agno/playground/sync_router.py +0 -405
  675. agno/reasoning/agent.py +0 -68
  676. agno/run/response.py +0 -112
  677. agno/storage/agent/__init__.py +0 -0
  678. agno/storage/agent/base.py +0 -38
  679. agno/storage/agent/dynamodb.py +0 -350
  680. agno/storage/agent/json.py +0 -92
  681. agno/storage/agent/mongodb.py +0 -228
  682. agno/storage/agent/postgres.py +0 -367
  683. agno/storage/agent/session.py +0 -79
  684. agno/storage/agent/singlestore.py +0 -303
  685. agno/storage/agent/sqlite.py +0 -357
  686. agno/storage/agent/yaml.py +0 -93
  687. agno/storage/workflow/__init__.py +0 -0
  688. agno/storage/workflow/base.py +0 -40
  689. agno/storage/workflow/mongodb.py +0 -233
  690. agno/storage/workflow/postgres.py +0 -366
  691. agno/storage/workflow/session.py +0 -60
  692. agno/storage/workflow/sqlite.py +0 -359
  693. agno/tools/googlesearch.py +0 -88
  694. agno/utils/defaults.py +0 -57
  695. agno/utils/filesystem.py +0 -39
  696. agno/utils/git.py +0 -52
  697. agno/utils/json_io.py +0 -30
  698. agno/utils/load_env.py +0 -19
  699. agno/utils/py_io.py +0 -19
  700. agno/utils/pyproject.py +0 -18
  701. agno/utils/resource_filter.py +0 -31
  702. agno/vectordb/singlestore/s2vectordb.py +0 -390
  703. agno/vectordb/singlestore/s2vectordb2.py +0 -355
  704. agno/workspace/__init__.py +0 -0
  705. agno/workspace/config.py +0 -325
  706. agno/workspace/enums.py +0 -6
  707. agno/workspace/helpers.py +0 -48
  708. agno/workspace/operator.py +0 -758
  709. agno/workspace/settings.py +0 -63
  710. agno-0.1.2.dist-info/LICENSE +0 -375
  711. agno-0.1.2.dist-info/METADATA +0 -502
  712. agno-0.1.2.dist-info/RECORD +0 -352
  713. agno-0.1.2.dist-info/entry_points.txt +0 -3
  714. /agno/{cli → db/migrations}/__init__.py +0 -0
  715. /agno/{cli/ws → db/migrations/versions}/__init__.py +0 -0
  716. /agno/{document/chunking/__init__.py → db/schemas/metrics.py} +0 -0
  717. /agno/{document/reader/s3 → integrations}/__init__.py +0 -0
  718. /agno/{file/local → knowledge/chunking}/__init__.py +0 -0
  719. /agno/{infra → knowledge/remote_content}/__init__.py +0 -0
  720. /agno/{knowledge/s3 → tools/models}/__init__.py +0 -0
  721. /agno/{reranker → utils/models}/__init__.py +0 -0
  722. /agno/{storage → utils/print_response}/__init__.py +0 -0
  723. {agno-0.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/tools/decorator.py CHANGED
@@ -1,12 +1,55 @@
1
1
  from functools import update_wrapper, wraps
2
- from typing import Any, Callable, Optional, TypeVar, Union, overload
2
+ from typing import Any, Callable, Dict, List, Optional, TypeVar, Union, overload
3
3
 
4
- from agno.tools.function import Function
4
+ from agno.tools.function import Function, get_entrypoint_docstring
5
5
  from agno.utils.log import logger
6
6
 
7
7
  # Type variable for better type hints
8
8
  F = TypeVar("F", bound=Callable[..., Any])
9
- ToolConfig = TypeVar("ToolConfig", bound=dict[str, 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
10
53
 
11
54
 
12
55
  @overload
@@ -19,11 +62,20 @@ def tool(
19
62
  name: Optional[str] = None,
20
63
  description: Optional[str] = None,
21
64
  strict: Optional[bool] = None,
22
- sanitize_arguments: Optional[bool] = None,
65
+ instructions: Optional[str] = None,
66
+ add_instructions: bool = True,
23
67
  show_result: Optional[bool] = None,
24
- stop_after_call: 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,
25
73
  pre_hook: Optional[Callable] = None,
26
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,
27
79
  ) -> Callable[[F], Function]: ...
28
80
 
29
81
 
@@ -38,11 +90,20 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
38
90
  name: Optional[str] - Override for the function name
39
91
  description: Optional[str] - Override for the function description
40
92
  strict: Optional[bool] - Flag for strict parameter checking
41
- sanitize_arguments: Optional[bool] - If True, arguments are sanitized before passing to function
93
+ instructions: Optional[str] - Instructions for using the tool
94
+ add_instructions: bool - If True, add instructions to the system message
42
95
  show_result: Optional[bool] - If True, shows the result after function call
43
- stop_after_call: Optional[bool] - If True, the agent will stop after the 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
44
101
  pre_hook: Optional[Callable] - Hook that runs before the function is executed.
45
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
46
107
 
47
108
  Returns:
48
109
  Union[Function, Callable[[F], Function]]: Decorated function or decorator
@@ -55,6 +116,10 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
55
116
  @tool(name="custom_name", description="Custom description")
56
117
  def another_function():
57
118
  pass
119
+
120
+ @tool
121
+ async def my_async_function():
122
+ pass
58
123
  """
59
124
  # Move valid kwargs to a frozen set at module level
60
125
  VALID_KWARGS = frozenset(
@@ -62,11 +127,20 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
62
127
  "name",
63
128
  "description",
64
129
  "strict",
65
- "sanitize_arguments",
130
+ "instructions",
131
+ "add_instructions",
66
132
  "show_result",
67
- "stop_after_call",
133
+ "stop_after_tool_call",
134
+ "requires_confirmation",
135
+ "requires_user_input",
136
+ "user_input_fields",
137
+ "external_execution",
68
138
  "pre_hook",
69
139
  "post_hook",
140
+ "tool_hooks",
141
+ "cache_results",
142
+ "cache_dir",
143
+ "cache_ttl",
70
144
  }
71
145
  )
72
146
 
@@ -77,28 +151,109 @@ def tool(*args, **kwargs) -> Union[Function, Callable[[F], Function]]:
77
151
  f"Invalid tool configuration arguments: {invalid_kwargs}. Valid arguments are: {sorted(VALID_KWARGS)}"
78
152
  )
79
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
+
80
167
  def decorator(func: F) -> Function:
168
+ from inspect import isasyncgenfunction
169
+
81
170
  @wraps(func)
82
- def wrapper(*args: Any, **kwargs: Any) -> Any:
171
+ def sync_wrapper(*args: Any, **kwargs: Any) -> Any:
83
172
  try:
84
173
  return func(*args, **kwargs)
85
174
  except Exception as e:
86
175
  logger.error(
87
176
  f"Error in tool {func.__name__!r}: {e!r}",
88
- exc_info=True, # Include stack trace
177
+ exc_info=True,
89
178
  )
90
179
  raise
91
180
 
92
- # Preserve the original signature
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
93
212
  update_wrapper(wrapper, func)
94
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
+
95
220
  # Create Function instance with any provided kwargs
96
221
  tool_config = {
97
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),
98
228
  "entrypoint": wrapper,
99
- **{k: v for k, v in kwargs.items() if k != "name" and v is not None},
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
+ },
100
247
  }
101
- return Function(**tool_config)
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
102
257
 
103
258
  # Handle both @tool and @tool() cases
104
259
  if len(args) == 1 and callable(args[0]) and not kwargs:
agno/tools/desi_vocal.py CHANGED
@@ -1,12 +1,14 @@
1
1
  from os import getenv
2
- from typing import Optional
2
+ from typing import Any, List, Optional, Union
3
3
  from uuid import uuid4
4
4
 
5
5
  import requests
6
6
 
7
7
  from agno.agent import Agent
8
- from agno.media import AudioArtifact
8
+ from agno.media import Audio
9
+ from agno.team.team import Team
9
10
  from agno.tools import Toolkit
11
+ from agno.tools.function import ToolResult
10
12
  from agno.utils.log import logger
11
13
 
12
14
 
@@ -15,17 +17,24 @@ class DesiVocalTools(Toolkit):
15
17
  self,
16
18
  api_key: Optional[str] = None,
17
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,
18
24
  ):
19
- super().__init__(name="desi_vocal_tools")
20
-
21
25
  self.api_key = api_key or getenv("DESI_VOCAL_API_KEY")
22
26
  if not self.api_key:
23
27
  logger.error("DESI_VOCAL_API_KEY not set. Please set the DESI_VOCAL_API_KEY environment variable.")
24
28
 
25
29
  self.voice_id = voice_id
26
30
 
27
- self.register(self.get_voices)
28
- self.register(self.text_to_speech)
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)
29
38
 
30
39
  def get_voices(self) -> str:
31
40
  """
@@ -60,13 +69,13 @@ class DesiVocalTools(Toolkit):
60
69
  logger.error(f"Failed to get voices: {e}")
61
70
  return f"Error: {e}"
62
71
 
63
- def text_to_speech(self, agent: Agent, 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:
64
73
  """
65
74
  Use this function to generate audio from text.
66
75
  Args:
67
76
  prompt (str): The text to generate audio from.
68
77
  Returns:
69
- result (str): The URL of the generated audio.
78
+ ToolResult: A ToolResult containing the generated audio or error message.
70
79
  """
71
80
  try:
72
81
  url = "https://prod-api2.desivocal.com/dv/api/v0/tts_api/generate"
@@ -88,9 +97,12 @@ class DesiVocalTools(Toolkit):
88
97
  response_json = response.json()
89
98
  audio_url = response_json["s3_path"]
90
99
 
91
- agent.add_audio(AudioArtifact(id=str(uuid4()), url=audio_url))
100
+ audio_artifact = Audio(id=str(uuid4()), url=audio_url)
92
101
 
93
- return audio_url
102
+ return ToolResult(
103
+ content=f"Audio generated successfully: {audio_url}",
104
+ audios=[audio_artifact],
105
+ )
94
106
  except Exception as e:
95
107
  logger.error(f"Failed to generate audio: {e}")
96
- return f"Error: {e}"
108
+ return ToolResult(content=f"Error: {e}")
agno/tools/discord.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  import json
4
4
  from os import getenv
5
- from typing import Any, Dict, Optional
5
+ from typing import Any, Dict, List, Optional
6
6
 
7
7
  import requests
8
8
 
@@ -14,14 +14,14 @@ 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,
23
+ **kwargs,
21
24
  ):
22
- """Initialize Discord tools."""
23
- super().__init__(name="discord")
24
-
25
25
  self.bot_token = bot_token or getenv("DISCORD_BOT_TOKEN")
26
26
  if not self.bot_token:
27
27
  logger.error("Discord bot token is required")
@@ -33,16 +33,19 @@ class DiscordTools(Toolkit):
33
33
  "Content-Type": "application/json",
34
34
  }
35
35
 
36
- # Register tools based on enabled features
37
- if enable_messaging:
38
- self.register(self.send_message)
39
- if enable_history:
40
- self.register(self.get_channel_messages)
41
- if enable_channel_management:
42
- self.register(self.get_channel_info)
43
- self.register(self.list_channels)
44
- if enable_message_management:
45
- self.register(self.delete_message)
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)
46
49
 
47
50
  def _make_request(self, method: str, endpoint: str, data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
48
51
  """Make a request to Discord API."""
@@ -51,12 +54,12 @@ class DiscordTools(Toolkit):
51
54
  response.raise_for_status()
52
55
  return response.json() if response.text else {}
53
56
 
54
- def send_message(self, channel_id: int, message: str) -> str:
57
+ def send_message(self, channel_id: str, message: str) -> str:
55
58
  """
56
59
  Send a message to a Discord channel.
57
60
 
58
61
  Args:
59
- channel_id (int): The ID of the channel to send the message to.
62
+ channel_id (str): The ID of the channel to send the message to.
60
63
  message (str): The text of the message to send.
61
64
 
62
65
  Returns:
@@ -70,12 +73,12 @@ class DiscordTools(Toolkit):
70
73
  logger.error(f"Error sending message: {e}")
71
74
  return f"Error sending message: {str(e)}"
72
75
 
73
- def get_channel_info(self, channel_id: int) -> str:
76
+ def get_channel_info(self, channel_id: str) -> str:
74
77
  """
75
78
  Get information about a Discord channel.
76
79
 
77
80
  Args:
78
- channel_id (int): The ID of the channel to get information about.
81
+ channel_id (str): The ID of the channel to get information about.
79
82
 
80
83
  Returns:
81
84
  str: A JSON string containing the channel information.
@@ -87,12 +90,12 @@ class DiscordTools(Toolkit):
87
90
  logger.error(f"Error getting channel info: {e}")
88
91
  return f"Error getting channel info: {str(e)}"
89
92
 
90
- def list_channels(self, guild_id: int) -> str:
93
+ def list_channels(self, guild_id: str) -> str:
91
94
  """
92
95
  List all channels in a Discord server.
93
96
 
94
97
  Args:
95
- guild_id (int): The ID of the server to list channels from.
98
+ guild_id (str): The ID of the server to list channels from.
96
99
 
97
100
  Returns:
98
101
  str: A JSON string containing the list of channels.
@@ -104,12 +107,12 @@ class DiscordTools(Toolkit):
104
107
  logger.error(f"Error listing channels: {e}")
105
108
  return f"Error listing channels: {str(e)}"
106
109
 
107
- def get_channel_messages(self, channel_id: int, limit: int = 100) -> str:
110
+ def get_channel_messages(self, channel_id: str, limit: int = 100) -> str:
108
111
  """
109
112
  Get the message history of a Discord channel.
110
113
 
111
114
  Args:
112
- channel_id (int): The ID of the channel to fetch messages from.
115
+ channel_id (str): The ID of the channel to fetch messages from.
113
116
  limit (int): The maximum number of messages to fetch. Defaults to 100.
114
117
 
115
118
  Returns:
@@ -122,13 +125,13 @@ class DiscordTools(Toolkit):
122
125
  logger.error(f"Error getting messages: {e}")
123
126
  return f"Error getting messages: {str(e)}"
124
127
 
125
- def delete_message(self, channel_id: int, message_id: int) -> str:
128
+ def delete_message(self, channel_id: str, message_id: str) -> str:
126
129
  """
127
130
  Delete a message from a Discord channel.
128
131
 
129
132
  Args:
130
- channel_id (int): The ID of the channel containing the message.
131
- message_id (int): The ID of the message to delete.
133
+ channel_id (str): The ID of the channel containing the message.
134
+ message_id (str): The ID of the message to delete.
132
135
 
133
136
  Returns:
134
137
  str: A success message or error message.