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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (583) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2781 -4126
  4. agno/api/agent.py +9 -65
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +6 -17
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +9 -64
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1749 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1438 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +888 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1051 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1417 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +298 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1720 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +281 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1371 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1722 -0
  67. agno/db/singlestore/utils.py +327 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1680 -0
  71. agno/db/sqlite/utils.py +269 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +142 -43
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +10 -10
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1515 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +68 -15
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/knowledge/reader/gcs_reader.py +67 -0
  118. agno/{document → knowledge}/reader/json_reader.py +30 -9
  119. agno/{document → knowledge}/reader/markdown_reader.py +36 -9
  120. agno/{document → knowledge}/reader/pdf_reader.py +79 -21
  121. agno/knowledge/reader/reader_factory.py +275 -0
  122. agno/knowledge/reader/s3_reader.py +171 -0
  123. agno/{document → knowledge}/reader/text_reader.py +31 -10
  124. agno/knowledge/reader/url_reader.py +84 -0
  125. agno/knowledge/reader/web_search_reader.py +389 -0
  126. agno/{document → knowledge}/reader/website_reader.py +37 -10
  127. agno/knowledge/reader/wikipedia_reader.py +59 -0
  128. agno/knowledge/reader/youtube_reader.py +78 -0
  129. agno/knowledge/remote_content/remote_content.py +88 -0
  130. agno/{reranker → knowledge/reranker}/base.py +1 -1
  131. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  132. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  133. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  134. agno/knowledge/types.py +30 -0
  135. agno/knowledge/utils.py +169 -0
  136. agno/media.py +2 -2
  137. agno/memory/__init__.py +2 -10
  138. agno/memory/manager.py +1003 -148
  139. agno/models/aimlapi/__init__.py +2 -2
  140. agno/models/aimlapi/aimlapi.py +6 -6
  141. agno/models/anthropic/claude.py +129 -82
  142. agno/models/aws/bedrock.py +107 -175
  143. agno/models/aws/claude.py +64 -18
  144. agno/models/azure/ai_foundry.py +73 -23
  145. agno/models/base.py +347 -287
  146. agno/models/cerebras/cerebras.py +84 -27
  147. agno/models/cohere/chat.py +106 -98
  148. agno/models/dashscope/dashscope.py +14 -5
  149. agno/models/google/gemini.py +123 -53
  150. agno/models/groq/groq.py +97 -35
  151. agno/models/huggingface/huggingface.py +92 -27
  152. agno/models/ibm/watsonx.py +72 -13
  153. agno/models/litellm/chat.py +85 -13
  154. agno/models/message.py +38 -144
  155. agno/models/meta/llama.py +85 -49
  156. agno/models/metrics.py +120 -0
  157. agno/models/mistral/mistral.py +90 -21
  158. agno/models/ollama/__init__.py +0 -2
  159. agno/models/ollama/chat.py +84 -46
  160. agno/models/openai/chat.py +135 -27
  161. agno/models/openai/responses.py +233 -115
  162. agno/models/perplexity/perplexity.py +26 -2
  163. agno/models/portkey/portkey.py +0 -7
  164. agno/models/response.py +14 -8
  165. agno/models/utils.py +20 -0
  166. agno/models/vercel/__init__.py +2 -2
  167. agno/models/vercel/v0.py +1 -1
  168. agno/models/vllm/__init__.py +2 -2
  169. agno/models/vllm/vllm.py +3 -3
  170. agno/models/xai/xai.py +10 -10
  171. agno/os/__init__.py +3 -0
  172. agno/os/app.py +393 -0
  173. agno/os/auth.py +47 -0
  174. agno/os/config.py +103 -0
  175. agno/os/interfaces/agui/__init__.py +3 -0
  176. agno/os/interfaces/agui/agui.py +31 -0
  177. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  178. agno/{app → os/interfaces}/agui/utils.py +65 -28
  179. agno/os/interfaces/base.py +21 -0
  180. agno/os/interfaces/slack/__init__.py +3 -0
  181. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  182. agno/os/interfaces/slack/slack.py +33 -0
  183. agno/os/interfaces/whatsapp/__init__.py +3 -0
  184. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  185. agno/os/interfaces/whatsapp/whatsapp.py +30 -0
  186. agno/os/router.py +843 -0
  187. agno/os/routers/__init__.py +3 -0
  188. agno/os/routers/evals/__init__.py +3 -0
  189. agno/os/routers/evals/evals.py +204 -0
  190. agno/os/routers/evals/schemas.py +142 -0
  191. agno/os/routers/evals/utils.py +161 -0
  192. agno/os/routers/knowledge/__init__.py +3 -0
  193. agno/os/routers/knowledge/knowledge.py +413 -0
  194. agno/os/routers/knowledge/schemas.py +118 -0
  195. agno/os/routers/memory/__init__.py +3 -0
  196. agno/os/routers/memory/memory.py +179 -0
  197. agno/os/routers/memory/schemas.py +58 -0
  198. agno/os/routers/metrics/__init__.py +3 -0
  199. agno/os/routers/metrics/metrics.py +58 -0
  200. agno/os/routers/metrics/schemas.py +47 -0
  201. agno/os/routers/session/__init__.py +3 -0
  202. agno/os/routers/session/session.py +163 -0
  203. agno/os/schema.py +892 -0
  204. agno/{app/playground → os}/settings.py +8 -15
  205. agno/os/utils.py +270 -0
  206. agno/reasoning/azure_ai_foundry.py +4 -4
  207. agno/reasoning/deepseek.py +4 -4
  208. agno/reasoning/default.py +6 -11
  209. agno/reasoning/groq.py +4 -4
  210. agno/reasoning/helpers.py +4 -6
  211. agno/reasoning/ollama.py +4 -4
  212. agno/reasoning/openai.py +4 -4
  213. agno/run/{response.py → agent.py} +144 -72
  214. agno/run/base.py +44 -58
  215. agno/run/cancel.py +83 -0
  216. agno/run/team.py +133 -77
  217. agno/run/workflow.py +537 -12
  218. agno/session/__init__.py +10 -0
  219. agno/session/agent.py +244 -0
  220. agno/session/summary.py +225 -0
  221. agno/session/team.py +262 -0
  222. agno/{storage/session/v2 → session}/workflow.py +47 -24
  223. agno/team/__init__.py +15 -16
  224. agno/team/team.py +2967 -4243
  225. agno/tools/agentql.py +14 -5
  226. agno/tools/airflow.py +9 -4
  227. agno/tools/api.py +7 -3
  228. agno/tools/apify.py +2 -46
  229. agno/tools/arxiv.py +8 -3
  230. agno/tools/aws_lambda.py +7 -5
  231. agno/tools/aws_ses.py +7 -1
  232. agno/tools/baidusearch.py +4 -1
  233. agno/tools/bitbucket.py +4 -4
  234. agno/tools/brandfetch.py +14 -11
  235. agno/tools/bravesearch.py +4 -1
  236. agno/tools/brightdata.py +42 -22
  237. agno/tools/browserbase.py +13 -4
  238. agno/tools/calcom.py +12 -10
  239. agno/tools/calculator.py +10 -27
  240. agno/tools/cartesia.py +18 -13
  241. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  242. agno/tools/confluence.py +71 -18
  243. agno/tools/crawl4ai.py +7 -1
  244. agno/tools/csv_toolkit.py +9 -8
  245. agno/tools/dalle.py +18 -11
  246. agno/tools/daytona.py +13 -16
  247. agno/tools/decorator.py +6 -3
  248. agno/tools/desi_vocal.py +16 -7
  249. agno/tools/discord.py +11 -8
  250. agno/tools/docker.py +30 -42
  251. agno/tools/duckdb.py +34 -53
  252. agno/tools/duckduckgo.py +8 -7
  253. agno/tools/e2b.py +62 -62
  254. agno/tools/eleven_labs.py +35 -28
  255. agno/tools/email.py +4 -1
  256. agno/tools/evm.py +7 -1
  257. agno/tools/exa.py +19 -14
  258. agno/tools/fal.py +29 -29
  259. agno/tools/file.py +9 -8
  260. agno/tools/financial_datasets.py +25 -44
  261. agno/tools/firecrawl.py +22 -22
  262. agno/tools/function.py +68 -17
  263. agno/tools/giphy.py +22 -10
  264. agno/tools/github.py +48 -126
  265. agno/tools/gmail.py +46 -62
  266. agno/tools/google_bigquery.py +7 -6
  267. agno/tools/google_maps.py +11 -26
  268. agno/tools/googlesearch.py +7 -2
  269. agno/tools/googlesheets.py +21 -17
  270. agno/tools/hackernews.py +9 -5
  271. agno/tools/jina.py +5 -4
  272. agno/tools/jira.py +18 -9
  273. agno/tools/knowledge.py +31 -32
  274. agno/tools/linear.py +18 -33
  275. agno/tools/linkup.py +5 -1
  276. agno/tools/local_file_system.py +8 -5
  277. agno/tools/lumalab.py +31 -19
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +32 -14
  282. agno/tools/models/gemini.py +58 -31
  283. agno/tools/models/groq.py +29 -20
  284. agno/tools/models/nebius.py +27 -11
  285. agno/tools/models_labs.py +39 -15
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +134 -0
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +57 -26
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +62 -46
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +54 -41
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +95 -118
  335. agno/utils/knowledge.py +29 -0
  336. agno/utils/location.py +2 -2
  337. agno/utils/log.py +2 -2
  338. agno/utils/mcp.py +11 -5
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/claude.py +6 -4
  342. agno/utils/models/mistral.py +8 -7
  343. agno/utils/models/schema_utils.py +3 -3
  344. agno/utils/pprint.py +33 -32
  345. agno/utils/print_response/agent.py +779 -0
  346. agno/utils/print_response/team.py +1565 -0
  347. agno/utils/print_response/workflow.py +1451 -0
  348. agno/utils/prompts.py +14 -14
  349. agno/utils/reasoning.py +87 -0
  350. agno/utils/response.py +42 -42
  351. agno/utils/string.py +8 -22
  352. agno/utils/team.py +50 -0
  353. agno/utils/timer.py +2 -2
  354. agno/vectordb/base.py +33 -21
  355. agno/vectordb/cassandra/cassandra.py +287 -23
  356. agno/vectordb/chroma/chromadb.py +482 -59
  357. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  358. agno/vectordb/couchbase/couchbase.py +309 -29
  359. agno/vectordb/lancedb/lance_db.py +360 -21
  360. agno/vectordb/langchaindb/__init__.py +5 -0
  361. agno/vectordb/langchaindb/langchaindb.py +145 -0
  362. agno/vectordb/lightrag/__init__.py +5 -0
  363. agno/vectordb/lightrag/lightrag.py +374 -0
  364. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  365. agno/vectordb/milvus/milvus.py +242 -32
  366. agno/vectordb/mongodb/mongodb.py +200 -24
  367. agno/vectordb/pgvector/pgvector.py +319 -37
  368. agno/vectordb/pineconedb/pineconedb.py +221 -27
  369. agno/vectordb/qdrant/qdrant.py +356 -14
  370. agno/vectordb/singlestore/singlestore.py +286 -29
  371. agno/vectordb/surrealdb/surrealdb.py +187 -7
  372. agno/vectordb/upstashdb/upstashdb.py +342 -26
  373. agno/vectordb/weaviate/weaviate.py +227 -165
  374. agno/workflow/__init__.py +17 -13
  375. agno/workflow/{v2/condition.py → condition.py} +135 -32
  376. agno/workflow/{v2/loop.py → loop.py} +115 -28
  377. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  378. agno/workflow/{v2/router.py → router.py} +133 -32
  379. agno/workflow/{v2/step.py → step.py} +200 -42
  380. agno/workflow/{v2/steps.py → steps.py} +147 -66
  381. agno/workflow/types.py +482 -0
  382. agno/workflow/workflow.py +2394 -696
  383. agno-2.0.0a1.dist-info/METADATA +355 -0
  384. agno-2.0.0a1.dist-info/RECORD +514 -0
  385. agno/agent/metrics.py +0 -107
  386. agno/api/app.py +0 -35
  387. agno/api/playground.py +0 -92
  388. agno/api/schemas/app.py +0 -12
  389. agno/api/schemas/playground.py +0 -22
  390. agno/api/schemas/user.py +0 -35
  391. agno/api/schemas/workspace.py +0 -46
  392. agno/api/user.py +0 -160
  393. agno/api/workflows.py +0 -33
  394. agno/api/workspace.py +0 -175
  395. agno/app/agui/__init__.py +0 -3
  396. agno/app/agui/app.py +0 -17
  397. agno/app/agui/sync_router.py +0 -120
  398. agno/app/base.py +0 -186
  399. agno/app/discord/__init__.py +0 -3
  400. agno/app/fastapi/__init__.py +0 -3
  401. agno/app/fastapi/app.py +0 -107
  402. agno/app/fastapi/async_router.py +0 -457
  403. agno/app/fastapi/sync_router.py +0 -448
  404. agno/app/playground/app.py +0 -228
  405. agno/app/playground/async_router.py +0 -1050
  406. agno/app/playground/deploy.py +0 -249
  407. agno/app/playground/operator.py +0 -183
  408. agno/app/playground/schemas.py +0 -220
  409. agno/app/playground/serve.py +0 -55
  410. agno/app/playground/sync_router.py +0 -1042
  411. agno/app/playground/utils.py +0 -46
  412. agno/app/settings.py +0 -15
  413. agno/app/slack/__init__.py +0 -3
  414. agno/app/slack/app.py +0 -19
  415. agno/app/slack/sync_router.py +0 -92
  416. agno/app/utils.py +0 -54
  417. agno/app/whatsapp/__init__.py +0 -3
  418. agno/app/whatsapp/app.py +0 -15
  419. agno/app/whatsapp/sync_router.py +0 -197
  420. agno/cli/auth_server.py +0 -249
  421. agno/cli/config.py +0 -274
  422. agno/cli/console.py +0 -88
  423. agno/cli/credentials.py +0 -23
  424. agno/cli/entrypoint.py +0 -571
  425. agno/cli/operator.py +0 -357
  426. agno/cli/settings.py +0 -96
  427. agno/cli/ws/ws_cli.py +0 -817
  428. agno/constants.py +0 -13
  429. agno/document/__init__.py +0 -5
  430. agno/document/chunking/semantic.py +0 -45
  431. agno/document/chunking/strategy.py +0 -31
  432. agno/document/reader/__init__.py +0 -5
  433. agno/document/reader/base.py +0 -47
  434. agno/document/reader/docx_reader.py +0 -60
  435. agno/document/reader/gcs/pdf_reader.py +0 -44
  436. agno/document/reader/s3/pdf_reader.py +0 -59
  437. agno/document/reader/s3/text_reader.py +0 -63
  438. agno/document/reader/url_reader.py +0 -59
  439. agno/document/reader/youtube_reader.py +0 -58
  440. agno/embedder/__init__.py +0 -5
  441. agno/embedder/langdb.py +0 -80
  442. agno/embedder/mistral.py +0 -82
  443. agno/embedder/openai.py +0 -78
  444. agno/file/__init__.py +0 -5
  445. agno/file/file.py +0 -16
  446. agno/file/local/csv.py +0 -32
  447. agno/file/local/txt.py +0 -19
  448. agno/infra/app.py +0 -240
  449. agno/infra/base.py +0 -144
  450. agno/infra/context.py +0 -20
  451. agno/infra/db_app.py +0 -52
  452. agno/infra/resource.py +0 -205
  453. agno/infra/resources.py +0 -55
  454. agno/knowledge/agent.py +0 -698
  455. agno/knowledge/arxiv.py +0 -33
  456. agno/knowledge/combined.py +0 -36
  457. agno/knowledge/csv.py +0 -144
  458. agno/knowledge/csv_url.py +0 -124
  459. agno/knowledge/document.py +0 -223
  460. agno/knowledge/docx.py +0 -137
  461. agno/knowledge/firecrawl.py +0 -34
  462. agno/knowledge/gcs/__init__.py +0 -0
  463. agno/knowledge/gcs/base.py +0 -39
  464. agno/knowledge/gcs/pdf.py +0 -125
  465. agno/knowledge/json.py +0 -137
  466. agno/knowledge/langchain.py +0 -71
  467. agno/knowledge/light_rag.py +0 -273
  468. agno/knowledge/llamaindex.py +0 -66
  469. agno/knowledge/markdown.py +0 -154
  470. agno/knowledge/pdf.py +0 -164
  471. agno/knowledge/pdf_bytes.py +0 -42
  472. agno/knowledge/pdf_url.py +0 -148
  473. agno/knowledge/s3/__init__.py +0 -0
  474. agno/knowledge/s3/base.py +0 -64
  475. agno/knowledge/s3/pdf.py +0 -33
  476. agno/knowledge/s3/text.py +0 -34
  477. agno/knowledge/text.py +0 -141
  478. agno/knowledge/url.py +0 -46
  479. agno/knowledge/website.py +0 -179
  480. agno/knowledge/wikipedia.py +0 -32
  481. agno/knowledge/youtube.py +0 -35
  482. agno/memory/agent.py +0 -423
  483. agno/memory/classifier.py +0 -104
  484. agno/memory/db/__init__.py +0 -5
  485. agno/memory/db/base.py +0 -42
  486. agno/memory/db/mongodb.py +0 -189
  487. agno/memory/db/postgres.py +0 -203
  488. agno/memory/db/sqlite.py +0 -193
  489. agno/memory/memory.py +0 -22
  490. agno/memory/row.py +0 -36
  491. agno/memory/summarizer.py +0 -201
  492. agno/memory/summary.py +0 -19
  493. agno/memory/team.py +0 -415
  494. agno/memory/v2/__init__.py +0 -2
  495. agno/memory/v2/db/__init__.py +0 -1
  496. agno/memory/v2/db/base.py +0 -42
  497. agno/memory/v2/db/firestore.py +0 -339
  498. agno/memory/v2/db/mongodb.py +0 -196
  499. agno/memory/v2/db/postgres.py +0 -214
  500. agno/memory/v2/db/redis.py +0 -187
  501. agno/memory/v2/db/schema.py +0 -54
  502. agno/memory/v2/db/sqlite.py +0 -209
  503. agno/memory/v2/manager.py +0 -437
  504. agno/memory/v2/memory.py +0 -1097
  505. agno/memory/v2/schema.py +0 -55
  506. agno/memory/v2/summarizer.py +0 -215
  507. agno/memory/workflow.py +0 -38
  508. agno/models/ollama/tools.py +0 -430
  509. agno/models/qwen/__init__.py +0 -5
  510. agno/playground/__init__.py +0 -10
  511. agno/playground/deploy.py +0 -3
  512. agno/playground/playground.py +0 -3
  513. agno/playground/serve.py +0 -3
  514. agno/playground/settings.py +0 -3
  515. agno/reranker/__init__.py +0 -0
  516. agno/run/v2/__init__.py +0 -0
  517. agno/run/v2/workflow.py +0 -567
  518. agno/storage/__init__.py +0 -0
  519. agno/storage/agent/__init__.py +0 -0
  520. agno/storage/agent/dynamodb.py +0 -1
  521. agno/storage/agent/json.py +0 -1
  522. agno/storage/agent/mongodb.py +0 -1
  523. agno/storage/agent/postgres.py +0 -1
  524. agno/storage/agent/singlestore.py +0 -1
  525. agno/storage/agent/sqlite.py +0 -1
  526. agno/storage/agent/yaml.py +0 -1
  527. agno/storage/base.py +0 -60
  528. agno/storage/dynamodb.py +0 -673
  529. agno/storage/firestore.py +0 -297
  530. agno/storage/gcs_json.py +0 -261
  531. agno/storage/in_memory.py +0 -234
  532. agno/storage/json.py +0 -237
  533. agno/storage/mongodb.py +0 -328
  534. agno/storage/mysql.py +0 -685
  535. agno/storage/postgres.py +0 -682
  536. agno/storage/redis.py +0 -336
  537. agno/storage/session/__init__.py +0 -16
  538. agno/storage/session/agent.py +0 -64
  539. agno/storage/session/team.py +0 -63
  540. agno/storage/session/v2/__init__.py +0 -5
  541. agno/storage/session/workflow.py +0 -61
  542. agno/storage/singlestore.py +0 -606
  543. agno/storage/sqlite.py +0 -646
  544. agno/storage/workflow/__init__.py +0 -0
  545. agno/storage/workflow/mongodb.py +0 -1
  546. agno/storage/workflow/postgres.py +0 -1
  547. agno/storage/workflow/sqlite.py +0 -1
  548. agno/storage/yaml.py +0 -241
  549. agno/tools/thinking.py +0 -73
  550. agno/utils/defaults.py +0 -57
  551. agno/utils/filesystem.py +0 -39
  552. agno/utils/git.py +0 -52
  553. agno/utils/json_io.py +0 -30
  554. agno/utils/load_env.py +0 -19
  555. agno/utils/py_io.py +0 -19
  556. agno/utils/pyproject.py +0 -18
  557. agno/utils/resource_filter.py +0 -31
  558. agno/workflow/v2/__init__.py +0 -21
  559. agno/workflow/v2/types.py +0 -357
  560. agno/workflow/v2/workflow.py +0 -3312
  561. agno/workspace/__init__.py +0 -0
  562. agno/workspace/config.py +0 -325
  563. agno/workspace/enums.py +0 -6
  564. agno/workspace/helpers.py +0 -52
  565. agno/workspace/operator.py +0 -757
  566. agno/workspace/settings.py +0 -158
  567. agno-1.8.0.dist-info/METADATA +0 -979
  568. agno-1.8.0.dist-info/RECORD +0 -565
  569. agno-1.8.0.dist-info/entry_points.txt +0 -3
  570. /agno/{app → db/migrations}/__init__.py +0 -0
  571. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  572. /agno/{cli → integrations}/__init__.py +0 -0
  573. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  574. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  575. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  576. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  577. /agno/{app → os/interfaces}/slack/security.py +0 -0
  578. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  579. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  580. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  581. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  582. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  583. {agno-1.8.0.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
agno/tools/giphy.py CHANGED
@@ -1,5 +1,5 @@
1
- import os
2
1
  import uuid
2
+ from os import getenv
3
3
  from typing import Any, List, Optional, Union
4
4
 
5
5
  import httpx
@@ -8,6 +8,7 @@ from agno.agent import Agent
8
8
  from agno.media import ImageArtifact
9
9
  from agno.team.team import Team
10
10
  from agno.tools import Toolkit
11
+ from agno.tools.function import ToolResult
11
12
  from agno.utils.log import logger
12
13
 
13
14
 
@@ -16,6 +17,8 @@ class GiphyTools(Toolkit):
16
17
  self,
17
18
  api_key: Optional[str] = None,
18
19
  limit: int = 1,
20
+ enable_search_gifs: bool = True,
21
+ all: bool = False,
19
22
  **kwargs,
20
23
  ):
