agno 2.1.2__py3-none-any.whl → 2.3.13__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 (314) hide show
  1. agno/agent/agent.py +5540 -2273
  2. agno/api/api.py +2 -0
  3. agno/api/os.py +1 -1
  4. agno/compression/__init__.py +3 -0
  5. agno/compression/manager.py +247 -0
  6. agno/culture/__init__.py +3 -0
  7. agno/culture/manager.py +956 -0
  8. agno/db/async_postgres/__init__.py +3 -0
  9. agno/db/base.py +689 -6
  10. agno/db/dynamo/dynamo.py +933 -37
  11. agno/db/dynamo/schemas.py +174 -10
  12. agno/db/dynamo/utils.py +63 -4
  13. agno/db/firestore/firestore.py +831 -9
  14. agno/db/firestore/schemas.py +51 -0
  15. agno/db/firestore/utils.py +102 -4
  16. agno/db/gcs_json/gcs_json_db.py +660 -12
  17. agno/db/gcs_json/utils.py +60 -26
  18. agno/db/in_memory/in_memory_db.py +287 -14
  19. agno/db/in_memory/utils.py +60 -2
  20. agno/db/json/json_db.py +590 -14
  21. agno/db/json/utils.py +60 -26
  22. agno/db/migrations/manager.py +199 -0
  23. agno/db/migrations/v1_to_v2.py +43 -13
  24. agno/db/migrations/versions/__init__.py +0 -0
  25. agno/db/migrations/versions/v2_3_0.py +938 -0
  26. agno/db/mongo/__init__.py +15 -1
  27. agno/db/mongo/async_mongo.py +2760 -0
  28. agno/db/mongo/mongo.py +879 -11
  29. agno/db/mongo/schemas.py +42 -0
  30. agno/db/mongo/utils.py +80 -8
  31. agno/db/mysql/__init__.py +2 -1
  32. agno/db/mysql/async_mysql.py +2912 -0
  33. agno/db/mysql/mysql.py +946 -68
  34. agno/db/mysql/schemas.py +72 -10
  35. agno/db/mysql/utils.py +198 -7
  36. agno/db/postgres/__init__.py +2 -1
  37. agno/db/postgres/async_postgres.py +2579 -0
  38. agno/db/postgres/postgres.py +942 -57
  39. agno/db/postgres/schemas.py +81 -18
  40. agno/db/postgres/utils.py +164 -2
  41. agno/db/redis/redis.py +671 -7
  42. agno/db/redis/schemas.py +50 -0
  43. agno/db/redis/utils.py +65 -7
  44. agno/db/schemas/__init__.py +2 -1
  45. agno/db/schemas/culture.py +120 -0
  46. agno/db/schemas/evals.py +1 -0
  47. agno/db/schemas/memory.py +17 -2
  48. agno/db/singlestore/schemas.py +63 -0
  49. agno/db/singlestore/singlestore.py +949 -83
  50. agno/db/singlestore/utils.py +60 -2
  51. agno/db/sqlite/__init__.py +2 -1
  52. agno/db/sqlite/async_sqlite.py +2911 -0
  53. agno/db/sqlite/schemas.py +62 -0
  54. agno/db/sqlite/sqlite.py +965 -46
  55. agno/db/sqlite/utils.py +169 -8
  56. agno/db/surrealdb/__init__.py +3 -0
  57. agno/db/surrealdb/metrics.py +292 -0
  58. agno/db/surrealdb/models.py +334 -0
  59. agno/db/surrealdb/queries.py +71 -0
  60. agno/db/surrealdb/surrealdb.py +1908 -0
  61. agno/db/surrealdb/utils.py +147 -0
  62. agno/db/utils.py +2 -0
  63. agno/eval/__init__.py +10 -0
  64. agno/eval/accuracy.py +75 -55
  65. agno/eval/agent_as_judge.py +861 -0
  66. agno/eval/base.py +29 -0
  67. agno/eval/performance.py +16 -7
  68. agno/eval/reliability.py +28 -16
  69. agno/eval/utils.py +35 -17
  70. agno/exceptions.py +27 -2
  71. agno/filters.py +354 -0
  72. agno/guardrails/prompt_injection.py +1 -0
  73. agno/hooks/__init__.py +3 -0
  74. agno/hooks/decorator.py +164 -0
  75. agno/integrations/discord/client.py +1 -1
  76. agno/knowledge/chunking/agentic.py +13 -10
  77. agno/knowledge/chunking/fixed.py +4 -1
  78. agno/knowledge/chunking/semantic.py +9 -4
  79. agno/knowledge/chunking/strategy.py +59 -15
  80. agno/knowledge/embedder/fastembed.py +1 -1
  81. agno/knowledge/embedder/nebius.py +1 -1
  82. agno/knowledge/embedder/ollama.py +8 -0
  83. agno/knowledge/embedder/openai.py +8 -8
  84. agno/knowledge/embedder/sentence_transformer.py +6 -2
  85. agno/knowledge/embedder/vllm.py +262 -0
  86. agno/knowledge/knowledge.py +1618 -318
  87. agno/knowledge/reader/base.py +6 -2
  88. agno/knowledge/reader/csv_reader.py +8 -10
  89. agno/knowledge/reader/docx_reader.py +5 -6
  90. agno/knowledge/reader/field_labeled_csv_reader.py +16 -20
  91. agno/knowledge/reader/json_reader.py +5 -4
  92. agno/knowledge/reader/markdown_reader.py +8 -8
  93. agno/knowledge/reader/pdf_reader.py +17 -19
  94. agno/knowledge/reader/pptx_reader.py +101 -0
  95. agno/knowledge/reader/reader_factory.py +32 -3
  96. agno/knowledge/reader/s3_reader.py +3 -3
  97. agno/knowledge/reader/tavily_reader.py +193 -0
  98. agno/knowledge/reader/text_reader.py +22 -10
  99. agno/knowledge/reader/web_search_reader.py +1 -48
  100. agno/knowledge/reader/website_reader.py +10 -10
  101. agno/knowledge/reader/wikipedia_reader.py +33 -1
  102. agno/knowledge/types.py +1 -0
  103. agno/knowledge/utils.py +72 -7
  104. agno/media.py +22 -6
  105. agno/memory/__init__.py +14 -1
  106. agno/memory/manager.py +544 -83
  107. agno/memory/strategies/__init__.py +15 -0
  108. agno/memory/strategies/base.py +66 -0
  109. agno/memory/strategies/summarize.py +196 -0
  110. agno/memory/strategies/types.py +37 -0
  111. agno/models/aimlapi/aimlapi.py +17 -0
  112. agno/models/anthropic/claude.py +515 -40
  113. agno/models/aws/bedrock.py +102 -21
  114. agno/models/aws/claude.py +131 -274
  115. agno/models/azure/ai_foundry.py +41 -19
  116. agno/models/azure/openai_chat.py +39 -8
  117. agno/models/base.py +1249 -525
  118. agno/models/cerebras/cerebras.py +91 -21
  119. agno/models/cerebras/cerebras_openai.py +21 -2
  120. agno/models/cohere/chat.py +40 -6
  121. agno/models/cometapi/cometapi.py +18 -1
  122. agno/models/dashscope/dashscope.py +2 -3
  123. agno/models/deepinfra/deepinfra.py +18 -1
  124. agno/models/deepseek/deepseek.py +69 -3
  125. agno/models/fireworks/fireworks.py +18 -1
  126. agno/models/google/gemini.py +877 -80
  127. agno/models/google/utils.py +22 -0
  128. agno/models/groq/groq.py +51 -18
  129. agno/models/huggingface/huggingface.py +17 -6
  130. agno/models/ibm/watsonx.py +16 -6
  131. agno/models/internlm/internlm.py +18 -1
  132. agno/models/langdb/langdb.py +13 -1
  133. agno/models/litellm/chat.py +44 -9
  134. agno/models/litellm/litellm_openai.py +18 -1
  135. agno/models/message.py +28 -5
  136. agno/models/meta/llama.py +47 -14
  137. agno/models/meta/llama_openai.py +22 -17
  138. agno/models/mistral/mistral.py +8 -4
  139. agno/models/nebius/nebius.py +6 -7
  140. agno/models/nvidia/nvidia.py +20 -3
  141. agno/models/ollama/chat.py +24 -8
  142. agno/models/openai/chat.py +104 -29
  143. agno/models/openai/responses.py +101 -81
  144. agno/models/openrouter/openrouter.py +60 -3
  145. agno/models/perplexity/perplexity.py +17 -1
  146. agno/models/portkey/portkey.py +7 -6
  147. agno/models/requesty/requesty.py +24 -4
  148. agno/models/response.py +73 -2
  149. agno/models/sambanova/sambanova.py +20 -3
  150. agno/models/siliconflow/siliconflow.py +19 -2
  151. agno/models/together/together.py +20 -3
  152. agno/models/utils.py +254 -8
  153. agno/models/vercel/v0.py +20 -3
  154. agno/models/vertexai/__init__.py +0 -0
  155. agno/models/vertexai/claude.py +190 -0
  156. agno/models/vllm/vllm.py +19 -14
  157. agno/models/xai/xai.py +19 -2
  158. agno/os/app.py +549 -152
  159. agno/os/auth.py +190 -3
  160. agno/os/config.py +23 -0
  161. agno/os/interfaces/a2a/router.py +8 -11
  162. agno/os/interfaces/a2a/utils.py +1 -1
  163. agno/os/interfaces/agui/router.py +18 -3
  164. agno/os/interfaces/agui/utils.py +152 -39
  165. agno/os/interfaces/slack/router.py +55 -37
  166. agno/os/interfaces/slack/slack.py +9 -1
  167. agno/os/interfaces/whatsapp/router.py +0 -1
  168. agno/os/interfaces/whatsapp/security.py +3 -1
  169. agno/os/mcp.py +110 -52
  170. agno/os/middleware/__init__.py +2 -0
  171. agno/os/middleware/jwt.py +676 -112
  172. agno/os/router.py +40 -1478
  173. agno/os/routers/agents/__init__.py +3 -0
  174. agno/os/routers/agents/router.py +599 -0
  175. agno/os/routers/agents/schema.py +261 -0
  176. agno/os/routers/evals/evals.py +96 -39
  177. agno/os/routers/evals/schemas.py +65 -33
  178. agno/os/routers/evals/utils.py +80 -10
  179. agno/os/routers/health.py +10 -4
  180. agno/os/routers/knowledge/knowledge.py +196 -38
  181. agno/os/routers/knowledge/schemas.py +82 -22
  182. agno/os/routers/memory/memory.py +279 -52
  183. agno/os/routers/memory/schemas.py +46 -17
  184. agno/os/routers/metrics/metrics.py +20 -8
  185. agno/os/routers/metrics/schemas.py +16 -16
  186. agno/os/routers/session/session.py +462 -34
  187. agno/os/routers/teams/__init__.py +3 -0
  188. agno/os/routers/teams/router.py +512 -0
  189. agno/os/routers/teams/schema.py +257 -0
  190. agno/os/routers/traces/__init__.py +3 -0
  191. agno/os/routers/traces/schemas.py +414 -0
  192. agno/os/routers/traces/traces.py +499 -0
  193. agno/os/routers/workflows/__init__.py +3 -0
  194. agno/os/routers/workflows/router.py +624 -0
  195. agno/os/routers/workflows/schema.py +75 -0
  196. agno/os/schema.py +256 -693
  197. agno/os/scopes.py +469 -0
  198. agno/os/utils.py +514 -36
  199. agno/reasoning/anthropic.py +80 -0
  200. agno/reasoning/gemini.py +73 -0
  201. agno/reasoning/openai.py +5 -0
  202. agno/reasoning/vertexai.py +76 -0
  203. agno/run/__init__.py +6 -0
  204. agno/run/agent.py +155 -32
  205. agno/run/base.py +55 -3
  206. agno/run/requirement.py +181 -0
  207. agno/run/team.py +125 -38
  208. agno/run/workflow.py +72 -18
  209. agno/session/agent.py +102 -89
  210. agno/session/summary.py +56 -15
  211. agno/session/team.py +164 -90
  212. agno/session/workflow.py +405 -40
  213. agno/table.py +10 -0
  214. agno/team/team.py +3974 -1903
  215. agno/tools/dalle.py +2 -4
  216. agno/tools/eleven_labs.py +23 -25
  217. agno/tools/exa.py +21 -16
  218. agno/tools/file.py +153 -23
  219. agno/tools/file_generation.py +16 -10
  220. agno/tools/firecrawl.py +15 -7
  221. agno/tools/function.py +193 -38
  222. agno/tools/gmail.py +238 -14
  223. agno/tools/google_drive.py +271 -0
  224. agno/tools/googlecalendar.py +36 -8
  225. agno/tools/googlesheets.py +20 -5
  226. agno/tools/jira.py +20 -0
  227. agno/tools/mcp/__init__.py +10 -0
  228. agno/tools/mcp/mcp.py +331 -0
  229. agno/tools/mcp/multi_mcp.py +347 -0
  230. agno/tools/mcp/params.py +24 -0
  231. agno/tools/mcp_toolbox.py +3 -3
  232. agno/tools/models/nebius.py +5 -5
  233. agno/tools/models_labs.py +20 -10
  234. agno/tools/nano_banana.py +151 -0
  235. agno/tools/notion.py +204 -0
  236. agno/tools/parallel.py +314 -0
  237. agno/tools/postgres.py +76 -36
  238. agno/tools/redshift.py +406 -0
  239. agno/tools/scrapegraph.py +1 -1
  240. agno/tools/shopify.py +1519 -0
  241. agno/tools/slack.py +18 -3
  242. agno/tools/spotify.py +919 -0
  243. agno/tools/tavily.py +146 -0
  244. agno/tools/toolkit.py +25 -0
  245. agno/tools/workflow.py +8 -1
  246. agno/tools/yfinance.py +12 -11
  247. agno/tracing/__init__.py +12 -0
  248. agno/tracing/exporter.py +157 -0
  249. agno/tracing/schemas.py +276 -0
  250. agno/tracing/setup.py +111 -0
  251. agno/utils/agent.py +938 -0
  252. agno/utils/cryptography.py +22 -0
  253. agno/utils/dttm.py +33 -0
  254. agno/utils/events.py +151 -3
  255. agno/utils/gemini.py +15 -5
  256. agno/utils/hooks.py +118 -4
  257. agno/utils/http.py +113 -2
  258. agno/utils/knowledge.py +12 -5
  259. agno/utils/log.py +1 -0
  260. agno/utils/mcp.py +92 -2
  261. agno/utils/media.py +187 -1
  262. agno/utils/merge_dict.py +3 -3
  263. agno/utils/message.py +60 -0
  264. agno/utils/models/ai_foundry.py +9 -2
  265. agno/utils/models/claude.py +49 -14
  266. agno/utils/models/cohere.py +9 -2
  267. agno/utils/models/llama.py +9 -2
  268. agno/utils/models/mistral.py +4 -2
  269. agno/utils/print_response/agent.py +109 -16
  270. agno/utils/print_response/team.py +223 -30
  271. agno/utils/print_response/workflow.py +251 -34
  272. agno/utils/streamlit.py +1 -1
  273. agno/utils/team.py +98 -9
  274. agno/utils/tokens.py +657 -0
  275. agno/vectordb/base.py +39 -7
  276. agno/vectordb/cassandra/cassandra.py +21 -5
  277. agno/vectordb/chroma/chromadb.py +43 -12
  278. agno/vectordb/clickhouse/clickhousedb.py +21 -5
  279. agno/vectordb/couchbase/couchbase.py +29 -5
  280. agno/vectordb/lancedb/lance_db.py +92 -181
  281. agno/vectordb/langchaindb/langchaindb.py +24 -4
  282. agno/vectordb/lightrag/lightrag.py +17 -3
  283. agno/vectordb/llamaindex/llamaindexdb.py +25 -5
  284. agno/vectordb/milvus/milvus.py +50 -37
  285. agno/vectordb/mongodb/__init__.py +7 -1
  286. agno/vectordb/mongodb/mongodb.py +36 -30
  287. agno/vectordb/pgvector/pgvector.py +201 -77
  288. agno/vectordb/pineconedb/pineconedb.py +41 -23
  289. agno/vectordb/qdrant/qdrant.py +67 -54
  290. agno/vectordb/redis/__init__.py +9 -0
  291. agno/vectordb/redis/redisdb.py +682 -0
  292. agno/vectordb/singlestore/singlestore.py +50 -29
  293. agno/vectordb/surrealdb/surrealdb.py +31 -41
  294. agno/vectordb/upstashdb/upstashdb.py +34 -6
  295. agno/vectordb/weaviate/weaviate.py +53 -14
  296. agno/workflow/__init__.py +2 -0
  297. agno/workflow/agent.py +299 -0
  298. agno/workflow/condition.py +120 -18
  299. agno/workflow/loop.py +77 -10
  300. agno/workflow/parallel.py +231 -143
  301. agno/workflow/router.py +118 -17
  302. agno/workflow/step.py +609 -170
  303. agno/workflow/steps.py +73 -6
  304. agno/workflow/types.py +96 -21
  305. agno/workflow/workflow.py +2039 -262
  306. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/METADATA +201 -66
  307. agno-2.3.13.dist-info/RECORD +613 -0
  308. agno/tools/googlesearch.py +0 -98
  309. agno/tools/mcp.py +0 -679
  310. agno/tools/memori.py +0 -339
  311. agno-2.1.2.dist-info/RECORD +0 -543
  312. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +0 -0
  313. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/licenses/LICENSE +0 -0
  314. {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/top_level.txt +0 -0
agno/workflow/router.py CHANGED
@@ -1,9 +1,11 @@
1
1
  import inspect
2
+ import warnings
2
3
  from dataclasses import dataclass
3
4
  from typing import Any, AsyncIterator, Awaitable, Callable, Dict, Iterator, List, Optional, Union
4
5
  from uuid import uuid4
5
6
 
6
7
  from agno.run.agent import RunOutputEvent
8
+ from agno.run.base import RunContext
7
9
  from agno.run.team import TeamRunOutputEvent
8
10
  from agno.run.workflow import (
9
11
  RouterExecutionCompletedEvent,
@@ -11,6 +13,7 @@ from agno.run.workflow import (
11
13
  WorkflowRunOutput,
12
14
  WorkflowRunOutputEvent,
13
15
  )
16
+ from agno.session.workflow import WorkflowSession
14
17
  from agno.utils.log import log_debug, logger
15
18
  from agno.workflow.step import Step
16
19
  from agno.workflow.types import StepInput, StepOutput, StepType
@@ -107,10 +110,13 @@ class Router:
107
110
  audio=current_audio + all_audio,
108
111
  )
109
112
 
110
- def _route_steps(self, step_input: StepInput) -> List[Step]: # type: ignore[return-value]
113
+ def _route_steps(self, step_input: StepInput, session_state: Optional[Dict[str, Any]] = None) -> List[Step]: # type: ignore[return-value]
111
114
  """Route to the appropriate steps based on input"""
112
115
  if callable(self.selector):
113
- result = self.selector(step_input)
116
+ if session_state is not None and self._selector_has_session_state_param():
117
+ result = self.selector(step_input, session_state) # type: ignore[call-arg]
118
+ else:
119
+ result = self.selector(step_input)
114
120
 
115
121
  # Handle the result based on its type
116
122
  if isinstance(result, Step):
@@ -123,13 +129,21 @@ class Router:
123
129
 
124
130
  return []
125
131
 
126
- async def _aroute_steps(self, step_input: StepInput) -> List[Step]: # type: ignore[return-value]
132
+ async def _aroute_steps(self, step_input: StepInput, session_state: Optional[Dict[str, Any]] = None) -> List[Step]: # type: ignore[return-value]
127
133
  """Async version of step routing"""
128
134
  if callable(self.selector):
135
+ has_session_state = session_state is not None and self._selector_has_session_state_param()
136
+
129
137
  if inspect.iscoroutinefunction(self.selector):
130
- result = await self.selector(step_input)
138
+ if has_session_state:
139
+ result = await self.selector(step_input, session_state) # type: ignore[call-arg]
140
+ else:
141
+ result = await self.selector(step_input)
131
142
  else:
132
- result = self.selector(step_input)
143
+ if has_session_state:
144
+ result = self.selector(step_input, session_state) # type: ignore[call-arg]
145
+ else:
146
+ result = self.selector(step_input)
133
147
 
134
148
  # Handle the result based on its type
135
149
  if isinstance(result, Step):
@@ -142,14 +156,30 @@ class Router:
142
156
 
143
157
  return []
144
158
 
159
+ def _selector_has_session_state_param(self) -> bool:
160
+ """Check if the selector function has a session_state parameter"""
161
+ if not callable(self.selector):
162
+ return False
163
+
164
+ try:
165
+ sig = inspect.signature(self.selector)
166
+ return "session_state" in sig.parameters
167
+ except Exception:
168
+ return False
169
+
145
170
  def execute(
146
171
  self,
147
172
  step_input: StepInput,
148
173
  session_id: Optional[str] = None,
149
174
  user_id: Optional[str] = None,
150
175
  workflow_run_response: Optional[WorkflowRunOutput] = None,
176
+ run_context: Optional[RunContext] = None,
151
177
  session_state: Optional[Dict[str, Any]] = None,
152
178
  store_executor_outputs: bool = True,
179
+ workflow_session: Optional[WorkflowSession] = None,
180
+ add_workflow_history_to_steps: Optional[bool] = False,
181
+ num_history_runs: int = 3,
182
+ background_tasks: Optional[Any] = None,
153
183
  ) -> StepOutput:
154
184
  """Execute the router and its selected steps with sequential chaining"""
155
185
  log_debug(f"Router Start: {self.name}", center=True, symbol="-")
@@ -159,7 +189,10 @@ class Router:
159
189
  self._prepare_steps()
160
190
 
161
191
  # Route to appropriate steps
162
- steps_to_execute = self._route_steps(step_input)
192
+ if run_context is not None and run_context.session_state is not None:
193
+ steps_to_execute = self._route_steps(step_input, session_state=run_context.session_state)
194
+ else:
195
+ steps_to_execute = self._route_steps(step_input, session_state=session_state)
163
196
  log_debug(f"Router {self.name}: Selected {len(steps_to_execute)} steps to execute")
164
197
 
165
198
  if not steps_to_execute:
@@ -183,7 +216,12 @@ class Router:
183
216
  user_id=user_id,
184
217
  workflow_run_response=workflow_run_response,
185
218
  store_executor_outputs=store_executor_outputs,
219
+ run_context=run_context,
186
220
  session_state=session_state,
221
+ workflow_session=workflow_session,
222
+ add_workflow_history_to_steps=add_workflow_history_to_steps,
223
+ num_history_runs=num_history_runs,
224
+ background_tasks=background_tasks,
187
225
  )
