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
@@ -1,18 +1,19 @@
1
1
  import inspect
2
2
  from dataclasses import dataclass
3
- from typing import AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
3
+ from typing import Any, AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
4
+ from uuid import uuid4
4
5
 
5
- from agno.run.response import RunResponseEvent
6
- from agno.run.team import TeamRunResponseEvent
7
- from agno.run.v2.workflow import (
6
+ from agno.run.agent import RunOutputEvent
7
+ from agno.run.team import TeamRunOutputEvent
8
+ from agno.run.workflow import (
8
9
  ConditionExecutionCompletedEvent,
9
10
  ConditionExecutionStartedEvent,
10
- WorkflowRunResponse,
11
- WorkflowRunResponseEvent,
11
+ WorkflowRunOutput,
12
+ WorkflowRunOutputEvent,
12
13
  )
13
14
  from agno.utils.log import log_debug, logger
14
- from agno.workflow.v2.step import Step
15
- from agno.workflow.v2.types import StepInput, StepOutput
15
+ from agno.workflow.step import Step
16
+ from agno.workflow.types import StepInput, StepOutput, StepType
16
17
 
17
18
  WorkflowSteps = List[
18
19
  Union[
@@ -48,11 +49,11 @@ class Condition:
48
49
  """Prepare the steps for execution - mirrors workflow logic"""
49
50
  from agno.agent.agent import Agent
50
51
  from agno.team.team import Team
51
- from agno.workflow.v2.loop import Loop
52
- from agno.workflow.v2.parallel import Parallel
53
- from agno.workflow.v2.router import Router
54
- from agno.workflow.v2.step import Step
55
- from agno.workflow.v2.steps import Steps
52
+ from agno.workflow.loop import Loop
53
+ from agno.workflow.parallel import Parallel
54
+ from agno.workflow.router import Router
55
+ from agno.workflow.step import Step
56
+ from agno.workflow.steps import Steps
56
57
 
57
58
  prepared_steps: WorkflowSteps = []
58
59
  for step in self.steps:
@@ -100,7 +101,7 @@ class Condition:
100
101
  updated_previous_step_outputs.update(condition_step_outputs)
101
102
 
102
103
  return StepInput(
103
- message=step_input.message,
104
+ input=step_input.input,
104
105
  previous_step_content=previous_step_content,
105
106
  previous_step_outputs=updated_previous_step_outputs,
106
107
  additional_data=step_input.additional_data,
@@ -145,11 +146,19 @@ class Condition:
145
146
  return False
146
147
 
147
148
  def execute(
148
- self, step_input: StepInput, session_id: Optional[str] = None, user_id: Optional[str] = None
149
- ) -> List[StepOutput]:
149
+ self,
150
+ step_input: StepInput,
151
+ session_id: Optional[str] = None,
152
+ user_id: Optional[str] = None,
153
+ workflow_run_response: Optional[WorkflowRunOutput] = None,
154
+ store_executor_outputs: bool = True,
155
+ session_state: Optional[Dict[str, Any]] = None,
156
+ ) -> StepOutput:
150
157
  """Execute the condition and its steps with sequential chaining if condition is true"""
151
158
  log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
152
159
 
160
+ conditional_step_id = str(uuid4())
161
+
153
162
  self._prepare_steps()
154
163
 
155
164
  # Evaluate the condition
@@ -158,7 +167,13 @@ class Condition:
158
167
 
159
168
  if not condition_result:
160
169
  log_debug(f"Condition {self.name} not met, skipping {len(self.steps)} steps")
161
- return []
170
+ return StepOutput(
171
+ step_name=self.name,
172
+ step_id=conditional_step_id,
173
+ step_type=StepType.CONDITION,
174
+ content=f"Condition {self.name} not met - skipped {len(self.steps)} steps",
175
+ success=True,
176
+ )
162
177
 
163
178
  log_debug(f"Condition {self.name} met, executing {len(self.steps)} steps")
164
179
  all_results: List[StepOutput] = []
@@ -167,7 +182,14 @@ class Condition:
167
182
 
168
183
  for i, step in enumerate(self.steps):
169
184
  try:
170
- step_output = step.execute(current_step_input, session_id=session_id, user_id=user_id) # type: ignore[union-attr]
185
+ step_output = step.execute( # type: ignore[union-attr]
186
+ current_step_input,
187
+ session_id=session_id,
188
+ user_id=user_id,
189
+ workflow_run_response=workflow_run_response,
190
+ store_executor_outputs=store_executor_outputs,
191
+ session_state=session_state,
192
+ )
171
193
 
172
194
  # Handle both single StepOutput and List[StepOutput] (from Loop/Condition/Router steps)
173
195
  if isinstance(step_output, list):
@@ -210,7 +232,17 @@ class Condition:
210
232
  break
211
233
 
212
234
  log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
213
- return all_results
235
+
236
+ return StepOutput(
237
+ step_name=self.name,
238
+ step_id=conditional_step_id,
239
+ step_type=StepType.CONDITION,
240
+ content=f"Condition {self.name} completed with {len(all_results)} results",
241
+ success=all(result.success for result in all_results) if all_results else True,
242
+ error=None,
243
+ stop=False,
244
+ steps=all_results,
245
+ )
214
246
 
215
247
  def execute_stream(
216
248
  self,
@@ -218,12 +250,17 @@ class Condition:
218
250
  session_id: Optional[str] = None,
219
251
  user_id: Optional[str] = None,
220
252
  stream_intermediate_steps: bool = False,
221
- workflow_run_response: Optional[WorkflowRunResponse] = None,
253
+ workflow_run_response: Optional[WorkflowRunOutput] = None,
222
254
  step_index: Optional[Union[int, tuple]] = None,
223
- ) -> Iterator[Union[WorkflowRunResponseEvent, StepOutput]]:
255
+ store_executor_outputs: bool = True,
256
+ session_state: Optional[Dict[str, Any]] = None,
257
+ parent_step_id: Optional[str] = None,
258
+ ) -> Iterator[Union[WorkflowRunOutputEvent, StepOutput]]:
224
259
  """Execute the condition with streaming support - mirrors Loop logic"""
225
260
  log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
226
261
 
262
+ conditional_step_id = str(uuid4())
263
+
227
264
  self._prepare_steps()
228
265
 
229
266
  # Evaluate the condition
@@ -240,6 +277,8 @@ class Condition:
240
277
  step_name=self.name,
241
278
  step_index=step_index,
242
279
  condition_result=condition_result,
280
+ step_id=conditional_step_id,
281
+ parent_step_id=parent_step_id,
243
282
  )
244
283
 
245
284
  if not condition_result:
@@ -255,6 +294,8 @@ class Condition:
255
294
  condition_result=False,
256
295
  executed_steps=0,
257
296
  step_results=[],
297
+ step_id=conditional_step_id,
298
+ parent_step_id=parent_step_id,
258
299
  )