21
24
  """Initialize Giphy tools.
@@ -23,27 +26,29 @@ class GiphyTools(Toolkit):
23
26
  Args:
24
27
  api_key: Giphy API key. Defaults to GIPHY_API_KEY environment variable.
25
28
  limit: Number of GIFs to return. Defaults to 1.
26
- search_gifs: Whether to enable GIF search functionality. Defaults to True.
29
+ enable_search_gifs: Whether to enable GIF search functionality. Defaults to True.
30
+ all: Enable all functions. Defaults to False.
27
31
  """
28
- self.api_key = api_key or os.getenv("GIPHY_API_KEY")
32
+ self.api_key = api_key or getenv("GIPHY_API_KEY")
29
33
  if not self.api_key:
30
34
  logger.error("No Giphy API key provided")
31
35
 
32
36
  self.limit: int = limit
33
37
 
34
38
  tools: List[Any] = []
35
- tools.append(self.search_gifs)
39
+ if all or enable_search_gifs:
40
+ tools.append(self.search_gifs)
36
41
 
37
42
  super().__init__(name="giphy_tools", tools=tools, **kwargs)
38
43
 
39
- def search_gifs(self, agent: Union[Agent, Team], query: str) -> str:
44
+ def search_gifs(self, agent: Union[Agent, Team], query: str) -> ToolResult:
40
45
  """Find a GIPHY gif
41
46
 
42
47
  Args:
43
48
  query (str): A text description of the required gif.
44
49
 
45
50
  Returns:
46
- result (str): A string containing urls of GIFs found
51
+ ToolResult: Contains the found GIF images or error message.
47
52
  """
