agno 1.8.0__py3-none-any.whl → 2.0.0a1__py3-none-any.whl

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