agno 1.8.1__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 (580) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +2778 -4123
  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/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 +129 -82
  141. agno/models/aws/bedrock.py +107 -175
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +347 -287
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +100 -42
  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 +38 -144
  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 +84 -46
  158. agno/models/openai/chat.py +121 -23
  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 +14 -8
  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 +393 -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 +65 -28
  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 +33 -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 +30 -0
  184. agno/os/router.py +843 -0
  185. agno/os/routers/__init__.py +3 -0
  186. agno/os/routers/evals/__init__.py +3 -0
  187. agno/os/routers/evals/evals.py +204 -0
  188. agno/os/routers/evals/schemas.py +142 -0
  189. agno/os/routers/evals/utils.py +161 -0
  190. agno/os/routers/knowledge/__init__.py +3 -0
  191. agno/os/routers/knowledge/knowledge.py +413 -0
  192. agno/os/routers/knowledge/schemas.py +118 -0
  193. agno/os/routers/memory/__init__.py +3 -0
  194. agno/os/routers/memory/memory.py +179 -0
  195. agno/os/routers/memory/schemas.py +58 -0
  196. agno/os/routers/metrics/__init__.py +3 -0
  197. agno/os/routers/metrics/metrics.py +58 -0
  198. agno/os/routers/metrics/schemas.py +47 -0
  199. agno/os/routers/session/__init__.py +3 -0
  200. agno/os/routers/session/session.py +163 -0
  201. agno/os/schema.py +892 -0
  202. agno/{app/playground → os}/settings.py +8 -15
  203. agno/os/utils.py +270 -0
  204. agno/reasoning/azure_ai_foundry.py +4 -4
  205. agno/reasoning/deepseek.py +4 -4
  206. agno/reasoning/default.py +6 -11
  207. agno/reasoning/groq.py +4 -4
  208. agno/reasoning/helpers.py +4 -6
  209. agno/reasoning/ollama.py +4 -4
  210. agno/reasoning/openai.py +4 -4
  211. agno/run/{response.py → agent.py} +144 -72
  212. agno/run/base.py +44 -58
  213. agno/run/cancel.py +83 -0
  214. agno/run/team.py +133 -77
  215. agno/run/workflow.py +537 -12
  216. agno/session/__init__.py +10 -0
  217. agno/session/agent.py +244 -0
  218. agno/session/summary.py +225 -0
  219. agno/session/team.py +262 -0
  220. agno/{storage/session/v2 → session}/workflow.py +47 -24
  221. agno/team/__init__.py +15 -16
  222. agno/team/team.py +2961 -4253
  223. agno/tools/agentql.py +14 -5
  224. agno/tools/airflow.py +9 -4
  225. agno/tools/api.py +7 -3
  226. agno/tools/apify.py +2 -46
  227. agno/tools/arxiv.py +8 -3
  228. agno/tools/aws_lambda.py +7 -5
  229. agno/tools/aws_ses.py +7 -1
  230. agno/tools/baidusearch.py +4 -1
  231. agno/tools/bitbucket.py +4 -4
  232. agno/tools/brandfetch.py +14 -11
  233. agno/tools/bravesearch.py +4 -1
  234. agno/tools/brightdata.py +42 -22
  235. agno/tools/browserbase.py +13 -4
  236. agno/tools/calcom.py +12 -10
  237. agno/tools/calculator.py +10 -27
  238. agno/tools/cartesia.py +18 -13
  239. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  240. agno/tools/confluence.py +8 -8
  241. agno/tools/crawl4ai.py +7 -1
  242. agno/tools/csv_toolkit.py +9 -8
  243. agno/tools/dalle.py +18 -11
  244. agno/tools/daytona.py +13 -16
  245. agno/tools/decorator.py +6 -3
  246. agno/tools/desi_vocal.py +16 -7
  247. agno/tools/discord.py +11 -8
  248. agno/tools/docker.py +30 -42
  249. agno/tools/duckdb.py +34 -53
  250. agno/tools/duckduckgo.py +8 -7
  251. agno/tools/e2b.py +61 -61
  252. agno/tools/eleven_labs.py +35 -28
  253. agno/tools/email.py +4 -1
  254. agno/tools/evm.py +7 -1
  255. agno/tools/exa.py +19 -14
  256. agno/tools/fal.py +29 -29
  257. agno/tools/file.py +9 -8
  258. agno/tools/financial_datasets.py +25 -44
  259. agno/tools/firecrawl.py +22 -22
  260. agno/tools/function.py +68 -17
  261. agno/tools/giphy.py +22 -10
  262. agno/tools/github.py +48 -126
  263. agno/tools/gmail.py +45 -61
  264. agno/tools/google_bigquery.py +7 -6
  265. agno/tools/google_maps.py +11 -26
  266. agno/tools/googlesearch.py +7 -2
  267. agno/tools/googlesheets.py +21 -17
  268. agno/tools/hackernews.py +9 -5
  269. agno/tools/jina.py +5 -4
  270. agno/tools/jira.py +18 -9
  271. agno/tools/knowledge.py +31 -32
  272. agno/tools/linear.py +18 -33
  273. agno/tools/linkup.py +5 -1
  274. agno/tools/local_file_system.py +8 -5
  275. agno/tools/lumalab.py +31 -19
  276. agno/tools/mem0.py +18 -12
  277. agno/tools/memori.py +14 -10
  278. agno/tools/mlx_transcribe.py +3 -2
  279. agno/tools/models/azure_openai.py +32 -14
  280. agno/tools/models/gemini.py +58 -31
  281. agno/tools/models/groq.py +29 -20
  282. agno/tools/models/nebius.py +27 -11
  283. agno/tools/models_labs.py +39 -15
  284. agno/tools/moviepy_video.py +7 -6
  285. agno/tools/neo4j.py +10 -8
  286. agno/tools/newspaper.py +7 -2
  287. agno/tools/newspaper4k.py +8 -3
  288. agno/tools/openai.py +57 -26
  289. agno/tools/openbb.py +12 -11
  290. agno/tools/opencv.py +62 -46
  291. agno/tools/openweather.py +14 -12
  292. agno/tools/pandas.py +11 -3
  293. agno/tools/postgres.py +4 -12
  294. agno/tools/pubmed.py +4 -1
  295. agno/tools/python.py +9 -22
  296. agno/tools/reasoning.py +35 -27
  297. agno/tools/reddit.py +11 -26
  298. agno/tools/replicate.py +54 -41
  299. agno/tools/resend.py +4 -1
  300. agno/tools/scrapegraph.py +15 -14
  301. agno/tools/searxng.py +10 -23
  302. agno/tools/serpapi.py +6 -3
  303. agno/tools/serper.py +13 -4
  304. agno/tools/shell.py +9 -2
  305. agno/tools/slack.py +12 -11
  306. agno/tools/sleep.py +3 -2
  307. agno/tools/spider.py +24 -4
  308. agno/tools/sql.py +7 -6
  309. agno/tools/tavily.py +6 -4
  310. agno/tools/telegram.py +12 -4
  311. agno/tools/todoist.py +11 -31
  312. agno/tools/toolkit.py +1 -1
  313. agno/tools/trafilatura.py +22 -6
  314. agno/tools/trello.py +9 -22
  315. agno/tools/twilio.py +10 -3
  316. agno/tools/user_control_flow.py +6 -1
  317. agno/tools/valyu.py +34 -5
  318. agno/tools/visualization.py +19 -28
  319. agno/tools/webbrowser.py +4 -3
  320. agno/tools/webex.py +11 -7
  321. agno/tools/website.py +15 -46
  322. agno/tools/webtools.py +12 -4
  323. agno/tools/whatsapp.py +5 -9
  324. agno/tools/wikipedia.py +20 -13
  325. agno/tools/x.py +14 -13
  326. agno/tools/yfinance.py +13 -40
  327. agno/tools/youtube.py +26 -20
  328. agno/tools/zendesk.py +7 -2
  329. agno/tools/zep.py +10 -7
  330. agno/tools/zoom.py +10 -9
  331. agno/utils/common.py +1 -19
  332. agno/utils/events.py +95 -118
  333. agno/utils/knowledge.py +29 -0
  334. agno/utils/log.py +2 -2
  335. agno/utils/mcp.py +11 -5
  336. agno/utils/media.py +39 -0
  337. agno/utils/message.py +12 -1
  338. agno/utils/models/claude.py +6 -4
  339. agno/utils/models/mistral.py +8 -7
  340. agno/utils/models/schema_utils.py +3 -3
  341. agno/utils/pprint.py +33 -32
  342. agno/utils/print_response/agent.py +779 -0
  343. agno/utils/print_response/team.py +1565 -0
  344. agno/utils/print_response/workflow.py +1451 -0
  345. agno/utils/prompts.py +14 -14
  346. agno/utils/reasoning.py +87 -0
  347. agno/utils/response.py +42 -42
  348. agno/utils/string.py +8 -22
  349. agno/utils/team.py +50 -0
  350. agno/utils/timer.py +2 -2
  351. agno/vectordb/base.py +33 -21
  352. agno/vectordb/cassandra/cassandra.py +287 -23
  353. agno/vectordb/chroma/chromadb.py +482 -59
  354. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  355. agno/vectordb/couchbase/couchbase.py +309 -29
  356. agno/vectordb/lancedb/lance_db.py +360 -21
  357. agno/vectordb/langchaindb/__init__.py +5 -0
  358. agno/vectordb/langchaindb/langchaindb.py +145 -0
  359. agno/vectordb/lightrag/__init__.py +5 -0
  360. agno/vectordb/lightrag/lightrag.py +374 -0
  361. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  362. agno/vectordb/milvus/milvus.py +242 -32
  363. agno/vectordb/mongodb/mongodb.py +200 -24
  364. agno/vectordb/pgvector/pgvector.py +319 -37
  365. agno/vectordb/pineconedb/pineconedb.py +221 -27
  366. agno/vectordb/qdrant/qdrant.py +334 -14
  367. agno/vectordb/singlestore/singlestore.py +286 -29
  368. agno/vectordb/surrealdb/surrealdb.py +187 -7
  369. agno/vectordb/upstashdb/upstashdb.py +342 -26
  370. agno/vectordb/weaviate/weaviate.py +227 -165
  371. agno/workflow/__init__.py +17 -13
  372. agno/workflow/{v2/condition.py → condition.py} +135 -32
  373. agno/workflow/{v2/loop.py → loop.py} +115 -28
  374. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  375. agno/workflow/{v2/router.py → router.py} +133 -32
  376. agno/workflow/{v2/step.py → step.py} +200 -42
  377. agno/workflow/{v2/steps.py → steps.py} +147 -66
  378. agno/workflow/types.py +482 -0
  379. agno/workflow/workflow.py +2394 -696
  380. agno-2.0.0a1.dist-info/METADATA +355 -0
  381. agno-2.0.0a1.dist-info/RECORD +514 -0
  382. agno/agent/metrics.py +0 -107
  383. agno/api/app.py +0 -35
  384. agno/api/playground.py +0 -92
  385. agno/api/schemas/app.py +0 -12
  386. agno/api/schemas/playground.py +0 -22
  387. agno/api/schemas/user.py +0 -35
  388. agno/api/schemas/workspace.py +0 -46
  389. agno/api/user.py +0 -160
  390. agno/api/workflows.py +0 -33
  391. agno/api/workspace.py +0 -175
  392. agno/app/agui/__init__.py +0 -3
  393. agno/app/agui/app.py +0 -17
  394. agno/app/agui/sync_router.py +0 -120
  395. agno/app/base.py +0 -186
  396. agno/app/discord/__init__.py +0 -3
  397. agno/app/fastapi/__init__.py +0 -3
  398. agno/app/fastapi/app.py +0 -107
  399. agno/app/fastapi/async_router.py +0 -457
  400. agno/app/fastapi/sync_router.py +0 -448
  401. agno/app/playground/app.py +0 -228
  402. agno/app/playground/async_router.py +0 -1050
  403. agno/app/playground/deploy.py +0 -249
  404. agno/app/playground/operator.py +0 -183
  405. agno/app/playground/schemas.py +0 -220
  406. agno/app/playground/serve.py +0 -55
  407. agno/app/playground/sync_router.py +0 -1042
  408. agno/app/playground/utils.py +0 -46
  409. agno/app/settings.py +0 -15
  410. agno/app/slack/__init__.py +0 -3
  411. agno/app/slack/app.py +0 -19
  412. agno/app/slack/sync_router.py +0 -92
  413. agno/app/utils.py +0 -54
  414. agno/app/whatsapp/__init__.py +0 -3
  415. agno/app/whatsapp/app.py +0 -15
  416. agno/app/whatsapp/sync_router.py +0 -197
  417. agno/cli/auth_server.py +0 -249
  418. agno/cli/config.py +0 -274
  419. agno/cli/console.py +0 -88
  420. agno/cli/credentials.py +0 -23
  421. agno/cli/entrypoint.py +0 -571
  422. agno/cli/operator.py +0 -357
  423. agno/cli/settings.py +0 -96
  424. agno/cli/ws/ws_cli.py +0 -817
  425. agno/constants.py +0 -13
  426. agno/document/__init__.py +0 -5
  427. agno/document/chunking/semantic.py +0 -45
  428. agno/document/chunking/strategy.py +0 -31
  429. agno/document/reader/__init__.py +0 -5
  430. agno/document/reader/base.py +0 -47
  431. agno/document/reader/docx_reader.py +0 -60
  432. agno/document/reader/gcs/pdf_reader.py +0 -44
  433. agno/document/reader/s3/pdf_reader.py +0 -59
  434. agno/document/reader/s3/text_reader.py +0 -63
  435. agno/document/reader/url_reader.py +0 -59
  436. agno/document/reader/youtube_reader.py +0 -58
  437. agno/embedder/__init__.py +0 -5
  438. agno/embedder/langdb.py +0 -80
  439. agno/embedder/mistral.py +0 -82
  440. agno/embedder/openai.py +0 -78
  441. agno/file/__init__.py +0 -5
  442. agno/file/file.py +0 -16
  443. agno/file/local/csv.py +0 -32
  444. agno/file/local/txt.py +0 -19
  445. agno/infra/app.py +0 -240
  446. agno/infra/base.py +0 -144
  447. agno/infra/context.py +0 -20
  448. agno/infra/db_app.py +0 -52
  449. agno/infra/resource.py +0 -205
  450. agno/infra/resources.py +0 -55
  451. agno/knowledge/agent.py +0 -702
  452. agno/knowledge/arxiv.py +0 -33
  453. agno/knowledge/combined.py +0 -36
  454. agno/knowledge/csv.py +0 -144
  455. agno/knowledge/csv_url.py +0 -124
  456. agno/knowledge/document.py +0 -223
  457. agno/knowledge/docx.py +0 -137
  458. agno/knowledge/firecrawl.py +0 -34
  459. agno/knowledge/gcs/__init__.py +0 -0
  460. agno/knowledge/gcs/base.py +0 -39
  461. agno/knowledge/gcs/pdf.py +0 -125
  462. agno/knowledge/json.py +0 -137
  463. agno/knowledge/langchain.py +0 -71
  464. agno/knowledge/light_rag.py +0 -273
  465. agno/knowledge/llamaindex.py +0 -66
  466. agno/knowledge/markdown.py +0 -154
  467. agno/knowledge/pdf.py +0 -164
  468. agno/knowledge/pdf_bytes.py +0 -42
  469. agno/knowledge/pdf_url.py +0 -148
  470. agno/knowledge/s3/__init__.py +0 -0
  471. agno/knowledge/s3/base.py +0 -64
  472. agno/knowledge/s3/pdf.py +0 -33
  473. agno/knowledge/s3/text.py +0 -34
  474. agno/knowledge/text.py +0 -141
  475. agno/knowledge/url.py +0 -46
  476. agno/knowledge/website.py +0 -179
  477. agno/knowledge/wikipedia.py +0 -32
  478. agno/knowledge/youtube.py +0 -35
  479. agno/memory/agent.py +0 -423
  480. agno/memory/classifier.py +0 -104
  481. agno/memory/db/__init__.py +0 -5
  482. agno/memory/db/base.py +0 -42
  483. agno/memory/db/mongodb.py +0 -189
  484. agno/memory/db/postgres.py +0 -203
  485. agno/memory/db/sqlite.py +0 -193
  486. agno/memory/memory.py +0 -22
  487. agno/memory/row.py +0 -36
  488. agno/memory/summarizer.py +0 -201
  489. agno/memory/summary.py +0 -19
  490. agno/memory/team.py +0 -415
  491. agno/memory/v2/__init__.py +0 -2
  492. agno/memory/v2/db/__init__.py +0 -1
  493. agno/memory/v2/db/base.py +0 -42
  494. agno/memory/v2/db/firestore.py +0 -339
  495. agno/memory/v2/db/mongodb.py +0 -196
  496. agno/memory/v2/db/postgres.py +0 -214
  497. agno/memory/v2/db/redis.py +0 -187
  498. agno/memory/v2/db/schema.py +0 -54
  499. agno/memory/v2/db/sqlite.py +0 -209
  500. agno/memory/v2/manager.py +0 -437
  501. agno/memory/v2/memory.py +0 -1097
  502. agno/memory/v2/schema.py +0 -55
  503. agno/memory/v2/summarizer.py +0 -215
  504. agno/memory/workflow.py +0 -38
  505. agno/models/ollama/tools.py +0 -430
  506. agno/models/qwen/__init__.py +0 -5
  507. agno/playground/__init__.py +0 -10
  508. agno/playground/deploy.py +0 -3
  509. agno/playground/playground.py +0 -3
  510. agno/playground/serve.py +0 -3
  511. agno/playground/settings.py +0 -3
  512. agno/reranker/__init__.py +0 -0
  513. agno/run/v2/__init__.py +0 -0
  514. agno/run/v2/workflow.py +0 -567
  515. agno/storage/__init__.py +0 -0
  516. agno/storage/agent/__init__.py +0 -0
  517. agno/storage/agent/dynamodb.py +0 -1
  518. agno/storage/agent/json.py +0 -1
  519. agno/storage/agent/mongodb.py +0 -1
  520. agno/storage/agent/postgres.py +0 -1
  521. agno/storage/agent/singlestore.py +0 -1
  522. agno/storage/agent/sqlite.py +0 -1
  523. agno/storage/agent/yaml.py +0 -1
  524. agno/storage/base.py +0 -60
  525. agno/storage/dynamodb.py +0 -673
  526. agno/storage/firestore.py +0 -297
  527. agno/storage/gcs_json.py +0 -261
  528. agno/storage/in_memory.py +0 -234
  529. agno/storage/json.py +0 -237
  530. agno/storage/mongodb.py +0 -328
  531. agno/storage/mysql.py +0 -685
  532. agno/storage/postgres.py +0 -682
  533. agno/storage/redis.py +0 -336
  534. agno/storage/session/__init__.py +0 -16
  535. agno/storage/session/agent.py +0 -64
  536. agno/storage/session/team.py +0 -63
  537. agno/storage/session/v2/__init__.py +0 -5
  538. agno/storage/session/workflow.py +0 -61
  539. agno/storage/singlestore.py +0 -606
  540. agno/storage/sqlite.py +0 -646
  541. agno/storage/workflow/__init__.py +0 -0
  542. agno/storage/workflow/mongodb.py +0 -1
  543. agno/storage/workflow/postgres.py +0 -1
  544. agno/storage/workflow/sqlite.py +0 -1
  545. agno/storage/yaml.py +0 -241
  546. agno/tools/thinking.py +0 -73
  547. agno/utils/defaults.py +0 -57
  548. agno/utils/filesystem.py +0 -39
  549. agno/utils/git.py +0 -52
  550. agno/utils/json_io.py +0 -30
  551. agno/utils/load_env.py +0 -19
  552. agno/utils/py_io.py +0 -19
  553. agno/utils/pyproject.py +0 -18
  554. agno/utils/resource_filter.py +0 -31
  555. agno/workflow/v2/__init__.py +0 -21
  556. agno/workflow/v2/types.py +0 -357
  557. agno/workflow/v2/workflow.py +0 -3312
  558. agno/workspace/__init__.py +0 -0
  559. agno/workspace/config.py +0 -325
  560. agno/workspace/enums.py +0 -6
  561. agno/workspace/helpers.py +0 -52
  562. agno/workspace/operator.py +0 -757
  563. agno/workspace/settings.py +0 -158
  564. agno-1.8.1.dist-info/METADATA +0 -982
  565. agno-1.8.1.dist-info/RECORD +0 -566
  566. agno-1.8.1.dist-info/entry_points.txt +0 -3
  567. /agno/{app → db/migrations}/__init__.py +0 -0
  568. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  569. /agno/{cli → integrations}/__init__.py +0 -0
  570. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  571. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  572. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  573. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  574. /agno/{app → os/interfaces}/slack/security.py +0 -0
  575. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  576. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  577. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  578. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/WHEEL +0 -0
  579. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/licenses/LICENSE +0 -0
  580. {agno-1.8.1.dist-info → agno-2.0.0a1.dist-info}/top_level.txt +0 -0
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)