48
53
 
49
54
  base_url = "https://api.giphy.com/v1/gifs/search"
@@ -60,6 +65,8 @@ class GiphyTools(Toolkit):
60
65
  # Extract the GIF URLs
61
66
  data = response.json()
62
67
  gif_urls = []
68
+ image_artifacts = []
69
+
63
70
  for gif in data.get("data", []):
64
71
  images = gif.get("images", {})
65
72
  original_image = images["original"]
@@ -69,13 +76,18 @@ class GiphyTools(Toolkit):
69
76
  alt_text = gif["alt_text"]
70
77
  gif_urls.append(gif_url)
71
78
 
72
- agent.add_image(ImageArtifact(id=media_id, url=gif_url, alt_text=alt_text, revised_prompt=query))
79
+ # Create ImageArtifact for the GIF
80
+ image_artifact = ImageArtifact(id=media_id, url=gif_url, alt_text=alt_text, revised_prompt=query)
81
+ image_artifacts.append(image_artifact)
73
82
 
74
- return f"These are the found gifs {gif_urls}"
83
+ if image_artifacts:
84
+ return ToolResult(content=f"Found {len(gif_urls)} GIF(s): {gif_urls}", images=image_artifacts)
85
+ else:
86
+ return ToolResult(content="No gifs found")
75
87
 