259
300
  return
260
301
 
@@ -283,6 +324,9 @@ class Condition:
283
324
  stream_intermediate_steps=stream_intermediate_steps,
284
325
  workflow_run_response=workflow_run_response,
285
326
  step_index=child_step_index,
327
+ store_executor_outputs=store_executor_outputs,
328
+ session_state=session_state,
329
+ parent_step_id=conditional_step_id,
286
330
  ):
287
331
  if isinstance(event, StepOutput):
288
332
  step_outputs_for_step.append(event)
@@ -342,17 +386,33 @@ class Condition:
342
386
  condition_result=True,
343
387
  executed_steps=len(self.steps),
344
388
  step_results=all_results,
389
+ step_id=conditional_step_id,
390
+ parent_step_id=parent_step_id,
345
391
  )
346
392
 
347
- for result in all_results:
348
- yield result
393
+ yield StepOutput(
394
+ step_name=self.name,
395
+ step_id=conditional_step_id,
396
+ step_type=StepType.CONDITION,
397
+ content=f"Condition {self.name} completed with {len(all_results)} results",
398
+ success=all(result.success for result in all_results) if all_results else True,
399
+ steps=all_results,
400
+ )
349
401
 
350
402
  async def aexecute(
351
- self, step_input: StepInput, session_id: Optional[str] = None, user_id: Optional[str] = None
352
- ) -> List[StepOutput]:
403
+ self,
404
+ step_input: StepInput,
405
+ session_id: Optional[str] = None,
406
+ user_id: Optional[str] = None,
407
+ workflow_run_response: Optional[WorkflowRunOutput] = None,
408
+ store_executor_outputs: bool = True,
409
+ session_state: Optional[Dict[str, Any]] = None,
410
+ ) -> StepOutput:
353
411
  """Async execute the condition and its steps with sequential chaining"""
