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/calculator.py CHANGED
@@ -1,42 +1,29 @@
1
1
  import json
2
2
  import math
3
+ from typing import Callable, List
3
4
 
4
5
  from agno.tools import Toolkit
5
- from agno.utils.log import logger
6
+ from agno.utils.log import log_debug, logger
6
7
 
7
8
 
8
9
  class CalculatorTools(Toolkit):
9
10
  def __init__(
10
11
  self,
11
- add: bool = True,
12
- subtract: bool = True,
13
- multiply: bool = True,
14
- divide: bool = True,
15
- exponentiate: bool = False,
16
- factorial: bool = False,
17
- is_prime: bool = False,
18
- square_root: bool = False,
19
- enable_all: bool = False,
12
+ **kwargs,
20
13
  ):
21
- super().__init__(name="calculator")
22
-
23
- # Register functions in the toolkit
24
- if add or enable_all:
25
- self.register(self.add)
26
- if subtract or enable_all:
27
- self.register(self.subtract)
28
- if multiply or enable_all:
29
- self.register(self.multiply)
30
- if divide or enable_all:
31
- self.register(self.divide)
32
- if exponentiate or enable_all:
33
- self.register(self.exponentiate)
34
- if factorial or enable_all:
35
- self.register(self.factorial)
36
- if is_prime or enable_all:
37
- self.register(self.is_prime)
38
- if square_root or enable_all:
39
- self.register(self.square_root)
14
+ tools: List[Callable] = [
15
+ self.add,
16
+ self.subtract,
17
+ self.multiply,
18
+ self.divide,
19
+ self.exponentiate,
20
+ self.factorial,
21
+ self.is_prime,
22
+ self.square_root,
23
+ ]
24
+
25
+ # Initialize the toolkit with auto-registration enabled
26
+ super().__init__(name="calculator", tools=tools, **kwargs)
40
27
 
41
28
  def add(self, a: float, b: float) -> str:
42
29
  """Add two numbers and return the result.
@@ -49,7 +36,7 @@ class CalculatorTools(Toolkit):
49
36
  str: JSON string of the result.
50
37
  """
51
38
  result = a + b
52
- logger.info(f"Adding {a} and {b} to get {result}")
39
+ log_debug(f"Adding {a} and {b} to get {result}")
53
40
  return json.dumps({"operation": "addition", "result": result})
54
41
 
55
42
  def subtract(self, a: float, b: float) -> str:
@@ -63,7 +50,7 @@ class CalculatorTools(Toolkit):
63
50
  str: JSON string of the result.
64
51
  """
65
52
  result = a - b
66
- logger.info(f"Subtracting {b} from {a} to get {result}")
53
+ log_debug(f"Subtracting {b} from {a} to get {result}")
67
54
  return json.dumps({"operation": "subtraction", "result": result})
68
55
 
69
56
  def multiply(self, a: float, b: float) -> str:
@@ -77,7 +64,7 @@ class CalculatorTools(Toolkit):
77
64
  str: JSON string of the result.
78
65
  """
79
66
  result = a * b
80
- logger.info(f"Multiplying {a} and {b} to get {result}")
67
+ log_debug(f"Multiplying {a} and {b} to get {result}")
81
68
  return json.dumps({"operation": "multiplication", "result": result})
82
69
 
83
70
  def divide(self, a: float, b: float) -> str:
@@ -96,8 +83,8 @@ class CalculatorTools(Toolkit):
96
83
  try:
97
84
  result = a / b
98
85
  except Exception as e:
99
- return json.dumps({"operation": "division", "error": e, "result": "Error"})
100
- logger.info(f"Dividing {a} by {b} to get {result}")
86
+ return json.dumps({"operation": "division", "error": str(e), "result": "Error"})
87
+ log_debug(f"Dividing {a} by {b} to get {result}")
101
88
  return json.dumps({"operation": "division", "result": result})
102
89
 
103
90
  def exponentiate(self, a: float, b: float) -> str:
@@ -111,7 +98,7 @@ class CalculatorTools(Toolkit):
111
98
  str: JSON string of the result.
112
99
  """
113
100
  result = math.pow(a, b)
114
- logger.info(f"Raising {a} to the power of {b} to get {result}")
101
+ log_debug(f"Raising {a} to the power of {b} to get {result}")
115
102
  return json.dumps({"operation": "exponentiation", "result": result})
116
103
 
117
104
  def factorial(self, n: int) -> str:
@@ -127,7 +114,7 @@ class CalculatorTools(Toolkit):
127
114
  logger.error("Attempt to calculate factorial of a negative number")
128
115
  return json.dumps({"operation": "factorial", "error": "Factorial of a negative number is undefined"})
129
116
  result = math.factorial(n)
130
- logger.info(f"Calculating factorial of {n} to get {result}")
117
+ log_debug(f"Calculating factorial of {n} to get {result}")
131
118
  return json.dumps({"operation": "factorial", "result": result})
132
119
 
133
120
  def is_prime(self, n: int) -> str:
@@ -160,5 +147,5 @@ class CalculatorTools(Toolkit):
160
147
  return json.dumps({"operation": "square_root", "error": "Square root of a negative number is undefined"})
161
148
 
162
149
  result = math.sqrt(n)
163
- logger.info(f"Calculating square root of {n} to get {result}")
150
+ log_debug(f"Calculating square root of {n} to get {result}")
164
151
  return json.dumps({"operation": "square_root", "result": result})
agno/tools/cartesia.py ADDED
@@ -0,0 +1,187 @@
1
+ import json
2
+ from os import getenv
3
+ from typing import Any, Dict, List, Optional, Union
4
+ from uuid import uuid4
5
+
6
+ from agno.agent import Agent
7
+ from agno.media import Audio
8
+ from agno.team.team import Team
9
+ from agno.tools import Toolkit
10
+ from agno.tools.function import ToolResult
11
+ from agno.utils.log import log_debug, log_error, log_info
12
+
13
+ try:
14
+ import cartesia # type: ignore
15
+ except ImportError:
16
+ raise ImportError("`cartesia` not installed. Please install using `pip install cartesia`")
17
+
18
+
19
+ class CartesiaTools(Toolkit):
20
+ def __init__(
21
+ self,
22
+ api_key: Optional[str] = None,
23
+ model_id: str = "sonic-2",
24
+ default_voice_id: str = "78ab82d5-25be-4f7d-82b3-7ad64e5b85b2",
25
+ enable_text_to_speech: bool = True,
26
+ enable_list_voices: bool = True,
27
+ enable_localize_voice: bool = False,
28
+ all: bool = False,
29
+ **kwargs,
30
+ ):
31
+ self.api_key = api_key or getenv("CARTESIA_API_KEY")
32
+
33
+ if not self.api_key:
34
+ raise ValueError("CARTESIA_API_KEY not set. Please set the CARTESIA_API_KEY environment variable.")
35
+
36
+ self.client = cartesia.Cartesia(api_key=self.api_key)
37
+ self.model_id = model_id
38
+ self.default_voice_id = default_voice_id
39
+
40
+ tools: List[Any] = []
41
+ if all or enable_localize_voice:
42
+ tools.append(self.localize_voice)
43
+ if all or enable_text_to_speech:
44
+ tools.append(self.text_to_speech)
45
+ if all or enable_list_voices:
46
+ tools.append(self.list_voices)
47
+
48
+ super().__init__(name="cartesia_tools", tools=tools, **kwargs)
49
+
50
+ def list_voices(self) -> str:
51
+ """List available voices from Cartesia (first page).
52
+
53
+ Returns:
54
+ str: JSON string containing a list of voices, each with id, name, description, and language.
55
+ """
56
+ try:
57
+ voices = self.client.voices.list()
58
+
59
+ voice_objects = voices.items if voices else None
60
+
61
+ filtered_result = []
62
+ if voice_objects:
63
+ for voice in voice_objects:
64
+ try:
65
+ # Extract desired attributes from the Voice object
66
+ voice_data = {
67
+ "id": voice.id if hasattr(voice, "id") else None,
68
+ "name": voice.name if hasattr(voice, "name") else None,
69
+ "description": voice.description if hasattr(voice, "description") else None,
70
+ "language": voice.language if hasattr(voice, "language") else None,
71
+ }
72
+
73
+ if voice_data["id"]: # Only add if we could get an ID
74
+ filtered_result.append(voice_data)
75
+ else:
76
+ log_info(f"Could not extract 'id' from voice object: {voice}")
77
+ except AttributeError as ae:
78
+ log_error(f"AttributeError accessing voice data: {ae}. Voice data: {voice}")
79
+ continue
80
+ except Exception as inner_e:
81
+ log_error(f"Unexpected error processing voice: {inner_e}. Voice data: {voice}")
82
+ continue
83
+
84
+ return json.dumps(filtered_result, indent=4)
85
+ except Exception as e:
86
+ log_error(f"Error listing voices from Cartesia: {e}", exc_info=True)
87
+ return json.dumps({"error": str(e), "detail": "Error occurred in list_voices function."})
88
+
89
+ def localize_voice(
90
+ self,
91
+ name: str,
92
+ description: str,
93
+ language: str,
94
+ original_speaker_gender: str,
95
+ voice_id: Optional[str] = None,
96
+ ) -> str:
97
+ """Create a new voice localized to a different language.
98
+
99
+ Args:
100
+ name (str): The desired name for the new localized voice.
101
+ description (str): The description for the new localized voice.
102
+ language (str): The target language code (e.g., 'fr', 'es').
103
+ original_speaker_gender (str): The gender of the original speaker ("male" or "female").
104
+ voice_id (optional): The ID of an existing voice to use as the base. If None, uses the default voice ID configured in the tool. Defaults to None.
105
+
106
+ Returns:
107
+ str: JSON string containing the information of the newly created localized voice, including its 'id'.
108
+ """
109
+ localize_voice_id = voice_id or self.default_voice_id
110
+ log_debug(f"Using voice_id '{localize_voice_id}' for localization.")
111
+
112
+ try:
113
+ result = self.client.voices.localize(
114
+ voice_id=localize_voice_id,
115
+ name=name,
116
+ description=description,
117
+ language=language,
118
+ original_speaker_gender=original_speaker_gender,
119
+ )
120
+
121
+ if isinstance(result, dict):
122
+ return json.dumps(result, indent=4)
123
+ else:
124
+ return result.model_dump_json(indent=4)
125
+
126
+ except Exception as e:
127
+ log_error(f"Error localizing voice with Cartesia: {e}", exc_info=True)
128
+ return json.dumps({"error": str(e), "type": type(e).__name__})
129
+
130
+ def text_to_speech(
131
+ self,
132
+ agent: Union[Agent, Team],
133
+ transcript: str,
134
+ voice_id: Optional[str] = None,
135
+ ) -> ToolResult:
136
+ """
137
+ Convert text to speech.
138
+ Args:
139
+ transcript: The text to convert to speech
140
+ voice_id (optional): The ID of the voice to use for the text-to-speech. If None, uses the default voice ID configured in the tool. Defaults to None.
141
+
142
+ Returns:
143
+ ToolResult: A ToolResult containing the generated audio or error message.
144
+ """
145
+
146
+ try:
147
+ effective_voice_id = voice_id or self.default_voice_id
148
+
149
+ log_info(f"Using voice_id: {effective_voice_id} for text_to_speech.")
150
+ log_info(f"Using model_id: {self.model_id} for text_to_speech.")
151
+
152
+ output_format_sample_rate = 44100
153
+ requested_bit_rate = 128000
154
+ mime_type = "audio/mpeg"
155
+
156
+ output_format = {
157
+ "container": "mp3",
158
+ "sample_rate": output_format_sample_rate,
159
+ "bit_rate": requested_bit_rate,
160
+ "encoding": "mp3",
161
+ }
162
+
163
+ params: Dict[str, Any] = {
164
+ "model_id": self.model_id,
165
+ "transcript": transcript,
166
+ "voice": {"mode": "id", "id": effective_voice_id},
167
+ "output_format": output_format,
168
+ }
169
+
170
+ audio_iterator = self.client.tts.bytes(**params)
171
+ audio_data = b"".join(chunk for chunk in audio_iterator)
172
+
173
+ # Create AudioArtifact
174
+ audio_artifact = Audio(
175
+ id=str(uuid4()),
176
+ content=audio_data,
177
+ mime_type=mime_type, # Hardcoded to audio/mpeg
178
+ )
179
+
180
+ return ToolResult(
181
+ content="Audio generated and attached successfully.",
182
+ audios=[audio_artifact],
183
+ )
184
+
185
+ except Exception as e:
186
+ log_error(f"Error generating speech with Cartesia: {e}", exc_info=True)
187
+ return ToolResult(content=f"Error generating speech: {e}")
@@ -1,10 +1,10 @@
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
7
- from agno.utils.log import logger
7
+ from agno.utils.log import log_debug, logger
8
8
 
9
9
  try:
10
10
  import requests
@@ -17,18 +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,
20
+ **kwargs,
27
21
  ):
28
- super().__init__(name="clickup")
29
-
30
- self.api_key = api_key or os.getenv("CLICKUP_API_KEY")
31
- 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")
32
24
  self.base_url = "https://api.clickup.com/api/v2"
33
25
  self.headers = {"Authorization": self.api_key}
34
26
 
@@ -37,20 +29,17 @@ class ClickUpTools(Toolkit):
37
29
  if not self.master_space_id:
38
30
  raise ValueError("MASTER_SPACE_ID not set. Please set the MASTER_SPACE_ID environment variable.")
39
31
 
40
- if list_tasks:
41
- self.register(self.list_tasks)
42
- if create_task:
43
- self.register(self.create_task)
44
- if get_task:
45
- self.register(self.get_task)
46
- if update_task:
47
- self.register(self.update_task)
48
- if delete_task:
49
- self.register(self.delete_task)
50
- if list_spaces:
51
- self.register(self.list_spaces)
52
- if list_lists:
53
- self.register(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
+ ]
41
+
42
+ super().__init__(name="clickup", tools=tools, **kwargs)
54
43
 
55
44
  def _make_request(
56
45
  self, method: str, endpoint: str, params: Optional[Dict] = None, data: Optional[Dict] = None
@@ -175,7 +164,7 @@ class ClickUpTools(Toolkit):
175
164
 
176
165
  # Get first list in space
177
166
  response = self._make_request("GET", f"space/{space['id']}/list")
178
- logger.debug(f"Lists: {response}")
167
+ log_debug(f"Lists: {response}")
179
168
  lists_data = response.get("lists", [])
180
169
  if not lists_data:
181
170
  return json.dumps({"error": f"No lists found in space '{space_name}'"}, indent=2)
agno/tools/confluence.py CHANGED
@@ -1,9 +1,11 @@
1
1
  import json
2
2
  from os import getenv
3
- from typing import Optional
3
+ from typing import Any, List, Optional
4
+
5
+ import requests
4
6
 
5
7
  from agno.tools import Toolkit
6
- from agno.utils.log import logger
8
+ from agno.utils.log import log_info, logger
7
9
 
8
10
  try:
9
11
  from atlassian import Confluence
@@ -18,6 +20,8 @@ class ConfluenceTools(Toolkit):
18
20
  password: Optional[str] = None,
19
21
  url: Optional[str] = None,
20
22
  api_key: Optional[str] = None,
23
+ verify_ssl: bool = True,
24
+ **kwargs,
21
25
  ):
22
26
  """Initialize Confluence Tools with authentication credentials.
