agno 1.8.1__py3-none-any.whl → 2.0.0__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 (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  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 +11 -66
  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 +1743 -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 +1432 -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 +882 -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 +1045 -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 +1416 -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 +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -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 +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  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 +15 -11
  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 +1551 -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 +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  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 +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  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 +55 -42
  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 +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
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,17 +111,6 @@ 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
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.
@@ -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)
agno/tools/hackernews.py CHANGED
@@ -10,16 +10,20 @@ from agno.utils.log import log_debug, logger
10
10
  class HackerNewsTools(Toolkit):
11
11
  """
12
12
  HackerNews is a tool for getting top stories from Hacker News.
13
+
13
14
  Args:
14
- get_top_stories (bool): Whether to get top stories from Hacker News.
15
- get_user_details (bool): Whether to get user details from Hacker News.
15
+ enable_get_top_stories (bool): Enable getting top stories from Hacker News. Default is True.
16
+ enable_get_user_details (bool): Enable getting user details from Hacker News. Default is True.
17
+ all (bool): Enable all tools. Overrides individual flags when True. Default is False.
16
18
  """
17
19
 
18
- def __init__(self, get_top_stories: bool = True, get_user_details: bool = True, **kwargs):
20
+ def __init__(
21
+ self, enable_get_top_stories: bool = True, enable_get_user_details: bool = True, all: bool = False, **kwargs
22
+ ):
19
23
  tools: List[Any] = []
20
- if get_top_stories:
24
+ if all or enable_get_top_stories:
21
25
  tools.append(self.get_top_hackernews_stories)
22
- if get_user_details:
26
+ if all or enable_get_user_details:
23
27
  tools.append(self.get_user_details)
24
28
 
25
29
  super().__init__(name="hackers_news", tools=tools, **kwargs)
agno/tools/jina.py CHANGED
@@ -25,9 +25,10 @@ class JinaReaderTools(Toolkit):
25
25
  search_url: str = "https://s.jina.ai/",
26
26
  max_content_length: int = 10000,
27
27
  timeout: Optional[int] = None,
28
- read_url: bool = True,
29
- search_query: bool = False,
30
28
  search_query_content: bool = True,
29
+ enable_read_url: bool = True,
30
+ enable_search_query: bool = False,
31
+ all: bool = False,
31
32
  **kwargs,
32
33
  ):
33
34
  self.api_key = api_key or getenv("JINA_API_KEY")
@@ -41,9 +42,9 @@ class JinaReaderTools(Toolkit):
41
42
  )
42
43
 
43
44
  tools: List[Any] = []
44
- if read_url:
45
+ if all or enable_read_url:
45
46
  tools.append(self.read_url)
46
- if search_query:
47
+ if all or enable_search_query:
47
48
  tools.append(self.search_query)
48
49
 
49
50
  super().__init__(name="jina_reader_tools", tools=tools, **kwargs)
agno/tools/jira.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import json
2
- import os
2
+ from os import getenv
3
3
  from typing import Any, List, Optional, cast
4
4
 
5
5
  from agno.tools import Toolkit
@@ -18,12 +18,17 @@ class JiraTools(Toolkit):
18
18
  username: Optional[str] = None,
19
19
  password: Optional[str] = None,
20
20
  token: Optional[str] = None,
21
+ enable_get_issue: bool = True,
22
+ enable_create_issue: bool = True,
23
+ enable_search_issues: bool = True,
24
+ enable_add_comment: bool = True,
25
+ all: bool = False,
21
26
  **kwargs,
22
27
  ):
23
- self.server_url = server_url or os.getenv("JIRA_SERVER_URL")
24
- self.username = username or os.getenv("JIRA_USERNAME")
25
- self.password = password or os.getenv("JIRA_PASSWORD")
26
- self.token = token or os.getenv("JIRA_TOKEN")
28
+ self.server_url = server_url or getenv("JIRA_SERVER_URL")
29
+ self.username = username or getenv("JIRA_USERNAME")
30
+ self.password = password or getenv("JIRA_PASSWORD")
31
+ self.token = token or getenv("JIRA_TOKEN")
27
32
 
28
33
  if not self.server_url:
29
34
  raise ValueError("JIRA server URL not provided.")
@@ -42,10 +47,14 @@ class JiraTools(Toolkit):
42
47
  self.jira = JIRA(server=self.server_url)
43
48
 
44
49
  tools: List[Any] = []
45
- tools.append(self.get_issue)
46
- tools.append(self.create_issue)
47
- tools.append(self.search_issues)
48
- tools.append(self.add_comment)
50
+ if enable_get_issue or all:
51
+ tools.append(self.get_issue)
52
+ if enable_create_issue or all:
53
+ tools.append(self.create_issue)
54
+ if enable_search_issues or all:
55
+ tools.append(self.search_issues)
56
+ if enable_add_comment or all:
57
+ tools.append(self.add_comment)
49
58
 