76
88
  except httpx.HTTPStatusError as e:
77
89
  logger.error(f"HTTP error occurred: {e.response.status_code} - {e.response.text}")
90
+ return ToolResult(content=f"HTTP error occurred: {e.response.status_code}")
78
91
  except Exception as e:
79
92
  logger.error(f"An error occurred: {e}")
80
-
81
- return "No gifs found"
93
+ return ToolResult(content=f"An error occurred: {e}")
agno/tools/github.py CHANGED
@@ -7,7 +7,6 @@ from agno.utils.log import log_debug, logger
7
7
 
8
8
  try:
9
9
  from github import Auth, Github, GithubException
10
- from github.GithubObject import NotSet
11
10
 
12
11
  except ImportError:
13
12
  raise ImportError("`PyGithub` not installed. Please install using `pip install pygithub`")
@@ -18,45 +17,6 @@ class GithubTools(Toolkit):
18
17
  self,
19
18
  access_token: Optional[str] = None,
20
19
  base_url: Optional[str] = None,
21
- search_repositories: bool = True,
22
- list_repositories: bool = False,
23
- get_repository: bool = False,
24
- get_pull_request: bool = False,
25
- get_pull_request_changes: bool = False,
26
- create_issue: bool = False,
27
- create_repository: bool = False,
28
- delete_repository: bool = False,
29
- get_repository_languages: bool = False,
30
- list_branches: bool = False,
31
- get_pull_request_count: bool = False,
32
- get_repository_stars: bool = False,
33
- get_pull_requests: bool = False,
34
- get_pull_request_comments: bool = False,
35
- create_pull_request_comment: bool = False,
36
- edit_pull_request_comment: bool = False,
37
- get_pull_request_with_details: bool = False,
38
- get_repository_with_stats: bool = False,
39
- list_issues: bool = False,
40
- get_issue: bool = False,
41
- comment_on_issue: bool = False,
42
- close_issue: bool = False,
43
- reopen_issue: bool = False,
44
- assign_issue: bool = False,
45
- label_issue: bool = False,
46
- list_issue_comments: bool = False,
47
- edit_issue: bool = False,
48
- create_pull_request: bool = False,
49
- create_file: bool = False,
50
- get_file_content: bool = False,
51
- update_file: bool = True,
52
- delete_file: bool = False,
53
- get_directory_content: bool = False,
54
- get_branch_content: bool = False,
55
- create_branch: bool = False,
56
- set_default_branch: bool = False,
57
- search_code: bool = False,
58
- search_issues_and_prs: bool = False,
59
- create_review_request: bool = False,
60
20
  **kwargs,