23
27
 
@@ -26,6 +30,7 @@ class ConfluenceTools(Toolkit):
26
30
  password (str, optional): Confluence password. Defaults to None.
27
31
  url (str, optional): Confluence instance URL. Defaults to None.
28
32
  api_key (str, optional): Confluence API key. Defaults to None.
33
+ verify_ssl (bool, optional): Whether to verify SSL certificates. Defaults to True.
29
34
 
30
35
  Notes:
31
36
  Credentials can be provided either through method arguments or environment variables:
@@ -34,32 +39,49 @@ class ConfluenceTools(Toolkit):
34
39
  - CONFLUENCE_API_KEY
35
40
  """
36
41
 
37
- super().__init__(name="confluence_tools")
38
42
  self.url = url or getenv("CONFLUENCE_URL")
39
43
  self.username = username or getenv("CONFLUENCE_USERNAME")
40
44
  self.password = api_key or getenv("CONFLUENCE_API_KEY") or password or getenv("CONFLUENCE_PASSWORD")
41
45
 
42
46
  if not self.url:
43
- logger.error(
47
+ raise ValueError(
44
48
  "Confluence URL not provided. Pass it in the constructor or set CONFLUENCE_URL in environment variable"
45
49
  )
46
50
 
47
51
  if not self.username:
48
- logger.error(
52
+ raise ValueError(
49
53
  "Confluence username not provided. Pass it in the constructor or set CONFLUENCE_USERNAME in environment variable"
50
54
  )
51
55
 
52
56
  if not self.password:
53
- logger.error("Confluence API KEY or password not provided")
57
+ raise ValueError("Confluence API KEY or password not provided")
58
+
59
+ session = requests.Session()
60
+ session.verify = verify_ssl
61
+
62
+ if not verify_ssl:
63
+ import urllib3
64
+
65
+ urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
66
+
67
+ self.confluence = Confluence(
68
+ url=self.url,
69
+ username=self.username,
70
+ password=self.password,
71
+ verify_ssl=verify_ssl,
72
+ session=session,
73
+ )
54
74
 
55
- self.confluence = Confluence(url=self.url, username=self.username, password=self.password)
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
+ ]
56
83
 
57
- self.register(self.get_page_content)
58
- self.register(self.get_space_key)
59
- self.register(self.create_page)
60
- self.register(self.update_page)
61
- self.register(self.get_all_space_detail)
62
- self.register(self.get_all_page_from_space)
84
+ super().__init__(name="confluence_tools", tools=tools, **kwargs)
63
85
 
64
86
  def get_page_content(self, space_name: str, page_title: str, expand: Optional[str] = "body.storage"):
65
87
  """Retrieve the content of a specific page in a Confluence space.
