agno 1.8.1__py3-none-any.whl → 2.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (590) hide show
  1. agno/__init__.py +8 -0
  2. agno/agent/__init__.py +19 -27
  3. agno/agent/agent.py +3143 -4170
  4. agno/api/agent.py +11 -67
  5. agno/api/api.py +5 -46
  6. agno/api/evals.py +8 -19
  7. agno/api/os.py +17 -0
  8. agno/api/routes.py +6 -41
  9. agno/api/schemas/__init__.py +9 -0
  10. agno/api/schemas/agent.py +5 -21
  11. agno/api/schemas/evals.py +7 -16
  12. agno/api/schemas/os.py +14 -0
  13. agno/api/schemas/team.py +5 -21
  14. agno/api/schemas/utils.py +21 -0
  15. agno/api/schemas/workflows.py +11 -7
  16. agno/api/settings.py +53 -0
  17. agno/api/team.py +11 -66
  18. agno/api/workflow.py +28 -0
  19. agno/cloud/aws/base.py +214 -0
  20. agno/cloud/aws/s3/__init__.py +2 -0
  21. agno/cloud/aws/s3/api_client.py +43 -0
  22. agno/cloud/aws/s3/bucket.py +195 -0
  23. agno/cloud/aws/s3/object.py +57 -0
  24. agno/db/__init__.py +24 -0
  25. agno/db/base.py +245 -0
  26. agno/db/dynamo/__init__.py +3 -0
  27. agno/db/dynamo/dynamo.py +1743 -0
  28. agno/db/dynamo/schemas.py +278 -0
  29. agno/db/dynamo/utils.py +684 -0
  30. agno/db/firestore/__init__.py +3 -0
  31. agno/db/firestore/firestore.py +1432 -0
  32. agno/db/firestore/schemas.py +130 -0
  33. agno/db/firestore/utils.py +278 -0
  34. agno/db/gcs_json/__init__.py +3 -0
  35. agno/db/gcs_json/gcs_json_db.py +1001 -0
  36. agno/db/gcs_json/utils.py +194 -0
  37. agno/db/in_memory/__init__.py +3 -0
  38. agno/db/in_memory/in_memory_db.py +882 -0
  39. agno/db/in_memory/utils.py +172 -0
  40. agno/db/json/__init__.py +3 -0
  41. agno/db/json/json_db.py +1045 -0
  42. agno/db/json/utils.py +196 -0
  43. agno/db/migrations/v1_to_v2.py +162 -0
  44. agno/db/mongo/__init__.py +3 -0
  45. agno/db/mongo/mongo.py +1416 -0
  46. agno/db/mongo/schemas.py +77 -0
  47. agno/db/mongo/utils.py +204 -0
  48. agno/db/mysql/__init__.py +3 -0
  49. agno/db/mysql/mysql.py +1719 -0
  50. agno/db/mysql/schemas.py +124 -0
  51. agno/db/mysql/utils.py +297 -0
  52. agno/db/postgres/__init__.py +3 -0
  53. agno/db/postgres/postgres.py +1710 -0
  54. agno/db/postgres/schemas.py +124 -0
  55. agno/db/postgres/utils.py +280 -0
  56. agno/db/redis/__init__.py +3 -0
  57. agno/db/redis/redis.py +1367 -0
  58. agno/db/redis/schemas.py +109 -0
  59. agno/db/redis/utils.py +288 -0
  60. agno/db/schemas/__init__.py +3 -0
  61. agno/db/schemas/evals.py +33 -0
  62. agno/db/schemas/knowledge.py +40 -0
  63. agno/db/schemas/memory.py +46 -0
  64. agno/db/singlestore/__init__.py +3 -0
  65. agno/db/singlestore/schemas.py +116 -0
  66. agno/db/singlestore/singlestore.py +1712 -0
  67. agno/db/singlestore/utils.py +326 -0
  68. agno/db/sqlite/__init__.py +3 -0
  69. agno/db/sqlite/schemas.py +119 -0
  70. agno/db/sqlite/sqlite.py +1676 -0
  71. agno/db/sqlite/utils.py +268 -0
  72. agno/db/utils.py +88 -0
  73. agno/eval/__init__.py +14 -0
  74. agno/eval/accuracy.py +154 -48
  75. agno/eval/performance.py +88 -23
  76. agno/eval/reliability.py +73 -20
  77. agno/eval/utils.py +23 -13
  78. agno/integrations/discord/__init__.py +3 -0
  79. agno/{app → integrations}/discord/client.py +15 -11
  80. agno/knowledge/__init__.py +2 -2
  81. agno/{document → knowledge}/chunking/agentic.py +2 -2
  82. agno/{document → knowledge}/chunking/document.py +2 -2
  83. agno/{document → knowledge}/chunking/fixed.py +3 -3
  84. agno/{document → knowledge}/chunking/markdown.py +2 -2
  85. agno/{document → knowledge}/chunking/recursive.py +2 -2
  86. agno/{document → knowledge}/chunking/row.py +2 -2
  87. agno/knowledge/chunking/semantic.py +59 -0
  88. agno/knowledge/chunking/strategy.py +121 -0
  89. agno/knowledge/content.py +74 -0
  90. agno/knowledge/document/__init__.py +5 -0
  91. agno/{document → knowledge/document}/base.py +12 -2
  92. agno/knowledge/embedder/__init__.py +5 -0
  93. agno/{embedder → knowledge/embedder}/aws_bedrock.py +127 -1
  94. agno/{embedder → knowledge/embedder}/azure_openai.py +65 -1
  95. agno/{embedder → knowledge/embedder}/base.py +6 -0
  96. agno/{embedder → knowledge/embedder}/cohere.py +72 -1
  97. agno/{embedder → knowledge/embedder}/fastembed.py +17 -1
  98. agno/{embedder → knowledge/embedder}/fireworks.py +1 -1
  99. agno/{embedder → knowledge/embedder}/google.py +74 -1
  100. agno/{embedder → knowledge/embedder}/huggingface.py +36 -2
  101. agno/{embedder → knowledge/embedder}/jina.py +48 -2
  102. agno/knowledge/embedder/langdb.py +22 -0
  103. agno/knowledge/embedder/mistral.py +139 -0
  104. agno/{embedder → knowledge/embedder}/nebius.py +1 -1
  105. agno/{embedder → knowledge/embedder}/ollama.py +54 -3
  106. agno/knowledge/embedder/openai.py +223 -0
  107. agno/{embedder → knowledge/embedder}/sentence_transformer.py +16 -1
  108. agno/{embedder → knowledge/embedder}/together.py +1 -1
  109. agno/{embedder → knowledge/embedder}/voyageai.py +49 -1
  110. agno/knowledge/knowledge.py +1551 -0
  111. agno/knowledge/reader/__init__.py +7 -0
  112. agno/{document → knowledge}/reader/arxiv_reader.py +32 -4
  113. agno/knowledge/reader/base.py +88 -0
  114. agno/{document → knowledge}/reader/csv_reader.py +47 -65
  115. agno/knowledge/reader/docx_reader.py +83 -0
  116. agno/{document → knowledge}/reader/firecrawl_reader.py +42 -21
  117. agno/{document → knowledge}/reader/json_reader.py +30 -9
  118. agno/{document → knowledge}/reader/markdown_reader.py +58 -9
  119. agno/{document → knowledge}/reader/pdf_reader.py +71 -126
  120. agno/knowledge/reader/reader_factory.py +268 -0
  121. agno/knowledge/reader/s3_reader.py +101 -0
  122. agno/{document → knowledge}/reader/text_reader.py +31 -10
  123. agno/knowledge/reader/url_reader.py +128 -0
  124. agno/knowledge/reader/web_search_reader.py +366 -0
  125. agno/{document → knowledge}/reader/website_reader.py +37 -10
  126. agno/knowledge/reader/wikipedia_reader.py +59 -0
  127. agno/knowledge/reader/youtube_reader.py +78 -0
  128. agno/knowledge/remote_content/remote_content.py +88 -0
  129. agno/{reranker → knowledge/reranker}/base.py +1 -1
  130. agno/{reranker → knowledge/reranker}/cohere.py +2 -2
  131. agno/{reranker → knowledge/reranker}/infinity.py +2 -2
  132. agno/{reranker → knowledge/reranker}/sentence_transformer.py +2 -2
  133. agno/knowledge/types.py +30 -0
  134. agno/knowledge/utils.py +169 -0
  135. agno/media.py +269 -268
  136. agno/memory/__init__.py +2 -10
  137. agno/memory/manager.py +1003 -148
  138. agno/models/aimlapi/__init__.py +2 -2
  139. agno/models/aimlapi/aimlapi.py +6 -6
  140. agno/models/anthropic/claude.py +131 -131
  141. agno/models/aws/bedrock.py +110 -182
  142. agno/models/aws/claude.py +64 -18
  143. agno/models/azure/ai_foundry.py +73 -23
  144. agno/models/base.py +346 -290
  145. agno/models/cerebras/cerebras.py +84 -27
  146. agno/models/cohere/chat.py +106 -98
  147. agno/models/google/gemini.py +105 -46
  148. agno/models/groq/groq.py +97 -35
  149. agno/models/huggingface/huggingface.py +92 -27
  150. agno/models/ibm/watsonx.py +72 -13
  151. agno/models/litellm/chat.py +85 -13
  152. agno/models/message.py +46 -151
  153. agno/models/meta/llama.py +85 -49
  154. agno/models/metrics.py +120 -0
  155. agno/models/mistral/mistral.py +90 -21
  156. agno/models/ollama/__init__.py +0 -2
  157. agno/models/ollama/chat.py +85 -47
  158. agno/models/openai/chat.py +154 -37
  159. agno/models/openai/responses.py +178 -105
  160. agno/models/perplexity/perplexity.py +26 -2
  161. agno/models/portkey/portkey.py +0 -7
  162. agno/models/response.py +15 -9
  163. agno/models/utils.py +20 -0
  164. agno/models/vercel/__init__.py +2 -2
  165. agno/models/vercel/v0.py +1 -1
  166. agno/models/vllm/__init__.py +2 -2
  167. agno/models/vllm/vllm.py +3 -3
  168. agno/models/xai/xai.py +10 -10
  169. agno/os/__init__.py +3 -0
  170. agno/os/app.py +497 -0
  171. agno/os/auth.py +47 -0
  172. agno/os/config.py +103 -0
  173. agno/os/interfaces/agui/__init__.py +3 -0
  174. agno/os/interfaces/agui/agui.py +31 -0
  175. agno/{app/agui/async_router.py → os/interfaces/agui/router.py} +16 -16
  176. agno/{app → os/interfaces}/agui/utils.py +77 -33
  177. agno/os/interfaces/base.py +21 -0
  178. agno/os/interfaces/slack/__init__.py +3 -0
  179. agno/{app/slack/async_router.py → os/interfaces/slack/router.py} +3 -5
  180. agno/os/interfaces/slack/slack.py +32 -0
  181. agno/os/interfaces/whatsapp/__init__.py +3 -0
  182. agno/{app/whatsapp/async_router.py → os/interfaces/whatsapp/router.py} +4 -7
  183. agno/os/interfaces/whatsapp/whatsapp.py +29 -0
  184. agno/os/mcp.py +235 -0
  185. agno/os/router.py +1400 -0
  186. agno/os/routers/__init__.py +3 -0
  187. agno/os/routers/evals/__init__.py +3 -0
  188. agno/os/routers/evals/evals.py +393 -0
  189. agno/os/routers/evals/schemas.py +142 -0
  190. agno/os/routers/evals/utils.py +161 -0
  191. agno/os/routers/knowledge/__init__.py +3 -0
  192. agno/os/routers/knowledge/knowledge.py +850 -0
  193. agno/os/routers/knowledge/schemas.py +118 -0
  194. agno/os/routers/memory/__init__.py +3 -0
  195. agno/os/routers/memory/memory.py +410 -0
  196. agno/os/routers/memory/schemas.py +58 -0
  197. agno/os/routers/metrics/__init__.py +3 -0
  198. agno/os/routers/metrics/metrics.py +178 -0
  199. agno/os/routers/metrics/schemas.py +47 -0
  200. agno/os/routers/session/__init__.py +3 -0
  201. agno/os/routers/session/session.py +536 -0
  202. agno/os/schema.py +945 -0
  203. agno/{app/playground → os}/settings.py +7 -15
  204. agno/os/utils.py +270 -0
  205. agno/reasoning/azure_ai_foundry.py +4 -4
  206. agno/reasoning/deepseek.py +4 -4
  207. agno/reasoning/default.py +6 -11
  208. agno/reasoning/groq.py +4 -4
  209. agno/reasoning/helpers.py +4 -6
  210. agno/reasoning/ollama.py +4 -4
  211. agno/reasoning/openai.py +4 -4
  212. agno/run/agent.py +633 -0
  213. agno/run/base.py +53 -77
  214. agno/run/cancel.py +81 -0
  215. agno/run/team.py +243 -96
  216. agno/run/workflow.py +550 -12
  217. agno/session/__init__.py +10 -0
  218. agno/session/agent.py +244 -0
  219. agno/session/summary.py +225 -0
  220. agno/session/team.py +262 -0
  221. agno/{storage/session/v2 → session}/workflow.py +47 -24
  222. agno/team/__init__.py +15 -16
  223. agno/team/team.py +3260 -4824
  224. agno/tools/agentql.py +14 -5
  225. agno/tools/airflow.py +9 -4
  226. agno/tools/api.py +7 -3
  227. agno/tools/apify.py +2 -46
  228. agno/tools/arxiv.py +8 -3
  229. agno/tools/aws_lambda.py +7 -5
  230. agno/tools/aws_ses.py +7 -1
  231. agno/tools/baidusearch.py +4 -1
  232. agno/tools/bitbucket.py +4 -4
  233. agno/tools/brandfetch.py +14 -11
  234. agno/tools/bravesearch.py +4 -1
  235. agno/tools/brightdata.py +43 -23
  236. agno/tools/browserbase.py +13 -4
  237. agno/tools/calcom.py +12 -10
  238. agno/tools/calculator.py +10 -27
  239. agno/tools/cartesia.py +20 -17
  240. agno/tools/{clickup_tool.py → clickup.py} +12 -25
  241. agno/tools/confluence.py +8 -8
  242. agno/tools/crawl4ai.py +7 -1
  243. agno/tools/csv_toolkit.py +9 -8
  244. agno/tools/dalle.py +22 -12
  245. agno/tools/daytona.py +13 -16
  246. agno/tools/decorator.py +6 -3
  247. agno/tools/desi_vocal.py +17 -8
  248. agno/tools/discord.py +11 -8
  249. agno/tools/docker.py +30 -42
  250. agno/tools/duckdb.py +34 -53
  251. agno/tools/duckduckgo.py +8 -7
  252. agno/tools/e2b.py +62 -62
  253. agno/tools/eleven_labs.py +36 -29
  254. agno/tools/email.py +4 -1
  255. agno/tools/evm.py +7 -1
  256. agno/tools/exa.py +19 -14
  257. agno/tools/fal.py +30 -30
  258. agno/tools/file.py +9 -8
  259. agno/tools/financial_datasets.py +25 -44
  260. agno/tools/firecrawl.py +22 -22
  261. agno/tools/function.py +127 -18
  262. agno/tools/giphy.py +23 -11
  263. agno/tools/github.py +48 -126
  264. agno/tools/gmail.py +45 -61
  265. agno/tools/google_bigquery.py +7 -6
  266. agno/tools/google_maps.py +11 -26
  267. agno/tools/googlesearch.py +7 -2
  268. agno/tools/googlesheets.py +21 -17
  269. agno/tools/hackernews.py +9 -5
  270. agno/tools/jina.py +5 -4
  271. agno/tools/jira.py +18 -9
  272. agno/tools/knowledge.py +31 -32
  273. agno/tools/linear.py +19 -34
  274. agno/tools/linkup.py +5 -1
  275. agno/tools/local_file_system.py +8 -5
  276. agno/tools/lumalab.py +32 -20
  277. agno/tools/mcp.py +1 -2
  278. agno/tools/mem0.py +18 -12
  279. agno/tools/memori.py +14 -10
  280. agno/tools/mlx_transcribe.py +3 -2
  281. agno/tools/models/azure_openai.py +33 -15
  282. agno/tools/models/gemini.py +59 -32
  283. agno/tools/models/groq.py +30 -23
  284. agno/tools/models/nebius.py +28 -12
  285. agno/tools/models_labs.py +40 -16
  286. agno/tools/moviepy_video.py +7 -6
  287. agno/tools/neo4j.py +10 -8
  288. agno/tools/newspaper.py +7 -2
  289. agno/tools/newspaper4k.py +8 -3
  290. agno/tools/openai.py +58 -32
  291. agno/tools/openbb.py +12 -11
  292. agno/tools/opencv.py +63 -47
  293. agno/tools/openweather.py +14 -12
  294. agno/tools/pandas.py +11 -3
  295. agno/tools/postgres.py +4 -12
  296. agno/tools/pubmed.py +4 -1
  297. agno/tools/python.py +9 -22
  298. agno/tools/reasoning.py +35 -27
  299. agno/tools/reddit.py +11 -26
  300. agno/tools/replicate.py +55 -42
  301. agno/tools/resend.py +4 -1
  302. agno/tools/scrapegraph.py +15 -14
  303. agno/tools/searxng.py +10 -23
  304. agno/tools/serpapi.py +6 -3
  305. agno/tools/serper.py +13 -4
  306. agno/tools/shell.py +9 -2
  307. agno/tools/slack.py +12 -11
  308. agno/tools/sleep.py +3 -2
  309. agno/tools/spider.py +24 -4
  310. agno/tools/sql.py +7 -6
  311. agno/tools/tavily.py +6 -4
  312. agno/tools/telegram.py +12 -4
  313. agno/tools/todoist.py +11 -31
  314. agno/tools/toolkit.py +1 -1
  315. agno/tools/trafilatura.py +22 -6
  316. agno/tools/trello.py +9 -22
  317. agno/tools/twilio.py +10 -3
  318. agno/tools/user_control_flow.py +6 -1
  319. agno/tools/valyu.py +34 -5
  320. agno/tools/visualization.py +19 -28
  321. agno/tools/webbrowser.py +4 -3
  322. agno/tools/webex.py +11 -7
  323. agno/tools/website.py +15 -46
  324. agno/tools/webtools.py +12 -4
  325. agno/tools/whatsapp.py +5 -9
  326. agno/tools/wikipedia.py +20 -13
  327. agno/tools/x.py +14 -13
  328. agno/tools/yfinance.py +13 -40
  329. agno/tools/youtube.py +26 -20
  330. agno/tools/zendesk.py +7 -2
  331. agno/tools/zep.py +10 -7
  332. agno/tools/zoom.py +10 -9
  333. agno/utils/common.py +1 -19
  334. agno/utils/events.py +100 -123
  335. agno/utils/gemini.py +32 -2
  336. agno/utils/knowledge.py +29 -0
  337. agno/utils/log.py +54 -4
  338. agno/utils/mcp.py +68 -10
  339. agno/utils/media.py +39 -0
  340. agno/utils/message.py +12 -1
  341. agno/utils/models/aws_claude.py +1 -1
  342. agno/utils/models/claude.py +47 -4
  343. agno/utils/models/cohere.py +1 -1
  344. agno/utils/models/mistral.py +8 -7
  345. agno/utils/models/schema_utils.py +3 -3
  346. agno/utils/models/watsonx.py +1 -1
  347. agno/utils/openai.py +1 -1
  348. agno/utils/pprint.py +33 -32
  349. agno/utils/print_response/agent.py +779 -0
  350. agno/utils/print_response/team.py +1669 -0
  351. agno/utils/print_response/workflow.py +1451 -0
  352. agno/utils/prompts.py +14 -14
  353. agno/utils/reasoning.py +87 -0
  354. agno/utils/response.py +42 -42
  355. agno/utils/streamlit.py +481 -0
  356. agno/utils/string.py +8 -22
  357. agno/utils/team.py +50 -0
  358. agno/utils/timer.py +2 -2
  359. agno/vectordb/base.py +33 -21
  360. agno/vectordb/cassandra/cassandra.py +287 -23
  361. agno/vectordb/chroma/chromadb.py +482 -59
  362. agno/vectordb/clickhouse/clickhousedb.py +270 -63
  363. agno/vectordb/couchbase/couchbase.py +309 -29
  364. agno/vectordb/lancedb/lance_db.py +360 -21
  365. agno/vectordb/langchaindb/__init__.py +5 -0
  366. agno/vectordb/langchaindb/langchaindb.py +145 -0
  367. agno/vectordb/lightrag/__init__.py +5 -0
  368. agno/vectordb/lightrag/lightrag.py +374 -0
  369. agno/vectordb/llamaindex/llamaindexdb.py +127 -0
  370. agno/vectordb/milvus/milvus.py +242 -32
  371. agno/vectordb/mongodb/mongodb.py +200 -24
  372. agno/vectordb/pgvector/pgvector.py +319 -37
  373. agno/vectordb/pineconedb/pineconedb.py +221 -27
  374. agno/vectordb/qdrant/qdrant.py +334 -14
  375. agno/vectordb/singlestore/singlestore.py +286 -29
  376. agno/vectordb/surrealdb/surrealdb.py +187 -7
  377. agno/vectordb/upstashdb/upstashdb.py +342 -26
  378. agno/vectordb/weaviate/weaviate.py +227 -165
  379. agno/workflow/__init__.py +17 -13
  380. agno/workflow/{v2/condition.py → condition.py} +135 -32
  381. agno/workflow/{v2/loop.py → loop.py} +115 -28
  382. agno/workflow/{v2/parallel.py → parallel.py} +138 -108
  383. agno/workflow/{v2/router.py → router.py} +133 -32
  384. agno/workflow/{v2/step.py → step.py} +207 -49
  385. agno/workflow/{v2/steps.py → steps.py} +147 -66
  386. agno/workflow/types.py +482 -0
  387. agno/workflow/workflow.py +2410 -696
  388. agno-2.0.0.dist-info/METADATA +494 -0
  389. agno-2.0.0.dist-info/RECORD +515 -0
  390. agno-2.0.0.dist-info/licenses/LICENSE +201 -0
  391. agno/agent/metrics.py +0 -107
  392. agno/api/app.py +0 -35
  393. agno/api/playground.py +0 -92
  394. agno/api/schemas/app.py +0 -12
  395. agno/api/schemas/playground.py +0 -22
  396. agno/api/schemas/user.py +0 -35
  397. agno/api/schemas/workspace.py +0 -46
  398. agno/api/user.py +0 -160
  399. agno/api/workflows.py +0 -33
  400. agno/api/workspace.py +0 -175
  401. agno/app/agui/__init__.py +0 -3
  402. agno/app/agui/app.py +0 -17
  403. agno/app/agui/sync_router.py +0 -120
  404. agno/app/base.py +0 -186
  405. agno/app/discord/__init__.py +0 -3
  406. agno/app/fastapi/__init__.py +0 -3
  407. agno/app/fastapi/app.py +0 -107
  408. agno/app/fastapi/async_router.py +0 -457
  409. agno/app/fastapi/sync_router.py +0 -448
  410. agno/app/playground/app.py +0 -228
  411. agno/app/playground/async_router.py +0 -1050
  412. agno/app/playground/deploy.py +0 -249
  413. agno/app/playground/operator.py +0 -183
  414. agno/app/playground/schemas.py +0 -220
  415. agno/app/playground/serve.py +0 -55
  416. agno/app/playground/sync_router.py +0 -1042
  417. agno/app/playground/utils.py +0 -46
  418. agno/app/settings.py +0 -15
  419. agno/app/slack/__init__.py +0 -3
  420. agno/app/slack/app.py +0 -19
  421. agno/app/slack/sync_router.py +0 -92
  422. agno/app/utils.py +0 -54
  423. agno/app/whatsapp/__init__.py +0 -3
  424. agno/app/whatsapp/app.py +0 -15
  425. agno/app/whatsapp/sync_router.py +0 -197
  426. agno/cli/auth_server.py +0 -249
  427. agno/cli/config.py +0 -274
  428. agno/cli/console.py +0 -88
  429. agno/cli/credentials.py +0 -23
  430. agno/cli/entrypoint.py +0 -571
  431. agno/cli/operator.py +0 -357
  432. agno/cli/settings.py +0 -96
  433. agno/cli/ws/ws_cli.py +0 -817
  434. agno/constants.py +0 -13
  435. agno/document/__init__.py +0 -5
  436. agno/document/chunking/semantic.py +0 -45
  437. agno/document/chunking/strategy.py +0 -31
  438. agno/document/reader/__init__.py +0 -5
  439. agno/document/reader/base.py +0 -47
  440. agno/document/reader/docx_reader.py +0 -60
  441. agno/document/reader/gcs/pdf_reader.py +0 -44
  442. agno/document/reader/s3/pdf_reader.py +0 -59
  443. agno/document/reader/s3/text_reader.py +0 -63
  444. agno/document/reader/url_reader.py +0 -59
  445. agno/document/reader/youtube_reader.py +0 -58
  446. agno/embedder/__init__.py +0 -5
  447. agno/embedder/langdb.py +0 -80
  448. agno/embedder/mistral.py +0 -82
  449. agno/embedder/openai.py +0 -78
  450. agno/file/__init__.py +0 -5
  451. agno/file/file.py +0 -16
  452. agno/file/local/csv.py +0 -32
  453. agno/file/local/txt.py +0 -19
  454. agno/infra/app.py +0 -240
  455. agno/infra/base.py +0 -144
  456. agno/infra/context.py +0 -20
  457. agno/infra/db_app.py +0 -52
  458. agno/infra/resource.py +0 -205
  459. agno/infra/resources.py +0 -55
  460. agno/knowledge/agent.py +0 -702
  461. agno/knowledge/arxiv.py +0 -33
  462. agno/knowledge/combined.py +0 -36
  463. agno/knowledge/csv.py +0 -144
  464. agno/knowledge/csv_url.py +0 -124
  465. agno/knowledge/document.py +0 -223
  466. agno/knowledge/docx.py +0 -137
  467. agno/knowledge/firecrawl.py +0 -34
  468. agno/knowledge/gcs/__init__.py +0 -0
  469. agno/knowledge/gcs/base.py +0 -39
  470. agno/knowledge/gcs/pdf.py +0 -125
  471. agno/knowledge/json.py +0 -137
  472. agno/knowledge/langchain.py +0 -71
  473. agno/knowledge/light_rag.py +0 -273
  474. agno/knowledge/llamaindex.py +0 -66
  475. agno/knowledge/markdown.py +0 -154
  476. agno/knowledge/pdf.py +0 -164
  477. agno/knowledge/pdf_bytes.py +0 -42
  478. agno/knowledge/pdf_url.py +0 -148
  479. agno/knowledge/s3/__init__.py +0 -0
  480. agno/knowledge/s3/base.py +0 -64
  481. agno/knowledge/s3/pdf.py +0 -33
  482. agno/knowledge/s3/text.py +0 -34
  483. agno/knowledge/text.py +0 -141
  484. agno/knowledge/url.py +0 -46
  485. agno/knowledge/website.py +0 -179
  486. agno/knowledge/wikipedia.py +0 -32
  487. agno/knowledge/youtube.py +0 -35
  488. agno/memory/agent.py +0 -423
  489. agno/memory/classifier.py +0 -104
  490. agno/memory/db/__init__.py +0 -5
  491. agno/memory/db/base.py +0 -42
  492. agno/memory/db/mongodb.py +0 -189
  493. agno/memory/db/postgres.py +0 -203
  494. agno/memory/db/sqlite.py +0 -193
  495. agno/memory/memory.py +0 -22
  496. agno/memory/row.py +0 -36
  497. agno/memory/summarizer.py +0 -201
  498. agno/memory/summary.py +0 -19
  499. agno/memory/team.py +0 -415
  500. agno/memory/v2/__init__.py +0 -2
  501. agno/memory/v2/db/__init__.py +0 -1
  502. agno/memory/v2/db/base.py +0 -42
  503. agno/memory/v2/db/firestore.py +0 -339
  504. agno/memory/v2/db/mongodb.py +0 -196
  505. agno/memory/v2/db/postgres.py +0 -214
  506. agno/memory/v2/db/redis.py +0 -187
  507. agno/memory/v2/db/schema.py +0 -54
  508. agno/memory/v2/db/sqlite.py +0 -209
  509. agno/memory/v2/manager.py +0 -437
  510. agno/memory/v2/memory.py +0 -1097
  511. agno/memory/v2/schema.py +0 -55
  512. agno/memory/v2/summarizer.py +0 -215
  513. agno/memory/workflow.py +0 -38
  514. agno/models/ollama/tools.py +0 -430
  515. agno/models/qwen/__init__.py +0 -5
  516. agno/playground/__init__.py +0 -10
  517. agno/playground/deploy.py +0 -3
  518. agno/playground/playground.py +0 -3
  519. agno/playground/serve.py +0 -3
  520. agno/playground/settings.py +0 -3
  521. agno/reranker/__init__.py +0 -0
  522. agno/run/response.py +0 -467
  523. agno/run/v2/__init__.py +0 -0
  524. agno/run/v2/workflow.py +0 -567
  525. agno/storage/__init__.py +0 -0
  526. agno/storage/agent/__init__.py +0 -0
  527. agno/storage/agent/dynamodb.py +0 -1
  528. agno/storage/agent/json.py +0 -1
  529. agno/storage/agent/mongodb.py +0 -1
  530. agno/storage/agent/postgres.py +0 -1
  531. agno/storage/agent/singlestore.py +0 -1
  532. agno/storage/agent/sqlite.py +0 -1
  533. agno/storage/agent/yaml.py +0 -1
  534. agno/storage/base.py +0 -60
  535. agno/storage/dynamodb.py +0 -673
  536. agno/storage/firestore.py +0 -297
  537. agno/storage/gcs_json.py +0 -261
  538. agno/storage/in_memory.py +0 -234
  539. agno/storage/json.py +0 -237
  540. agno/storage/mongodb.py +0 -328
  541. agno/storage/mysql.py +0 -685
  542. agno/storage/postgres.py +0 -682
  543. agno/storage/redis.py +0 -336
  544. agno/storage/session/__init__.py +0 -16
  545. agno/storage/session/agent.py +0 -64
  546. agno/storage/session/team.py +0 -63
  547. agno/storage/session/v2/__init__.py +0 -5
  548. agno/storage/session/workflow.py +0 -61
  549. agno/storage/singlestore.py +0 -606
  550. agno/storage/sqlite.py +0 -646
  551. agno/storage/workflow/__init__.py +0 -0
  552. agno/storage/workflow/mongodb.py +0 -1
  553. agno/storage/workflow/postgres.py +0 -1
  554. agno/storage/workflow/sqlite.py +0 -1
  555. agno/storage/yaml.py +0 -241
  556. agno/tools/thinking.py +0 -73
  557. agno/utils/defaults.py +0 -57
  558. agno/utils/filesystem.py +0 -39
  559. agno/utils/git.py +0 -52
  560. agno/utils/json_io.py +0 -30
  561. agno/utils/load_env.py +0 -19
  562. agno/utils/py_io.py +0 -19
  563. agno/utils/pyproject.py +0 -18
  564. agno/utils/resource_filter.py +0 -31
  565. agno/workflow/v2/__init__.py +0 -21
  566. agno/workflow/v2/types.py +0 -357
  567. agno/workflow/v2/workflow.py +0 -3312
  568. agno/workspace/__init__.py +0 -0
  569. agno/workspace/config.py +0 -325
  570. agno/workspace/enums.py +0 -6
  571. agno/workspace/helpers.py +0 -52
  572. agno/workspace/operator.py +0 -757
  573. agno/workspace/settings.py +0 -158
  574. agno-1.8.1.dist-info/METADATA +0 -982
  575. agno-1.8.1.dist-info/RECORD +0 -566
  576. agno-1.8.1.dist-info/entry_points.txt +0 -3
  577. agno-1.8.1.dist-info/licenses/LICENSE +0 -375
  578. /agno/{app → db/migrations}/__init__.py +0 -0
  579. /agno/{app/playground/__init__.py → db/schemas/metrics.py} +0 -0
  580. /agno/{cli → integrations}/__init__.py +0 -0
  581. /agno/{cli/ws → knowledge/chunking}/__init__.py +0 -0
  582. /agno/{document/chunking → knowledge/remote_content}/__init__.py +0 -0
  583. /agno/{document/reader/gcs → knowledge/reranker}/__init__.py +0 -0
  584. /agno/{document/reader/s3 → os/interfaces}/__init__.py +0 -0
  585. /agno/{app → os/interfaces}/slack/security.py +0 -0
  586. /agno/{app → os/interfaces}/whatsapp/security.py +0 -0
  587. /agno/{file/local → utils/print_response}/__init__.py +0 -0
  588. /agno/{infra → vectordb/llamaindex}/__init__.py +0 -0
  589. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/WHEEL +0 -0
  590. {agno-1.8.1.dist-info → agno-2.0.0.dist-info}/top_level.txt +0 -0