50
59
  super().__init__(name="jira_tools", tools=tools, **kwargs)
51
60
 
agno/tools/knowledge.py CHANGED
@@ -1,26 +1,25 @@
1
1
  import json
2
2
  from textwrap import dedent
3
- from typing import Any, List, Optional, Union
3
+ from typing import Any, Dict, List, Optional
4
4
 
5
- from agno.agent import Agent
6
- from agno.document import Document
7
- from agno.knowledge.agent import AgentKnowledge
8
- from agno.team.team import Team
5
+ from agno.knowledge.document import Document
6
+ from agno.knowledge.knowledge import Knowledge
9
7
  from agno.tools import Toolkit
10
- from agno.utils.log import log_debug, logger
8
+ from agno.utils.log import log_debug, log_error
11
9
 
12
10
 
13
11
  class KnowledgeTools(Toolkit):
14
12
  def __init__(
15
13
  self,
16
- knowledge: AgentKnowledge,
17
- think: bool = True,
18
- search: bool = True,
19
- analyze: bool = True,
14
+ knowledge: Knowledge,
15
+ enable_think: bool = True,
16
+ enable_search: bool = True,
17
+ enable_analyze: bool = True,
20
18
  instructions: Optional[str] = None,
21
19
  add_instructions: bool = True,
22
20
  add_few_shot: bool = False,
23
21
  few_shot_examples: Optional[str] = None,
22
+ all: bool = False,
24
23
  **kwargs,
25
24
  ):
26
25
  if knowledge is None:
@@ -38,14 +37,14 @@ class KnowledgeTools(Toolkit):
38
37
  self.instructions = instructions
39
38
 
40
39
  # The knowledge to search
41
- self.knowledge: AgentKnowledge = knowledge
40
+ self.knowledge: Knowledge = knowledge
42
41
 
43
42
  tools: List[Any] = []
44
- if think:
43
+ if enable_think or all:
45
44
  tools.append(self.think)
46
- if search:
45
+ if enable_search or all:
47
46
  tools.append(self.search)
48
- if analyze:
47
+ if enable_analyze or all:
49
48
  tools.append(self.analyze)
50
49
 
51
50
  super().__init__(
@@ -56,7 +55,7 @@ class KnowledgeTools(Toolkit):
56
55
  **kwargs,
57
56
  )
58
57
 
59
- def think(self, agent: Union[Agent, Team], thought: str) -> str:
58
+ def think(self, session_state: Dict[str, Any], thought: str) -> str:
60
59
  """Use this tool as a scratchpad to reason about the question, refine your approach, brainstorm search terms, or revise your plan.
61
60
 
62
61
  Call `Think` whenever you need to figure out what to do next, analyze the user's question, or plan your approach.
@@ -72,14 +71,14 @@ class KnowledgeTools(Toolkit):
72
71
  log_debug(f"Thought: {thought}")
73
72
 
74
73
  # Add the thought to the Agent state
75
- if agent.session_state is None:
76
- agent.session_state = {}
77
- if "thoughts" not in agent.session_state:
78
- agent.session_state["thoughts"] = []
79
- agent.session_state["thoughts"].append(thought)
74
+ if session_state is None:
75
+ session_state = {}
76
+ if "thoughts" not in session_state:
77
+ session_state["thoughts"] = []
78
+ session_state["thoughts"].append(thought)
80
79
 
81
80
  # Return the full log of thoughts and the new thought
82
- thoughts = "\n".join([f"- {t}" for t in agent.session_state["thoughts"]])
81
+ thoughts = "\n".join([f"- {t}" for t in session_state["thoughts"]])
83
82
  formatted_thoughts = dedent(
84
83
  f"""Thoughts:
85
84
  {thoughts}
@@ -87,10 +86,10 @@ class KnowledgeTools(Toolkit):
87
86
  ).strip()
88
87
  return formatted_thoughts
89
88
  except Exception as e:
90
- logger.error(f"Error recording thought: {e}")
89
+ log_error(f"Error recording thought: {e}")
91
90
  return f"Error recording thought: {e}"
92
91
 
93
- def search(self, agent: Union[Agent, Team], query: str) -> str:
92
+ def search(self, session_state: Dict[str, Any], query: str) -> str:
94
93
  """Use this tool to search the knowledge base for relevant information.
95
94
  After thinking through the question, use this tool as many times as needed to search for relevant information.
96
95
 
@@ -109,10 +108,10 @@ class KnowledgeTools(Toolkit):
109
108
  return "No documents found"
110
109
  return json.dumps([doc.to_dict() for doc in relevant_docs])
111
110
  except Exception as e:
112
- logger.error(f"Error searching knowledge base: {e}")
111
+ log_error(f"Error searching knowledge base: {e}")
113
112
  return f"Error searching knowledge base: {e}"
114
113
 
115
- def analyze(self, agent: Union[Agent, Team], analysis: str) -> str:
114
+ def analyze(self, session_state: Dict[str, Any], analysis: str) -> str:
116
115
  """Use this tool to evaluate whether the returned documents are correct and sufficient.