61
21
  ):
62
22
  self.access_token = access_token or getenv("GITHUB_ACCESS_TOKEN")
@@ -64,85 +24,47 @@ class GithubTools(Toolkit):
64
24
 
65
25
  self.g = self.authenticate()
66
26
 
67
- tools: List[Any] = []
68
- if search_repositories:
69
- tools.append(self.search_repositories)
70
- if list_repositories:
71
- tools.append(self.list_repositories)
72
- if get_repository:
73
- tools.append(self.get_repository)
74
- if get_pull_request:
75
- tools.append(self.get_pull_request)
76
- if get_pull_request_changes:
77
- tools.append(self.get_pull_request_changes)
78
- if create_issue:
79
- tools.append(self.create_issue)
80
- if create_repository:
81
- tools.append(self.create_repository)
82
- if delete_repository:
83
- tools.append(self.delete_repository)
84
- if list_branches:
85
- tools.append(self.list_branches)
86
- if get_repository_languages:
87
- tools.append(self.get_repository_languages)
88
- if get_pull_request_count:
89
- tools.append(self.get_pull_request_count)
90
- if get_repository_stars:
91
- tools.append(self.get_repository_stars)
92
- if get_pull_requests:
93
- tools.append(self.get_pull_requests)
94
- if get_pull_request_comments:
95
- tools.append(self.get_pull_request_comments)
96
- if create_pull_request_comment:
97
- tools.append(self.create_pull_request_comment)
98
- if edit_pull_request_comment:
99
- tools.append(self.edit_pull_request_comment)
100
- if get_pull_request_with_details:
101
- tools.append(self.get_pull_request_with_details)
102
- if get_repository_with_stats:
103
- tools.append(self.get_repository_with_stats)
104
- if list_issues:
105
- tools.append(self.list_issues)
106
- if get_issue:
107
- tools.append(self.get_issue)
108
- if comment_on_issue:
109
- tools.append(self.comment_on_issue)
110
- if close_issue:
111
- tools.append(self.close_issue)
112
- if reopen_issue:
113
- tools.append(self.reopen_issue)
114
- if assign_issue:
115
- tools.append(self.assign_issue)
116
- if label_issue:
117
- tools.append(self.label_issue)
118
- if list_issue_comments:
119
- tools.append(self.list_issue_comments)
120
- if edit_issue:
121
- tools.append(self.edit_issue)
122
- if create_pull_request:
123
- tools.append(self.create_pull_request)
124
- if create_file:
125
- tools.append(self.create_file)
126
- if get_file_content:
127
- tools.append(self.get_file_content)
128
- if update_file:
129
- tools.append(self.update_file)
130
- if delete_file:
131
- tools.append(self.delete_file)
132
- if get_directory_content:
133
- tools.append(self.get_directory_content)
134
- if get_branch_content:
135
- tools.append(self.get_branch_content)
136
- if create_branch:
137
- tools.append(self.create_branch)
138
- if set_default_branch:
139
- tools.append(self.set_default_branch)
140
- if search_code:
141
- tools.append(self.search_code)
142
- if search_issues_and_prs:
143
- tools.append(self.search_issues_and_prs)
144
- if create_review_request:
145
- tools.append(self.create_review_request)
27
+ tools: List[Any] = [
28
+ self.search_repositories,
29
+ self.list_repositories,
30
+ self.get_repository,
31
+ self.get_pull_request,
32
+ self.get_pull_request_changes,
33
+ self.create_issue,
34
+ self.create_repository,
35
+ self.delete_repository,
36
+ self.list_branches,
37
+ self.get_repository_languages,
38
+ self.get_pull_request_count,
39
+ self.get_repository_stars,
40
+ self.get_pull_requests,
41
+ self.get_pull_request_comments,
42
+ self.create_pull_request_comment,
43
+ self.edit_pull_request_comment,
44
+ self.get_pull_request_with_details,
45
+ self.get_repository_with_stats,
46
+ self.list_issues,
47
+ self.get_issue,
48
+ self.comment_on_issue,
49
+ self.close_issue,
50
+ self.reopen_issue,
51
+ self.assign_issue,
52
+ self.label_issue,
53
+ self.list_issue_comments,
54
+ self.edit_issue,
55
+ self.create_pull_request,
56
+ self.create_file,
57
+ self.get_file_content,
58
+ self.update_file,
59
+ self.delete_file,
60
+ self.get_directory_content,
61
+ self.get_branch_content,
62
+ self.create_branch,
63
+ self.set_default_branch,
64
+ self.search_code,
65
+ self.search_issues_and_prs,
66
+ self.create_review_request,
67
+ ]
146
68
 
