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/workflow.py CHANGED
@@ -1,28 +1,71 @@
1
1
  from dataclasses import asdict, dataclass, field
2
2
  from enum import Enum
3
3
  from time import time
4
- from typing import Any, Dict, Optional, Union
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
5
5
 
6
6
  from pydantic import BaseModel
7
7
 
8
+ from agno.media import Audio, Image, Video
9
+ from agno.run.agent import RunOutput
10
+ from agno.run.base import RunStatus
11
+ from agno.run.team import TeamRunOutput
8
12
  from agno.utils.log import log_error
9
13
 
14
+ if TYPE_CHECKING:
15
+ from agno.workflow.types import StepOutput, WorkflowMetrics
16
+ else:
17
+ StepOutput = Any
18
+ WorkflowMetrics = Any
10
19
 
11
- class RunEvent(str, Enum):
12
- """Events that can be sent by the run() functions"""
20
+
21
+ class WorkflowRunEvent(str, Enum):
22
+ """Events that can be sent by workflow execution"""
13
23
 
14
24
  workflow_started = "WorkflowStarted"
15
25
  workflow_completed = "WorkflowCompleted"
26
+ workflow_cancelled = "WorkflowCancelled"
27
+ workflow_error = "WorkflowError"
28
+
29
+ step_started = "StepStarted"
30
+ step_completed = "StepCompleted"
31
+ step_error = "StepError"
32
+
33
+ loop_execution_started = "LoopExecutionStarted"
34
+ loop_iteration_started = "LoopIterationStarted"
35
+ loop_iteration_completed = "LoopIterationCompleted"
36
+ loop_execution_completed = "LoopExecutionCompleted"
37
+
38
+ parallel_execution_started = "ParallelExecutionStarted"
39
+ parallel_execution_completed = "ParallelExecutionCompleted"
40
+
41
+ condition_execution_started = "ConditionExecutionStarted"
42
+ condition_execution_completed = "ConditionExecutionCompleted"
43
+
44
+ router_execution_started = "RouterExecutionStarted"
45
+ router_execution_completed = "RouterExecutionCompleted"
46
+
47
+ steps_execution_started = "StepsExecutionStarted"
48
+ steps_execution_completed = "StepsExecutionCompleted"
49
+
50
+ step_output = "StepOutput"
51
+
52
+ custom_event = "CustomEvent"
16
53
 
17
54
 
18
55
  @dataclass
19
- class BaseWorkflowRunResponseEvent:
20
- run_id: str
56
+ class BaseWorkflowRunOutputEvent:
57
+ """Base class for all workflow run response events"""
58
+
21
59
  created_at: int = field(default_factory=lambda: int(time()))
22
60
  event: str = ""
23
61
 
24
- # For backwards compatibility
25
- content: Optional[Any] = None
62
+ # Workflow-specific fields
63
+ workflow_id: Optional[str] = None
64
+ workflow_name: Optional[str] = None
65
+ session_id: Optional[str] = None
66
+ run_id: Optional[str] = None
67
+ step_id: Optional[str] = None
68
+ parent_step_id: Optional[str] = None
26
69
 
27
70
  def to_dict(self) -> Dict[str, Any]:
28
71
  _dict = {k: v for k, v in asdict(self).items() if v is not None}
@@ -30,6 +73,22 @@ class BaseWorkflowRunResponseEvent:
30
73
  if hasattr(self, "content") and self.content and isinstance(self.content, BaseModel):
31
74
  _dict["content"] = self.content.model_dump(exclude_none=True)
32
75
 
76
+ # Handle StepOutput fields that contain Message objects
77
+ if hasattr(self, "step_results") and self.step_results is not None:
78
+ _dict["step_results"] = [step.to_dict() for step in self.step_results]
79
+
80
+ if hasattr(self, "step_response") and self.step_response is not None:
81
+ _dict["step_response"] = self.step_response.to_dict()
82
+
83
+ if hasattr(self, "iteration_results") and self.iteration_results is not None:
84
+ _dict["iteration_results"] = [step.to_dict() for step in self.iteration_results]
85
+
86
+ if hasattr(self, "all_results") and self.all_results is not None:
87
+ _dict["all_results"] = [[step.to_dict() for step in iteration] for iteration in self.all_results]
88
+
89
+ if hasattr(self, "step_results") and self.step_results is not None:
90
+ _dict["step_results"] = [step.to_dict() for step in self.step_results]
91
+
33
92
  return _dict