@@ -73,11 +95,14 @@ class ConfluenceTools(Toolkit):
73
95
  str: JSON-encoded page content or error message.
74
96
  """
75
97
  try:
76
- logger.info(f"Retrieving page content from space '{space_name}'")
98
+ log_info(f"Retrieving page content from space '{space_name}'")
77
99
  key = self.get_space_key(space_name=space_name)
100
+ if key == "No space found":
101
+ return json.dumps({"error": f"Space '{space_name}' not found"})
102
+
78
103
  page = self.confluence.get_page_by_title(key, page_title, expand=expand)
79
104
  if page:
80
- logger.info(f"Successfully retrieved page '{page_title}' from space '{space_name}'")
105
+ log_info(f"Successfully retrieved page '{page_title}' from space '{space_name}'")
81
106
  return json.dumps(page)
82
107
 
83
108
  logger.warning(f"Page '{page_title}' not found in space '{space_name}'")
@@ -93,8 +118,21 @@ class ConfluenceTools(Toolkit):
93
118
  Returns:
94
119
  str: List of space details as a string.
95
120
  """
96
- logger.info("Retrieving details for all Confluence spaces")
97
- results = self.confluence.get_all_spaces()["results"]
121
+ log_info("Retrieving details for all Confluence spaces")
122
+ results = []
123
+ start = 0
124
+ limit = 50
125
+
126
+ while True:
127
+ spaces_data = self.confluence.get_all_spaces(start=start, limit=limit)
128
+ if not spaces_data.get("results"):
129
+ break
130
+ results.extend(spaces_data["results"])
131
+
132
+ if len(spaces_data["results"]) < limit:
133
+ break
134
+ start += limit
135
+
98
136
  return str(results)
