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/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
agno/tools/giphy.py CHANGED
@@ -1,5 +1,5 @@
1
- import os
2
1
  import uuid
2
+ from os import getenv
3
3
  from typing import Any, List, Optional, Union
4
4
 
5
5
  import httpx
@@ -8,6 +8,7 @@ from agno.agent import Agent
8
8
  from agno.media import ImageArtifact
9
9
  from agno.team.team import Team
10
10
  from agno.tools import Toolkit
11
+ from agno.tools.function import ToolResult
11
12
  from agno.utils.log import logger
12
13
 
13
14
 
@@ -16,6 +17,8 @@ class GiphyTools(Toolkit):
16
17
  self,
17
18
  api_key: Optional[str] = None,
18
19
  limit: int = 1,
20
+ enable_search_gifs: bool = True,
21
+ all: bool = False,
19
22
  **kwargs,
20
23
  ):
21
24
  """Initialize Giphy tools.
@@ -23,27 +26,29 @@ class GiphyTools(Toolkit):
23
26
  Args:
24
27
  api_key: Giphy API key. Defaults to GIPHY_API_KEY environment variable.
25
28
  limit: Number of GIFs to return. Defaults to 1.
26
- search_gifs: Whether to enable GIF search functionality. Defaults to True.
29
+ enable_search_gifs: Whether to enable GIF search functionality. Defaults to True.
30
+ all: Enable all functions. Defaults to False.
27
31
  """
28
- self.api_key = api_key or os.getenv("GIPHY_API_KEY")
32
+ self.api_key = api_key or getenv("GIPHY_API_KEY")
29
33
  if not self.api_key:
30
34
  logger.error("No Giphy API key provided")
31
35
 
32
36
  self.limit: int = limit
33
37
 
34
38
  tools: List[Any] = []
35
- tools.append(self.search_gifs)
39
+ if all or enable_search_gifs:
40
+ tools.append(self.search_gifs)
36
41
 
37
42
  super().__init__(name="giphy_tools", tools=tools, **kwargs)
38
43
 
39
- def search_gifs(self, agent: Union[Agent, Team], query: str) -> str:
44
+ def search_gifs(self, agent: Union[Agent, Team], query: str) -> ToolResult:
40
45
  """Find a GIPHY gif
41
46
 
42
47
  Args:
43
48
  query (str): A text description of the required gif.
44
49
 
45
50
  Returns:
46
- result (str): A string containing urls of GIFs found
51
+ ToolResult: Contains the found GIF images or error message.
47
52
  """
48
53
 
49
54
  base_url = "https://api.giphy.com/v1/gifs/search"
@@ -60,6 +65,8 @@ class GiphyTools(Toolkit):
60
65
  # Extract the GIF URLs
61
66
  data = response.json()
62
67
  gif_urls = []
68
+ image_artifacts = []
69
+
63
70
  for gif in data.get("data", []):
64
71
  images = gif.get("images", {})
65
72
  original_image = images["original"]
@@ -69,13 +76,18 @@ class GiphyTools(Toolkit):
69
76
  alt_text = gif["alt_text"]
70
77
  gif_urls.append(gif_url)
71
78
 
72
- agent.add_image(ImageArtifact(id=media_id, url=gif_url, alt_text=alt_text, revised_prompt=query))
79
+ # Create ImageArtifact for the GIF
80
+ image_artifact = ImageArtifact(id=media_id, url=gif_url, alt_text=alt_text, revised_prompt=query)
81
+ image_artifacts.append(image_artifact)
73
82
 
74
- return f"These are the found gifs {gif_urls}"
83
+ if image_artifacts:
84
+ return ToolResult(content=f"Found {len(gif_urls)} GIF(s): {gif_urls}", images=image_artifacts)
85
+ else:
86
+ return ToolResult(content="No gifs found")
75
87
 
76
88
  except httpx.HTTPStatusError as e:
77
89
  logger.error(f"HTTP error occurred: {e.response.status_code} - {e.response.text}")
90
+ return ToolResult(content=f"HTTP error occurred: {e.response.status_code}")
78
91
  except Exception as e:
79
92
  logger.error(f"An error occurred: {e}")
80
-
81
- return "No gifs found"
93
+ return ToolResult(content=f"An error occurred: {e}")