34
93
 
35
94
  def to_json(self) -> str:
@@ -43,17 +102,496 @@ class BaseWorkflowRunResponseEvent:
43
102
 
44
103
  return json.dumps(_dict, indent=2)
45
104
 
105
+ @property
106
+ def is_cancelled(self):
107
+ return False
108
+
109
+ @property
110
+ def is_error(self):
111
+ return False
112
+
113
+ @property
114
+ def status(self):
115
+ status = "Completed"
116
+ if self.is_error:
117
+ status = "Error"
118
+ if self.is_cancelled:
119
+ status = "Cancelled"
120
+
121
+ return status
122
+
46
123
 
47
124
  @dataclass
48
- class WorkflowRunResponseStartedEvent(BaseWorkflowRunResponseEvent):
49
- event: str = RunEvent.workflow_started.value
125
+ class WorkflowStartedEvent(BaseWorkflowRunOutputEvent):
126
+ """Event sent when workflow execution starts"""
127
+
128
+ event: str = WorkflowRunEvent.workflow_started.value
50
129
 
51
130
 
52
131
  @dataclass
53
- class WorkflowCompletedEvent(BaseWorkflowRunResponseEvent):
54
- event: str = RunEvent.workflow_completed.value
132
+ class WorkflowCompletedEvent(BaseWorkflowRunOutputEvent):
133
+ """Event sent when workflow execution completes"""
134
+
135
+ event: str = WorkflowRunEvent.workflow_completed.value
55
136
  content: Optional[Any] = None
56
137
  content_type: str = "str"
57
138
 
