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/loop.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
|
LoopExecutionCompletedEvent,
|
|
@@ -13,6 +15,7 @@ from agno.run.workflow import (
|
|
|
13
15
|
WorkflowRunOutput,
|
|
14
16
|
WorkflowRunOutputEvent,
|
|
15
17
|
)
|
|
18
|
+
from agno.session.workflow import WorkflowSession
|
|
16
19
|
from agno.utils.log import log_debug, logger
|
|
17
20
|
from agno.workflow.step import Step
|
|
18
21
|
from agno.workflow.types import StepInput, StepOutput, StepType
|
|
@@ -131,7 +134,12 @@ class Loop:
|
|
|
131
134
|
user_id: Optional[str] = None,
|
|
132
135
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
133
136
|
store_executor_outputs: bool = True,
|
|
137
|
+
run_context: Optional[RunContext] = None,
|
|
134
138
|
session_state: Optional[Dict[str, Any]] = None,
|
|
139
|
+
workflow_session: Optional[WorkflowSession] = None,
|
|
140
|
+
add_workflow_history_to_steps: Optional[bool] = False,
|
|
141
|
+
num_history_runs: int = 3,
|
|
142
|
+
background_tasks: Optional[Any] = None,
|
|
135
143
|
) -> StepOutput:
|
|
136
144
|
"""Execute loop steps with iteration control - mirrors workflow execution logic"""
|
|
137
145
|
# Use workflow logger for loop orchestration
|
|
@@ -156,7 +164,12 @@ class Loop:
|
|
|
156
164
|
user_id=user_id,
|
|
157
165
|
workflow_run_response=workflow_run_response,
|
|
158
166
|
store_executor_outputs=store_executor_outputs,
|
|
167
|
+
run_context=run_context,
|
|
159
168
|
session_state=session_state,
|
|
169
|
+
workflow_session=workflow_session,
|
|
170
|
+
add_workflow_history_to_steps=add_workflow_history_to_steps,
|
|
171
|
+
num_history_runs=num_history_runs,
|
|
172
|
+
background_tasks=background_tasks,
|
|
160
173
|
)
|
|
161
174
|
|
|
162
175
|
# Handle both single StepOutput and List[StepOutput] (from Loop/Condition steps)
|
|
@@ -219,12 +232,19 @@ class Loop:
|
|
|
219
232
|
step_input: StepInput,
|
|
220
233
|
session_id: Optional[str] = None,
|
|
221
234
|
user_id: Optional[str] = None,
|
|
235
|
+
stream_events: bool = False,
|
|
222
236
|
stream_intermediate_steps: bool = False,
|
|
237
|
+
stream_executor_events: bool = True,
|
|
223
238
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
224
239
|
step_index: Optional[Union[int, tuple]] = None,
|
|
225
240
|
store_executor_outputs: bool = True,
|
|
241
|
+
run_context: Optional[RunContext] = None,
|
|
226
242
|
session_state: Optional[Dict[str, Any]] = None,
|
|
227
243
|
parent_step_id: Optional[str] = None,
|
|
244
|
+
workflow_session: Optional[WorkflowSession] = None,
|
|
245
|
+
add_workflow_history_to_steps: Optional[bool] = False,
|
|
246
|
+
num_history_runs: int = 3,
|
|
247
|
+
background_tasks: Optional[Any] = None,
|
|
228
248
|
) -> Iterator[Union[WorkflowRunOutputEvent, StepOutput]]:
|
|
229
249
|
"""Execute loop steps with streaming support - mirrors workflow execution logic"""
|
|
230
250
|
log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
|
|
@@ -234,7 +254,16 @@ class Loop:
|
|
|
234
254
|
|
|
235
255
|
loop_step_id = str(uuid4())
|
|
236
256
|
|
|
237
|
-
|
|
257
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
258
|
+
if stream_intermediate_steps is not None:
|
|
259
|
+
warnings.warn(
|
|
260
|
+
"The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Use 'stream_events' instead.",
|
|
261
|
+
DeprecationWarning,
|
|
262
|
+
stacklevel=2,
|
|
263
|
+
)
|
|
264
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
265
|
+
|
|
266
|
+
if stream_events and workflow_run_response:
|
|
238
267
|
# Yield loop started event
|
|
239
268
|
yield LoopExecutionStartedEvent(
|
|
240
269
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -255,7 +284,7 @@ class Loop:
|
|
|
255
284
|
while iteration < self.max_iterations:
|
|
256
285
|
log_debug(f"Loop iteration {iteration + 1}/{self.max_iterations}")
|
|
257
286
|
|
|
258
|
-
if
|
|
287
|
+
if stream_events and workflow_run_response:
|
|
259
288
|
# Yield iteration started event
|
|
260
289
|
yield LoopIterationStartedEvent(
|
|
261
290
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -291,12 +320,18 @@ class Loop:
|
|
|
291
320
|
current_step_input,
|
|
292
321
|
session_id=session_id,
|
|
293
322
|
user_id=user_id,
|
|
294
|
-
|
|
323
|
+
stream_events=stream_events,
|
|
324
|
+
stream_executor_events=stream_executor_events,
|
|
295
325
|
workflow_run_response=workflow_run_response,
|
|
296
326
|
step_index=composite_step_index,
|
|
297
327
|
store_executor_outputs=store_executor_outputs,
|
|
328
|
+
run_context=run_context,
|
|
298
329
|
session_state=session_state,
|
|
299
330
|
parent_step_id=loop_step_id,
|
|
331
|
+
add_workflow_history_to_steps=add_workflow_history_to_steps,
|
|
332
|
+
workflow_session=workflow_session,
|
|
333
|
+
num_history_runs=num_history_runs,
|
|
334
|
+
background_tasks=background_tasks,
|
|
300
335
|
):
|
|
301
336
|
if isinstance(event, StepOutput):
|
|
302
337
|
step_outputs_for_iteration.append(event)
|
|
@@ -348,7 +383,7 @@ class Loop:
|
|
|
348
383
|
should_continue = False
|
|
349
384
|
log_debug(f"Loop ending early due to step termination request at iteration {iteration}")
|
|
350
385
|
|
|
351
|
-
if
|
|
386
|
+
if stream_events and workflow_run_response:
|
|
352
387
|
# Yield iteration completed event
|
|
353
388
|
yield LoopIterationCompletedEvent(
|
|
354
389
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -373,7 +408,7 @@ class Loop:
|
|
|
373
408
|
|
|
374
409
|
log_debug(f"Loop End: {self.name} ({iteration} iterations)", center=True, symbol="=")
|
|
375
410
|
|
|
376
|
-
if
|
|
411
|
+
if stream_events and workflow_run_response:
|
|
377
412
|
# Yield loop completed event
|
|
378
413
|
yield LoopExecutionCompletedEvent(
|
|
379
414
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -409,7 +444,12 @@ class Loop:
|
|
|
409
444
|
user_id: Optional[str] = None,
|
|
410
445
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
411
446
|
store_executor_outputs: bool = True,
|
|
447
|
+
run_context: Optional[RunContext] = None,
|
|
412
448
|
session_state: Optional[Dict[str, Any]] = None,
|
|
449
|
+
workflow_session: Optional[WorkflowSession] = None,
|
|
450
|
+
add_workflow_history_to_steps: Optional[bool] = False,
|
|
451
|
+
num_history_runs: int = 3,
|
|
452
|
+
background_tasks: Optional[Any] = None,
|
|
413
453
|
) -> StepOutput:
|
|
414
454
|
"""Execute loop steps asynchronously with iteration control - mirrors workflow execution logic"""
|
|
415
455
|
# Use workflow logger for async loop orchestration
|
|
@@ -436,7 +476,12 @@ class Loop:
|
|
|
436
476
|
user_id=user_id,
|
|
437
477
|
workflow_run_response=workflow_run_response,
|
|
438
478
|
store_executor_outputs=store_executor_outputs,
|
|
479
|
+
run_context=run_context,
|
|
439
480
|
session_state=session_state,
|
|
481
|
+
workflow_session=workflow_session,
|
|
482
|
+
add_workflow_history_to_steps=add_workflow_history_to_steps,
|
|
483
|
+
num_history_runs=num_history_runs,
|
|
484
|
+
background_tasks=background_tasks,
|
|
440
485
|
)
|
|
441
486
|
|
|
442
487
|
# Handle both single StepOutput and List[StepOutput] (from Loop/Condition steps)
|
|
@@ -502,12 +547,19 @@ class Loop:
|
|
|
502
547
|
step_input: StepInput,
|
|
503
548
|
session_id: Optional[str] = None,
|
|
504
549
|
user_id: Optional[str] = None,
|
|
550
|
+
stream_events: bool = False,
|
|
505
551
|
stream_intermediate_steps: bool = False,
|
|
552
|
+
stream_executor_events: bool = True,
|
|
506
553
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
507
554
|
step_index: Optional[Union[int, tuple]] = None,
|
|
508
555
|
store_executor_outputs: bool = True,
|
|
556
|
+
run_context: Optional[RunContext] = None,
|
|
509
557
|
session_state: Optional[Dict[str, Any]] = None,
|
|
510
558
|
parent_step_id: Optional[str] = None,
|
|
559
|
+
workflow_session: Optional[WorkflowSession] = None,
|
|
560
|
+
add_workflow_history_to_steps: Optional[bool] = False,
|
|
561
|
+
num_history_runs: int = 3,
|
|
562
|
+
background_tasks: Optional[Any] = None,
|
|
511
563
|
) -> AsyncIterator[Union[WorkflowRunOutputEvent, TeamRunOutputEvent, RunOutputEvent, StepOutput]]:
|
|
512
564
|
"""Execute loop steps with async streaming support - mirrors workflow execution logic"""
|
|
513
565
|
log_debug(f"Loop Start: {self.name}", center=True, symbol="=")
|
|
@@ -517,7 +569,16 @@ class Loop:
|
|
|
517
569
|
# Prepare steps first
|
|
518
570
|
self._prepare_steps()
|
|
519
571
|
|
|
520
|
-
|
|
572
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
573
|
+
if stream_intermediate_steps is not None:
|
|
574
|
+
warnings.warn(
|
|
575
|
+
"The 'stream_intermediate_steps' parameter is deprecated and will be removed in future versions. Use 'stream_events' instead.",
|
|
576
|
+
DeprecationWarning,
|
|
577
|
+
stacklevel=2,
|
|
578
|
+
)
|
|
579
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
580
|
+
|
|
581
|
+
if stream_events and workflow_run_response:
|
|
521
582
|
# Yield loop started event
|
|
522
583
|
yield LoopExecutionStartedEvent(
|
|
523
584
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -538,7 +599,7 @@ class Loop:
|
|
|
538
599
|
while iteration < self.max_iterations:
|
|
539
600
|
log_debug(f"Async loop iteration {iteration + 1}/{self.max_iterations}")
|
|
540
601
|
|
|
541
|
-
if
|
|
602
|
+
if stream_events and workflow_run_response:
|
|
542
603
|
# Yield iteration started event
|
|
543
604
|
yield LoopIterationStartedEvent(
|
|
544
605
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -574,12 +635,18 @@ class Loop:
|
|
|
574
635
|
current_step_input,
|
|
575
636
|
session_id=session_id,
|
|
576
637
|
user_id=user_id,
|
|
577
|
-
|
|
638
|
+
stream_events=stream_events,
|
|
639
|
+
stream_executor_events=stream_executor_events,
|
|
578
640
|
workflow_run_response=workflow_run_response,
|
|
579
641
|
step_index=composite_step_index,
|
|
580
642
|
store_executor_outputs=store_executor_outputs,
|
|
643
|
+
run_context=run_context,
|
|
581
644
|
session_state=session_state,
|
|
582
645
|
parent_step_id=loop_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,
|
|
583
650
|
):
|
|
584
651
|
if isinstance(event, StepOutput):
|
|
585
652
|
step_outputs_for_iteration.append(event)
|
|
@@ -634,7 +701,7 @@ class Loop:
|
|
|
634
701
|
should_continue = False
|
|
635
702
|
log_debug(f"Loop ending early due to step termination request at iteration {iteration}")
|
|
636
703
|
|
|
637
|
-
if
|
|
704
|
+
if stream_events and workflow_run_response:
|
|
638
705
|
# Yield iteration completed event
|
|
639
706
|
yield LoopIterationCompletedEvent(
|
|
640
707
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -659,7 +726,7 @@ class Loop:
|
|
|
659
726
|
|
|
660
727
|
log_debug(f"Loop End: {self.name} ({iteration} iterations)", center=True, symbol="=")
|
|
661
728
|
|
|
662
|
-
if
|
|
729
|
+
if stream_events and workflow_run_response:
|
|
663
730
|
# Yield loop completed event
|
|
664
731
|
yield LoopExecutionCompletedEvent(
|
|
665
732
|
run_id=workflow_run_response.run_id or "",
|