188
226
 
189
227
  # Handle both single StepOutput and List[StepOutput]
@@ -237,12 +275,19 @@ class Router:
237
275
  step_input: StepInput,
238
276
  session_id: Optional[str] = None,
239
277
  user_id: Optional[str] = None,
278
+ run_context: Optional[RunContext] = None,
240
279
  session_state: Optional[Dict[str, Any]] = None,
280
+ stream_events: bool = False,
241
281
  stream_intermediate_steps: bool = False,
282
+ stream_executor_events: bool = True,
242
283
  workflow_run_response: Optional[WorkflowRunOutput] = None,
243
284
  step_index: Optional[Union[int, tuple]] = None,
244
285
  store_executor_outputs: bool = True,
245
286
  parent_step_id: Optional[str] = None,
287
+ workflow_session: Optional[WorkflowSession] = None,
288
+ add_workflow_history_to_steps: Optional[bool] = False,
289
+ num_history_runs: int = 3,
290
+ background_tasks: Optional[Any] = None,
246
291
  ) -> Iterator[Union[WorkflowRunOutputEvent, StepOutput]]:
247
292
  """Execute the router with streaming support"""
248
293
  log_debug(f"Router Start: {self.name}", center=True, symbol="-")
@@ -252,10 +297,22 @@ class Router:
252
297
  router_step_id = str(uuid4())