147
69
  super().__init__(name="github", tools=tools, **kwargs)
148
70
 
@@ -428,7 +350,7 @@ class GithubTools(Toolkit):
428
350
  logger.error(f"Error getting pull request changes: {e}")
429
351
  return json.dumps({"error": str(e)})
430
352
 
431
- def create_issue(self, repo_name: str, title: str, body: Optional[str] = NotSet) -> str:
353
+ def create_issue(self, repo_name: str, title: str, body: Optional[str] = None) -> str:
432
354
  """Create an issue in a repository.
433
355
 
434
356
  Args:
@@ -442,7 +364,7 @@ class GithubTools(Toolkit):
442
364
  log_debug(f"Creating issue in repository: {repo_name}")
443
365
  try:
444
366
  repo = self.g.get_repo(repo_name)
445
- issue = repo.create_issue(title=title, body=body)
367
+ issue = repo.create_issue(title=title, body=body) # type: ignore
446
368
  issue_info = {
447
369
  "id": issue.id,
448
370
  "number": issue.number,
@@ -697,8 +619,8 @@ class GithubTools(Toolkit):
697
619
  self,
698
620
  repo_name: str,
699
621
  issue_number: int,
700
- title: Optional[str] = NotSet,
701
- body: Optional[str] = NotSet,
622
+ title: Optional[str] = None,
623
+ body: Optional[str] = None,
702
624
  ) -> str:
703
625
  """Edit the title or body of an issue.
704
626
 
@@ -715,7 +637,7 @@ class GithubTools(Toolkit):
715
637
  try:
716
638
  repo = self.g.get_repo(repo_name)
717
639
  issue = repo.get_issue(number=issue_number)
718
- issue.edit(title=title, body=body)
640
+ issue.edit(title=title, body=body) # type: ignore
719
641
  return json.dumps({"message": f"Issue #{issue_number} updated."}, indent=2)
720
642
  except GithubException as e:
721
643
  logger.error(f"Error editing issue: {e}")
@@ -1324,7 +1246,7 @@ class GithubTools(Toolkit):
1324
1246
  path: str,
1325
1247
  content: str,
1326
1248
  message: str,
1327
- branch: Optional[str] = NotSet,
1249
+ branch: Optional[str] = None,
1328
1250
  ) -> str:
1329
1251
  """Create a new file in a repository.
1330
1252
 
@@ -1350,7 +1272,7 @@ class GithubTools(Toolkit):
1350
1272
 
1351
1273
  # Extract relevant information
1352
1274
  file_info = {
1353
- "path": result["content"].path,
1275
+ "path": result["content"].path, # type: ignore
1354
1276
  "sha": result["content"].sha,
1355
1277
  "url": result["content"].html_url,
1356
1278
  "commit": {
agno/tools/gmail.py CHANGED
@@ -101,17 +101,6 @@ class GmailTools(Toolkit):
101
101
 
102
102
  def __init__(
103
103
  self,
104
- get_latest_emails: bool = True,
105
- get_emails_from_user: bool = True,
106
- get_unread_emails: bool = True,
107
- get_starred_emails: bool = True,
108
- get_emails_by_context: bool = True,
109
- get_emails_by_date: bool = True,
110
- get_emails_by_thread: bool = True,
111
- create_draft_email: bool = True,
112
- send_email: bool = True,
113
- send_email_reply: bool = True,
114
- search_emails: bool = True,
115
104
  creds: Optional[Credentials] = None,
116
105
  credentials_path: Optional[str] = None,
117
106
  token_path: Optional[str] = None,
@@ -122,18 +111,7 @@ class GmailTools(Toolkit):
122
111
  """Initialize GmailTools and authenticate with Gmail API
123
112
 
124
113
  Args:
125
- get_latest_emails (bool): Enable getting latest emails. Defaults to True.
126
- get_emails_from_user (bool): Enable getting emails from specific user. Defaults to True.
127
- get_unread_emails (bool): Enable getting unread emails. Defaults to True.
128
- get_starred_emails (bool): Enable getting starred emails. Defaults to True.
129
- get_emails_by_context (bool): Enable getting emails by context. Defaults to True.
130
- get_emails_by_date (bool): Enable getting emails by date. Defaults to True.
131
- get_emails_by_thread (bool): Enable getting emails by thread. Defaults to True.
132
- create_draft_email (bool): Enable creating draft emails. Defaults to True.
133
- send_email (bool): Enable sending emails. Defaults to True.
134
- search_emails (bool): Enable searching emails. Defaults to True.
135
- send_email_reply (bool): Enable sending email replies. Defaults to True.
136
- creds (Optional[Credentials]): Pre-existing credentials. Defaults to None.
114
+ creds (Optional[Credentials]): Pre-fetched OAuth credentials. Use this to skip a new auth flow. Defaults to None.
137
115
  credentials_path (Optional[str]): Path to credentials file. Defaults to None.
138
116
  token_path (Optional[str]): Path to token file. Defaults to None.
139
117
  scopes (Optional[List[str]]): Custom OAuth scopes. If None, uses DEFAULT_SCOPES.
@@ -146,55 +124,61 @@ class GmailTools(Toolkit):
146
124
  self.scopes = scopes or self.DEFAULT_SCOPES
147
125
  self.port = port
148
126
 
