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/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."""
agno/tools/linkup.py CHANGED
@@ -16,6 +16,8 @@ class LinkupTools(Toolkit):
16
16
  api_key: Optional[str] = None,
17
17
  depth: Literal["standard", "deep"] = "standard",
18
18
  output_type: Literal["sourcedAnswer", "searchResults"] = "searchResults",
19
+ enable_web_search_with_linkup: bool = True,
20
+ all: bool = False,
19
21
  **kwargs,
20
22
  ):
21
23
  self.api_key = api_key or getenv("LINKUP_API_KEY")
@@ -26,7 +28,9 @@ class LinkupTools(Toolkit):
26
28
  self.depth = depth
27
29
  self.output_type = output_type
28
30
 
29
- tools: List[Any] = [self.web_search_with_linkup]
31
+ tools: List[Any] = []
32
+ if all or enable_web_search_with_linkup:
33
+ tools.append(self.web_search_with_linkup)
30
34
 
31
35
  super().__init__(name="linkup_tools", tools=tools, **kwargs)
32
36
 
@@ -1,4 +1,3 @@
1
- import os
2
1
  from pathlib import Path
3
2
  from typing import Optional
4
3
  from uuid import uuid4
@@ -12,6 +11,8 @@ class LocalFileSystemTools(Toolkit):
12
11
  self,
13
12
  target_directory: Optional[str] = None,
14
13
  default_extension: str = "txt",
14
+ enable_write_file: bool = True,
15
+ all: bool = False,
15
16
  **kwargs,
16
17
  ):
17
18
  """
@@ -21,14 +22,15 @@ class LocalFileSystemTools(Toolkit):
21
22
  default_extension (str): Default file extension to use if none specified.
22
23
  """
23
24
 
24
- self.target_directory = target_directory or os.getcwd()
25
+ self.target_directory = target_directory or str(Path.cwd())
25
26
  self.default_extension = default_extension.lstrip(".")
26
27
 
27
28
  target_path = Path(self.target_directory)
28
29
  target_path.mkdir(parents=True, exist_ok=True)
29
30
 
30
31
  tools = []
31
- tools.append(self.write_file)
32
+ if all or enable_write_file:
33
+ tools.append(self.write_file)
32
34
 
33
35
  super().__init__(name="write_to_local", tools=tools, **kwargs)
34
36
 
@@ -53,8 +55,9 @@ class LocalFileSystemTools(Toolkit):
53
55
  filename = filename or str(uuid4())
54
56
  directory = directory or self.target_directory
55
57
  if filename and "." in filename:
56
- filename, file_ext = os.path.splitext(filename)
57
- extension = extension or file_ext.lstrip(".")
58
+ path_obj = Path(filename)
59
+ filename = path_obj.stem
60
+ extension = extension or path_obj.suffix.lstrip(".")
58
61
 
59
62
  log_debug(f"Writing file to local system: {filename}")
60
63
 
agno/tools/lumalab.py CHANGED
@@ -6,6 +6,7 @@ from typing import Any, Dict, List, Literal, Optional, TypedDict
6
6
  from agno.agent import Agent
7
7
  from agno.media import VideoArtifact
8
8
  from agno.tools import Toolkit
9
+ from agno.tools.function import ToolResult
9
10
  from agno.utils.log import log_info, logger
10
11
 
11
12
  try:
@@ -30,6 +31,9 @@ class LumaLabTools(Toolkit):
30
31
  wait_for_completion: bool = True,
31
32
  poll_interval: int = 3,
32
33
  max_wait_time: int = 300, # 5 minutes
34
+ enable_generate_video: bool = True,
35
+ enable_image_to_video: bool = True,
36
+ all: bool = False,
33
37
  **kwargs,
34
38
  ):
35
39
  self.wait_for_completion = wait_for_completion
@@ -43,8 +47,10 @@ class LumaLabTools(Toolkit):
43
47
  self.client = LumaAI(auth_token=self.api_key)
44
48
 
45
49
  tools: List[Any] = []
46
- tools.append(self.generate_video)
47
- tools.append(self.image_to_video)
50
+ if all or enable_generate_video:
51
+ tools.append(self.generate_video)
52
+ if all or enable_image_to_video:
53
+ tools.append(self.image_to_video)
48
54
 
49
55
  super().__init__(name="luma_lab", tools=tools, **kwargs)
50
56
 
@@ -56,7 +62,7 @@ class LumaLabTools(Toolkit):
56
62
  end_image_url: Optional[str] = None,
57
63
  loop: bool = False,
58
64
  aspect_ratio: Literal["1:1", "16:9", "9:16", "4:3", "3:4", "21:9", "9:21"] = "16:9",
59
- ) -> str:
65
+ ) -> ToolResult:
60
66
  """Generate a video from one or two images with a prompt.
61
67
 
62
68
  Args:
@@ -68,7 +74,7 @@ class LumaLabTools(Toolkit):
68
74
  aspect_ratio: Aspect ratio of the output video
69
75
 
70
76
  Returns:
71
- str: Status message or error
77
+ ToolResult: A ToolResult containing the generated video or error message.
72
78
  """
73
79
 
74
80
  try:
@@ -90,33 +96,36 @@ class LumaLabTools(Toolkit):
90
96
  video_id = str(uuid.uuid4())
91
97
 
92
98
  if not self.wait_for_completion:
93
- return "Async generation unsupported"
99
+ return ToolResult(content="Async generation unsupported")
94
100
 
95
101
  # Poll for completion
96
102
  seconds_waited = 0
97
103
  while seconds_waited < self.max_wait_time:
98
104
  if not generation or not generation.id:
99
- return "Failed to get generation ID"
105
+ return ToolResult(content="Failed to get generation ID")
100
106
 
101
107
  generation = self.client.generations.get(generation.id)
102
108
 
103
109
  if generation.state == "completed" and generation.assets:
104
110
  video_url = generation.assets.video
105
111
  if video_url:
106
- agent.add_video(VideoArtifact(id=video_id, url=video_url, eta="completed"))
107
- return f"Video generated successfully: {video_url}"
112
+ video_artifact = VideoArtifact(id=video_id, url=video_url, eta="completed")
113
+ return ToolResult(
114
+ content=f"Video generated successfully: {video_url}",
115
+ videos=[video_artifact],
116
+ )
108
117
  elif generation.state == "failed":
109
- return f"Generation failed: {generation.failure_reason}"
118
+ return ToolResult(content=f"Generation failed: {generation.failure_reason}")
110
119
 
111
120
  log_info(f"Generation in progress... State: {generation.state}")
112
121
  time.sleep(self.poll_interval)
113
122
  seconds_waited += self.poll_interval
114
123
 
115
- return f"Video generation timed out after {self.max_wait_time} seconds"
124
+ return ToolResult(content=f"Video generation timed out after {self.max_wait_time} seconds")
116
125
 
117
126
  except Exception as e:
118
127
  logger.error(f"Failed to generate video: {e}")
119
- return f"Error: {e}"
128
+ return ToolResult(content=f"Error: {e}")
120
129
 
121
130
  def generate_video(
122
131
  self,
@@ -125,7 +134,7 @@ class LumaLabTools(Toolkit):
125
134
  loop: bool = False,
126
135
  aspect_ratio: Literal["1:1", "16:9", "9:16", "4:3", "3:4", "21:9", "9:21"] = "16:9",
127
136
  keyframes: Optional[Dict[str, Dict[str, str]]] = None,
128
- ) -> str:
137
+ ) -> ToolResult:
129
138
  """Use this function to generate a video given a prompt."""
130
139
 
131
140
  try:
@@ -142,30 +151,33 @@ class LumaLabTools(Toolkit):
142
151
 
143
152
  video_id = str(uuid.uuid4())
144
153
  if not self.wait_for_completion:
145
- return "Async generation unsupported"
154
+ return ToolResult(content="Async generation unsupported")
146
155
 
147
156
  # Poll for completion
148
157
  seconds_waited = 0
149
158
  while seconds_waited < self.max_wait_time:
150
159
  if not generation or not generation.id:
151
- return "Failed to get generation ID"
160
+ return ToolResult(content="Failed to get generation ID")
152
161
 
153
162
  generation = self.client.generations.get(generation.id)
154
163
 
155
164
  if generation.state == "completed" and generation.assets:
156
165
  video_url = generation.assets.video
157
166
  if video_url:
158
- agent.add_video(VideoArtifact(id=video_id, url=video_url, state="completed"))
159
- return f"Video generated successfully: {video_url}"
167
+ video_artifact = VideoArtifact(id=video_id, url=video_url, state="completed")
168
+ return ToolResult(
169
+ content=f"Video generated successfully: {video_url}",
170
+ videos=[video_artifact],
171
+ )
160
172
  elif generation.state == "failed":
161
- return f"Generation failed: {generation.failure_reason}"
173
+ return ToolResult(content=f"Generation failed: {generation.failure_reason}")
162
174
 
163
175
  log_info(f"Generation in progress... State: {generation.state}")
164
176
  time.sleep(self.poll_interval)
165
177
  seconds_waited += self.poll_interval
166
178
 
167
- return f"Video generation timed out after {self.max_wait_time} seconds"
179
+ return ToolResult(content=f"Video generation timed out after {self.max_wait_time} seconds")
168
180
 
169
181
  except Exception as e:
170
182
  logger.error(f"Failed to generate video: {e}")
171
- return f"Error: {e}"
183
+ return ToolResult(content=f"Error: {e}")
agno/tools/mem0.py CHANGED
@@ -1,9 +1,9 @@
1
1
  import json
2
2
  from os import getenv
3
- from typing import Any, Dict, Optional, Union
3
+ from typing import Any, Dict, List, Optional, Union
4
4
 
5
5
  from agno.agent import Agent
6
- from agno.tools.toolkit import Toolkit
6
+ from agno.tools import Toolkit
7
7
  from agno.utils.log import log_debug, log_error, log_warning
8
8
 
9
9
  try:
@@ -22,18 +22,24 @@ class Mem0Tools(Toolkit):
22
22
  org_id: Optional[str] = None,
23
23
  project_id: Optional[str] = None,
24
24
  infer: bool = True,
25
+ enable_add_memory: bool = True,
26
+ enable_search_memory: bool = True,
27
+ enable_get_all_memories: bool = True,
28
+ enable_delete_all_memories: bool = True,
29
+ all: bool = False,
25
30
  **kwargs,
26
31
  ):
27
- super().__init__(
28
- name="mem0_tools",
29
- tools=[
30
- self.add_memory,
31
- self.search_memory,
32
- self.get_all_memories,
33
- self.delete_all_memories,
34
- ],
35
- **kwargs,
36
- )
32
+ tools: List[Any] = []
33
+ if enable_add_memory or all:
34
+ tools.append(self.add_memory)
35
+ if enable_search_memory or all:
36
+ tools.append(self.search_memory)
37
+ if enable_get_all_memories or all:
38
+ tools.append(self.get_all_memories)
39
+ if enable_delete_all_memories or all:
40
+ tools.append(self.delete_all_memories)
41
+
42
+ super().__init__(name="mem0_tools", tools=tools, **kwargs)
37
43
  self.api_key = api_key or getenv("MEM0_API_KEY")
38
44
  self.user_id = user_id
39
45
  self.org_id = org_id or getenv("MEM0_ORG_ID")
agno/tools/memori.py CHANGED
@@ -1,5 +1,5 @@
1
1
  import json
2
- from typing import Any, Dict, Optional
2
+ from typing import Any, Dict, List, Optional
3
3
 
4
4
  from agno.agent import Agent
5
5
  from agno.tools.toolkit import Toolkit
@@ -54,6 +54,10 @@ class MemoriTools(Toolkit):
54
54
  verbose: bool = False,
55
55
  config: Optional[Dict[str, Any]] = None,
56
56
  auto_enable: bool = True,
57
+ enable_search_memory: bool = True,
58
+ enable_record_conversation: bool = True,
59
+ enable_get_memory_stats: bool = True,
60
+ all: bool = False,
57
61
  **kwargs,
58
62
  ):
59
63
  """