117
116
  If not, go back to "Think" or "Search" with refined queries.
118
117
 
@@ -126,14 +125,14 @@ class KnowledgeTools(Toolkit):
126
125
  log_debug(f"Analysis: {analysis}")
127
126
 
128
127
  # Add the thought to the Agent state
129
- if agent.session_state is None:
130
- agent.session_state = {}
131
- if "analysis" not in agent.session_state:
132
- agent.session_state["analysis"] = []
133
- agent.session_state["analysis"].append(analysis)
128
+ if session_state is None:
129
+ session_state = {}
130
+ if "analysis" not in session_state:
131
+ session_state["analysis"] = []
132
+ session_state["analysis"].append(analysis)
134
133
 
135
134
  # Return the full log of thoughts and the new thought
136
- analysis = "\n".join([f"- {a}" for a in agent.session_state["analysis"]])
135
+ analysis = "\n".join([f"- {a}" for a in session_state["analysis"]])
137
136
  formatted_analysis = dedent(
138
137
  f"""Analysis:
139
138
  {analysis}
@@ -141,7 +140,7 @@ class KnowledgeTools(Toolkit):
141
140
  ).strip()
142
141
  return formatted_analysis
143
142
  except Exception as e:
144
- logger.error(f"Error recording analysis: {e}")
143
+ log_error(f"Error recording analysis: {e}")
145
144
  return f"Error recording analysis: {e}"
146
145
 
147
146
  DEFAULT_INSTRUCTIONS = dedent("""\
agno/tools/linear.py CHANGED
@@ -10,44 +10,29 @@ from agno.utils.log import log_info, logger
10
10
  class LinearTools(Toolkit):
11
11
  def __init__(
12
12
  self,
13
- get_user_details: bool = True,
14
- get_teams_details: bool = True,
15
- get_issue_details: bool = True,
16
- create_issue: bool = True,
17
- update_issue: bool = True,
18
- get_user_assigned_issues: bool = True,
19
- get_workflow_issues: bool = True,
20
- get_high_priority_issues: bool = True,
13
+ api_key: Optional[str] = None,
21
14
  **kwargs,
22
15
  ):
23
- self.api_token = getenv("LINEAR_API_KEY")
16
+ self.api_key = api_key or getenv("LINEAR_API_KEY")
24
17
 
25
- if not self.api_token:
26
- api_error_message = "API token 'LINEAR_API_KEY' is missing. Please set it as an environment variable."
27
- logger.error(api_error_message)
18
+ if not self.api_key:
19
+ raise ValueError("Linear API key is required")
28
20
 
29
21
  self.endpoint = "https://api.linear.app/graphql"
30
- self.headers = {"Authorization": f"{self.api_token}"}
31
-
32
- tools: List[Any] = []
33
- if get_user_details:
34
- tools.append(self.get_user_details)
35
- if get_teams_details:
36
- tools.append(self.get_teams_details)
37
- if get_issue_details:
38
- tools.append(self.get_issue_details)
39
- if create_issue:
40
- tools.append(self.create_issue)
41
- if update_issue:
42
- tools.append(self.update_issue)
43
- if get_user_assigned_issues:
44
- tools.append(self.get_user_assigned_issues)
45
- if get_workflow_issues:
46
- tools.append(self.get_workflow_issues)
47
- if get_high_priority_issues:
48
- tools.append(self.get_high_priority_issues)
49
-
50
- super().__init__(name="linear tools", tools=tools, **kwargs)
22
+ self.headers = {"Authorization": f"{self.api_key}"}
23
+
24
+ tools: List[Any] = [
25
+ self.get_user_details,
26
+ self.get_teams_details,
27
+ self.get_issue_details,
28
+ self.create_issue,
29
+ self.update_issue,
30
+ self.get_user_assigned_issues,
31
+ self.get_workflow_issues,
32
+ self.get_high_priority_issues,
33
+ ]
34
+
35
+ super().__init__(name="linear_tools", tools=tools, **kwargs)
51
36
 
52
37
  def _execute_query(self, query, variables=None):
53
38
  """Helper method to execute GraphQL queries with optional variables."""
@@ -217,7 +202,7 @@ class LinearTools(Toolkit):
217
202
  """
218
203
 
219
204
  query = """
220
- mutation IssueCreate ($title: String!, $description: String!, $teamId: String!, $projectId: String!, $assigneeId: String!){
205
+ mutation IssueCreate ($title: String!, $description: String!, $teamId: String!, $projectId: String, $assigneeId: String){
221
206
  issueCreate(
222
207
  input: { title: $title, description: $description, teamId: $teamId, projectId: $projectId, assigneeId: $assigneeId}
223
208
  ) {