agno 2.0.1__py3-none-any.whl → 2.3.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 (314) hide show
  1. agno/agent/agent.py +6015 -2823
  2. agno/api/api.py +2 -0
  3. agno/api/os.py +1 -1
  4. agno/culture/__init__.py +3 -0
  5. agno/culture/manager.py +956 -0
  6. agno/db/async_postgres/__init__.py +3 -0
  7. agno/db/base.py +385 -6
  8. agno/db/dynamo/dynamo.py +388 -81
  9. agno/db/dynamo/schemas.py +47 -10
  10. agno/db/dynamo/utils.py +63 -4
  11. agno/db/firestore/firestore.py +435 -64
  12. agno/db/firestore/schemas.py +11 -0
  13. agno/db/firestore/utils.py +102 -4
  14. agno/db/gcs_json/gcs_json_db.py +384 -42
  15. agno/db/gcs_json/utils.py +60 -26
  16. agno/db/in_memory/in_memory_db.py +351 -66
  17. agno/db/in_memory/utils.py +60 -2
  18. agno/db/json/json_db.py +339 -48
  19. agno/db/json/utils.py +60 -26
  20. agno/db/migrations/manager.py +199 -0
  21. agno/db/migrations/v1_to_v2.py +510 -37
  22. agno/db/migrations/versions/__init__.py +0 -0
  23. agno/db/migrations/versions/v2_3_0.py +938 -0
  24. agno/db/mongo/__init__.py +15 -1
  25. agno/db/mongo/async_mongo.py +2036 -0
  26. agno/db/mongo/mongo.py +653 -76
  27. agno/db/mongo/schemas.py +13 -0
  28. agno/db/mongo/utils.py +80 -8
  29. agno/db/mysql/mysql.py +687 -25
  30. agno/db/mysql/schemas.py +61 -37
  31. agno/db/mysql/utils.py +60 -2
  32. agno/db/postgres/__init__.py +2 -1
  33. agno/db/postgres/async_postgres.py +2001 -0
  34. agno/db/postgres/postgres.py +676 -57
  35. agno/db/postgres/schemas.py +43 -18
  36. agno/db/postgres/utils.py +164 -2
  37. agno/db/redis/redis.py +344 -38
  38. agno/db/redis/schemas.py +18 -0
  39. agno/db/redis/utils.py +60 -2
  40. agno/db/schemas/__init__.py +2 -1
  41. agno/db/schemas/culture.py +120 -0
  42. agno/db/schemas/memory.py +13 -0
  43. agno/db/singlestore/schemas.py +26 -1
  44. agno/db/singlestore/singlestore.py +687 -53
  45. agno/db/singlestore/utils.py +60 -2
  46. agno/db/sqlite/__init__.py +2 -1
  47. agno/db/sqlite/async_sqlite.py +2371 -0
  48. agno/db/sqlite/schemas.py +24 -0
  49. agno/db/sqlite/sqlite.py +774 -85
  50. agno/db/sqlite/utils.py +168 -5
  51. agno/db/surrealdb/__init__.py +3 -0
  52. agno/db/surrealdb/metrics.py +292 -0
  53. agno/db/surrealdb/models.py +309 -0
  54. agno/db/surrealdb/queries.py +71 -0
  55. agno/db/surrealdb/surrealdb.py +1361 -0
  56. agno/db/surrealdb/utils.py +147 -0
  57. agno/db/utils.py +50 -22
  58. agno/eval/accuracy.py +50 -43
  59. agno/eval/performance.py +6 -3
  60. agno/eval/reliability.py +6 -3
  61. agno/eval/utils.py +33 -16
  62. agno/exceptions.py +68 -1
  63. agno/filters.py +354 -0
  64. agno/guardrails/__init__.py +6 -0
  65. agno/guardrails/base.py +19 -0
  66. agno/guardrails/openai.py +144 -0
  67. agno/guardrails/pii.py +94 -0
  68. agno/guardrails/prompt_injection.py +52 -0
  69. agno/integrations/discord/client.py +1 -0
  70. agno/knowledge/chunking/agentic.py +13 -10
  71. agno/knowledge/chunking/fixed.py +1 -1
  72. agno/knowledge/chunking/semantic.py +40 -8
  73. agno/knowledge/chunking/strategy.py +59 -15
  74. agno/knowledge/embedder/aws_bedrock.py +9 -4
  75. agno/knowledge/embedder/azure_openai.py +54 -0
  76. agno/knowledge/embedder/base.py +2 -0
  77. agno/knowledge/embedder/cohere.py +184 -5
  78. agno/knowledge/embedder/fastembed.py +1 -1
  79. agno/knowledge/embedder/google.py +79 -1
  80. agno/knowledge/embedder/huggingface.py +9 -4
  81. agno/knowledge/embedder/jina.py +63 -0
  82. agno/knowledge/embedder/mistral.py +78 -11
  83. agno/knowledge/embedder/nebius.py +1 -1
  84. agno/knowledge/embedder/ollama.py +13 -0
  85. agno/knowledge/embedder/openai.py +37 -65
  86. agno/knowledge/embedder/sentence_transformer.py +8 -4
  87. agno/knowledge/embedder/vllm.py +262 -0
  88. agno/knowledge/embedder/voyageai.py +69 -16
  89. agno/knowledge/knowledge.py +594 -186
  90. agno/knowledge/reader/base.py +9 -2
  91. agno/knowledge/reader/csv_reader.py +8 -10
  92. agno/knowledge/reader/docx_reader.py +5 -6
  93. agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
  94. agno/knowledge/reader/json_reader.py +6 -5
  95. agno/knowledge/reader/markdown_reader.py +13 -13
  96. agno/knowledge/reader/pdf_reader.py +43 -68
  97. agno/knowledge/reader/pptx_reader.py +101 -0
  98. agno/knowledge/reader/reader_factory.py +51 -6
  99. agno/knowledge/reader/s3_reader.py +3 -15
  100. agno/knowledge/reader/tavily_reader.py +194 -0
  101. agno/knowledge/reader/text_reader.py +13 -13
  102. agno/knowledge/reader/web_search_reader.py +2 -43
  103. agno/knowledge/reader/website_reader.py +43 -25
  104. agno/knowledge/reranker/__init__.py +2 -8
  105. agno/knowledge/types.py +9 -0
  106. agno/knowledge/utils.py +20 -0
  107. agno/media.py +72 -0
  108. agno/memory/manager.py +336 -82
  109. agno/models/aimlapi/aimlapi.py +2 -2
  110. agno/models/anthropic/claude.py +183 -37
  111. agno/models/aws/bedrock.py +52 -112
  112. agno/models/aws/claude.py +33 -1
  113. agno/models/azure/ai_foundry.py +33 -15
  114. agno/models/azure/openai_chat.py +25 -8
  115. agno/models/base.py +999 -519
  116. agno/models/cerebras/cerebras.py +19 -13
  117. agno/models/cerebras/cerebras_openai.py +8 -5
  118. agno/models/cohere/chat.py +27 -1
  119. agno/models/cometapi/__init__.py +5 -0
  120. agno/models/cometapi/cometapi.py +57 -0
  121. agno/models/dashscope/dashscope.py +1 -0
  122. agno/models/deepinfra/deepinfra.py +2 -2
  123. agno/models/deepseek/deepseek.py +2 -2
  124. agno/models/fireworks/fireworks.py +2 -2
  125. agno/models/google/gemini.py +103 -31
  126. agno/models/groq/groq.py +28 -11
  127. agno/models/huggingface/huggingface.py +2 -1
  128. agno/models/internlm/internlm.py +2 -2
  129. agno/models/langdb/langdb.py +4 -4
  130. agno/models/litellm/chat.py +18 -1
  131. agno/models/litellm/litellm_openai.py +2 -2
  132. agno/models/llama_cpp/__init__.py +5 -0
  133. agno/models/llama_cpp/llama_cpp.py +22 -0
  134. agno/models/message.py +139 -0
  135. agno/models/meta/llama.py +27 -10
  136. agno/models/meta/llama_openai.py +5 -17
  137. agno/models/nebius/nebius.py +6 -6
  138. agno/models/nexus/__init__.py +3 -0
  139. agno/models/nexus/nexus.py +22 -0
  140. agno/models/nvidia/nvidia.py +2 -2
  141. agno/models/ollama/chat.py +59 -5
  142. agno/models/openai/chat.py +69 -29
  143. agno/models/openai/responses.py +103 -106
  144. agno/models/openrouter/openrouter.py +41 -3
  145. agno/models/perplexity/perplexity.py +4 -5
  146. agno/models/portkey/portkey.py +3 -3
  147. agno/models/requesty/__init__.py +5 -0
  148. agno/models/requesty/requesty.py +52 -0
  149. agno/models/response.py +77 -1
  150. agno/models/sambanova/sambanova.py +2 -2
  151. agno/models/siliconflow/__init__.py +5 -0
  152. agno/models/siliconflow/siliconflow.py +25 -0
  153. agno/models/together/together.py +2 -2
  154. agno/models/utils.py +254 -8
  155. agno/models/vercel/v0.py +2 -2
  156. agno/models/vertexai/__init__.py +0 -0
  157. agno/models/vertexai/claude.py +96 -0
  158. agno/models/vllm/vllm.py +1 -0
  159. agno/models/xai/xai.py +3 -2
  160. agno/os/app.py +543 -178
  161. agno/os/auth.py +24 -14
  162. agno/os/config.py +1 -0
  163. agno/os/interfaces/__init__.py +1 -0
  164. agno/os/interfaces/a2a/__init__.py +3 -0
  165. agno/os/interfaces/a2a/a2a.py +42 -0
  166. agno/os/interfaces/a2a/router.py +250 -0
  167. agno/os/interfaces/a2a/utils.py +924 -0
  168. agno/os/interfaces/agui/agui.py +23 -7
  169. agno/os/interfaces/agui/router.py +27 -3
  170. agno/os/interfaces/agui/utils.py +242 -142
  171. agno/os/interfaces/base.py +6 -2
  172. agno/os/interfaces/slack/router.py +81 -23
  173. agno/os/interfaces/slack/slack.py +29 -14
  174. agno/os/interfaces/whatsapp/router.py +11 -4
  175. agno/os/interfaces/whatsapp/whatsapp.py +14 -7
  176. agno/os/mcp.py +111 -54
  177. agno/os/middleware/__init__.py +7 -0
  178. agno/os/middleware/jwt.py +233 -0
  179. agno/os/router.py +556 -139
  180. agno/os/routers/evals/evals.py +71 -34
  181. agno/os/routers/evals/schemas.py +31 -31
  182. agno/os/routers/evals/utils.py +6 -5
  183. agno/os/routers/health.py +31 -0
  184. agno/os/routers/home.py +52 -0
  185. agno/os/routers/knowledge/knowledge.py +185 -38
  186. agno/os/routers/knowledge/schemas.py +82 -22
  187. agno/os/routers/memory/memory.py +158 -53
  188. agno/os/routers/memory/schemas.py +20 -16
  189. agno/os/routers/metrics/metrics.py +20 -8
  190. agno/os/routers/metrics/schemas.py +16 -16
  191. agno/os/routers/session/session.py +499 -38
  192. agno/os/schema.py +308 -198
  193. agno/os/utils.py +401 -41
  194. agno/reasoning/anthropic.py +80 -0
  195. agno/reasoning/azure_ai_foundry.py +2 -2
  196. agno/reasoning/deepseek.py +2 -2
  197. agno/reasoning/default.py +3 -1
  198. agno/reasoning/gemini.py +73 -0
  199. agno/reasoning/groq.py +2 -2
  200. agno/reasoning/ollama.py +2 -2
  201. agno/reasoning/openai.py +7 -2
  202. agno/reasoning/vertexai.py +76 -0
  203. agno/run/__init__.py +6 -0
  204. agno/run/agent.py +248 -94
  205. agno/run/base.py +44 -5
  206. agno/run/team.py +238 -97
  207. agno/run/workflow.py +144 -33
  208. agno/session/agent.py +105 -89
  209. agno/session/summary.py +65 -25
  210. agno/session/team.py +176 -96
  211. agno/session/workflow.py +406 -40
  212. agno/team/team.py +3854 -1610
  213. agno/tools/dalle.py +2 -4
  214. agno/tools/decorator.py +4 -2
  215. agno/tools/duckduckgo.py +15 -11
  216. agno/tools/e2b.py +14 -7
  217. agno/tools/eleven_labs.py +23 -25
  218. agno/tools/exa.py +21 -16
  219. agno/tools/file.py +153 -23
  220. agno/tools/file_generation.py +350 -0
  221. agno/tools/firecrawl.py +4 -4
  222. agno/tools/function.py +250 -30
  223. agno/tools/gmail.py +238 -14
  224. agno/tools/google_drive.py +270 -0
  225. agno/tools/googlecalendar.py +36 -8
  226. agno/tools/googlesheets.py +20 -5
  227. agno/tools/jira.py +20 -0
  228. agno/tools/knowledge.py +3 -3
  229. agno/tools/mcp/__init__.py +10 -0
  230. agno/tools/mcp/mcp.py +331 -0
  231. agno/tools/mcp/multi_mcp.py +347 -0
  232. agno/tools/mcp/params.py +24 -0
  233. agno/tools/mcp_toolbox.py +284 -0
  234. agno/tools/mem0.py +11 -17
  235. agno/tools/memori.py +1 -53
  236. agno/tools/memory.py +419 -0
  237. agno/tools/models/nebius.py +5 -5
  238. agno/tools/models_labs.py +20 -10
  239. agno/tools/notion.py +204 -0
  240. agno/tools/parallel.py +314 -0
  241. agno/tools/scrapegraph.py +58 -31
  242. agno/tools/searxng.py +2 -2
  243. agno/tools/serper.py +2 -2
  244. agno/tools/slack.py +18 -3
  245. agno/tools/spider.py +2 -2
  246. agno/tools/tavily.py +146 -0
  247. agno/tools/whatsapp.py +1 -1
  248. agno/tools/workflow.py +278 -0
  249. agno/tools/yfinance.py +12 -11
  250. agno/utils/agent.py +820 -0
  251. agno/utils/audio.py +27 -0
  252. agno/utils/common.py +90 -1
  253. agno/utils/events.py +217 -2
  254. agno/utils/gemini.py +180 -22
  255. agno/utils/hooks.py +57 -0
  256. agno/utils/http.py +111 -0
  257. agno/utils/knowledge.py +12 -5
  258. agno/utils/log.py +1 -0
  259. agno/utils/mcp.py +92 -2
  260. agno/utils/media.py +188 -10
  261. agno/utils/merge_dict.py +22 -1
  262. agno/utils/message.py +60 -0
  263. agno/utils/models/claude.py +40 -11
  264. agno/utils/print_response/agent.py +105 -21
  265. agno/utils/print_response/team.py +103 -38
  266. agno/utils/print_response/workflow.py +251 -34
  267. agno/utils/reasoning.py +22 -1
  268. agno/utils/serialize.py +32 -0
  269. agno/utils/streamlit.py +16 -10
  270. agno/utils/string.py +41 -0
  271. agno/utils/team.py +98 -9
  272. agno/utils/tools.py +1 -1
  273. agno/vectordb/base.py +23 -4
  274. agno/vectordb/cassandra/cassandra.py +65 -9
  275. agno/vectordb/chroma/chromadb.py +182 -38
  276. agno/vectordb/clickhouse/clickhousedb.py +64 -11
  277. agno/vectordb/couchbase/couchbase.py +105 -10
  278. agno/vectordb/lancedb/lance_db.py +124 -133
  279. agno/vectordb/langchaindb/langchaindb.py +25 -7
  280. agno/vectordb/lightrag/lightrag.py +17 -3
  281. agno/vectordb/llamaindex/__init__.py +3 -0
  282. agno/vectordb/llamaindex/llamaindexdb.py +46 -7
  283. agno/vectordb/milvus/milvus.py +126 -9
  284. agno/vectordb/mongodb/__init__.py +7 -1
  285. agno/vectordb/mongodb/mongodb.py +112 -7
  286. agno/vectordb/pgvector/pgvector.py +142 -21
  287. agno/vectordb/pineconedb/pineconedb.py +80 -8
  288. agno/vectordb/qdrant/qdrant.py +125 -39
  289. agno/vectordb/redis/__init__.py +9 -0
  290. agno/vectordb/redis/redisdb.py +694 -0
  291. agno/vectordb/singlestore/singlestore.py +111 -25
  292. agno/vectordb/surrealdb/surrealdb.py +31 -5
  293. agno/vectordb/upstashdb/upstashdb.py +76 -8
  294. agno/vectordb/weaviate/weaviate.py +86 -15
  295. agno/workflow/__init__.py +2 -0
  296. agno/workflow/agent.py +299 -0
  297. agno/workflow/condition.py +112 -18
  298. agno/workflow/loop.py +69 -10
  299. agno/workflow/parallel.py +266 -118
  300. agno/workflow/router.py +110 -17
  301. agno/workflow/step.py +638 -129
  302. agno/workflow/steps.py +65 -6
  303. agno/workflow/types.py +61 -23
  304. agno/workflow/workflow.py +2085 -272
  305. {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/METADATA +182 -58
  306. agno-2.3.0.dist-info/RECORD +577 -0
  307. agno/knowledge/reader/url_reader.py +0 -128
  308. agno/tools/googlesearch.py +0 -98
  309. agno/tools/mcp.py +0 -610
  310. agno/utils/models/aws_claude.py +0 -170
  311. agno-2.0.1.dist-info/RECORD +0 -515
  312. {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/WHEEL +0 -0
  313. {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/licenses/LICENSE +0 -0
  314. {agno-2.0.1.dist-info → agno-2.3.0.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,29 @@ 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,
153
182
  ) -> StepOutput:
154
183
  """Execute the router and its selected steps with sequential chaining"""
155
184
  log_debug(f"Router Start: {self.name}", center=True, symbol="-")
@@ -159,7 +188,10 @@ class Router:
159
188
  self._prepare_steps()
160
189
 
161
190
  # Route to appropriate steps
162
- steps_to_execute = self._route_steps(step_input)
191
+ if run_context is not None and run_context.session_state is not None:
192
+ steps_to_execute = self._route_steps(step_input, session_state=run_context.session_state)
193
+ else:
194
+ steps_to_execute = self._route_steps(step_input, session_state=session_state)
163
195
  log_debug(f"Router {self.name}: Selected {len(steps_to_execute)} steps to execute")
164
196
 
165
197
  if not steps_to_execute:
@@ -183,7 +215,11 @@ class Router:
183
215
  user_id=user_id,
184
216
  workflow_run_response=workflow_run_response,
185
217
  store_executor_outputs=store_executor_outputs,
218
+ run_context=run_context,
186
219
  session_state=session_state,
220
+ workflow_session=workflow_session,
221
+ add_workflow_history_to_steps=add_workflow_history_to_steps,
222
+ num_history_runs=num_history_runs,
187
223
  )
188
224
 
189
225
  # Handle both single StepOutput and List[StepOutput]
@@ -237,12 +273,18 @@ class Router:
237
273
  step_input: StepInput,
238
274
  session_id: Optional[str] = None,
239
275
  user_id: Optional[str] = None,
276
+ run_context: Optional[RunContext] = None,
240
277
  session_state: Optional[Dict[str, Any]] = None,
278
+ stream_events: bool = False,
241
279
  stream_intermediate_steps: bool = False,
280
+ stream_executor_events: bool = True,
242
281
  workflow_run_response: Optional[WorkflowRunOutput] = None,
243
282
  step_index: Optional[Union[int, tuple]] = None,
244
283
  store_executor_outputs: bool = True,
245
284
  parent_step_id: Optional[str] = None,
285
+ workflow_session: Optional[WorkflowSession] = None,
286
+ add_workflow_history_to_steps: Optional[bool] = False,
287
+ num_history_runs: int = 3,
246
288
  ) -> Iterator[Union[WorkflowRunOutputEvent, StepOutput]]:
247
289
  """Execute the router with streaming support"""
248
290
  log_debug(f"Router Start: {self.name}", center=True, symbol="-")
@@ -252,10 +294,22 @@ class Router:
252
294
  router_step_id = str(uuid4())
253
295
 
254
296
  # Route to appropriate steps
255
- steps_to_execute = self._route_steps(step_input)
297
+ if run_context is not None and run_context.session_state is not None:
298
+ steps_to_execute = self._route_steps(step_input, session_state=run_context.session_state)
299
+ else:
300
+ steps_to_execute = self._route_steps(step_input, session_state=session_state)
256
301
  log_debug(f"Router {self.name}: Selected {len(steps_to_execute)} steps to execute")
257
302
 
258
- if stream_intermediate_steps and workflow_run_response:
303
+ # Considering both stream_events and stream_intermediate_steps (deprecated)
304
+ if stream_intermediate_steps is not None:
305
+ warnings.warn(
306
+ "The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Use 'stream_events' instead.",
307
+ DeprecationWarning,
308
+ stacklevel=2,
309
+ )
310
+ stream_events = stream_events or stream_intermediate_steps
311
+
312
+ if stream_events and workflow_run_response:
259
313
  # Yield router started event
260
314
  yield RouterExecutionStartedEvent(
261
315
  run_id=workflow_run_response.run_id or "",
@@ -271,7 +325,7 @@ class Router:
271
325
 
272
326
  if not steps_to_execute:
273
327
  # Yield router completed event for empty case
274
- if stream_intermediate_steps and workflow_run_response:
328
+ if stream_events and workflow_run_response:
275
329
  yield RouterExecutionCompletedEvent(
276
330
  run_id=workflow_run_response.run_id or "",
277
331
  workflow_name=workflow_run_response.workflow_name or "",
@@ -299,12 +353,17 @@ class Router:
299
353
  current_step_input,
300
354
  session_id=session_id,
301
355
  user_id=user_id,
302
- stream_intermediate_steps=stream_intermediate_steps,
356
+ stream_events=stream_events,
357
+ stream_executor_events=stream_executor_events,
303
358
  workflow_run_response=workflow_run_response,
304
359
  step_index=step_index,
305
360
  store_executor_outputs=store_executor_outputs,
361
+ run_context=run_context,
306
362
  session_state=session_state,
307
363
  parent_step_id=router_step_id,
364
+ workflow_session=workflow_session,
365
+ add_workflow_history_to_steps=add_workflow_history_to_steps,
366
+ num_history_runs=num_history_runs,
308
367
  ):
309
368
  if isinstance(event, StepOutput):
310
369
  step_outputs_for_step.append(event)
@@ -353,7 +412,7 @@ class Router:
353
412
 
354
413
  log_debug(f"Router End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
355
414
 
356
- if stream_intermediate_steps and workflow_run_response:
415
+ if stream_events and workflow_run_response:
357
416
  # Yield router completed event
358
417
  yield RouterExecutionCompletedEvent(
359
418
  run_id=workflow_run_response.run_id or "",
@@ -384,8 +443,12 @@ class Router:
384
443
  session_id: Optional[str] = None,
385
444
  user_id: Optional[str] = None,
386
445
  workflow_run_response: Optional[WorkflowRunOutput] = None,
446
+ run_context: Optional[RunContext] = None,
387
447
  session_state: Optional[Dict[str, Any]] = None,
388
448
  store_executor_outputs: bool = True,
449
+ workflow_session: Optional[WorkflowSession] = None,
450
+ add_workflow_history_to_steps: Optional[bool] = False,
451
+ num_history_runs: int = 3,
389
452
  ) -> StepOutput:
390
453
  """Async execute the router and its selected steps with sequential chaining"""
391
454
  log_debug(f"Router Start: {self.name}", center=True, symbol="-")
@@ -395,7 +458,10 @@ class Router:
395
458
  self._prepare_steps()
396
459
 
397
460
  # Route to appropriate steps
398
- steps_to_execute = await self._aroute_steps(step_input)
461
+ if run_context is not None and run_context.session_state is not None:
462
+ steps_to_execute = await self._aroute_steps(step_input, session_state=run_context.session_state)
463
+ else:
464
+ steps_to_execute = await self._aroute_steps(step_input, session_state=session_state)
399
465
  log_debug(f"Router {self.name} selected: {len(steps_to_execute)} steps to execute")
400
466
 
401
467
  if not steps_to_execute:
@@ -420,7 +486,11 @@ class Router:
420
486
  user_id=user_id,
421
487
  workflow_run_response=workflow_run_response,
422
488
  store_executor_outputs=store_executor_outputs,
489
+ run_context=run_context,
423
490
  session_state=session_state,
491
+ workflow_session=workflow_session,
492
+ add_workflow_history_to_steps=add_workflow_history_to_steps,
493
+ num_history_runs=num_history_runs,
424
494
  )
425
495
  # Handle both single StepOutput and List[StepOutput]
426
496
  if isinstance(step_output, list):
@@ -476,12 +546,18 @@ class Router:
476
546
  step_input: StepInput,
477
547
  session_id: Optional[str] = None,
478
548
  user_id: Optional[str] = None,
549
+ run_context: Optional[RunContext] = None,
479
550
  session_state: Optional[Dict[str, Any]] = None,
551
+ stream_events: bool = False,
480
552
  stream_intermediate_steps: bool = False,
553
+ stream_executor_events: bool = True,
481
554
  workflow_run_response: Optional[WorkflowRunOutput] = None,
482
555
  step_index: Optional[Union[int, tuple]] = None,
483
556
  store_executor_outputs: bool = True,
484
557
  parent_step_id: Optional[str] = None,
558
+ workflow_session: Optional[WorkflowSession] = None,
559
+ add_workflow_history_to_steps: Optional[bool] = False,
560
+ num_history_runs: int = 3,
485
561
  ) -> AsyncIterator[Union[WorkflowRunOutputEvent, TeamRunOutputEvent, RunOutputEvent, StepOutput]]:
486
562
  """Async execute the router with streaming support"""
487
563
  log_debug(f"Router Start: {self.name}", center=True, symbol="-")
@@ -491,10 +567,22 @@ class Router:
491
567
  router_step_id = str(uuid4())
492
568
 
493
569
  # Route to appropriate steps
494
- steps_to_execute = await self._aroute_steps(step_input)
570
+ if run_context is not None and run_context.session_state is not None:
571
+ steps_to_execute = await self._aroute_steps(step_input, session_state=run_context.session_state)
572
+ else:
573
+ steps_to_execute = await self._aroute_steps(step_input, session_state=session_state)
495
574
  log_debug(f"Router {self.name} selected: {len(steps_to_execute)} steps to execute")
496
575
 
497
- if stream_intermediate_steps and workflow_run_response:
576
+ # Considering both stream_events and stream_intermediate_steps (deprecated)
577
+ if stream_intermediate_steps is not None:
578
+ warnings.warn(
579
+ "The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Use 'stream_events' instead.",
580
+ DeprecationWarning,
581
+ stacklevel=2,
582
+ )
583
+ stream_events = stream_events or stream_intermediate_steps
584
+
585
+ if stream_events and workflow_run_response:
498
586
  # Yield router started event
499
587
  yield RouterExecutionStartedEvent(
500
588
  run_id=workflow_run_response.run_id or "",
@@ -509,7 +597,7 @@ class Router:
509
597
  )
510
598
 
511
599
  if not steps_to_execute:
512
- if stream_intermediate_steps and workflow_run_response:
600
+ if stream_events and workflow_run_response:
513
601
  # Yield router completed event for empty case
514
602
  yield RouterExecutionCompletedEvent(
515
603
  run_id=workflow_run_response.run_id or "",
@@ -540,12 +628,17 @@ class Router:
540
628
  current_step_input,
541
629
  session_id=session_id,
542
630
  user_id=user_id,
543
- stream_intermediate_steps=stream_intermediate_steps,
631
+ stream_events=stream_events,
632
+ stream_executor_events=stream_executor_events,
544
633
  workflow_run_response=workflow_run_response,
545
634
  step_index=step_index,
546
635
  store_executor_outputs=store_executor_outputs,
636
+ run_context=run_context,
547
637
  session_state=session_state,
548
638
  parent_step_id=router_step_id,
639
+ workflow_session=workflow_session,
640
+ add_workflow_history_to_steps=add_workflow_history_to_steps,
641
+ num_history_runs=num_history_runs,
549
642
  ):
550
643
  if isinstance(event, StepOutput):
551
644
  step_outputs_for_step.append(event)
@@ -594,7 +687,7 @@ class Router:
594
687
 
595
688
  log_debug(f"Router End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
596
689
 
597
- if stream_intermediate_steps and workflow_run_response:
690
+ if stream_events and workflow_run_response:
598
691
  # Yield router completed event
599
692
  yield RouterExecutionCompletedEvent(
600
693
  run_id=workflow_run_response.run_id or "",