@@ -69,15 +73,15 @@ class MemoriTools(Toolkit):
69
73
  auto_enable: Automatically enable the memory system on initialization
70
74
  **kwargs: Additional arguments passed to Toolkit base class
71
75
  """
72
- super().__init__(
73
- name="memori_tools",
74
- tools=[
75
- self.search_memory,
76
- self.record_conversation,
77
- self.get_memory_stats,
78
- ],
79
- **kwargs,
80
- )
76
+ tools: List[Any] = []
77
+ if all or enable_search_memory:
78
+ tools.append(self.search_memory)
79
+ if all or enable_record_conversation:
80
+ tools.append(self.record_conversation)
81
+ if all or enable_get_memory_stats:
82
+ tools.append(self.get_memory_stats)
83
+
84
+ super().__init__(name="memori_tools", tools=tools, **kwargs)
81
85
 
82
86
  # Set default database connection if not provided
83
87
  if not database_connect:
@@ -32,7 +32,7 @@ class MLXTranscribeTools(Toolkit):
32
32
  def __init__(
33
33
  self,
34
34
  base_dir: Optional[Path] = None,
35
- read_files_in_base_dir: bool = True,
35
+ enable_read_files_in_base_dir: bool = True,
36
36
  path_or_hf_repo: str = "mlx-community/whisper-large-v3-turbo",
37
37
  verbose: Optional[bool] = None,
38
38
  temperature: Optional[Union[float, Tuple[float, ...]]] = None,
@@ -47,6 +47,7 @@ class MLXTranscribeTools(Toolkit):
47
47
  clip_timestamps: Optional[Union[str, List[float]]] = None,
48
48
  hallucination_silence_threshold: Optional[float] = None,
49
49
  decode_options: Optional[dict] = None,
50
+ all: bool = False,
50
51
  **kwargs,
51
52
  ):
52
53
  self.base_dir: Path = base_dir or Path.cwd()
@@ -66,7 +67,7 @@ class MLXTranscribeTools(Toolkit):
66
67
  self.decode_options: Optional[dict] = decode_options
67
68
 
68
69
  tools: List[Any] = [self.transcribe]
69
- if read_files_in_base_dir:
70
+ if enable_read_files_in_base_dir or all:
70
71
  tools.append(self.read_files)
71
72
 
72
73
  super().__init__(name="mlx_transcribe", tools=tools, **kwargs)