354
412
  log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
355
413
 
414
+ conditional_step_id = str(uuid4())
415
+
356
416
  self._prepare_steps()
357
417
 
358
418
  # Evaluate the condition
@@ -361,7 +421,13 @@ class Condition:
361
421
 
362
422
  if not condition_result:
363
423
  log_debug(f"Condition {self.name} not met, skipping {len(self.steps)} steps")
364
- return []
424
+ return StepOutput(
425
+ step_name=self.name,
426
+ step_id=str(uuid4()),
427
+ step_type=StepType.CONDITION,
428
+ content=f"Condition {self.name} not met - skipped {len(self.steps)} steps",
429
+ success=True,
430
+ )
365
431
 
366
432
  log_debug(f"Condition {self.name} met, executing {len(self.steps)} steps")
367
433
 
@@ -372,7 +438,14 @@ class Condition:
372
438
 
373
439
  for i, step in enumerate(self.steps):
374
440
  try:
375
- step_output = await step.aexecute(current_step_input, session_id=session_id, user_id=user_id) # type: ignore[union-attr]
441
+ step_output = await step.aexecute( # type: ignore[union-attr]
442
+ current_step_input,
443
+ session_id=session_id,
444
+ user_id=user_id,
445
+ workflow_run_response=workflow_run_response,
446
+ store_executor_outputs=store_executor_outputs,
447
+ session_state=session_state,
448
+ )
376
449
 
377
450
  # Handle both single StepOutput and List[StepOutput]
378
451
  if isinstance(step_output, list):
@@ -413,7 +486,17 @@ class Condition:
413
486
  break
414
487
 
415
488
  log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
416
- return all_results
489
+
490
+ return StepOutput(
491
+ step_name=self.name,
492
+ step_id=conditional_step_id,
493
+ step_type=StepType.CONDITION,
494
+ content=f"Condition {self.name} completed with {len(all_results)} results",
495
+ success=all(result.success for result in all_results) if all_results else True,
496
+ error=None,
497
+ stop=False,
498
+ steps=all_results,
499
+ )
417
500
 
418
501
  async def aexecute_stream(
419
502
  self,
@@ -421,12 +504,17 @@ class Condition:
421
504
  session_id: Optional[str] = None,
422
505
  user_id: Optional[str] = None,
423
506
  stream_intermediate_steps: bool = False,
424
- workflow_run_response: Optional[WorkflowRunResponse] = None,
507
+ workflow_run_response: Optional[WorkflowRunOutput] = None,
425
508
  step_index: Optional[Union[int, tuple]] = None,
426
- ) -> AsyncIterator[Union[WorkflowRunResponseEvent, TeamRunResponseEvent, RunResponseEvent, StepOutput]]:
509
+ store_executor_outputs: bool = True,
510
+ session_state: Optional[Dict[str, Any]] = None,
511
+ parent_step_id: Optional[str] = None,
512
+ ) -> AsyncIterator[Union[WorkflowRunOutputEvent, TeamRunOutputEvent, RunOutputEvent, StepOutput]]:
427
513
  """Async execute the condition with streaming support - mirrors Loop logic"""
428
514
  log_debug(f"Condition Start: {self.name}", center=True, symbol="-")