149
- # Validate that required scopes are present for requested operations
150
- if (create_draft_email or send_email) and "https://www.googleapis.com/auth/gmail.compose" not in self.scopes:
127
+ """ tools functions:
128
+ enable_get_latest_emails (bool): Enable getting latest emails.
129
+ enable_get_emails_from_user (bool): Enable getting emails from specific user.
130
+ enable_get_unread_emails (bool): Enable getting unread emails.
131
+ enable_get_starred_emails (bool): Enable getting starred emails.
132
+ enable_get_emails_by_context (bool): Enable getting emails by context.
133
+ enable_get_emails_by_date (bool): Enable getting emails by date.
134
+ enable_get_emails_by_thread (bool): Enable getting emails by thread.
135
+ enable_create_draft_email (bool): Enable creating draft emails.
136
+ enable_send_email (bool): Enable sending emails.
137
+ enable_send_email_reply (bool): Enable sending email replies.
138
+ all (bool): Enable all tools.
139
+ """
140
+
141
+ tools: List[Any] = [
142
+ # Reading emails
143
+ self.get_latest_emails,
144
+ self.get_emails_from_user,
145
+ self.get_unread_emails,
146
+ self.get_starred_emails,
147
+ self.get_emails_by_context,
148
+ self.get_emails_by_date,
149
+ self.get_emails_by_thread,
150
+ self.search_emails,
151
+ # Composing emails
152
+ self.create_draft_email,
153
+ self.send_email,
154
+ self.send_email_reply,
155
+ ]
156
+
157
+ super().__init__(name="gmail_tools", tools=tools, **kwargs)
158
+
159
+ # Validate that required scopes are present for requested operations (only check registered functions)
160
+ if (
161
+ "create_draft_email" in self.functions or "send_email" in self.functions
162
+ ) and "https://www.googleapis.com/auth/gmail.compose" not in self.scopes:
151
163
  raise ValueError(
152
164
  "The scope https://www.googleapis.com/auth/gmail.compose is required for email composition operations"
153
165
  )
154
-
155
166
  read_operations = [
156
- get_latest_emails,
157
- get_emails_from_user,
158
- get_unread_emails,
159
- get_starred_emails,
160
- get_emails_by_context,
161
- get_emails_by_date,
162
- get_emails_by_thread,
163
- search_emails,
167
+ "get_latest_emails",
168
+ "get_emails_from_user",
169
+ "get_unread_emails",
170
+ "get_starred_emails",
171
+ "get_emails_by_context",
172
+ "get_emails_by_date",
173
+ "get_emails_by_thread",
174
+ "search_emails",
164
175
  ]
165
-
166
- if any(read_operations):
176
+ if any(read_operation in self.functions for read_operation in read_operations):
167
177
  read_scope = "https://www.googleapis.com/auth/gmail.readonly"
168
178
  write_scope = "https://www.googleapis.com/auth/gmail.modify"
169
179
  if read_scope not in self.scopes and write_scope not in self.scopes:
170
180
  raise ValueError(f"The scope {read_scope} is required for email reading operations")
171
181
 
172
- tools: List[Any] = []
173
- if get_latest_emails:
174
- tools.append(self.get_latest_emails)
175
- if get_emails_from_user:
176
- tools.append(self.get_emails_from_user)
177
- if get_unread_emails:
178
- tools.append(self.get_unread_emails)
179
- if get_starred_emails:
180
- tools.append(self.get_starred_emails)
181
- if get_emails_by_context:
182
- tools.append(self.get_emails_by_context)
183
- if get_emails_by_date:
184
- tools.append(self.get_emails_by_date)
185
- if get_emails_by_thread:
186
- tools.append(self.get_emails_by_thread)
187
- if create_draft_email:
188
- tools.append(self.create_draft_email)
189
- if send_email:
190
- tools.append(self.send_email)
191
- if send_email_reply:
192
- tools.append(self.send_email_reply)
193
- if search_emails:
194
- tools.append(self.search_emails)
195
-
196
- super().__init__(name="gmail_tools", tools=tools, **kwargs)
197
-
198
182
  def _auth(self) -> None:
199
183
  """Authenticate with Gmail API"""
200
184
  token_file = Path(self.token_path or "token.json")
@@ -17,10 +17,11 @@ class GoogleBigQueryTools(Toolkit):
17
17
  dataset: str,
18
18
  project: Optional[str] = None,
19
19
  location: Optional[str] = None,
20
- list_tables: Optional[bool] = True,
21
- describe_table: Optional[bool] = True,
22
- run_sql_query: Optional[bool] = True,
23
20
  credentials: Optional[Any] = None,
21
+ enable_list_tables: bool = True,
22
+ enable_describe_table: bool = True,
23
+ enable_run_sql_query: bool = True,
24
+ all: bool = False,
24
25
  **kwargs,
25
26
  ):
26
27
  self.project = project or getenv("GOOGLE_CLOUD_PROJECT")
@@ -37,11 +38,11 @@ class GoogleBigQueryTools(Toolkit):
37
38
  self.client = bigquery.Client(project=self.project, credentials=credentials)
38
39
 
39
40
  tools: List[Any] = []
40
- if list_tables:
41
+ if all or enable_list_tables:
41
42
  tools.append(self.list_tables)
42
- if describe_table:
43
+ if all or enable_describe_table:
43
44
  tools.append(self.describe_table)
44
- if run_sql_query:
45
+ if all or enable_run_sql_query:
45
46
  tools.append(self.run_sql_query)
46
47
 
47
48
  super().__init__(name="google_bigquery_tools", tools=tools, **kwargs)
agno/tools/google_maps.py CHANGED
@@ -6,7 +6,7 @@ Prerequisites:
6
6
  You can obtain the API key from the Google Cloud Console:
7
7
  https://console.cloud.google.com/projectselector2/google/maps-apis/credentials
8
8
 
9
- - You also need to activate the Address Validation API for your .
9
+ - You also need to activate the Address Validation API for your project.
10
10
  https://console.developers.google.com/apis/api/addressvalidation.googleapis.com
11
11
 
12
12
  """
@@ -29,14 +29,6 @@ class GoogleMapTools(Toolkit):
29
29
  def __init__(
30
30
  self,
31
31
  key: Optional[str] = None,
32
- search_places: bool = True,
33
- get_directions: bool = True,
34
- validate_address: bool = True,
35
- geocode_address: bool = True,
36
- reverse_geocode: bool = True,
37
- get_distance_matrix: bool = True,
38
- get_elevation: bool = True,
39
- get_timezone: bool = True,
40
32
  **kwargs,
41
33
  ):
42
34
  self.api_key = key or getenv("GOOGLE_MAPS_API_KEY")
@@ -46,23 +38,16 @@ class GoogleMapTools(Toolkit):
46
38
 
47
39
  self.places_client = places_v1.PlacesClient()
48
40
 
49
- tools: List[Any] = []
50
- if search_places:
51
- tools.append(self.search_places)
52
- if get_directions:
53
- tools.append(self.get_directions)
54
- if validate_address:
55
- tools.append(self.validate_address)
56
- if geocode_address:
57
- tools.append(self.geocode_address)
58
- if reverse_geocode:
59
- tools.append(self.reverse_geocode)
60
- if get_distance_matrix:
61
- tools.append(self.get_distance_matrix)
62
- if get_elevation:
63
- tools.append(self.get_elevation)
64
- if get_timezone:
65
- tools.append(self.get_timezone)
41
+ tools: List[Any] = [
42
+ self.search_places,
43
+ self.get_directions,
44
+ self.validate_address,
45
+ self.geocode_address,
46
+ self.reverse_geocode,
47
+ self.get_distance_matrix,
48
+ self.get_elevation,
49
+ self.get_timezone,
50
+ ]
66
51
 
67
52
  super().__init__(name="google_maps", tools=tools, **kwargs)
68
53
 
@@ -29,6 +29,8 @@ class GoogleSearchTools(Toolkit):
29
29
  cache_results (bool): Enable caching of search results.
30
30
  cache_ttl (int): Time-to-live for cached results in seconds.
31
31
  cache_dir (Optional[str]): Directory to store cache files.
32
+ enable_google_search (bool): Enable Google search.
33
+ all (bool): Enable all tools.
32
34
  """