253
298
 
254
299
  # Route to appropriate steps
255
- steps_to_execute = self._route_steps(step_input)
300
+ if run_context is not None and run_context.session_state is not None:
301
+ steps_to_execute = self._route_steps(step_input, session_state=run_context.session_state)
302
+ else:
303
+ steps_to_execute = self._route_steps(step_input, session_state=session_state)
256
304
  log_debug(f"Router {self.name}: Selected {len(steps_to_execute)} steps to execute")
257
305
 
258
- if stream_intermediate_steps and workflow_run_response:
306
+ # Considering both stream_events and stream_intermediate_steps (deprecated)
307
+ if stream_intermediate_steps is not None:
308
+ warnings.warn(
309
+ "The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Use 'stream_events' instead.",
310
+ DeprecationWarning,
311
+ stacklevel=2,
312
+ )
313
+ stream_events = stream_events or stream_intermediate_steps
314
+
315
+ if stream_events and workflow_run_response:
259
316
  # Yield router started event
260
317
  yield RouterExecutionStartedEvent(
261
318
  run_id=workflow_run_response.run_id or "",
@@ -271,7 +328,7 @@ class Router:
271
328
 
272
329
  if not steps_to_execute:
273
330
  # Yield router completed event for empty case
274
- if stream_intermediate_steps and workflow_run_response:
331
+ if stream_events and workflow_run_response:
275
332
  yield RouterExecutionCompletedEvent(
276
333
  run_id=workflow_run_response.run_id or "",
277
334
  workflow_name=workflow_run_response.workflow_name or "",
@@ -299,12 +356,18 @@ class Router:
299
356
  current_step_input,
300
357
  session_id=session_id,
301
358
  user_id=user_id,
302
- stream_intermediate_steps=stream_intermediate_steps,
359
+ stream_events=stream_events,
360
+ stream_executor_events=stream_executor_events,
303
361
  workflow_run_response=workflow_run_response,
304
362
  step_index=step_index,
305
363
  store_executor_outputs=store_executor_outputs,
364
+ run_context=run_context,
306
365
  session_state=session_state,
307
366
  parent_step_id=router_step_id,
367
+ workflow_session=workflow_session,
368
+ add_workflow_history_to_steps=add_workflow_history_to_steps,
369
+ num_history_runs=num_history_runs,
370
+ background_tasks=background_tasks,
308
371
  ):
309
372
  if isinstance(event, StepOutput):
310
373
  step_outputs_for_step.append(event)
@@ -353,7 +416,7 @@ class Router:
353
416
 
354
417
  log_debug(f"Router End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
355
418
 
356
- if stream_intermediate_steps and workflow_run_response:
419
+ if stream_events and workflow_run_response:
357
420
  # Yield router completed event
358
421
  yield RouterExecutionCompletedEvent(
359
422
  run_id=workflow_run_response.run_id or "",
@@ -384,8 +447,13 @@ class Router:
384
447
  session_id: Optional[str] = None,
385
448
  user_id: Optional[str] = None,
386
449
  workflow_run_response: Optional[WorkflowRunOutput] = None,
450
+ run_context: Optional[RunContext] = None,
387
451
  session_state: Optional[Dict[str, Any]] = None,
388
452
  store_executor_outputs: bool = True,
453
+ workflow_session: Optional[WorkflowSession] = None,
454
+ add_workflow_history_to_steps: Optional[bool] = False,
455
+ num_history_runs: int = 3,
456
+ background_tasks: Optional[Any] = None,
389
457
  ) -> StepOutput:
390
458
  """Async execute the router and its selected steps with sequential chaining"""
391
459
  log_debug(f"Router Start: {self.name}", center=True, symbol="-")
@@ -395,7 +463,10 @@ class Router:
395
463
  self._prepare_steps()
396
464
 
397
465
  # Route to appropriate steps
398
- steps_to_execute = await self._aroute_steps(step_input)
466
+ if run_context is not None and run_context.session_state is not None:
467
+ steps_to_execute = await self._aroute_steps(step_input, session_state=run_context.session_state)
468
+ else:
469
+ steps_to_execute = await self._aroute_steps(step_input, session_state=session_state)
399
470
  log_debug(f"Router {self.name} selected: {len(steps_to_execute)} steps to execute")
400
471
 
401
472
  if not steps_to_execute:
@@ -420,7 +491,12 @@ class Router:
420
491
  user_id=user_id,
421
492
  workflow_run_response=workflow_run_response,
422
493
  store_executor_outputs=store_executor_outputs,
494
+ run_context=run_context,
423
495
  session_state=session_state,
496
+ workflow_session=workflow_session,
497
+ add_workflow_history_to_steps=add_workflow_history_to_steps,
498
+ num_history_runs=num_history_runs,
499
+ background_tasks=background_tasks,
424
500
  )
425
501
  # Handle both single StepOutput and List[StepOutput]
426
502
  if isinstance(step_output, list):
@@ -476,12 +552,19 @@ class Router:
476
552
  step_input: StepInput,
477
553
  session_id: Optional[str] = None,
478
554
  user_id: Optional[str] = None,
555
+ run_context: Optional[RunContext] = None,
479
556
  session_state: Optional[Dict[str, Any]] = None,
557
+ stream_events: bool = False,
480
558
  stream_intermediate_steps: bool = False,
559
+ stream_executor_events: bool = True,
481
560
  workflow_run_response: Optional[WorkflowRunOutput] = None,
482
561
  step_index: Optional[Union[int, tuple]] = None,
483
562
  store_executor_outputs: bool = True,
484
563
  parent_step_id: Optional[str] = None,
564
+ workflow_session: Optional[WorkflowSession] = None,
565
+ add_workflow_history_to_steps: Optional[bool] = False,
566
+ num_history_runs: int = 3,
567
+ background_tasks: Optional[Any] = None,
485
568
  ) -> AsyncIterator[Union[WorkflowRunOutputEvent, TeamRunOutputEvent, RunOutputEvent, StepOutput]]:
486
569
  """Async execute the router with streaming support"""
487
570
  log_debug(f"Router Start: {self.name}", center=True, symbol="-")
@@ -491,10 +574,22 @@ class Router:
491
574
  router_step_id = str(uuid4())
492
575
 
493
576
  # Route to appropriate steps
494
- steps_to_execute = await self._aroute_steps(step_input)
577
+ if run_context is not None and run_context.session_state is not None:
578
+ steps_to_execute = await self._aroute_steps(step_input, session_state=run_context.session_state)
579
+ else:
580
+ steps_to_execute = await self._aroute_steps(step_input, session_state=session_state)
495
581
  log_debug(f"Router {self.name} selected: {len(steps_to_execute)} steps to execute")
496
582
 
497
- if stream_intermediate_steps and workflow_run_response:
583
+ # Considering both stream_events and stream_intermediate_steps (deprecated)
584
+ if stream_intermediate_steps is not None:
585
+ warnings.warn(
586
+ "The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Use 'stream_events' instead.",
587
+ DeprecationWarning,
588
+ stacklevel=2,
589
+ )
590
+ stream_events = stream_events or stream_intermediate_steps
591
+
592
+ if stream_events and workflow_run_response:
498
593
  # Yield router started event
499
594
  yield RouterExecutionStartedEvent(
500
595
  run_id=workflow_run_response.run_id or "",
@@ -509,7 +604,7 @@ class Router:
509
604
  )