429
515
 
516
+ conditional_step_id = str(uuid4())
517
+
430
518
  self._prepare_steps()
431
519
 
432
520
  # Evaluate the condition
@@ -443,6 +531,8 @@ class Condition:
443
531
  step_name=self.name,
444
532
  step_index=step_index,
445
533
  condition_result=condition_result,
534
+ step_id=conditional_step_id,
535
+ parent_step_id=parent_step_id,
446
536
  )
447
537
 
448
538
  if not condition_result:
@@ -458,6 +548,8 @@ class Condition:
458
548
  condition_result=False,
459
549
  executed_steps=0,
460
550
  step_results=[],
551
+ step_id=conditional_step_id,
552
+ parent_step_id=parent_step_id,
461
553
  )
462
554
  return
463
555
 
@@ -488,6 +580,9 @@ class Condition:
488
580
  stream_intermediate_steps=stream_intermediate_steps,
489
581
  workflow_run_response=workflow_run_response,
490
582
  step_index=child_step_index,
583
+ store_executor_outputs=store_executor_outputs,
584
+ session_state=session_state,
585
+ parent_step_id=conditional_step_id,
491
586
  ):
492
587
  if isinstance(event, StepOutput):
493
588
  step_outputs_for_step.append(event)
@@ -548,7 +643,15 @@ class Condition:
548
643
  condition_result=True,
549
644
  executed_steps=len(self.steps),
550
645
  step_results=all_results,
646
+ step_id=conditional_step_id,
647
+ parent_step_id=parent_step_id,
551
648
  )
552
649
 
553
- for result in all_results:
554
- yield result
650
+ yield StepOutput(
651
+ step_name=self.name,
652
+ step_id=conditional_step_id,
653
+ step_type=StepType.CONDITION,
654
+ content=f"Condition {self.name} completed with {len(all_results)} results",
655
+ success=all(result.success for result in all_results) if all_results else True,
656
+ steps=all_results,
657
+ )
@@ -1,20 +1,21 @@
1
1
  import inspect
2
2
  from dataclasses import dataclass
3
- from typing import AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
3
+ from typing import Any, AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
4
+ from uuid import uuid4
4
5
 