33
35
 
34
36
  def __init__(
@@ -38,6 +40,8 @@ class GoogleSearchTools(Toolkit):
38
40
  headers: Optional[Any] = None,
39
41
  proxy: Optional[str] = None,
40
42
  timeout: Optional[int] = 10,
43
+ enable_google_search: bool = True,
44
+ all: bool = False,
41
45
  **kwargs,
42
46
  ):
43
47
  self.fixed_max_results: Optional[int] = fixed_max_results
@@ -47,7 +51,8 @@ class GoogleSearchTools(Toolkit):
47
51
  self.timeout: Optional[int] = timeout
48
52
 
49
53
  tools = []
50
- tools.append(self.google_search)
54
+ if all or enable_google_search:
55
+ tools.append(self.google_search)
51
56
 
52
57
  super().__init__(name="google_search_tools", tools=tools, **kwargs)
53
58
 
@@ -77,7 +82,7 @@ class GoogleSearchTools(Toolkit):
77
82
  log_debug(f"Searching Google [{language}] for: {query}")
78
83
 
79
84
  # Perform Google search using the googlesearch-python package
80
- results = list(search(query, num_results=max_results, lang=language, proxy=self.proxy, advanced=True))
85
+ results = list(search(query, num=max_results, lang=language))
81
86
 
82
87
  # Collect the search results
83
88
  res: List[Dict[str, str]] = []
@@ -94,27 +94,29 @@ class GoogleSheetsTools(Toolkit):
94
94
  creds: Optional[Credentials] = None,
95
95
  creds_path: Optional[str] = None,
96
96
  token_path: Optional[str] = None,
97
- read: bool = True,
98
- create: bool = False,
99
- update: bool = False,
100
- duplicate: bool = False,
101
97
  oauth_port: int = 0,
98
+ enable_read_sheet: bool = True,
99
+ enable_create_sheet: bool = False,
100
+ enable_update_sheet: bool = False,
101
+ enable_create_duplicate_sheet: bool = False,
102
+ all: bool = False,
102
103
  **kwargs,
103
104
  ):
104
105
  """Initialize GoogleSheetsTools with the specified configuration.
105
106
 
106
107
  Args:
107
- scopes (Optional[List[str]]): Custom OAuth scopes. If None, determined by operations.
108
+ scopes (Optional[List[str]]): Custom OAuth scopes. If None, uses write scope by default.
108
109
  spreadsheet_id (Optional[str]): ID of the target spreadsheet.
109
110
  spreadsheet_range (Optional[str]): Range within the spreadsheet.
110
111
  creds (Optional[Credentials]): Pre-existing credentials.
111
112
  creds_path (Optional[str]): Path to credentials file.
112
113
  token_path (Optional[str]): Path to token file.
113
- read (bool): Enable read operations. Defaults to True.
114
- create (bool): Enable create operations. Defaults to False.
115
- update (bool): Enable update operations. Defaults to False.
116
- duplicate (bool): Enable duplicate operations. Defaults to False.
117
114
  oauth_port (int): Port to use for OAuth authentication. Defaults to 0.
115
+ enable_read_sheet (bool): Enable reading from a sheet.
116
+ enable_create_sheet (bool): Enable creating a sheet.
117
+ enable_update_sheet (bool): Enable updating a sheet.
118
+ enable_create_duplicate_sheet (bool): Enable creating a duplicate sheet.
119
+ all (bool): Enable all tools.
118
120
  """
119
121
 
120
122
  self.spreadsheet_id = spreadsheet_id
@@ -128,19 +130,21 @@ class GoogleSheetsTools(Toolkit):
128
130
  # Determine required scopes based on operations if no custom scopes provided
129
131
  if scopes is None:
130
132
  self.scopes = []
131
- if read:
133
+ if enable_read_sheet:
132
134
  self.scopes.append(self.DEFAULT_SCOPES["read"])
133
- if create or update or duplicate:
135
+ if enable_create_sheet or enable_update_sheet or enable_create_duplicate_sheet:
134
136
  self.scopes.append(self.DEFAULT_SCOPES["write"])
135
137
  # Remove duplicates while preserving order
136
138
  self.scopes = list(dict.fromkeys(self.scopes))
137
139
  else:
138
140
  self.scopes = scopes
139
141
  # Validate that required scopes are present for requested operations
140
- if (create or update or duplicate) and self.DEFAULT_SCOPES["write"] not in self.scopes:
142
+ if (enable_create_sheet or enable_update_sheet or enable_create_duplicate_sheet) and self.DEFAULT_SCOPES[
143
+ "write"
144
+ ] not in self.scopes:
141
145
  raise ValueError(f"The scope {self.DEFAULT_SCOPES['write']} is required for write operations")
142
146
  if (
143
- read
147
+ enable_read_sheet
144
148
  and self.DEFAULT_SCOPES["read"] not in self.scopes
145
149
  and self.DEFAULT_SCOPES["write"] not in self.scopes
146
150
  ):
@@ -149,13 +153,13 @@ class GoogleSheetsTools(Toolkit):
149
153
  )
150
154
 
151
155
  tools: List[Any] = []
152
- if read:
156
+ if all or enable_read_sheet:
153
157
  tools.append(self.read_sheet)
154
- if create:
158
+ if all or enable_create_sheet:
155
159
  tools.append(self.create_sheet)
156
- if update:
160
+ if all or enable_update_sheet:
157
161
  tools.append(self.update_sheet)
158
- if duplicate:
162
+ if all or enable_create_duplicate_sheet:
159
163
  tools.append(self.create_duplicate_sheet)
160
164
 
161
165
  super().__init__(name="google_sheets_tools", tools=tools, **kwargs)