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/exa.py CHANGED
@@ -19,11 +19,15 @@ class ExaTools(Toolkit):
19
19
  functionalities to perform categorized searches and retrieve structured results.
20
20
 
21
21
  Args:
22
+ enable_search (bool): Enable search functionality. Default is True.
23
+ enable_get_contents (bool): Enable get contents functionality. Default is True.
24
+ enable_find_similar (bool): Enable find similar functionality. Default is True.
25
+ enable_answer (bool): Enable answer generation. Default is True.
26
+ enable_research (bool): Enable research tool functionality. Default is False.
27
+ all (bool): Enable all tools. Overrides individual flags when True. Default is False.
22
28
  text (bool): Retrieve text content from results. Default is True.
23
29
  text_length_limit (int): Max length of text content per result. Default is 1000.
24
30
  highlights (bool): Include highlighted snippets. Default is True.
25
- answer (bool): Enable answer generation. Default is True.
26
- research (bool): Enable research tool functionality. Default is True.
27
31
  api_key (Optional[str]): Exa API key. Retrieved from `EXA_API_KEY` env variable if not provided.
28
32
  num_results (Optional[int]): Default number of search results. Overrides individual searches if set.
29
33
  start_crawl_date (Optional[str]): Include results crawled on/after this date (`YYYY-MM-DD`).
@@ -42,11 +46,12 @@ class ExaTools(Toolkit):
42
46
 
43
47
  def __init__(
44
48
  self,
45
- search: bool = True,
46
- get_contents: bool = True,
47
- find_similar: bool = True,
48
- answer: bool = True,
49
- research: bool = False,
49
+ enable_search: bool = True,
50
+ enable_get_contents: bool = True,
51
+ enable_find_similar: bool = True,
52
+ enable_answer: bool = True,
53
+ enable_research: bool = False,
54
+ all: bool = False,
50
55
  text: bool = True,
51
56
  text_length_limit: int = 1000,
52
57
  highlights: bool = True,
@@ -96,15 +101,15 @@ class ExaTools(Toolkit):
96
101
  self.research_model: Literal["exa-research", "exa-research-pro"] = research_model
97
102
 
98
103
  tools: List[Any] = []
99
- if search:
104
+ if all or enable_search:
100
105
  tools.append(self.search_exa)
101
- if get_contents:
106
+ if all or enable_get_contents:
102
107
  tools.append(self.get_contents)
103
- if find_similar:
108
+ if all or enable_find_similar:
104
109
  tools.append(self.find_similar)
105
- if answer:
110
+ if all or enable_answer:
106
111
  tools.append(self.exa_answer)
107
- if research:
112
+ if all or enable_research:
108
113
  tools.append(self.research)
109
114
 
110
115
  super().__init__(name="exa", tools=tools, **kwargs)
@@ -353,14 +358,14 @@ class ExaTools(Toolkit):
353
358
  else:
354
359
  task_kwargs["output_infer_schema"] = True
355
360
 
356
- task_result = self._execute_with_timeout(self.exa.research.create_task, **task_kwargs)
361
+ task_result = self._execute_with_timeout(self.exa.research.create_task, **task_kwargs) # type: ignore
357
362
  task_id = task_result.id
358
363
 
359
364
  if self.show_results:
360
365
  log_info(f"Research task created with ID: {task_id}")
361
366
 
362
367
  # Step 2: Poll until complete (using default polling settings)
363
- task = self.exa.research.poll_task(task_id)
368
+ task = self.exa.research.poll_task(task_id) # type: ignore
364
369
 
365
370
  # Step 3: Format and return results
366
371
  result: Dict[str, Any] = {"data": task.data, "citations": {}}
agno/tools/fal.py CHANGED
@@ -10,6 +10,7 @@ from agno.agent import Agent
10
10
  from agno.media import ImageArtifact, VideoArtifact
11
11
  from agno.team.team import Team
12
12
  from agno.tools import Toolkit
13
+ from agno.tools.function import ToolResult
13
14
  from agno.utils.log import log_info, logger
14
15
 
15
16
  try:
@@ -23,16 +24,22 @@ class FalTools(Toolkit):
23
24
  self,
24
25
  api_key: Optional[str] = None,
25
26
  model: str = "fal-ai/hunyuan-video",
27
+ enable_generate_media: bool = True,
28
+ enable_image_to_image: bool = False,
29
+ all: bool = False,
26
30
  **kwargs,
27
31
  ):