5
- from agno.run.response import RunResponseEvent
6
- from agno.run.team import TeamRunResponseEvent
7
- from agno.run.v2.workflow import (
6
+ from agno.run.agent import RunOutputEvent
7
+ from agno.run.team import TeamRunOutputEvent
8
+ from agno.run.workflow import (
8
9
  LoopExecutionCompletedEvent,
9
10
  LoopExecutionStartedEvent,
10
11
  LoopIterationCompletedEvent,
11
12
  LoopIterationStartedEvent,
12
- WorkflowRunResponse,
13
- WorkflowRunResponseEvent,
13
+ WorkflowRunOutput,
14
+ WorkflowRunOutputEvent,
14
15
  )
15
16
  from agno.utils.log import log_debug, logger
16
- from agno.workflow.v2.step import Step
17
- from agno.workflow.v2.types import StepInput, StepOutput
17
+ from agno.workflow.step import Step
18
+ from agno.workflow.types import StepInput, StepOutput, StepType
18
19
 
19
20
  WorkflowSteps = List[
20
21
  Union[
@@ -61,11 +62,11 @@ class Loop:
61
62
  """Prepare the steps for execution - mirrors workflow logic"""
62
63
  from agno.agent.agent import Agent
63
64
  from agno.team.team import Team
64
- from agno.workflow.v2.condition import Condition
65
- from agno.workflow.v2.parallel import Parallel
66
- from agno.workflow.v2.router import Router
67
- from agno.workflow.v2.step import Step
68
- from agno.workflow.v2.steps import Steps
65
+ from agno.workflow.condition import Condition
66
+ from agno.workflow.parallel import Parallel
67
+ from agno.workflow.router import Router
68
+ from agno.workflow.step import Step
69
+ from agno.workflow.steps import Steps
69
70
 
70
71
  prepared_steps: WorkflowSteps = []
71
72
  for step in self.steps:
@@ -114,7 +115,7 @@ class Loop:
114
115
  updated_previous_step_outputs.update(loop_step_outputs)
115
116
 
116
117
  return StepInput(
117
- message=step_input.message,
118
+ input=step_input.input,
118
119
  previous_step_content=previous_step_content,
119
120
  previous_step_outputs=updated_previous_step_outputs,
120
121
  additional_data=step_input.additional_data,
@@ -128,7 +129,10 @@ class Loop:
128
129
  step_input: StepInput,
129
130
  session_id: Optional[str] = None,
130
131
  user_id: Optional[str] = None,
131
- ) -> List[StepOutput]:
132
+ workflow_run_response: Optional[WorkflowRunOutput] = None,
133
+ store_executor_outputs: bool = True,
134
+ session_state: Optional[Dict[str, Any]] = None,
135
+ ) -> StepOutput:
132
136
  """Execute loop steps with iteration control - mirrors workflow execution logic"""
133
137
  # Use workflow logger for loop orchestration
134
138
  log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
@@ -146,7 +150,14 @@ class Loop:
146
150
  loop_step_outputs = {} # Track outputs within this loop iteration
147
151
 
148
152
  for i, step in enumerate(self.steps):
149
- step_output = step.execute(current_step_input, session_id=session_id, user_id=user_id) # type: ignore[union-attr]
153
+ step_output = step.execute( # type: ignore[union-attr]
154
+ current_step_input,
155
+ session_id=session_id,
156
+ user_id=user_id,
157
+ workflow_run_response=workflow_run_response,
158
+ store_executor_outputs=store_executor_outputs,
159
+ session_state=session_state,
160
+ )
150
161
 
151
162
  # Handle both single StepOutput and List[StepOutput] (from Loop/Condition steps)
152
163
  if isinstance(step_output, list):
@@ -194,7 +205,14 @@ class Loop:
194
205
  for iteration_results in all_results:
195
206
  flattened_results.extend(iteration_results)
196
207
 
197
- return flattened_results
208
+ return StepOutput(
209
+ step_name=self.name,
210
+ step_id=str(uuid4()),
211
+ step_type=StepType.LOOP,
212
+ content=f"Loop {self.name} completed {iteration} iterations with {len(flattened_results)} total steps",
213
+ success=all(result.success for result in flattened_results) if flattened_results else True,
214
+ steps=flattened_results,
215
+ )
198
216
 
199
217
  def execute_stream(
200
218
  self,
@@ -202,15 +220,20 @@ class Loop:
202
220
  session_id: Optional[str] = None,
203
221
  user_id: Optional[str] = None,
204
222
  stream_intermediate_steps: bool = False,
205
- workflow_run_response: Optional[WorkflowRunResponse] = None,
223
+ workflow_run_response: Optional[WorkflowRunOutput] = None,
206
224
  step_index: Optional[Union[int, tuple]] = None,
207
- ) -> Iterator[Union[WorkflowRunResponseEvent, StepOutput]]:
225
+ store_executor_outputs: bool = True,
226
+ session_state: Optional[Dict[str, Any]] = None,
227
+ parent_step_id: Optional[str] = None,
228
+ ) -> Iterator[Union[WorkflowRunOutputEvent, StepOutput]]:
208
229
  """Execute loop steps with streaming support - mirrors workflow execution logic"""
209
230
  log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
210
231
 
211
232
  # Prepare steps first
212
233
  self._prepare_steps()
213
234
 
235
+ loop_step_id = str(uuid4())
236
+
214
237
  if stream_intermediate_steps and workflow_run_response:
215
238
  # Yield loop started event
216
239
  yield LoopExecutionStartedEvent(
@@ -221,6 +244,8 @@ class Loop:
221
244
  step_name=self.name,
222
245
  step_index=step_index,
223
246
  max_iterations=self.max_iterations,
247
+ step_id=loop_step_id,
248
+ parent_step_id=parent_step_id,
224
249
  )
225
250
 
226
251
  all_results = []
@@ -241,6 +266,8 @@ class Loop:
241
266
  step_index=step_index,
242
267
  iteration=iteration + 1,
243
268
  max_iterations=self.max_iterations,
269
+ step_id=loop_step_id,
270
+ parent_step_id=parent_step_id,
244
271
  )
