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.
- agno/agent/agent.py +5540 -2273
- agno/api/api.py +2 -0
- agno/api/os.py +1 -1
- agno/compression/__init__.py +3 -0
- agno/compression/manager.py +247 -0
- agno/culture/__init__.py +3 -0
- agno/culture/manager.py +956 -0
- agno/db/async_postgres/__init__.py +3 -0
- agno/db/base.py +689 -6
- agno/db/dynamo/dynamo.py +933 -37
- agno/db/dynamo/schemas.py +174 -10
- agno/db/dynamo/utils.py +63 -4
- agno/db/firestore/firestore.py +831 -9
- agno/db/firestore/schemas.py +51 -0
- agno/db/firestore/utils.py +102 -4
- agno/db/gcs_json/gcs_json_db.py +660 -12
- agno/db/gcs_json/utils.py +60 -26
- agno/db/in_memory/in_memory_db.py +287 -14
- agno/db/in_memory/utils.py +60 -2
- agno/db/json/json_db.py +590 -14
- agno/db/json/utils.py +60 -26
- agno/db/migrations/manager.py +199 -0
- agno/db/migrations/v1_to_v2.py +43 -13
- 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 +2760 -0
- agno/db/mongo/mongo.py +879 -11
- agno/db/mongo/schemas.py +42 -0
- agno/db/mongo/utils.py +80 -8
- agno/db/mysql/__init__.py +2 -1
- agno/db/mysql/async_mysql.py +2912 -0
- agno/db/mysql/mysql.py +946 -68
- agno/db/mysql/schemas.py +72 -10
- agno/db/mysql/utils.py +198 -7
- agno/db/postgres/__init__.py +2 -1
- agno/db/postgres/async_postgres.py +2579 -0
- agno/db/postgres/postgres.py +942 -57
- agno/db/postgres/schemas.py +81 -18
- agno/db/postgres/utils.py +164 -2
- agno/db/redis/redis.py +671 -7
- agno/db/redis/schemas.py +50 -0
- agno/db/redis/utils.py +65 -7
- agno/db/schemas/__init__.py +2 -1
- agno/db/schemas/culture.py +120 -0
- agno/db/schemas/evals.py +1 -0
- agno/db/schemas/memory.py +17 -2
- agno/db/singlestore/schemas.py +63 -0
- agno/db/singlestore/singlestore.py +949 -83
- agno/db/singlestore/utils.py +60 -2
- agno/db/sqlite/__init__.py +2 -1
- agno/db/sqlite/async_sqlite.py +2911 -0
- agno/db/sqlite/schemas.py +62 -0
- agno/db/sqlite/sqlite.py +965 -46
- agno/db/sqlite/utils.py +169 -8
- agno/db/surrealdb/__init__.py +3 -0
- agno/db/surrealdb/metrics.py +292 -0
- agno/db/surrealdb/models.py +334 -0
- agno/db/surrealdb/queries.py +71 -0
- agno/db/surrealdb/surrealdb.py +1908 -0
- agno/db/surrealdb/utils.py +147 -0
- agno/db/utils.py +2 -0
- agno/eval/__init__.py +10 -0
- agno/eval/accuracy.py +75 -55
- agno/eval/agent_as_judge.py +861 -0
- agno/eval/base.py +29 -0
- agno/eval/performance.py +16 -7
- agno/eval/reliability.py +28 -16
- agno/eval/utils.py +35 -17
- agno/exceptions.py +27 -2
- agno/filters.py +354 -0
- agno/guardrails/prompt_injection.py +1 -0
- agno/hooks/__init__.py +3 -0
- agno/hooks/decorator.py +164 -0
- agno/integrations/discord/client.py +1 -1
- agno/knowledge/chunking/agentic.py +13 -10
- agno/knowledge/chunking/fixed.py +4 -1
- agno/knowledge/chunking/semantic.py +9 -4
- agno/knowledge/chunking/strategy.py +59 -15
- agno/knowledge/embedder/fastembed.py +1 -1
- agno/knowledge/embedder/nebius.py +1 -1
- agno/knowledge/embedder/ollama.py +8 -0
- agno/knowledge/embedder/openai.py +8 -8
- agno/knowledge/embedder/sentence_transformer.py +6 -2
- agno/knowledge/embedder/vllm.py +262 -0
- agno/knowledge/knowledge.py +1618 -318
- agno/knowledge/reader/base.py +6 -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 +16 -20
- agno/knowledge/reader/json_reader.py +5 -4
- agno/knowledge/reader/markdown_reader.py +8 -8
- agno/knowledge/reader/pdf_reader.py +17 -19
- agno/knowledge/reader/pptx_reader.py +101 -0
- agno/knowledge/reader/reader_factory.py +32 -3
- agno/knowledge/reader/s3_reader.py +3 -3
- agno/knowledge/reader/tavily_reader.py +193 -0
- agno/knowledge/reader/text_reader.py +22 -10
- agno/knowledge/reader/web_search_reader.py +1 -48
- agno/knowledge/reader/website_reader.py +10 -10
- agno/knowledge/reader/wikipedia_reader.py +33 -1
- agno/knowledge/types.py +1 -0
- agno/knowledge/utils.py +72 -7
- agno/media.py +22 -6
- agno/memory/__init__.py +14 -1
- agno/memory/manager.py +544 -83
- agno/memory/strategies/__init__.py +15 -0
- agno/memory/strategies/base.py +66 -0
- agno/memory/strategies/summarize.py +196 -0
- agno/memory/strategies/types.py +37 -0
- agno/models/aimlapi/aimlapi.py +17 -0
- agno/models/anthropic/claude.py +515 -40
- agno/models/aws/bedrock.py +102 -21
- agno/models/aws/claude.py +131 -274
- agno/models/azure/ai_foundry.py +41 -19
- agno/models/azure/openai_chat.py +39 -8
- agno/models/base.py +1249 -525
- agno/models/cerebras/cerebras.py +91 -21
- agno/models/cerebras/cerebras_openai.py +21 -2
- agno/models/cohere/chat.py +40 -6
- agno/models/cometapi/cometapi.py +18 -1
- agno/models/dashscope/dashscope.py +2 -3
- agno/models/deepinfra/deepinfra.py +18 -1
- agno/models/deepseek/deepseek.py +69 -3
- agno/models/fireworks/fireworks.py +18 -1
- agno/models/google/gemini.py +877 -80
- agno/models/google/utils.py +22 -0
- agno/models/groq/groq.py +51 -18
- agno/models/huggingface/huggingface.py +17 -6
- agno/models/ibm/watsonx.py +16 -6
- agno/models/internlm/internlm.py +18 -1
- agno/models/langdb/langdb.py +13 -1
- agno/models/litellm/chat.py +44 -9
- agno/models/litellm/litellm_openai.py +18 -1
- agno/models/message.py +28 -5
- agno/models/meta/llama.py +47 -14
- agno/models/meta/llama_openai.py +22 -17
- agno/models/mistral/mistral.py +8 -4
- agno/models/nebius/nebius.py +6 -7
- agno/models/nvidia/nvidia.py +20 -3
- agno/models/ollama/chat.py +24 -8
- agno/models/openai/chat.py +104 -29
- agno/models/openai/responses.py +101 -81
- agno/models/openrouter/openrouter.py +60 -3
- agno/models/perplexity/perplexity.py +17 -1
- agno/models/portkey/portkey.py +7 -6
- agno/models/requesty/requesty.py +24 -4
- agno/models/response.py +73 -2
- agno/models/sambanova/sambanova.py +20 -3
- agno/models/siliconflow/siliconflow.py +19 -2
- agno/models/together/together.py +20 -3
- agno/models/utils.py +254 -8
- agno/models/vercel/v0.py +20 -3
- agno/models/vertexai/__init__.py +0 -0
- agno/models/vertexai/claude.py +190 -0
- agno/models/vllm/vllm.py +19 -14
- agno/models/xai/xai.py +19 -2
- agno/os/app.py +549 -152
- agno/os/auth.py +190 -3
- agno/os/config.py +23 -0
- agno/os/interfaces/a2a/router.py +8 -11
- agno/os/interfaces/a2a/utils.py +1 -1
- agno/os/interfaces/agui/router.py +18 -3
- agno/os/interfaces/agui/utils.py +152 -39
- agno/os/interfaces/slack/router.py +55 -37
- agno/os/interfaces/slack/slack.py +9 -1
- agno/os/interfaces/whatsapp/router.py +0 -1
- agno/os/interfaces/whatsapp/security.py +3 -1
- agno/os/mcp.py +110 -52
- agno/os/middleware/__init__.py +2 -0
- agno/os/middleware/jwt.py +676 -112
- agno/os/router.py +40 -1478
- agno/os/routers/agents/__init__.py +3 -0
- agno/os/routers/agents/router.py +599 -0
- agno/os/routers/agents/schema.py +261 -0
- agno/os/routers/evals/evals.py +96 -39
- agno/os/routers/evals/schemas.py +65 -33
- agno/os/routers/evals/utils.py +80 -10
- agno/os/routers/health.py +10 -4
- agno/os/routers/knowledge/knowledge.py +196 -38
- agno/os/routers/knowledge/schemas.py +82 -22
- agno/os/routers/memory/memory.py +279 -52
- agno/os/routers/memory/schemas.py +46 -17
- agno/os/routers/metrics/metrics.py +20 -8
- agno/os/routers/metrics/schemas.py +16 -16
- agno/os/routers/session/session.py +462 -34
- agno/os/routers/teams/__init__.py +3 -0
- agno/os/routers/teams/router.py +512 -0
- agno/os/routers/teams/schema.py +257 -0
- agno/os/routers/traces/__init__.py +3 -0
- agno/os/routers/traces/schemas.py +414 -0
- agno/os/routers/traces/traces.py +499 -0
- agno/os/routers/workflows/__init__.py +3 -0
- agno/os/routers/workflows/router.py +624 -0
- agno/os/routers/workflows/schema.py +75 -0
- agno/os/schema.py +256 -693
- agno/os/scopes.py +469 -0
- agno/os/utils.py +514 -36
- agno/reasoning/anthropic.py +80 -0
- agno/reasoning/gemini.py +73 -0
- agno/reasoning/openai.py +5 -0
- agno/reasoning/vertexai.py +76 -0
- agno/run/__init__.py +6 -0
- agno/run/agent.py +155 -32
- agno/run/base.py +55 -3
- agno/run/requirement.py +181 -0
- agno/run/team.py +125 -38
- agno/run/workflow.py +72 -18
- agno/session/agent.py +102 -89
- agno/session/summary.py +56 -15
- agno/session/team.py +164 -90
- agno/session/workflow.py +405 -40
- agno/table.py +10 -0
- agno/team/team.py +3974 -1903
- agno/tools/dalle.py +2 -4
- agno/tools/eleven_labs.py +23 -25
- agno/tools/exa.py +21 -16
- agno/tools/file.py +153 -23
- agno/tools/file_generation.py +16 -10
- agno/tools/firecrawl.py +15 -7
- agno/tools/function.py +193 -38
- agno/tools/gmail.py +238 -14
- agno/tools/google_drive.py +271 -0
- agno/tools/googlecalendar.py +36 -8
- agno/tools/googlesheets.py +20 -5
- agno/tools/jira.py +20 -0
- 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 +3 -3
- agno/tools/models/nebius.py +5 -5
- agno/tools/models_labs.py +20 -10
- agno/tools/nano_banana.py +151 -0
- agno/tools/notion.py +204 -0
- agno/tools/parallel.py +314 -0
- agno/tools/postgres.py +76 -36
- agno/tools/redshift.py +406 -0
- agno/tools/scrapegraph.py +1 -1
- agno/tools/shopify.py +1519 -0
- agno/tools/slack.py +18 -3
- agno/tools/spotify.py +919 -0
- agno/tools/tavily.py +146 -0
- agno/tools/toolkit.py +25 -0
- agno/tools/workflow.py +8 -1
- agno/tools/yfinance.py +12 -11
- agno/tracing/__init__.py +12 -0
- agno/tracing/exporter.py +157 -0
- agno/tracing/schemas.py +276 -0
- agno/tracing/setup.py +111 -0
- agno/utils/agent.py +938 -0
- agno/utils/cryptography.py +22 -0
- agno/utils/dttm.py +33 -0
- agno/utils/events.py +151 -3
- agno/utils/gemini.py +15 -5
- agno/utils/hooks.py +118 -4
- agno/utils/http.py +113 -2
- agno/utils/knowledge.py +12 -5
- agno/utils/log.py +1 -0
- agno/utils/mcp.py +92 -2
- agno/utils/media.py +187 -1
- agno/utils/merge_dict.py +3 -3
- agno/utils/message.py +60 -0
- agno/utils/models/ai_foundry.py +9 -2
- agno/utils/models/claude.py +49 -14
- agno/utils/models/cohere.py +9 -2
- agno/utils/models/llama.py +9 -2
- agno/utils/models/mistral.py +4 -2
- agno/utils/print_response/agent.py +109 -16
- agno/utils/print_response/team.py +223 -30
- agno/utils/print_response/workflow.py +251 -34
- agno/utils/streamlit.py +1 -1
- agno/utils/team.py +98 -9
- agno/utils/tokens.py +657 -0
- agno/vectordb/base.py +39 -7
- agno/vectordb/cassandra/cassandra.py +21 -5
- agno/vectordb/chroma/chromadb.py +43 -12
- agno/vectordb/clickhouse/clickhousedb.py +21 -5
- agno/vectordb/couchbase/couchbase.py +29 -5
- agno/vectordb/lancedb/lance_db.py +92 -181
- agno/vectordb/langchaindb/langchaindb.py +24 -4
- agno/vectordb/lightrag/lightrag.py +17 -3
- agno/vectordb/llamaindex/llamaindexdb.py +25 -5
- agno/vectordb/milvus/milvus.py +50 -37
- agno/vectordb/mongodb/__init__.py +7 -1
- agno/vectordb/mongodb/mongodb.py +36 -30
- agno/vectordb/pgvector/pgvector.py +201 -77
- agno/vectordb/pineconedb/pineconedb.py +41 -23
- agno/vectordb/qdrant/qdrant.py +67 -54
- agno/vectordb/redis/__init__.py +9 -0
- agno/vectordb/redis/redisdb.py +682 -0
- agno/vectordb/singlestore/singlestore.py +50 -29
- agno/vectordb/surrealdb/surrealdb.py +31 -41
- agno/vectordb/upstashdb/upstashdb.py +34 -6
- agno/vectordb/weaviate/weaviate.py +53 -14
- agno/workflow/__init__.py +2 -0
- agno/workflow/agent.py +299 -0
- agno/workflow/condition.py +120 -18
- agno/workflow/loop.py +77 -10
- agno/workflow/parallel.py +231 -143
- agno/workflow/router.py +118 -17
- agno/workflow/step.py +609 -170
- agno/workflow/steps.py +73 -6
- agno/workflow/types.py +96 -21
- agno/workflow/workflow.py +2039 -262
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/METADATA +201 -66
- agno-2.3.13.dist-info/RECORD +613 -0
- agno/tools/googlesearch.py +0 -98
- agno/tools/mcp.py +0 -679
- agno/tools/memori.py +0 -339
- agno-2.1.2.dist-info/RECORD +0 -543
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/WHEEL +0 -0
- {agno-2.1.2.dist-info → agno-2.3.13.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
|
|
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,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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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 "",
|