agno/run/v2/workflow.py DELETED
@@ -1,567 +0,0 @@
1
- from dataclasses import asdict, dataclass, field
2
- from enum import Enum
3
- from time import time
4
- from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
5
-
6
- from pydantic import BaseModel
7
-
8
- from agno.media import AudioArtifact, AudioResponse, ImageArtifact, VideoArtifact
9
- from agno.run.base import RunStatus
10
- from agno.utils.log import log_error
11
-
12
- if TYPE_CHECKING:
13
- from agno.workflow.v2.types import StepOutput, WorkflowMetrics
14
-
15
-
16
- class WorkflowRunEvent(str, Enum):
17
- """Events that can be sent by workflow execution"""
18
-
19
- workflow_started = "WorkflowStarted"
20
- workflow_completed = "WorkflowCompleted"
21
- workflow_cancelled = "WorkflowCancelled"
22
- workflow_error = "WorkflowError"
23
-
24
- step_started = "StepStarted"
25
- step_completed = "StepCompleted"
26
- step_error = "StepError"
27
-
28
- loop_execution_started = "LoopExecutionStarted"
29
- loop_iteration_started = "LoopIterationStarted"
30
- loop_iteration_completed = "LoopIterationCompleted"
31
- loop_execution_completed = "LoopExecutionCompleted"
32
-
33
- parallel_execution_started = "ParallelExecutionStarted"
34
- parallel_execution_completed = "ParallelExecutionCompleted"
35
-
36
- condition_execution_started = "ConditionExecutionStarted"
37
- condition_execution_completed = "ConditionExecutionCompleted"
38
-
39
- router_execution_started = "RouterExecutionStarted"
40
- router_execution_completed = "RouterExecutionCompleted"
41
-
42
- steps_execution_started = "StepsExecutionStarted"
43
- steps_execution_completed = "StepsExecutionCompleted"
44
-
45
- step_output = "StepOutput"
46
-
47
-
48
- @dataclass
49
- class BaseWorkflowRunResponseEvent:
50
- """Base class for all workflow run response events"""
51
-
52
- created_at: int = field(default_factory=lambda: int(time()))
53
- event: str = ""
54
-
55
- # Workflow-specific fields
56
- workflow_id: Optional[str] = None
57
- workflow_name: Optional[str] = None
58
- session_id: Optional[str] = None
59
- run_id: Optional[str] = None
60
-
61
- def to_dict(self) -> Dict[str, Any]:
62
- _dict = {k: v for k, v in asdict(self).items() if v is not None}
63
-
64
- if hasattr(self, "content") and self.content and isinstance(self.content, BaseModel):
65
- _dict["content"] = self.content.model_dump(exclude_none=True)
66
-
67
- # Handle StepOutput fields that contain Message objects
68
- if hasattr(self, "step_responses") and self.step_responses is not None:
69
- _dict["step_responses"] = [step.to_dict() for step in self.step_responses]
70
-
71
- if hasattr(self, "step_response") and self.step_response is not None:
72
- _dict["step_response"] = self.step_response.to_dict()
73
-
74
- if hasattr(self, "iteration_results") and self.iteration_results is not None:
75
- _dict["iteration_results"] = [step.to_dict() for step in self.iteration_results]
76
-
77
- if hasattr(self, "all_results") and self.all_results is not None:
78
- _dict["all_results"] = [[step.to_dict() for step in iteration] for iteration in self.all_results]
79
-
80
- if hasattr(self, "step_results") and self.step_results is not None:
81
- _dict["step_results"] = [step.to_dict() for step in self.step_results]
82
-
83
- return _dict
84
-
85
- def to_json(self) -> str:
86
- import json
87
-
88
- try:
89
- _dict = self.to_dict()
90
- except Exception:
91
- log_error("Failed to convert response to json", exc_info=True)
92
- raise
93
-
94
- return json.dumps(_dict, indent=2)
95
-
96
- @property
97
- def is_cancelled(self):
98
- return False
99
-
100
- @property
101
- def is_error(self):
102
- return False
103
-
104
- @property
105
- def status(self):
106
- status = "Completed"
107
- if self.is_error:
108
- status = "Error"
109
- if self.is_cancelled:
110
- status = "Cancelled"
111
-
112
- return status
113
-
114
-
115
- @dataclass
116
- class WorkflowStartedEvent(BaseWorkflowRunResponseEvent):
117
- """Event sent when workflow execution starts"""
118
-
119
- event: str = WorkflowRunEvent.workflow_started.value
120
-
121
-
122
- @dataclass
123
- class WorkflowCompletedEvent(BaseWorkflowRunResponseEvent):
124
- """Event sent when workflow execution completes"""
125
-
126
- event: str = WorkflowRunEvent.workflow_completed.value
127
- content: Optional[Any] = None
128
- content_type: str = "str"
129
-
130
- # Store actual step execution results as StepOutput objects
131
- step_responses: List["StepOutput"] = field(default_factory=list) # noqa: F821
132
- extra_data: Optional[Dict[str, Any]] = None
133
-
134
-
135
- @dataclass
136
- class WorkflowErrorEvent(BaseWorkflowRunResponseEvent):
137
- """Event sent when workflow execution fails"""
138
-
139
- event: str = WorkflowRunEvent.workflow_error.value
140
- error: Optional[str] = None
141
-
142
-
143
- @dataclass
144
- class WorkflowCancelledEvent(BaseWorkflowRunResponseEvent):
145
- """Event sent when workflow execution is cancelled"""
146
-
147
- event: str = WorkflowRunEvent.workflow_cancelled.value
148
- reason: Optional[str] = None
149
-
150
- @property
151
- def is_cancelled(self):
152
- return True
153
-
154
-
155
- @dataclass
156
- class StepStartedEvent(BaseWorkflowRunResponseEvent):
157
- """Event sent when step execution starts"""
158
-
159
- event: str = WorkflowRunEvent.step_started.value
160
- step_name: Optional[str] = None
161
- step_index: Optional[Union[int, tuple]] = None
162
-
163
-
164
- @dataclass
165
- class StepCompletedEvent(BaseWorkflowRunResponseEvent):
166
- """Event sent when step execution completes"""
167
-
168
- event: str = WorkflowRunEvent.step_completed.value
169
- step_name: Optional[str] = None
170
- step_index: Optional[Union[int, tuple]] = None
171
-
172
- content: Optional[Any] = None
173
- content_type: str = "str"
174
-
175
- # Media content fields
176
- images: Optional[List[ImageArtifact]] = None
177
- videos: Optional[List[VideoArtifact]] = None
178
- audio: Optional[List[AudioArtifact]] = None
179
- response_audio: Optional[AudioResponse] = None
180
-
181
- # Store actual step execution results as StepOutput objects
182
- step_response: Optional["StepOutput"] = None # noqa: F821
183
-
184
-
185
- @dataclass
186
- class StepErrorEvent(BaseWorkflowRunResponseEvent):
187
- """Event sent when step execution fails"""
188
-
189
- event: str = WorkflowRunEvent.step_error.value
190
- step_name: Optional[str] = None
191
- step_index: Optional[Union[int, tuple]] = None
192
- error: Optional[str] = None
193
-
194
-
195
- @dataclass
196
- class LoopExecutionStartedEvent(BaseWorkflowRunResponseEvent):
197
- """Event sent when loop execution starts"""
198
-
199
- event: str = WorkflowRunEvent.loop_execution_started.value
200
- step_name: Optional[str] = None
201
- step_index: Optional[Union[int, tuple]] = None
202
- max_iterations: Optional[int] = None
203
-
204
-
205
- @dataclass
206
- class LoopIterationStartedEvent(BaseWorkflowRunResponseEvent):
207
- """Event sent when loop iteration starts"""
208
-
209
- event: str = WorkflowRunEvent.loop_iteration_started.value
210
- step_name: Optional[str] = None
211
- step_index: Optional[Union[int, tuple]] = None
212
- iteration: int = 0
213
- max_iterations: Optional[int] = None
214
-
215
-
216
- @dataclass
217
- class LoopIterationCompletedEvent(BaseWorkflowRunResponseEvent):
218
- """Event sent when loop iteration completes"""
219
-
220
- event: str = WorkflowRunEvent.loop_iteration_completed.value
221
- step_name: Optional[str] = None
222
- step_index: Optional[Union[int, tuple]] = None
223
- iteration: int = 0
224
- max_iterations: Optional[int] = None
225
- iteration_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
226
- should_continue: bool = True
227
-
228
-
229
- @dataclass
230
- class LoopExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
231
- """Event sent when loop execution completes"""
232
-
233
- event: str = WorkflowRunEvent.loop_execution_completed.value
234
- step_name: Optional[str] = None
235
- step_index: Optional[Union[int, tuple]] = None
236
- total_iterations: int = 0
237
- max_iterations: Optional[int] = None
238
- all_results: List[List["StepOutput"]] = field(default_factory=list) # noqa: F821
239
-
240
-
241
- @dataclass
242
- class ParallelExecutionStartedEvent(BaseWorkflowRunResponseEvent):
243
- """Event sent when parallel step execution starts"""
244
-
245
- event: str = WorkflowRunEvent.parallel_execution_started.value
246
- step_name: Optional[str] = None
247
- step_index: Optional[Union[int, tuple]] = None
248
- parallel_step_count: Optional[int] = None
249
-
250
-
251
- @dataclass
252
- class ParallelExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
253
- """Event sent when parallel step execution completes"""
254
-
255
- event: str = WorkflowRunEvent.parallel_execution_completed.value
256
- step_name: Optional[str] = None
257
- step_index: Optional[Union[int, tuple]] = None
258
- parallel_step_count: Optional[int] = None
259
-
260
- # Results from all parallel steps
261
- step_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
262
-
263
-
264
- @dataclass
265
- class ConditionExecutionStartedEvent(BaseWorkflowRunResponseEvent):
266
- """Event sent when condition step execution starts"""
267
-
268
- event: str = WorkflowRunEvent.condition_execution_started.value
269
- step_name: Optional[str] = None
270
- step_index: Optional[Union[int, tuple]] = None
271
- condition_result: Optional[bool] = None
272
-
273
-
274
- @dataclass
275
- class ConditionExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
276
- """Event sent when condition step execution completes"""
277
-
278
- event: str = WorkflowRunEvent.condition_execution_completed.value
279
- step_name: Optional[str] = None
280
- step_index: Optional[Union[int, tuple]] = None
281
- condition_result: Optional[bool] = None
282
- executed_steps: Optional[int] = None
283
-
284
- # Results from executed steps
285
- step_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
286
-
287
-
288
- @dataclass
289
- class RouterExecutionStartedEvent(BaseWorkflowRunResponseEvent):
290
- """Event sent when router step execution starts"""
291
-
292
- event: str = WorkflowRunEvent.router_execution_started.value
293
- step_name: Optional[str] = None
294
- step_index: Optional[Union[int, tuple]] = None
295
- # Names of steps selected by router
296
- selected_steps: List[str] = field(default_factory=list)
297
-
298
-
299
- @dataclass
300
- class RouterExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
301
- """Event sent when router step execution completes"""
302
-
303
- event: str = WorkflowRunEvent.router_execution_completed.value
304
- step_name: Optional[str] = None
305
- step_index: Optional[Union[int, tuple]] = None
306
- # Names of steps that were selected
307
- selected_steps: List[str] = field(default_factory=list)
308
- executed_steps: Optional[int] = None
309
-
310
- # Results from executed steps
311
- step_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
312
-
313
-
314
- @dataclass
315
- class StepsExecutionStartedEvent(BaseWorkflowRunResponseEvent):
316
- """Event sent when steps execution starts"""
317
-
318
- event: str = WorkflowRunEvent.steps_execution_started.value
319
- step_name: Optional[str] = None
320
- step_index: Optional[Union[int, tuple]] = None
321
- steps_count: Optional[int] = None
322
-
323
-
324
- @dataclass
325
- class StepsExecutionCompletedEvent(BaseWorkflowRunResponseEvent):
326
- """Event sent when steps execution completes"""
327
-
328
- event: str = WorkflowRunEvent.steps_execution_completed.value
329
- step_name: Optional[str] = None
330
- step_index: Optional[Union[int, tuple]] = None
331
- steps_count: Optional[int] = None
332
- executed_steps: Optional[int] = None
333
-
334
- # Results from executed steps
335
- step_results: List["StepOutput"] = field(default_factory=list) # noqa: F821
336
-
337
-
338
- @dataclass
339
- class StepOutputEvent(BaseWorkflowRunResponseEvent):
340
- """Event sent when a step produces output - replaces direct StepOutput yielding"""
341
-
342
- event: str = "StepOutput"
343
- step_name: Optional[str] = None
344
- step_index: Optional[Union[int, tuple]] = None
345
-
346
- # Store actual step execution result as StepOutput object
347
- step_output: Optional["StepOutput"] = None # noqa: F821
348
-
349
- # Properties for backward compatibility
350
- @property
351
- def content(self) -> Optional[Union[str, Dict[str, Any], List[Any], BaseModel, Any]]:
352
- return self.step_output.content if self.step_output else None
353
-
354
- @property
355
- def images(self) -> Optional[List[ImageArtifact]]:
356
- return self.step_output.images if self.step_output else None
357
-
358
- @property
359
- def videos(self) -> Optional[List[VideoArtifact]]:
360
- return self.step_output.videos if self.step_output else None
361
-
362
- @property
363
- def audio(self) -> Optional[List[AudioArtifact]]:
364
- return self.step_output.audio if self.step_output else None
365
-
366
- @property
367
- def success(self) -> bool:
368
- return self.step_output.success if self.step_output else True
369
-
370
- @property
371
- def error(self) -> Optional[str]:
372
- return self.step_output.error if self.step_output else None
373
-
374
- @property
375
- def stop(self) -> bool:
376
- return self.step_output.stop if self.step_output else False
377
-
378
-
379
- # Union type for all workflow run response events
380
- WorkflowRunResponseEvent = Union[
381
- WorkflowStartedEvent,
382
- WorkflowCompletedEvent,
383
- WorkflowErrorEvent,
384
- StepStartedEvent,
385
- StepCompletedEvent,
386
- StepErrorEvent,
387
- LoopExecutionStartedEvent,
388
- LoopIterationStartedEvent,
389
- LoopIterationCompletedEvent,
390
- LoopExecutionCompletedEvent,
391
- ParallelExecutionStartedEvent,
392
- ParallelExecutionCompletedEvent,
393
- ConditionExecutionStartedEvent,
394
- ConditionExecutionCompletedEvent,
395
- RouterExecutionStartedEvent,
396
- RouterExecutionCompletedEvent,
397
- StepsExecutionStartedEvent,
398
- StepsExecutionCompletedEvent,
399
- StepOutputEvent,
400
- ]
401
-
402
-
403
- @dataclass
404
- class WorkflowRunResponse:
405
- """Response returned by Workflow.run() functions - kept for backwards compatibility"""
406
-
407
- content: Optional[Union[str, Dict[str, Any], List[Any], BaseModel, Any]] = None
408
- content_type: str = "str"
409
- metrics: Optional[Dict[str, Any]] = None
410
-
411
- # Workflow-specific fields
412
- workflow_id: Optional[str] = None
413
- workflow_name: Optional[str] = None
414
-
415
- run_id: Optional[str] = None
416
- session_id: Optional[str] = None
417
-
418
- # Media content fields
419
- images: Optional[List[ImageArtifact]] = None
420
- videos: Optional[List[VideoArtifact]] = None
421
- audio: Optional[List[AudioArtifact]] = None
422
- response_audio: Optional[AudioResponse] = None
423
-
424
- # Store actual step execution results as StepOutput objects
425
- step_responses: List[Union["StepOutput", List["StepOutput"]]] = field(default_factory=list) # noqa: F821
426
-
427
- # Store events from workflow execution
428
- events: Optional[List[WorkflowRunResponseEvent]] = None
429
-
430
- # Workflow metrics aggregated from all steps
431
- workflow_metrics: Optional["WorkflowMetrics"] = None
432
-
433
- extra_data: Optional[Dict[str, Any]] = None
434
- created_at: int = field(default_factory=lambda: int(time()))
435
-
436
- status: RunStatus = RunStatus.pending
437
-
438
- @property
439
- def is_cancelled(self):
440
- return self.status == RunStatus.cancelled
441
-
442
- def to_dict(self) -> Dict[str, Any]:
443
- _dict = {
444
- k: v
445
- for k, v in asdict(self).items()
446
- if v is not None
447
- and k
448
- not in [
449
- "extra_data",
450
- "images",
451
- "videos",
452
- "audio",
453
- "response_audio",
454
- "step_responses",
455
- "events",
456
- "workflow_metrics",
457
- ]
458
- }
459
-
460
- if self.status is not None:
461
- _dict["status"] = self.status.value if isinstance(self.status, RunStatus) else self.status
462
-
463
- if self.extra_data is not None:
464
- _dict["extra_data"] = self.extra_data
465
-
466
- if self.images is not None:
467
- _dict["images"] = [img.to_dict() for img in self.images]
468
-
469
- if self.videos is not None:
470
- _dict["videos"] = [vid.to_dict() for vid in self.videos]
471
-
472
- if self.audio is not None:
473
- _dict["audio"] = [aud.to_dict() for aud in self.audio]
474
-
475
- if self.response_audio is not None:
476
- _dict["response_audio"] = self.response_audio.to_dict()
477
-
478
- if self.step_responses:
479
- flattened_responses = []
480
- for step_response in self.step_responses:
481
- if isinstance(step_response, list):
482
- # Handle List[StepOutput] from workflow components like Steps
483
- flattened_responses.extend([s.to_dict() for s in step_response])
484
- else:
485
- # Handle single StepOutput
486
- flattened_responses.append(step_response.to_dict())
487
- _dict["step_responses"] = flattened_responses
488
-
489
- if self.workflow_metrics is not None:
490
- _dict["workflow_metrics"] = self.workflow_metrics.to_dict()
491
-
492
- if self.content and isinstance(self.content, BaseModel):
493
- _dict["content"] = self.content.model_dump(exclude_none=True)
494
-
495
- if self.events is not None:
496
- _dict["events"] = [e.to_dict() for e in self.events]
497
-
498
- return _dict
499
-
500
- def to_json(self) -> str:
501
- import json
502
-
503
- _dict = self.to_dict()
504
- return json.dumps(_dict, indent=2)
505
-
506
- @classmethod
507
- def from_dict(cls, data: Dict[str, Any]) -> "WorkflowRunResponse":
508
- # Import here to avoid circular import
509
- from agno.workflow.v2.step import StepOutput
510
-
511
- workflow_metrics_dict = data.pop("workflow_metrics", {})
512
- workflow_metrics = None
513
- if workflow_metrics_dict:
514
- from agno.workflow.v2.workflow import WorkflowMetrics
515
-
516
- workflow_metrics = WorkflowMetrics.from_dict(workflow_metrics_dict)
517
-
518
- step_responses = data.pop("step_responses", [])
519
- parsed_step_responses: List[Union["StepOutput", List["StepOutput"]]] = []
520
- if step_responses:
521
- for step_output_dict in step_responses:
522
- # Reconstruct StepOutput from dict
523
- parsed_step_responses.append(StepOutput.from_dict(step_output_dict))
524
-
525
- extra_data = data.pop("extra_data", None)
526
-
527
- images = data.pop("images", [])
528
- images = [ImageArtifact.model_validate(image) for image in images] if images else None
529
-
530
- videos = data.pop("videos", [])
531
- videos = [VideoArtifact.model_validate(video) for video in videos] if videos else None
532
-
533
- audio = data.pop("audio", [])
534
- audio = [AudioArtifact.model_validate(audio) for audio in audio] if audio else None
535
-
536
- response_audio = data.pop("response_audio", None)
537
- response_audio = AudioResponse.model_validate(response_audio) if response_audio else None
538
-
539
- events = data.pop("events", [])
540
-
541
- return cls(
542
- step_responses=parsed_step_responses,
543
- extra_data=extra_data,
544
- images=images,
545
- videos=videos,
546
- audio=audio,
547
- response_audio=response_audio,
548
- events=events,
549
- workflow_metrics=workflow_metrics,
550
- **data,
551
- )
552
-
553
- def get_content_as_string(self, **kwargs) -> str:
554
- import json
555
-
556
- from pydantic import BaseModel
557
-
558
- if isinstance(self.content, str):
559
- return self.content
560
- elif isinstance(self.content, BaseModel):
561
- return self.content.model_dump_json(exclude_none=True, **kwargs)
562
- else:
563
- return json.dumps(self.content, **kwargs)
564
-
565
- def has_completed(self) -> bool:
566
- """Check if the workflow run is completed (either successfully or with error)"""
567
- return self.status in [RunStatus.completed, RunStatus.error]
agno/storage/__init__.py DELETED
File without changes
File without changes
@@ -1 +0,0 @@
1
- from agno.storage.dynamodb import DynamoDbStorage as DynamoDbAgentStorage # noqa: F401
@@ -1 +0,0 @@
1
- from agno.storage.json import JsonStorage as JsonAgentStorage # noqa: F401
@@ -1 +0,0 @@
1
- from agno.storage.mongodb import MongoDbStorage as MongoDbAgentStorage # noqa: F401
@@ -1 +0,0 @@
1
- from agno.storage.postgres import PostgresStorage as PostgresAgentStorage # noqa: F401
@@ -1 +0,0 @@
1
- from agno.storage.singlestore import SingleStoreStorage as SingleStoreAgentStorage # noqa: F401
@@ -1 +0,0 @@
1
- from agno.storage.sqlite import SqliteStorage as SqliteAgentStorage # noqa: F401
@@ -1 +0,0 @@
1
- from agno.storage.yaml import YamlStorage as YamlAgentStorage # noqa: F401
agno/storage/base.py DELETED
@@ -1,60 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- from typing import List, Literal, Optional
3
-
4
- from agno.storage.session import Session
5
-
6
-
7
- class Storage(ABC):
8
- def __init__(self, mode: Optional[Literal["agent", "team", "workflow", "workflow_v2"]] = "agent"):
9
- self._mode: Literal["agent", "team", "workflow", "workflow_v2"] = "agent" if mode is None else mode
10
-
11
- @property
12
- def mode(self) -> Literal["agent", "team", "workflow", "workflow_v2"]:
13
- """Get the mode of the storage."""
14
- return self._mode
15
-
16
- @mode.setter
17
- def mode(self, value: Optional[Literal["agent", "team", "workflow", "workflow_v2"]]) -> None:
18
- """Set the mode of the storage."""
19
- self._mode = "agent" if value is None else value
20
-
21
- @abstractmethod
22
- def create(self) -> None:
23
- raise NotImplementedError
24
-
25
- @abstractmethod
26
- def read(self, session_id: str, user_id: Optional[str] = None) -> Optional[Session]:
27
- raise NotImplementedError
28
-
29
- @abstractmethod
30
- def get_all_session_ids(self, user_id: Optional[str] = None, entity_id: Optional[str] = None) -> List[str]:
31
- raise NotImplementedError
32
-
33
- @abstractmethod
34
- def get_all_sessions(self, user_id: Optional[str] = None, entity_id: Optional[str] = None) -> List[Session]:
35
- raise NotImplementedError
36
-
37
- @abstractmethod
38
- def get_recent_sessions(
39
- self,
40
- user_id: Optional[str] = None,
41
- entity_id: Optional[str] = None,
42
- limit: Optional[int] = 2,
43
- ) -> List[Session]:
44
- raise NotImplementedError
45
-
46
- @abstractmethod
47
- def upsert(self, session: Session) -> Optional[Session]:
48
- raise NotImplementedError
49
-
50
- @abstractmethod
51
- def delete_session(self, session_id: Optional[str] = None):
52
- raise NotImplementedError
53
-
54
- @abstractmethod
55
- def drop(self) -> None:
56
- raise NotImplementedError
57
-
58
- @abstractmethod
59
- def upgrade_schema(self) -> None:
60
- raise NotImplementedError