139
+ # Store actual step execution results as StepOutput objects
140
+ step_results: List[StepOutput] = field(default_factory=list)
141
+ metadata: Optional[Dict[str, Any]] = None
142
+
143
+
144
+ @dataclass
145
+ class WorkflowErrorEvent(BaseWorkflowRunOutputEvent):
146
+ """Event sent when workflow execution fails"""
147
+
148
+ event: str = WorkflowRunEvent.workflow_error.value
149
+ error: Optional[str] = None
150
+
151
+
152
+ @dataclass
153
+ class WorkflowCancelledEvent(BaseWorkflowRunOutputEvent):
154
+ """Event sent when workflow execution is cancelled"""
155
+
156
+ event: str = WorkflowRunEvent.workflow_cancelled.value
157
+ reason: Optional[str] = None
158
+
159
+ @property
160
+ def is_cancelled(self):
161
+ return True
162
+
163
+
164
+ @dataclass
165
+ class StepStartedEvent(BaseWorkflowRunOutputEvent):
166
+ """Event sent when step execution starts"""
167
+
168
+ event: str = WorkflowRunEvent.step_started.value
169
+ step_name: Optional[str] = None
170
+ step_index: Optional[Union[int, tuple]] = None
171
+
172
+
173
+ @dataclass
174
+ class StepCompletedEvent(BaseWorkflowRunOutputEvent):
175
+ """Event sent when step execution completes"""
176
+
177
+ event: str = WorkflowRunEvent.step_completed.value
178
+ step_name: Optional[str] = None
179
+ step_index: Optional[Union[int, tuple]] = None
180
+
181
+ content: Optional[Any] = None
182
+ content_type: str = "str"
183
+
184
+ # Media content fields
185
+ images: Optional[List[Image]] = None
186
+ videos: Optional[List[Video]] = None
187
+ audio: Optional[List[Audio]] = None
188
+ response_audio: Optional[Audio] = None
189
+
190
+ # Store actual step execution results as StepOutput objects
191
+ step_response: Optional[StepOutput] = None
192
+
193
+
194
+ @dataclass
195
+ class StepErrorEvent(BaseWorkflowRunOutputEvent):
196
+ """Event sent when step execution fails"""
197
+
198
+ event: str = WorkflowRunEvent.step_error.value
199
+ step_name: Optional[str] = None
200
+ step_index: Optional[Union[int, tuple]] = None
201
+ error: Optional[str] = None
202
+
203
+
204
+ @dataclass
205
+ class LoopExecutionStartedEvent(BaseWorkflowRunOutputEvent):
206
+ """Event sent when loop execution starts"""
207
+
208
+ event: str = WorkflowRunEvent.loop_execution_started.value
209
+ step_name: Optional[str] = None
210
+ step_index: Optional[Union[int, tuple]] = None
211
+ max_iterations: Optional[int] = None
212
+
213
+
214
+ @dataclass
215
+ class LoopIterationStartedEvent(BaseWorkflowRunOutputEvent):
216
+ """Event sent when loop iteration starts"""
217
+
218
+ event: str = WorkflowRunEvent.loop_iteration_started.value
219
+ step_name: Optional[str] = None
220
+ step_index: Optional[Union[int, tuple]] = None
221
+ iteration: int = 0
222
+ max_iterations: Optional[int] = None
223
+
224
+
225
+ @dataclass
226
+ class LoopIterationCompletedEvent(BaseWorkflowRunOutputEvent):
227
+ """Event sent when loop iteration completes"""
228
+
229
+ event: str = WorkflowRunEvent.loop_iteration_completed.value
230
+ step_name: Optional[str] = None
231
+ step_index: Optional[Union[int, tuple]] = None
232
+ iteration: int = 0
233
+ max_iterations: Optional[int] = None
234
+ iteration_results: List[StepOutput] = field(default_factory=list)
235
+ should_continue: bool = True
236
+
237
+
238
+ @dataclass
239
+ class LoopExecutionCompletedEvent(BaseWorkflowRunOutputEvent):
240
+ """Event sent when loop execution completes"""
241
+
242
+ event: str = WorkflowRunEvent.loop_execution_completed.value
243
+ step_name: Optional[str] = None
244
+ step_index: Optional[Union[int, tuple]] = None
245
+ total_iterations: int = 0
246
+ max_iterations: Optional[int] = None
247
+ all_results: List[List[StepOutput]] = field(default_factory=list)
248
+
249
+
250
+ @dataclass
251
+ class ParallelExecutionStartedEvent(BaseWorkflowRunOutputEvent):
252
+ """Event sent when parallel step execution starts"""
253
+
254
+ event: str = WorkflowRunEvent.parallel_execution_started.value
255
+ step_name: Optional[str] = None
256
+ step_index: Optional[Union[int, tuple]] = None
257
+ parallel_step_count: Optional[int] = None
258
+
259
+
260
+ @dataclass
261
+ class ParallelExecutionCompletedEvent(BaseWorkflowRunOutputEvent):
262
+ """Event sent when parallel step execution completes"""
263
+
264
+ event: str = WorkflowRunEvent.parallel_execution_completed.value
265
+ step_name: Optional[str] = None
266
+ step_index: Optional[Union[int, tuple]] = None
267
+ parallel_step_count: Optional[int] = None
268
+
269
+ # Results from all parallel steps
270
+ step_results: List[StepOutput] = field(default_factory=list)
271
+
272
+
273
+ @dataclass
274
+ class ConditionExecutionStartedEvent(BaseWorkflowRunOutputEvent):
275
+ """Event sent when condition step execution starts"""
276
+
277
+ event: str = WorkflowRunEvent.condition_execution_started.value
278
+ step_name: Optional[str] = None
279
+ step_index: Optional[Union[int, tuple]] = None
280
+ condition_result: Optional[bool] = None
281
+
282
+
283
+ @dataclass
284
+ class ConditionExecutionCompletedEvent(BaseWorkflowRunOutputEvent):
285
+ """Event sent when condition step execution completes"""
286
+
287
+ event: str = WorkflowRunEvent.condition_execution_completed.value
288
+ step_name: Optional[str] = None
289
+ step_index: Optional[Union[int, tuple]] = None
290
+ condition_result: Optional[bool] = None
291
+ executed_steps: Optional[int] = None
292
+
293
+ # Results from executed steps
294
+ step_results: List[StepOutput] = field(default_factory=list)
295
+
296
+
297
+ @dataclass
298
+ class RouterExecutionStartedEvent(BaseWorkflowRunOutputEvent):
299
+ """Event sent when router step execution starts"""
300
+
301
+ event: str = WorkflowRunEvent.router_execution_started.value
302
+ step_name: Optional[str] = None
303
+ step_index: Optional[Union[int, tuple]] = None
304
+ # Names of steps selected by router
305
+ selected_steps: List[str] = field(default_factory=list)
306
+
307
+
308
+ @dataclass
309
+ class RouterExecutionCompletedEvent(BaseWorkflowRunOutputEvent):
310
+ """Event sent when router step execution completes"""
311
+
312
+ event: str = WorkflowRunEvent.router_execution_completed.value
313
+ step_name: Optional[str] = None
314
+ step_index: Optional[Union[int, tuple]] = None
315
+ # Names of steps that were selected
316
+ selected_steps: List[str] = field(default_factory=list)
317
+ executed_steps: Optional[int] = None
318
+
319
+ # Results from executed steps
320
+ step_results: List[StepOutput] = field(default_factory=list)
321
+
322
+
323
+ @dataclass
324
+ class StepsExecutionStartedEvent(BaseWorkflowRunOutputEvent):
325
+ """Event sent when steps execution starts"""
326
+
327
+ event: str = WorkflowRunEvent.steps_execution_started.value
328
+ step_name: Optional[str] = None
329
+ step_index: Optional[Union[int, tuple]] = None
330
+ steps_count: Optional[int] = None
331
+
332
+
333
+ @dataclass
334
+ class StepsExecutionCompletedEvent(BaseWorkflowRunOutputEvent):
335
+ """Event sent when steps execution completes"""
336
+
337
+ event: str = WorkflowRunEvent.steps_execution_completed.value
338
+ step_name: Optional[str] = None
339
+ step_index: Optional[Union[int, tuple]] = None
340
+ steps_count: Optional[int] = None
341
+ executed_steps: Optional[int] = None
342
+
343
+ # Results from executed steps
344
+ step_results: List[StepOutput] = field(default_factory=list)
345
+
346
+
347
+ @dataclass
348
+ class StepOutputEvent(BaseWorkflowRunOutputEvent):
349
+ """Event sent when a step produces output - replaces direct StepOutput yielding"""
350
+
351
+ event: str = "StepOutput"
352
+ step_name: Optional[str] = None
353
+ step_index: Optional[Union[int, tuple]] = None
354
+
355
+ # Store actual step execution result as StepOutput object
356
+ step_output: Optional[StepOutput] = None
357
+
358
+ # Properties for backward compatibility
359
+ @property
360
+ def content(self) -> Optional[Union[str, Dict[str, Any], List[Any], BaseModel, Any]]:
361
+ return self.step_output.content if self.step_output else None
362
+
363
+ @property
364
+ def images(self) -> Optional[List[Image]]:
365
+ return self.step_output.images if self.step_output else None
366
+
367
+ @property
368
+ def videos(self) -> Optional[List[Video]]:
369
+ return self.step_output.videos if self.step_output else None
370
+
371
+ @property
372
+ def audio(self) -> Optional[List[Audio]]:
373
+ return self.step_output.audio if self.step_output else None
374
+
375
+ @property
376
+ def success(self) -> bool:
377
+ return self.step_output.success if self.step_output else True
378
+
379
+ @property
380
+ def error(self) -> Optional[str]:
381
+ return self.step_output.error if self.step_output else None
382
+
383
+ @property
384
+ def stop(self) -> bool:
385
+ return self.step_output.stop if self.step_output else False
386
+
387
+
388
+ @dataclass
389
+ class CustomEvent(BaseWorkflowRunOutputEvent):
390
+ """Event sent when a custom event is produced"""
391
+
392
+ event: str = WorkflowRunEvent.custom_event.value
393
+
394
+
395
+ # Union type for all workflow run response events
396
+ WorkflowRunOutputEvent = Union[
397
+ WorkflowStartedEvent,
398
+ WorkflowCompletedEvent,
399
+ WorkflowErrorEvent,
400
+ WorkflowCancelledEvent,
401
+ StepStartedEvent,
402
+ StepCompletedEvent,
403
+ StepErrorEvent,
404
+ LoopExecutionStartedEvent,
405
+ LoopIterationStartedEvent,
406
+ LoopIterationCompletedEvent,
407
+ LoopExecutionCompletedEvent,
408
+ ParallelExecutionStartedEvent,
409
+ ParallelExecutionCompletedEvent,
410
+ ConditionExecutionStartedEvent,
411
+ ConditionExecutionCompletedEvent,
412
+ RouterExecutionStartedEvent,
413
+ RouterExecutionCompletedEvent,
414
+ StepsExecutionStartedEvent,
415
+ StepsExecutionCompletedEvent,
416
+ StepOutputEvent,
417
+ CustomEvent,
418
+ ]
419
+
420
+
421
+ @dataclass
422
+ class WorkflowRunOutput:
423
+ """Response returned by Workflow.run() functions - kept for backwards compatibility"""
424
+
425
+ content: Optional[Union[str, Dict[str, Any], List[Any], BaseModel, Any]] = None
426
+ content_type: str = "str"
427
+
428
+ # Workflow-specific fields
429
+ workflow_id: Optional[str] = None
430
+ workflow_name: Optional[str] = None
431
+
432
+ run_id: Optional[str] = None
433
+ session_id: Optional[str] = None
434
+
435
+ # Media content fields
436
+ images: Optional[List[Image]] = None
437
+ videos: Optional[List[Video]] = None
438
+ audio: Optional[List[Audio]] = None
439
+ response_audio: Optional[Audio] = None
440
+
441
+ # Store actual step execution results as StepOutput objects
442
+ step_results: List[Union[StepOutput, List[StepOutput]]] = field(default_factory=list)
443
+
444
+ # Store agent/team responses separately with parent_run_id references
445
+ step_executor_runs: Optional[List[Union[RunOutput, TeamRunOutput]]] = None
446
+
447
+ # Store events from workflow execution
448
+ events: Optional[List[WorkflowRunOutputEvent]] = None
449
+
450
+ # Workflow metrics aggregated from all steps
451
+ metrics: Optional[WorkflowMetrics] = None
452
+
453
+ metadata: Optional[Dict[str, Any]] = None
454
+ created_at: int = field(default_factory=lambda: int(time()))
455
+
456
+ status: RunStatus = RunStatus.pending
457
+
458
+ @property
459
+ def is_cancelled(self):
460
+ return self.status == RunStatus.cancelled
461
+
462
+ def to_dict(self) -> Dict[str, Any]:
463
+ _dict = {
464
+ k: v
465
+ for k, v in asdict(self).items()
466
+ if v is not None
467
+ and k
468
+ not in [
469
+ "metadata",
470
+ "images",
471
+ "videos",
472
+ "audio",
473
+ "response_audio",
474
+ "step_results",
475
+ "step_executor_runs",
476
+ "events",
477
+ "metrics",
478
+ ]
479
+ }
480
+
481
+ if self.status is not None:
482
+ _dict["status"] = self.status.value if isinstance(self.status, RunStatus) else self.status
483
+
484
+ if self.metadata is not None:
485
+ _dict["metadata"] = self.metadata
486
+
487
+ if self.images is not None:
488
+ _dict["images"] = [img.to_dict() for img in self.images]
489
+
490
+ if self.videos is not None:
491
+ _dict["videos"] = [vid.to_dict() for vid in self.videos]
492
+
493
+ if self.audio is not None:
494
+ _dict["audio"] = [aud.to_dict() for aud in self.audio]
495
+
496
+ if self.response_audio is not None:
497
+ _dict["response_audio"] = self.response_audio.to_dict()
498
+
499
+ if self.step_results:
500
+ flattened_responses = []
501
+ for step_response in self.step_results:
502
+ if isinstance(step_response, list):
503
+ # Handle List[StepOutput] from workflow components like Steps
504
+ flattened_responses.extend([s.to_dict() for s in step_response])
505
+ else:
506
+ # Handle single StepOutput
507
+ flattened_responses.append(step_response.to_dict())
508
+ _dict["step_results"] = flattened_responses
509
+
510
+ if self.step_executor_runs:
511
+ _dict["step_executor_runs"] = [run.to_dict() for run in self.step_executor_runs]
512
+
513
+ if self.metrics is not None:
514
+ _dict["metrics"] = self.metrics.to_dict()
515
+
516
+ if self.content and isinstance(self.content, BaseModel):
517
+ _dict["content"] = self.content.model_dump(exclude_none=True)
518
+
519
+ if self.events is not None:
520
+ _dict["events"] = [e.to_dict() for e in self.events]
521
+
522
+ return _dict
523
+
524
+ @classmethod
525
+ def from_dict(cls, data: Dict[str, Any]) -> "WorkflowRunOutput":
526
+ # Import here to avoid circular import
527
+ from agno.workflow.step import StepOutput
528
+
529
+ workflow_metrics_dict = data.pop("metrics", {})
530
+ workflow_metrics = None
531
+ if workflow_metrics_dict:
532
+ from agno.workflow.workflow import WorkflowMetrics
533
+
534
+ workflow_metrics = WorkflowMetrics.from_dict(workflow_metrics_dict)
535
+
536
+ step_results = data.pop("step_results", [])
537
+ parsed_step_results: List[Union[StepOutput, List[StepOutput]]] = []
538
+ if step_results:
539
+ for step_output_dict in step_results:
540
+ # Reconstruct StepOutput from dict
541
+ parsed_step_results.append(StepOutput.from_dict(step_output_dict))
542
+
543
+ # Parse step_executor_runs
544
+ step_executor_runs_data = data.pop("step_executor_runs", [])
545
+ step_executor_runs: List[Union[RunOutput, TeamRunOutput]] = []
546
+ if step_executor_runs_data:
547
+ step_executor_runs = []
548
+ for run_data in step_executor_runs_data:
549
+ if "team_id" in run_data or "team_name" in run_data:
550
+ step_executor_runs.append(TeamRunOutput.from_dict(run_data))
551
+ else:
552
+ step_executor_runs.append(RunOutput.from_dict(run_data))
553
+
554
+ metadata = data.pop("metadata", None)
555
+
556
+ images = data.pop("images", [])
557
+ images = [Image.model_validate(image) for image in images] if images else None
558
+
559
+ videos = data.pop("videos", [])
560
+ videos = [Video.model_validate(video) for video in videos] if videos else None
561
+
562
+ audio = data.pop("audio", [])
563
+ audio = [Audio.model_validate(audio) for audio in audio] if audio else None
564
+
565
+ response_audio = data.pop("response_audio", None)
566
+ response_audio = Audio.model_validate(response_audio) if response_audio else None
567
+
568
+ events = data.pop("events", [])
569
+
570
+ return cls(
571
+ step_results=parsed_step_results,
572
+ metadata=metadata,
573
+ images=images,
574
+ videos=videos,
575
+ audio=audio,
576
+ response_audio=response_audio,
577
+ events=events,
578
+ metrics=workflow_metrics,
579
+ step_executor_runs=step_executor_runs,
580
+ **data,
581
+ )
582
+
583
+ def get_content_as_string(self, **kwargs) -> str:
584
+ import json
585
+
586
+ from pydantic import BaseModel
587
+
588
+ if isinstance(self.content, str):
589
+ return self.content
590
+ elif isinstance(self.content, BaseModel):
591
+ return self.content.model_dump_json(exclude_none=True, **kwargs)
592
+ else:
593
+ return json.dumps(self.content, **kwargs)
58
594
 
59
- WorkflowRunResponseEvent = Union[WorkflowRunResponseStartedEvent, WorkflowCompletedEvent]
595
+ def has_completed(self) -> bool:
596
+ """Check if the workflow run is completed (either successfully or with error)"""
597
+ return self.status in [RunStatus.completed, RunStatus.error]
@@ -0,0 +1,10 @@
1
+ from typing import Union
2
+
3
+ from agno.session.agent import AgentSession
4
+ from agno.session.summary import SessionSummaryManager
5
+ from agno.session.team import TeamSession
6
+ from agno.session.workflow import WorkflowSession
7
+
8
+ Session = Union[AgentSession, TeamSession, WorkflowSession]
9
+
10
+ __all__ = ["AgentSession", "TeamSession", "WorkflowSession", "Session", "SessionSummaryManager"]