99
137
 
100
138
  def get_space_key(self, space_name: str):
@@ -106,13 +144,29 @@ class ConfluenceTools(Toolkit):
106
144
  Returns:
107
145
  str: Space key or "No space found" if space doesn't exist.
108
146
  """
109
- result = self.confluence.get_all_spaces()
110
- spaces = result["results"]
147
+ start = 0
148
+ limit = 50
111
149
 
112
- for space in spaces:
113
- if space["name"] == space_name:
114
- logger.info(f"Found space key for '{space_name}'")
115
- return space["key"]
150
+ while True:
151
+ result = self.confluence.get_all_spaces(start=start, limit=limit)
152
+ if not result.get("results"):
153
+ break
154
+
155
+ spaces = result["results"]
156
+
157
+ for space in spaces:
158
+ if space["name"].lower() == space_name.lower():
159
+ log_info(f"Found space key for '{space_name}': {space['key']}")
160
+ return space["key"]
161
+
162
+ for space in spaces:
163
+ if space["key"] == space_name:
164
+ log_info(f"'{space_name}' is already a space key")
165
+ return space_name
166
+
167
+ if len(spaces) < limit:
168
+ break
169
+ start += limit
116
170
 
117
171
  logger.warning(f"No space named {space_name} found")
118
172
  return "No space found"
@@ -126,11 +180,19 @@ class ConfluenceTools(Toolkit):
126
180
  Returns:
127
181
  list: Details of pages in the specified space.
128
182
  """