510
605
 
511
606
  if not steps_to_execute:
512
- if stream_intermediate_steps and workflow_run_response:
607
+ if stream_events and workflow_run_response:
513
608
  # Yield router completed event for empty case
514
609
  yield RouterExecutionCompletedEvent(
515
610
  run_id=workflow_run_response.run_id or "",
@@ -540,12 +635,18 @@ class Router:
540
635
  current_step_input,
541
636
  session_id=session_id,
542
637
  user_id=user_id,
543
- stream_intermediate_steps=stream_intermediate_steps,
638
+ stream_events=stream_events,
639
+ stream_executor_events=stream_executor_events,
544
640
  workflow_run_response=workflow_run_response,
545
641
  step_index=step_index,
546
642
  store_executor_outputs=store_executor_outputs,
643
+ run_context=run_context,
547
644
  session_state=session_state,
548
645
  parent_step_id=router_step_id,
646
+ workflow_session=workflow_session,
647
+ add_workflow_history_to_steps=add_workflow_history_to_steps,
648
+ num_history_runs=num_history_runs,
649
+ background_tasks=background_tasks,
549
650
  ):
550
651
  if isinstance(event, StepOutput):
551
652
  step_outputs_for_step.append(event)
@@ -594,7 +695,7 @@ class Router:
594
695
 
595
696
  log_debug(f"Router End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
596
697
 
597
- if stream_intermediate_steps and workflow_run_response:
698
+ if stream_events and workflow_run_response:
598
699
  # Yield router completed event
599
700
  yield RouterExecutionCompletedEvent(
600
701
  run_id=workflow_run_response.run_id or "",