245
272
 
246
273
  # Execute all steps in this iteration - mirroring workflow logic
@@ -267,6 +294,9 @@ class Loop:
267
294
  stream_intermediate_steps=stream_intermediate_steps,
268
295
  workflow_run_response=workflow_run_response,
269
296
  step_index=composite_step_index,
297
+ store_executor_outputs=store_executor_outputs,
298
+ session_state=session_state,
299
+ parent_step_id=loop_step_id,
270
300
  ):
271
301
  if isinstance(event, StepOutput):
272
302
  step_outputs_for_iteration.append(event)
@@ -331,6 +361,8 @@ class Loop:
331
361
  max_iterations=self.max_iterations,
332
362
  iteration_results=iteration_results,
333
363
  should_continue=should_continue,
364
+ step_id=loop_step_id,
365
+ parent_step_id=parent_step_id,
334
366
  )
335
367
 
336
368
  iteration += 1
@@ -353,22 +385,38 @@ class Loop:
353
385
  total_iterations=iteration,
354
386
  max_iterations=self.max_iterations,
355
387
  all_results=all_results,
388
+ step_id=loop_step_id,
389
+ parent_step_id=parent_step_id,
356
390
  )
357
391
 
392
+ flattened_results = []
358
393
  for iteration_results in all_results:
359
- for step_output in iteration_results:
360
- yield step_output
394
+ flattened_results.extend(iteration_results)
395
+
396
+ yield StepOutput(
397
+ step_name=self.name,
398
+ step_id=loop_step_id,
399
+ step_type=StepType.LOOP,
400
+ content=f"Loop {self.name} completed {iteration} iterations with {len(flattened_results)} total steps",
401
+ success=all(result.success for result in flattened_results) if flattened_results else True,
402
+ steps=flattened_results,
403
+ )
361
404
 
362
405
  async def aexecute(
363
406
  self,
364
407
  step_input: StepInput,
365
408
  session_id: Optional[str] = None,
366
409
  user_id: Optional[str] = None,
367
- ) -> List[StepOutput]:
410
+ workflow_run_response: Optional[WorkflowRunOutput] = None,
411
+ store_executor_outputs: bool = True,
412
+ session_state: Optional[Dict[str, Any]] = None,
413
+ ) -> StepOutput:
368
414
  """Execute loop steps asynchronously with iteration control - mirrors workflow execution logic"""
369
415
  # Use workflow logger for async loop orchestration
370
416
  log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
371
417
 
418
+ loop_step_id = str(uuid4())
419
+
372
420
  # Prepare steps first
373
421
  self._prepare_steps()
374
422
 
@@ -382,7 +430,14 @@ class Loop:
382
430
  loop_step_outputs = {} # Track outputs within this loop iteration
383
431
 
384
432
  for i, step in enumerate(self.steps):
385
- step_output = await step.aexecute(current_step_input, session_id=session_id, user_id=user_id) # type: ignore[union-attr]
433
+ step_output = await step.aexecute( # type: ignore[union-attr]
434
+ current_step_input,
435
+ session_id=session_id,
436
+ user_id=user_id,
437
+ workflow_run_response=workflow_run_response,
438
+ store_executor_outputs=store_executor_outputs,
439
+ session_state=session_state,
440
+ )
386
441
 
387
442
  # Handle both single StepOutput and List[StepOutput] (from Loop/Condition steps)
388
443
  if isinstance(step_output, list):
@@ -433,7 +488,14 @@ class Loop:
433
488
  for iteration_results in all_results:
434
489
  flattened_results.extend(iteration_results)
435
490
 
