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.
- agno/agent/agent.py +6015 -2823
- agno/api/api.py +2 -0
- agno/api/os.py +1 -1
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +385 -6
- agno/db/dynamo/dynamo.py +388 -81
- agno/db/dynamo/schemas.py +47 -10
- agno/db/dynamo/utils.py +63 -4
- agno/db/firestore/firestore.py +435 -64
- agno/db/firestore/schemas.py +11 -0
- agno/db/firestore/utils.py +102 -4
- agno/db/gcs_json/gcs_json_db.py +384 -42
- agno/db/gcs_json/utils.py +60 -26
- agno/db/in_memory/in_memory_db.py +351 -66
- agno/db/in_memory/utils.py +60 -2
- agno/db/json/json_db.py +339 -48
- agno/db/json/utils.py +60 -26
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +510 -37
- agno/db/migrations/versions/__init__.py +0 -0
- agno/db/migrations/versions/v2_3_0.py +938 -0
- agno/db/mongo/__init__.py +15 -1
- agno/db/mongo/async_mongo.py +2036 -0
- agno/db/mongo/mongo.py +653 -76
- agno/db/mongo/schemas.py +13 -0
- agno/db/mongo/utils.py +80 -8
- agno/db/mysql/mysql.py +687 -25
- agno/db/mysql/schemas.py +61 -37
- agno/db/mysql/utils.py +60 -2
- agno/db/postgres/__init__.py +2 -1
- agno/db/postgres/async_postgres.py +2001 -0
- agno/db/postgres/postgres.py +676 -57
- agno/db/postgres/schemas.py +43 -18
- agno/db/postgres/utils.py +164 -2
- agno/db/redis/redis.py +344 -38
- agno/db/redis/schemas.py +18 -0
- agno/db/redis/utils.py +60 -2
- agno/db/schemas/__init__.py +2 -1
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/memory.py +13 -0
- agno/db/singlestore/schemas.py +26 -1
- agno/db/singlestore/singlestore.py +687 -53
- agno/db/singlestore/utils.py +60 -2
- agno/db/sqlite/__init__.py +2 -1
- agno/db/sqlite/async_sqlite.py +2371 -0
- agno/db/sqlite/schemas.py +24 -0
- agno/db/sqlite/sqlite.py +774 -85
- agno/db/sqlite/utils.py +168 -5
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +309 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1361 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +50 -22
- agno/eval/accuracy.py +50 -43
- agno/eval/performance.py +6 -3
- agno/eval/reliability.py +6 -3
- agno/eval/utils.py +33 -16
- agno/exceptions.py +68 -1
- agno/filters.py +354 -0
- agno/guardrails/__init__.py +6 -0
- agno/guardrails/base.py +19 -0
- agno/guardrails/openai.py +144 -0
- agno/guardrails/pii.py +94 -0
- agno/guardrails/prompt_injection.py +52 -0
- agno/integrations/discord/client.py +1 -0
- agno/knowledge/chunking/agentic.py +13 -10
- agno/knowledge/chunking/fixed.py +1 -1
- agno/knowledge/chunking/semantic.py +40 -8
- agno/knowledge/chunking/strategy.py +59 -15
- agno/knowledge/embedder/aws_bedrock.py +9 -4
- agno/knowledge/embedder/azure_openai.py +54 -0
- agno/knowledge/embedder/base.py +2 -0
- agno/knowledge/embedder/cohere.py +184 -5
- agno/knowledge/embedder/fastembed.py +1 -1
- agno/knowledge/embedder/google.py +79 -1
- agno/knowledge/embedder/huggingface.py +9 -4
- agno/knowledge/embedder/jina.py +63 -0
- agno/knowledge/embedder/mistral.py +78 -11
- agno/knowledge/embedder/nebius.py +1 -1
- agno/knowledge/embedder/ollama.py +13 -0
- agno/knowledge/embedder/openai.py +37 -65
- agno/knowledge/embedder/sentence_transformer.py +8 -4
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/embedder/voyageai.py +69 -16
- agno/knowledge/knowledge.py +594 -186
- agno/knowledge/reader/base.py +9 -2
- agno/knowledge/reader/csv_reader.py +8 -10
- agno/knowledge/reader/docx_reader.py +5 -6
- agno/knowledge/reader/field_labeled_csv_reader.py +290 -0
- agno/knowledge/reader/json_reader.py +6 -5
- agno/knowledge/reader/markdown_reader.py +13 -13
- agno/knowledge/reader/pdf_reader.py +43 -68
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +51 -6
- agno/knowledge/reader/s3_reader.py +3 -15
- agno/knowledge/reader/tavily_reader.py +194 -0
- agno/knowledge/reader/text_reader.py +13 -13
- agno/knowledge/reader/web_search_reader.py +2 -43
- agno/knowledge/reader/website_reader.py +43 -25
- agno/knowledge/reranker/__init__.py +2 -8
- agno/knowledge/types.py +9 -0
- agno/knowledge/utils.py +20 -0
- agno/media.py +72 -0
- agno/memory/manager.py +336 -82
- agno/models/aimlapi/aimlapi.py +2 -2
- agno/models/anthropic/claude.py +183 -37
- agno/models/aws/bedrock.py +52 -112
- agno/models/aws/claude.py +33 -1
- agno/models/azure/ai_foundry.py +33 -15
- agno/models/azure/openai_chat.py +25 -8
- agno/models/base.py +999 -519
- agno/models/cerebras/cerebras.py +19 -13
- agno/models/cerebras/cerebras_openai.py +8 -5
- agno/models/cohere/chat.py +27 -1
- agno/models/cometapi/__init__.py +5 -0
- agno/models/cometapi/cometapi.py +57 -0
- agno/models/dashscope/dashscope.py +1 -0
- agno/models/deepinfra/deepinfra.py +2 -2
- agno/models/deepseek/deepseek.py +2 -2
- agno/models/fireworks/fireworks.py +2 -2
- agno/models/google/gemini.py +103 -31
- agno/models/groq/groq.py +28 -11
- agno/models/huggingface/huggingface.py +2 -1
- agno/models/internlm/internlm.py +2 -2
- agno/models/langdb/langdb.py +4 -4
- agno/models/litellm/chat.py +18 -1
- agno/models/litellm/litellm_openai.py +2 -2
- agno/models/llama_cpp/__init__.py +5 -0
- agno/models/llama_cpp/llama_cpp.py +22 -0
- agno/models/message.py +139 -0
- agno/models/meta/llama.py +27 -10
- agno/models/meta/llama_openai.py +5 -17
- agno/models/nebius/nebius.py +6 -6
- agno/models/nexus/__init__.py +3 -0
- agno/models/nexus/nexus.py +22 -0
- agno/models/nvidia/nvidia.py +2 -2
- agno/models/ollama/chat.py +59 -5
- agno/models/openai/chat.py +69 -29
- agno/models/openai/responses.py +103 -106
- agno/models/openrouter/openrouter.py +41 -3
- agno/models/perplexity/perplexity.py +4 -5
- agno/models/portkey/portkey.py +3 -3
- agno/models/requesty/__init__.py +5 -0
- agno/models/requesty/requesty.py +52 -0
- agno/models/response.py +77 -1
- agno/models/sambanova/sambanova.py +2 -2
- agno/models/siliconflow/__init__.py +5 -0
- agno/models/siliconflow/siliconflow.py +25 -0
- agno/models/together/together.py +2 -2
- agno/models/utils.py +254 -8
- agno/models/vercel/v0.py +2 -2
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +96 -0
- agno/models/vllm/vllm.py +1 -0
- agno/models/xai/xai.py +3 -2
- agno/os/app.py +543 -178
- agno/os/auth.py +24 -14
- agno/os/config.py +1 -0
- agno/os/interfaces/__init__.py +1 -0
- agno/os/interfaces/a2a/__init__.py +3 -0
- agno/os/interfaces/a2a/a2a.py +42 -0
- agno/os/interfaces/a2a/router.py +250 -0
- agno/os/interfaces/a2a/utils.py +924 -0
- agno/os/interfaces/agui/agui.py +23 -7
- agno/os/interfaces/agui/router.py +27 -3
- agno/os/interfaces/agui/utils.py +242 -142
- agno/os/interfaces/base.py +6 -2
- agno/os/interfaces/slack/router.py +81 -23
- agno/os/interfaces/slack/slack.py +29 -14
- agno/os/interfaces/whatsapp/router.py +11 -4
- agno/os/interfaces/whatsapp/whatsapp.py +14 -7
- agno/os/mcp.py +111 -54
- agno/os/middleware/__init__.py +7 -0
- agno/os/middleware/jwt.py +233 -0
- agno/os/router.py +556 -139
- agno/os/routers/evals/evals.py +71 -34
- agno/os/routers/evals/schemas.py +31 -31
- agno/os/routers/evals/utils.py +6 -5
- agno/os/routers/health.py +31 -0
- agno/os/routers/home.py +52 -0
- agno/os/routers/knowledge/knowledge.py +185 -38
- agno/os/routers/knowledge/schemas.py +82 -22
- agno/os/routers/memory/memory.py +158 -53
- agno/os/routers/memory/schemas.py +20 -16
- agno/os/routers/metrics/metrics.py +20 -8
- agno/os/routers/metrics/schemas.py +16 -16
- agno/os/routers/session/session.py +499 -38
- agno/os/schema.py +308 -198
- agno/os/utils.py +401 -41
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/azure_ai_foundry.py +2 -2
- agno/reasoning/deepseek.py +2 -2
- agno/reasoning/default.py +3 -1
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/groq.py +2 -2
- agno/reasoning/ollama.py +2 -2
- agno/reasoning/openai.py +7 -2
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +248 -94
- agno/run/base.py +44 -5
- agno/run/team.py +238 -97
- agno/run/workflow.py +144 -33
- agno/session/agent.py +105 -89
- agno/session/summary.py +65 -25
- agno/session/team.py +176 -96
- agno/session/workflow.py +406 -40
- agno/team/team.py +3854 -1610
- agno/tools/dalle.py +2 -4
- agno/tools/decorator.py +4 -2
- agno/tools/duckduckgo.py +15 -11
- agno/tools/e2b.py +14 -7
- agno/tools/eleven_labs.py +23 -25
- agno/tools/exa.py +21 -16
- agno/tools/file.py +153 -23
- agno/tools/file_generation.py +350 -0
- agno/tools/firecrawl.py +4 -4
- agno/tools/function.py +250 -30
- agno/tools/gmail.py +238 -14
- agno/tools/google_drive.py +270 -0
- agno/tools/googlecalendar.py +36 -8
- agno/tools/googlesheets.py +20 -5
- agno/tools/jira.py +20 -0
- agno/tools/knowledge.py +3 -3
- agno/tools/mcp/__init__.py +10 -0
- agno/tools/mcp/mcp.py +331 -0
- agno/tools/mcp/multi_mcp.py +347 -0
- agno/tools/mcp/params.py +24 -0
- agno/tools/mcp_toolbox.py +284 -0
- agno/tools/mem0.py +11 -17
- agno/tools/memori.py +1 -53
- agno/tools/memory.py +419 -0
- agno/tools/models/nebius.py +5 -5
- agno/tools/models_labs.py +20 -10
- agno/tools/notion.py +204 -0
- agno/tools/parallel.py +314 -0
- agno/tools/scrapegraph.py +58 -31
- agno/tools/searxng.py +2 -2
- agno/tools/serper.py +2 -2
- agno/tools/slack.py +18 -3
- agno/tools/spider.py +2 -2
- agno/tools/tavily.py +146 -0
- agno/tools/whatsapp.py +1 -1
- agno/tools/workflow.py +278 -0
- agno/tools/yfinance.py +12 -11
- agno/utils/agent.py +820 -0
- agno/utils/audio.py +27 -0
- agno/utils/common.py +90 -1
- agno/utils/events.py +217 -2
- agno/utils/gemini.py +180 -22
- agno/utils/hooks.py +57 -0
- agno/utils/http.py +111 -0
- agno/utils/knowledge.py +12 -5
- agno/utils/log.py +1 -0
- agno/utils/mcp.py +92 -2
- agno/utils/media.py +188 -10
- agno/utils/merge_dict.py +22 -1
- agno/utils/message.py +60 -0
- agno/utils/models/claude.py +40 -11
- agno/utils/print_response/agent.py +105 -21
- agno/utils/print_response/team.py +103 -38
- agno/utils/print_response/workflow.py +251 -34
- agno/utils/reasoning.py +22 -1
- agno/utils/serialize.py +32 -0
- agno/utils/streamlit.py +16 -10
- agno/utils/string.py +41 -0
- agno/utils/team.py +98 -9
- agno/utils/tools.py +1 -1
- agno/vectordb/base.py +23 -4
- agno/vectordb/cassandra/cassandra.py +65 -9
- agno/vectordb/chroma/chromadb.py +182 -38
- agno/vectordb/clickhouse/clickhousedb.py +64 -11
- agno/vectordb/couchbase/couchbase.py +105 -10
- agno/vectordb/lancedb/lance_db.py +124 -133
- agno/vectordb/langchaindb/langchaindb.py +25 -7
- agno/vectordb/lightrag/lightrag.py +17 -3
- agno/vectordb/llamaindex/__init__.py +3 -0
- agno/vectordb/llamaindex/llamaindexdb.py +46 -7
- agno/vectordb/milvus/milvus.py +126 -9
- agno/vectordb/mongodb/__init__.py +7 -1
- agno/vectordb/mongodb/mongodb.py +112 -7
- agno/vectordb/pgvector/pgvector.py +142 -21
- agno/vectordb/pineconedb/pineconedb.py +80 -8
- agno/vectordb/qdrant/qdrant.py +125 -39
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +694 -0
- agno/vectordb/singlestore/singlestore.py +111 -25
- agno/vectordb/surrealdb/surrealdb.py +31 -5
- agno/vectordb/upstashdb/upstashdb.py +76 -8
- agno/vectordb/weaviate/weaviate.py +86 -15
- agno/workflow/__init__.py +2 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +112 -18
- agno/workflow/loop.py +69 -10
- agno/workflow/parallel.py +266 -118
- agno/workflow/router.py +110 -17
- agno/workflow/step.py +638 -129
- agno/workflow/steps.py +65 -6
- agno/workflow/types.py +61 -23
- agno/workflow/workflow.py +2085 -272
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/METADATA +182 -58
- agno-2.3.0.dist-info/RECORD +577 -0
- agno/knowledge/reader/url_reader.py +0 -128
- agno/tools/googlesearch.py +0 -98
- agno/tools/mcp.py +0 -610
- agno/utils/models/aws_claude.py +0 -170
- agno-2.0.1.dist-info/RECORD +0 -515
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/WHEEL +0 -0
- {agno-2.0.1.dist-info → agno-2.3.0.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 "",
|