28
- self.api_key = api_key or getenv("FAL_KEY")
32
+ self.api_key = api_key or getenv("FAL_API_KEY")
29
33
  if not self.api_key:
30
- logger.error("FAL_KEY not set. Please set the FAL_KEY environment variable.")
34
+ logger.error("FAL_API_KEY not set. Please set the FAL_API_KEY environment variable.")
31
35
  self.model = model
32
36
  self.seen_logs: set[str] = set()
33
37
 
34
38
  tools = []
35
- tools.append(self.generate_media)
39
+ if all or enable_generate_media:
40
+ tools.append(self.generate_media)
41
+ if all or enable_image_to_image:
42
+ tools.append(self.image_to_image)
36
43
 
37
44
  super().__init__(name="fal-tools", tools=tools, **kwargs)
38
45
 
@@ -44,14 +51,14 @@ class FalTools(Toolkit):
44
51
  log_info(message)
45
52
  self.seen_logs.add(message)
46
53
 
47
- def generate_media(self, agent: Union[Agent, Team], prompt: str) -> str:
54
+ def generate_media(self, agent: Union[Agent, Team], prompt: str) -> ToolResult:
48
55
  """
49
56
  Use this function to run a model with a given prompt.
50
57
 
51
58
  Args:
52
59
  prompt (str): A text description of the task.
53
60
  Returns:
54
- str: Return the result of the model.
61
+ ToolResult: Contains the generated media and success message.
55
62
  """
56
63
  try:
57
64
  result = fal_client.subscribe(
@@ -65,32 +72,27 @@ class FalTools(Toolkit):
65
72
 
66
73
  if "image" in result:
67
74
  url = result.get("image", {}).get("url", "")
68
- agent.add_image(
69
- ImageArtifact(
70
- id=media_id,
71
- url=url,
72
- )
75
+ image_artifact = ImageArtifact(
76
+ id=media_id,
77
+ url=url,
73
78
  )
74
- media_type = "image"
79
+ return ToolResult(content=f"Image generated successfully at {url}", images=[image_artifact])
75
80
  elif "video" in result:
76
81
  url = result.get("video", {}).get("url", "")
77
- agent.add_video(
78
- VideoArtifact(
79
- id=media_id,
80
- url=url,
81
- )
82
+ video_artifact = VideoArtifact(
83
+ id=media_id,
84
+ url=url,
82
85
  )
83
- media_type = "video"
86
+ return ToolResult(content=f"Video generated successfully at {url}", videos=[video_artifact])
84
87
  else:
85
88
  logger.error(f"Unsupported type in result: {result}")
86
- return f"Unsupported type in result: {result}"
89
+ return ToolResult(content=f"Unsupported type in result: {result}")
87
90
 
88
- return f"{media_type.capitalize()} generated successfully at {url}"
89
91
  except Exception as e:
90
92
  logger.error(f"Failed to run model: {e}")
91
- return f"Error: {e}"
93
+ return ToolResult(content=f"Error: {e}")
92
94
 
93
- def image_to_image(self, agent: Union[Agent, Team], prompt: str, image_url: Optional[str] = None) -> str:
95
+ def image_to_image(self, agent: Union[Agent, Team], prompt: str, image_url: Optional[str] = None) -> ToolResult:
94
96
  """
95
97
  Use this function to transform an input image based on a text prompt using the Fal AI image-to-image model.
96
98
  The model takes an existing image and generates a new version modified according to your prompt.
@@ -101,7 +103,7 @@ class FalTools(Toolkit):
101
103
  image_url (str): The URL of the image to use for the generation.
102
104
 
103
105
  Returns:
104
- str: Return the result of the model.
106
+ ToolResult: Contains the generated image and success message.
105
107
  """
106
108
 
107
109
  try:
@@ -113,15 +115,13 @@ class FalTools(Toolkit):
113
115
  )
114
116
  url = result.get("images", [{}])[0].get("url", "")
115
117
  media_id = str(uuid4())
116
- agent.add_image(
117
- ImageArtifact(
118
- id=media_id,
119
- url=url,
120
- )
118
+ image_artifact = ImageArtifact(
119
+ id=media_id,
120
+ url=url,
121
121
  )
122
122
 
123
- return f"Image generated successfully at {url}"
123
+ return ToolResult(content=f"Image generated successfully at {url}", images=[image_artifact])
124
124
 
125
125
  except Exception as e:
126
126
  logger.error(f"Failed to generate image: {e}")
127
- return f"Error: {e}"
127
+ return ToolResult(content=f"Error: {e}")
agno/tools/file.py CHANGED
@@ -10,22 +10,23 @@ class FileTools(Toolkit):
10
10
  def __init__(
11
11
  self,
12
12
  base_dir: Optional[Path] = None,
13
- save_files: bool = True,
14
- read_files: bool = True,
15
- list_files: bool = True,
16
- search_files: bool = True,
13
+ enable_save_file: bool = True,
14
+ enable_read_file: bool = True,
15
+ enable_list_files: bool = True,
16
+ enable_search_files: bool = True,
17
+ all: bool = False,
17
18
  **kwargs,
18
19
  ):
19
20
  self.base_dir: Path = base_dir or Path.cwd()
20
21
 
21
22
  tools: List[Any] = []
22
- if save_files:
23
+ if all or enable_save_file:
23
24
  tools.append(self.save_file)
24
- if read_files:
25
+ if all or enable_read_file:
25
26
  tools.append(self.read_file)
26
- if list_files:
27
+ if all or enable_list_files:
27
28
  tools.append(self.list_files)
28
- if search_files:
29
+ if all or enable_search_files:
29
30
  tools.append(self.search_files)
30
31
 
31
32
  super().__init__(name="file_tools", tools=tools, **kwargs)
@@ -11,29 +11,12 @@ class FinancialDatasetsTools(Toolkit):
11
11
  def __init__(
12
12
  self,
13
13
  api_key: Optional[str] = None,
14
- enable_financial_statements: bool = True,
15
- enable_company_info: bool = True,
16
- enable_market_data: bool = True,
17
- enable_ownership_data: bool = True,
18
- enable_news: bool = True,
19
- enable_sec_filings: bool = True,
20
- enable_crypto: bool = True,
21
- enable_search: bool = True,
22
14
  **kwargs,
23
15
  ):
24
- """
25
- Initialize the Financial Datasets Tools with feature flags.
16
+ """Initialize the Financial Datasets Tools.
26
17
 
27
18
  Args:
28
19
  api_key: API key for Financial Datasets API (optional, can be set via environment variable)
29
- enable_financial_statements: Enable financial statement related functions (income statements, balance sheets, etc.)
30
- enable_company_info: Enable company information related functions
31
- enable_market_data: Enable market data related functions (stock prices, earnings, metrics)
32
- enable_ownership_data: Enable ownership data related functions (insider trades, institutional ownership)
33
- enable_news: Enable news related functions
34
- enable_sec_filings: Enable SEC filings related functions
35
- enable_crypto: Enable cryptocurrency related functions
36
- enable_search: Enable search related functions
37
20
  """
38
21
 
39
22
  self.api_key: Optional[str] = api_key or getenv("FINANCIAL_DATASETS_API_KEY")
@@ -44,32 +27,30 @@ class FinancialDatasetsTools(Toolkit):
44
27
 
45
28
  self.base_url = "https://api.financialdatasets.ai"
46
29
 
47
- tools: List[Any] = []
48
-
49
- if enable_financial_statements:
50
- tools.extend(
51
- [
52
- self.get_income_statements,
53
- self.get_balance_sheets,
54
- self.get_cash_flow_statements,
55
- self.get_segmented_financials,
56
- self.get_financial_metrics,
57
- ]
58
- )
59
- if enable_company_info:
60
- tools.append(self.get_company_info)
61
- if enable_market_data:
62
- tools.extend([self.get_stock_prices, self.get_earnings])
63
- if enable_ownership_data:
64
- tools.extend([self.get_insider_trades, self.get_institutional_ownership])
65
- if enable_news:
66
- tools.append(self.get_news)
67
- if enable_sec_filings:
68
- tools.append(self.get_sec_filings)
69
- if enable_crypto:
70
- tools.append(self.get_crypto_prices)
71
- if enable_search:
72
- tools.append(self.search_tickers)
30
+ tools: List[Any] = [
31
+ # Financial statements
32
+ self.get_income_statements,
33
+ self.get_balance_sheets,
34
+ self.get_cash_flow_statements,
35
+ self.get_segmented_financials,
36
+ self.get_financial_metrics,
37
+ # Company info
38
+ self.get_company_info,
39
+ # Market data
40
+ self.get_stock_prices,
41
+ self.get_earnings,
42
+ # Ownership data
43
+ self.get_insider_trades,
44
+ self.get_institutional_ownership,
45
+ # News
46
+ self.get_news,
47
+ # SEC filings
48
+ self.get_sec_filings,
49
+ # Crypto
50
+ self.get_crypto_prices,
51
+ # Search
52
+ self.search_tickers,
53
+ ]
73
54
 
74
55
  super().__init__(name="financial_datasets_tools", tools=tools, **kwargs)
75
56
 
agno/tools/firecrawl.py CHANGED
@@ -6,7 +6,8 @@ from agno.tools import Toolkit
6
6
  from agno.utils.log import logger
7
7
 
8
8
  try:
9
- from firecrawl import FirecrawlApp, ScrapeOptions # type: ignore[attr-defined]
9
+ from firecrawl import FirecrawlApp # type: ignore[attr-defined]
10
+ from firecrawl.types import ScrapeOptions
10
11
  except ImportError:
11
12
  raise ImportError("`firecrawl-py` not installed. Please install using `pip install firecrawl-py`")
12
13
 
@@ -24,26 +25,32 @@ class CustomJSONEncoder(json.JSONEncoder):
24
25
  class FirecrawlTools(Toolkit):
25
26
  """
26
27
  Firecrawl is a tool for scraping and crawling websites.
28
+
27
29
  Args:
28
30
  api_key (Optional[str]): The API key to use for the Firecrawl app.
31
+ enable_scrape (bool): Enable website scraping functionality. Default is True.
32
+ enable_crawl (bool): Enable website crawling functionality. Default is False.
33
+ enable_mapping (bool): Enable website mapping functionality. Default is False.
34
+ enable_search (bool): Enable web search functionality. Default is False.
35
+ all (bool): Enable all tools. Overrides individual flags when True. Default is False.
29
36
  formats (Optional[List[str]]): The formats to use for the Firecrawl app.
30
37
  limit (int): The maximum number of pages to crawl.
31
- scrape (bool): Whether to scrape the website.
32
- crawl (bool): Whether to crawl the website.
33
- mapping (bool): Whether to map the website.
38
+ poll_interval (int): Polling interval for crawl operations.
39
+ search_params (Optional[Dict[str, Any]]): Parameters for search operations.
34
40
  api_url (Optional[str]): The API URL to use for the Firecrawl app.
35
41
  """
36
42
 
37
43
  def __init__(
38
44
  self,
39
45
  api_key: Optional[str] = None,
46
+ enable_scrape: bool = True,
47
+ enable_crawl: bool = False,
48
+ enable_mapping: bool = False,
49
+ enable_search: bool = False,
50
+ all: bool = False,
40
51
  formats: Optional[List[str]] = None,
41
52
  limit: int = 10,
42
53
  poll_interval: int = 30,
43
- scrape: bool = True,
44
- crawl: bool = False,
45
- mapping: bool = False,
46
- search: bool = False,
47
54
  search_params: Optional[Dict[str, Any]] = None,
48
55
  api_url: Optional[str] = "https://api.firecrawl.dev",
49
56
  **kwargs,
@@ -58,21 +65,14 @@ class FirecrawlTools(Toolkit):
58
65
  self.app: FirecrawlApp = FirecrawlApp(api_key=self.api_key, api_url=api_url)
59
66
  self.search_params = search_params
60
67
 
61
- # Start with scrape by default. But if crawl is set, then set scrape to False.
62
- if crawl:
63
- scrape = False
64
- mapping = False
65
- elif not scrape:
66
- crawl = True
67
-
68
68
  tools: List[Any] = []
69
- if scrape:
69
+ if all or enable_scrape:
70
70
  tools.append(self.scrape_website)
71
- if crawl:
71
+ if all or enable_crawl:
72
72
  tools.append(self.crawl_website)
73
- if mapping:
73
+ if all or enable_mapping:
74
74
  tools.append(self.map_website)
75
- if search:
75
+ if all or enable_search:
76
76
  tools.append(self.search)
77
77
 
78
78
  super().__init__(name="firecrawl_tools", tools=tools, **kwargs)
@@ -87,7 +87,7 @@ class FirecrawlTools(Toolkit):
87
87
  if self.formats:
88
88
  params["formats"] = self.formats
89
89
 
90
- scrape_result = self.app.scrape_url(url, **params)
90
+ scrape_result = self.app.scrape(url, **params)
91
91
  return json.dumps(scrape_result.model_dump(), cls=CustomJSONEncoder)
92
92
 
93
93
  def crawl_website(self, url: str, limit: Optional[int] = None) -> str:
@@ -108,7 +108,7 @@ class FirecrawlTools(Toolkit):
108
108
 
109
109
  params["poll_interval"] = self.poll_interval
110
110
 
111
- crawl_result = self.app.crawl_url(url, **params)
111
+ crawl_result = self.app.crawl(url, **params)
112
112
  return json.dumps(crawl_result.model_dump(), cls=CustomJSONEncoder)
113
113
 
114
114
  def map_website(self, url: str) -> str:
@@ -118,7 +118,7 @@ class FirecrawlTools(Toolkit):
118
118
  url (str): The URL to map.
119
119
 
120
120
  """
121
- map_result = self.app.map_url(url)
121
+ map_result = self.app.map(url)
122
122
  return json.dumps(map_result.model_dump(), cls=CustomJSONEncoder)
123
123
 
124
124
  def search(self, query: str, limit: Optional[int] = None):
agno/tools/function.py CHANGED
@@ -8,6 +8,7 @@ from packaging.version import Version
8
8
  from pydantic import BaseModel, Field, validate_call
9
9
 
10
10
  from agno.exceptions import AgentRunException
11
+ from agno.media import AudioArtifact, ImageArtifact, VideoArtifact
11
12
  from agno.utils.log import log_debug, log_error, log_exception, log_warning
12
13
 
13
14
  T = TypeVar("T")
@@ -84,8 +85,6 @@ class Function(BaseModel):
84
85
  entrypoint: Optional[Callable] = None
85
86
  # If True, the entrypoint processing is skipped and the Function is used as is.
86
87
  skip_entrypoint_processing: bool = False
87
- # If True, the arguments are sanitized before being passed to the function. (Deprecated)
88
- sanitize_arguments: bool = False
89
88
  # If True, the function call will show the result along with sending it to the model.
90
89
  show_result: bool = False
91
90
  # If True, the agent will stop after the function call.
@@ -123,6 +122,8 @@ class Function(BaseModel):
123
122
  _agent: Optional[Any] = None
124
123
  # The team that the function is associated with
125
124
  _team: Optional[Any] = None
125
+ # The session state that the function is associated with
126
+ _session_state: Optional[Dict[str, Any]] = None
126
127
 
127
128
  def to_dict(self) -> Dict[str, Any]:
128
129
  return self.model_dump(
@@ -143,17 +144,19 @@ class Function(BaseModel):
143
144
  type_hints = get_type_hints(c)
144
145
 
145
146
  # If function has an the agent argument, remove the agent parameter from the type hints
146
- if "agent" in sig.parameters:
147
+ if "agent" in sig.parameters and "agent" in type_hints:
147
148
  del type_hints["agent"]
148
- if "team" in sig.parameters:
149
+ if "team" in sig.parameters and "team" in type_hints:
149
150
  del type_hints["team"]
151
+ if "session_state" in sig.parameters and "session_state" in type_hints:
152
+ del type_hints["session_state"]
150
153
  # log_info(f"Type hints for {function_name}: {type_hints}")
151
154
 
152
155
  # Filter out return type and only process parameters
153
156
  param_type_hints = {
154
157
  name: type_hints.get(name)
155
158
  for name in sig.parameters
156
- if name != "return" and name not in ["agent", "team", "self"]
159
+ if name != "return" and name not in ["agent", "team", "session_state", "self"]
157
160
  }
158
161
 
159
162
  # Parse docstring for parameters
@@ -180,14 +183,14 @@ class Function(BaseModel):
180
183
  # See: https://platform.openai.com/docs/guides/structured-outputs/supported-schemas#all-fields-must-be-required
181
184
  if strict:
182
185
  parameters["required"] = [
183
- name for name in parameters["properties"] if name not in ["agent", "team", "self"]
186
+ name for name in parameters["properties"] if name not in ["agent", "team", "session_state", "self"]
184
187
  ]
185
188
  else:
186
189
  # Mark a field as required if it has no default value (this would include optional fields)
187
190
  parameters["required"] = [
188
191
  name
189
192
  for name, param in sig.parameters.items()
190
- if param.default == param.empty and name != "self" and name not in ["agent", "team"]
193
+ if param.default == param.empty and name not in ["agent", "team", "session_state", "self"]
191
194
  ]
192
195
 
193
196
  # log_debug(f"JSON schema for {function_name}: {parameters}")
@@ -232,14 +235,16 @@ class Function(BaseModel):
232
235
  type_hints = get_type_hints(self.entrypoint)
233
236
 
234
237
  # If function has an the agent argument, remove the agent parameter from the type hints
235
- if "agent" in sig.parameters:
238
+ if "agent" in sig.parameters and "agent" in type_hints:
236
239
  del type_hints["agent"]
237
- if "team" in sig.parameters:
240
+ if "team" in sig.parameters and "team" in type_hints:
238
241
  del type_hints["team"]
242
+ if "session_state" in sig.parameters and "session_state" in type_hints:
243
+ del type_hints["session_state"]
239
244
  # log_info(f"Type hints for {self.name}: {type_hints}")
240
245
 
241
246
  # Filter out return type and only process parameters
242
- excluded_params = ["return", "agent", "team", "self"]
247
+ excluded_params = ["return", "agent", "team", "session_state", "self"]
243
248
  if self.requires_user_input and self.user_input_fields:
244
249
  if len(self.user_input_fields) == 0:
245
250
  excluded_params.extend(list(type_hints.keys()))
@@ -352,7 +357,7 @@ class Function(BaseModel):
352
357
  def process_schema_for_strict(self):
353
358
  self.parameters["additionalProperties"] = False
354
359
  self.parameters["required"] = [
355
- name for name in self.parameters["properties"] if name not in ["agent", "team", "self"]
360
+ name for name in self.parameters["properties"] if name not in ["agent", "team", "session_state", "self"]
356
361
  ]
357
362
 
358
363
  def _get_cache_key(self, entrypoint_args: Dict[str, Any], call_args: Optional[Dict[str, Any]] = None) -> str:
@@ -365,6 +370,8 @@ class Function(BaseModel):
365
370
  del copy_entrypoint_args["agent"]
366
371
  if "team" in copy_entrypoint_args:
367
372
  del copy_entrypoint_args["team"]
373
+ if "session_state" in copy_entrypoint_args:
374
+ del copy_entrypoint_args["session_state"]
368
375
  args_str = str(copy_entrypoint_args)
369
376
 
370
377
  kwargs_str = str(sorted((call_args or {}).items()))
@@ -425,6 +432,13 @@ class FunctionExecutionResult(BaseModel):
425
432
  result: Optional[Any] = None
426
433
  error: Optional[str] = None
427
434
 
435
+ updated_session_state: Optional[Dict[str, Any]] = None
436
+
437
+ # New fields for media artifacts
438
+ images: Optional[List[ImageArtifact]] = None
439
+ videos: Optional[List[VideoArtifact]] = None
440
+ audios: Optional[List[AudioArtifact]] = None
441
+
428
442
 
429
443
  class FunctionCall(BaseModel):
430
444
  """Model for Function Calls"""
@@ -480,6 +494,9 @@ class FunctionCall(BaseModel):
480
494
  # Check if the pre-hook has an team argument
481
495
  if "team" in signature(self.function.pre_hook).parameters:
482
496
  pre_hook_args["team"] = self.function._team
497
+ # Check if the pre-hook has an session_state argument
498
+ if "session_state" in signature(self.function.pre_hook).parameters:
499
+ pre_hook_args["session_state"] = self.function._session_state
483
500
  # Check if the pre-hook has an fc argument
484
501
  if "fc" in signature(self.function.pre_hook).parameters:
485
502
  pre_hook_args["fc"] = self
@@ -505,6 +522,9 @@ class FunctionCall(BaseModel):
505
522
  # Check if the post-hook has an team argument
506
523
  if "team" in signature(self.function.post_hook).parameters:
507
524
  post_hook_args["team"] = self.function._team
525
+ # Check if the post-hook has an session_state argument
526
+ if "session_state" in signature(self.function.post_hook).parameters:
527
+ post_hook_args["session_state"] = self.function._session_state
508
528
  # Check if the post-hook has an fc argument
509
529
  if "fc" in signature(self.function.post_hook).parameters:
510
530
  post_hook_args["fc"] = self
@@ -528,6 +548,9 @@ class FunctionCall(BaseModel):
528
548
  # Check if the entrypoint has an team argument
529
549
  if "team" in signature(self.function.entrypoint).parameters: # type: ignore
530
550
  entrypoint_args["team"] = self.function._team
551
+ # Check if the entrypoint has an session_state argument
552
+ if "session_state" in signature(self.function.entrypoint).parameters: # type: ignore
553
+ entrypoint_args["session_state"] = self.function._session_state
531
554
  # Check if the entrypoint has an fc argument
532
555
  if "fc" in signature(self.function.entrypoint).parameters: # type: ignore
533
556
  entrypoint_args["fc"] = self
@@ -544,6 +567,9 @@ class FunctionCall(BaseModel):
544
567
  # Check if the hook has an team argument
545
568
  if "team" in signature(hook).parameters:
546
569
  hook_args["team"] = self.function._team
570
+ # Check if the hook has an session_state argument
571
+ if "session_state" in signature(hook).parameters:
572
+ hook_args["session_state"] = self.function._session_state
547
573
 
548
574
  if "name" in signature(hook).parameters:
549
575
  hook_args["name"] = name
@@ -641,10 +667,11 @@ class FunctionCall(BaseModel):
641
667
  execution_chain = self._build_nested_execution_chain(entrypoint_args=entrypoint_args)
642
668
  result = execution_chain(self.function.name, self.function.entrypoint, self.arguments or {})
643
669
  else:
644
- arguments = entrypoint_args
645
- if self.arguments is not None:
646
- arguments.update(self.arguments)
647
- result = self.function.entrypoint(**arguments)
670
+ result = self.function.entrypoint(**entrypoint_args, **self.arguments) # type: ignore
671
+
672
+ updated_session_state = None
673
+ if entrypoint_args.get("session_state") is not None:
674
+ updated_session_state = entrypoint_args.get("session_state")
648
675
 
649
676
  # Handle generator case
650
677
  if isgenerator(result):
@@ -670,7 +697,9 @@ class FunctionCall(BaseModel):
670
697
  # Execute post-hook if it exists
671
698
  self._handle_post_hook()
672
699
 
673
- return FunctionExecutionResult(status="success", result=self.result)
700
+ return FunctionExecutionResult(
701
+ status="success", result=self.result, updated_session_state=updated_session_state
702
+ )
674
703
 
675
704
  async def _handle_pre_hook_async(self):
676
705
  """Handles the async pre-hook for the function call."""
@@ -685,6 +714,9 @@ class FunctionCall(BaseModel):
685
714
  # Check if the pre-hook has an team argument
686
715
  if "team" in signature(self.function.pre_hook).parameters:
687
716
  pre_hook_args["team"] = self.function._team
717
+ # Check if the pre-hook has an session_state argument
718
+ if "session_state" in signature(self.function.pre_hook).parameters:
719
+ pre_hook_args["session_state"] = self.function._session_state
688
720
  # Check if the pre-hook has an fc argument
689
721
  if "fc" in signature(self.function.pre_hook).parameters:
690
722
  pre_hook_args["fc"] = self
@@ -711,6 +743,10 @@ class FunctionCall(BaseModel):
711
743
  # Check if the post-hook has an team argument
712
744
  if "team" in signature(self.function.post_hook).parameters:
713
745
  post_hook_args["team"] = self.function._team
746
+ # Check if the post-hook has an session_state argument
747
+ if "session_state" in signature(self.function.post_hook).parameters:
748
+ post_hook_args["session_state"] = self.function._session_state
749
+
714
750
  # Check if the post-hook has an fc argument
715
751
  if "fc" in signature(self.function.post_hook).parameters:
716
752
  post_hook_args["fc"] = self
@@ -839,6 +875,10 @@ class FunctionCall(BaseModel):
839
875
  cache_file = self.function._get_cache_file_path(cache_key)
840
876
  self.function._save_to_cache(cache_file, self.result)
841
877
 
878
+ updated_session_state = None
879
+ if entrypoint_args.get("session_state") is not None:
880
+ updated_session_state = entrypoint_args.get("session_state")
881
+
842
882
  except AgentRunException as e:
843
883
  log_debug(f"{e.__class__.__name__}: {e}")
844
884
  self.error = str(e)
@@ -855,4 +895,15 @@ class FunctionCall(BaseModel):
855
895
  else:
856
896
  self._handle_post_hook()
857
897
 
858
- return FunctionExecutionResult(status="success", result=self.result)
898
+ return FunctionExecutionResult(
899
+ status="success", result=self.result, updated_session_state=updated_session_state
900
+ )
901
+
902
+
903
+ class ToolResult(BaseModel):
904
+ """Result from a tool that can include media artifacts."""
905
+
906
+ content: str
907
+ images: Optional[List[ImageArtifact]] = None
908
+ videos: Optional[List[VideoArtifact]] = None
909
+ audios: Optional[List[AudioArtifact]] = None