436
- return flattened_results
491
+ return StepOutput(
492
+ step_name=self.name,
493
+ step_id=loop_step_id,
494
+ step_type=StepType.LOOP,
495
+ content=f"Loop {self.name} completed {iteration} iterations with {len(flattened_results)} total steps",
496
+ success=all(result.success for result in flattened_results) if flattened_results else True,
497
+ steps=flattened_results,
498
+ )
437
499
 
438
500
  async def aexecute_stream(
439
501
  self,
@@ -441,12 +503,17 @@ class Loop:
441
503
  session_id: Optional[str] = None,
442
504
  user_id: Optional[str] = None,
443
505
  stream_intermediate_steps: bool = False,
444
- workflow_run_response: Optional[WorkflowRunResponse] = None,
506
+ workflow_run_response: Optional[WorkflowRunOutput] = None,
445
507
  step_index: Optional[Union[int, tuple]] = None,
446
- ) -> AsyncIterator[Union[WorkflowRunResponseEvent, TeamRunResponseEvent, RunResponseEvent, StepOutput]]:
508
+ store_executor_outputs: bool = True,
509
+ session_state: Optional[Dict[str, Any]] = None,
510
+ parent_step_id: Optional[str] = None,
511
+ ) -> AsyncIterator[Union[WorkflowRunOutputEvent, TeamRunOutputEvent, RunOutputEvent, StepOutput]]:
447
512
  """Execute loop steps with async streaming support - mirrors workflow execution logic"""
448
513
  log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
449
514
 
515
+ loop_step_id = str(uuid4())
516
+
450
517
  # Prepare steps first
451
518
  self._prepare_steps()
452
519
 
@@ -460,6 +527,8 @@ class Loop:
460
527
  step_name=self.name,
461
528
  step_index=step_index,
462
529
  max_iterations=self.max_iterations,
530
+ step_id=loop_step_id,
531
+ parent_step_id=parent_step_id,
463
532
  )
464
533
 
465
534
  all_results = []
@@ -480,6 +549,8 @@ class Loop:
480
549
  step_index=step_index,
481
550
  iteration=iteration + 1,
482
551
  max_iterations=self.max_iterations,
552
+ step_id=loop_step_id,
553
+ parent_step_id=parent_step_id,
483
554
  )
484
555
 
485
556
  # Execute all steps in this iteration - mirroring workflow logic
@@ -506,6 +577,9 @@ class Loop:
506
577
  stream_intermediate_steps=stream_intermediate_steps,
507
578
  workflow_run_response=workflow_run_response,
508
579
  step_index=composite_step_index,
580
+ store_executor_outputs=store_executor_outputs,
581
+ session_state=session_state,
582
+ parent_step_id=loop_step_id,
509
583
  ):
510
584
  if isinstance(event, StepOutput):
511
585
  step_outputs_for_iteration.append(event)
@@ -573,6 +647,8 @@ class Loop:
573
647
  max_iterations=self.max_iterations,
574
648
  iteration_results=iteration_results,
575
649
  should_continue=should_continue,
650
+ step_id=loop_step_id,
651
+ parent_step_id=parent_step_id,
576
652
  )
577
653
 
578
654
  iteration += 1
@@ -595,8 +671,19 @@ class Loop:
595
671
  total_iterations=iteration,
596
672
  max_iterations=self.max_iterations,
597
673
  all_results=all_results,
674
+ step_id=loop_step_id,
675
+ parent_step_id=parent_step_id,
598
676
  )
599
677
 
678
+ flattened_results = []
600
679
  for iteration_results in all_results:
601
- for step_output in iteration_results:
602
- yield step_output
680
+ flattened_results.extend(iteration_results)
681
+
682
+ yield StepOutput(
683
+ step_name=self.name,
684
+ step_id=loop_step_id,
685
+ step_type=StepType.LOOP,
686
+ content=f"Loop {self.name} completed {iteration} iterations with {len(flattened_results)} total steps",
687
+ success=all(result.success for result in flattened_results) if flattened_results else True,
688
+ steps=flattened_results,
689
+ )