129
- logger.info(f"Retrieving all pages from space '{space_name}'")
183
+ log_info(f"Retrieving all pages from space '{space_name}'")
130
184
  space_key = self.get_space_key(space_name)
185
+
186
+ if space_key == "No space found":
187
+ return json.dumps({"error": f"Space '{space_name}' not found"})
188
+
131
189
  page_details = self.confluence.get_all_pages_from_space(
132
190
  space_key, status=None, expand=None, content_type="page"
133
191
  )
192
+
193
+ if not page_details:
194
+ return json.dumps({"error": f"No pages found in space '{space_name}'"})
195
+
134
196
  page_details = str([{"id": page["id"], "title": page["title"]} for page in page_details])
135
197
  return page_details
136
198
 
@@ -148,8 +210,11 @@ class ConfluenceTools(Toolkit):
148
210
  """
149
211
  try:
150
212
  space_key = self.get_space_key(space_name=space_name)
213
+ if space_key == "No space found":
214
+ return json.dumps({"error": f"Space '{space_name}' not found"})
215
+
151
216
  page = self.confluence.create_page(space_key, title, body, parent_id=parent_id)
152
- logger.info(f"Page created: {title} with ID {page['id']}")
217
+ log_info(f"Page created: {title} with ID {page['id']}")
153
218
  return json.dumps({"id": page["id"], "title": title})
154
219
  except Exception as e:
155
220
  logger.error(f"Error creating page '{title}': {e}")
@@ -168,7 +233,7 @@ class ConfluenceTools(Toolkit):
168
233
  """
169
234
  try:
170
235
  updated_page = self.confluence.update_page(page_id, title, body)
171
- logger.info(f"Page updated: {title} with ID {updated_page['id']}")
236
+ log_info(f"Page updated: {title} with ID {updated_page['id']}")
172
237
  return json.dumps({"status": "success", "id": updated_page["id"]})
173
238
  except Exception as e:
174
239
  logger.error(f"Error updating page '{title}': {e}")