agno 2.1.10__py3-none-any.whl → 2.2.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 +1578 -1247
- agno/models/anthropic/claude.py +2 -2
- agno/models/ollama/chat.py +7 -2
- agno/os/app.py +1 -1
- agno/os/interfaces/a2a/router.py +2 -2
- agno/os/interfaces/agui/router.py +2 -2
- agno/os/router.py +7 -7
- agno/os/routers/evals/schemas.py +31 -31
- agno/os/routers/health.py +6 -2
- agno/os/routers/knowledge/schemas.py +49 -47
- agno/os/routers/memory/schemas.py +16 -16
- agno/os/routers/metrics/schemas.py +16 -16
- agno/os/routers/session/session.py +382 -7
- agno/os/schema.py +254 -231
- agno/os/utils.py +1 -1
- agno/run/agent.py +49 -1
- agno/run/team.py +43 -0
- agno/session/summary.py +45 -13
- agno/session/team.py +90 -5
- agno/team/team.py +1117 -856
- agno/utils/agent.py +372 -0
- agno/utils/events.py +144 -2
- agno/utils/print_response/agent.py +10 -6
- agno/utils/print_response/team.py +6 -4
- agno/utils/print_response/workflow.py +7 -5
- agno/utils/team.py +9 -8
- agno/workflow/condition.py +17 -9
- agno/workflow/loop.py +18 -10
- agno/workflow/parallel.py +14 -6
- agno/workflow/router.py +16 -8
- agno/workflow/step.py +14 -6
- agno/workflow/steps.py +14 -6
- agno/workflow/workflow.py +245 -122
- {agno-2.1.10.dist-info → agno-2.2.0.dist-info}/METADATA +60 -23
- {agno-2.1.10.dist-info → agno-2.2.0.dist-info}/RECORD +38 -37
- {agno-2.1.10.dist-info → agno-2.2.0.dist-info}/WHEEL +0 -0
- {agno-2.1.10.dist-info → agno-2.2.0.dist-info}/licenses/LICENSE +0 -0
- {agno-2.1.10.dist-info → agno-2.2.0.dist-info}/top_level.txt +0 -0
|
@@ -331,6 +331,7 @@ def print_response_stream(
|
|
|
331
331
|
videos: Optional[Sequence[Video]] = None,
|
|
332
332
|
files: Optional[Sequence[File]] = None,
|
|
333
333
|
markdown: bool = False,
|
|
334
|
+
stream_events: bool = False,
|
|
334
335
|
stream_intermediate_steps: bool = False, # type: ignore
|
|
335
336
|
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
336
337
|
add_history_to_context: Optional[bool] = None,
|
|
@@ -355,7 +356,7 @@ def print_response_stream(
|
|
|
355
356
|
if not tags_to_include_in_markdown:
|
|
356
357
|
tags_to_include_in_markdown = {"think", "thinking"}
|
|
357
358
|
|
|
358
|
-
|
|
359
|
+
stream_events = True # With streaming print response, we need to stream intermediate steps
|
|
359
360
|
|
|
360
361
|
_response_content: str = ""
|
|
361
362
|
_response_reasoning_content: str = ""
|
|
@@ -399,7 +400,7 @@ def print_response_stream(
|
|
|
399
400
|
videos=videos,
|
|
400
401
|
files=files,
|
|
401
402
|
stream=True,
|
|
402
|
-
|
|
403
|
+
stream_events=stream_events,
|
|
403
404
|
session_id=session_id,
|
|
404
405
|
session_state=session_state,
|
|
405
406
|
user_id=user_id,
|
|
@@ -1160,6 +1161,7 @@ async def aprint_response_stream(
|
|
|
1160
1161
|
videos: Optional[Sequence[Video]] = None,
|
|
1161
1162
|
files: Optional[Sequence[File]] = None,
|
|
1162
1163
|
markdown: bool = False,
|
|
1164
|
+
stream_events: bool = False,
|
|
1163
1165
|
stream_intermediate_steps: bool = False, # type: ignore
|
|
1164
1166
|
knowledge_filters: Optional[Dict[str, Any]] = None,
|
|
1165
1167
|
add_history_to_context: Optional[bool] = None,
|
|
@@ -1182,7 +1184,7 @@ async def aprint_response_stream(
|
|
|
1182
1184
|
if not tags_to_include_in_markdown:
|
|
1183
1185
|
tags_to_include_in_markdown = {"think", "thinking"}
|
|
1184
1186
|
|
|
1185
|
-
|
|
1187
|
+
stream_events = True # With streaming print response, we need to stream intermediate steps
|
|
1186
1188
|
|
|
1187
1189
|
_response_content: str = ""
|
|
1188
1190
|
_response_reasoning_content: str = ""
|
|
@@ -1238,7 +1240,7 @@ async def aprint_response_stream(
|
|
|
1238
1240
|
videos=videos,
|
|
1239
1241
|
files=files,
|
|
1240
1242
|
stream=True,
|
|
1241
|
-
|
|
1243
|
+
stream_events=stream_events,
|
|
1242
1244
|
session_id=session_id,
|
|
1243
1245
|
session_state=session_state,
|
|
1244
1246
|
user_id=user_id,
|
|
@@ -186,6 +186,7 @@ def print_response_stream(
|
|
|
186
186
|
audio: Optional[List[Audio]] = None,
|
|
187
187
|
images: Optional[List[Image]] = None,
|
|
188
188
|
videos: Optional[List[Video]] = None,
|
|
189
|
+
stream_events: bool = False,
|
|
189
190
|
stream_intermediate_steps: bool = False,
|
|
190
191
|
markdown: bool = True,
|
|
191
192
|
show_time: bool = True,
|
|
@@ -199,7 +200,7 @@ def print_response_stream(
|
|
|
199
200
|
|
|
200
201
|
console = Console()
|
|
201
202
|
|
|
202
|
-
|
|
203
|
+
stream_events = True # With streaming print response, we need to stream intermediate steps
|
|
203
204
|
|
|
204
205
|
# Show workflow info (same as before)
|
|
205
206
|
media_info = []
|
|
@@ -314,7 +315,7 @@ def print_response_stream(
|
|
|
314
315
|
images=images,
|
|
315
316
|
videos=videos,
|
|
316
317
|
stream=True,
|
|
317
|
-
|
|
318
|
+
stream_events=stream_events,
|
|
318
319
|
**kwargs,
|
|
319
320
|
): # type: ignore
|
|
320
321
|
# Handle the new event types
|
|
@@ -969,6 +970,7 @@ async def aprint_response_stream(
|
|
|
969
970
|
audio: Optional[List[Audio]] = None,
|
|
970
971
|
images: Optional[List[Image]] = None,
|
|
971
972
|
videos: Optional[List[Video]] = None,
|
|
973
|
+
stream_events: bool = False,
|
|
972
974
|
stream_intermediate_steps: bool = False,
|
|
973
975
|
markdown: bool = True,
|
|
974
976
|
show_time: bool = True,
|
|
@@ -982,7 +984,7 @@ async def aprint_response_stream(
|
|
|
982
984
|
|
|
983
985
|
console = Console()
|
|
984
986
|
|
|
985
|
-
|
|
987
|
+
stream_events = True # With streaming print response, we need to stream intermediate steps
|
|
986
988
|
|
|
987
989
|
# Show workflow info (same as before)
|
|
988
990
|
media_info = []
|
|
@@ -1088,7 +1090,7 @@ async def aprint_response_stream(
|
|
|
1088
1090
|
live_log.update(status)
|
|
1089
1091
|
|
|
1090
1092
|
try:
|
|
1091
|
-
async for response in
|
|
1093
|
+
async for response in workflow.arun(
|
|
1092
1094
|
input=input,
|
|
1093
1095
|
additional_data=additional_data,
|
|
1094
1096
|
user_id=user_id,
|
|
@@ -1097,7 +1099,7 @@ async def aprint_response_stream(
|
|
|
1097
1099
|
images=images,
|
|
1098
1100
|
videos=videos,
|
|
1099
1101
|
stream=True,
|
|
1100
|
-
|
|
1102
|
+
stream_events=stream_events,
|
|
1101
1103
|
**kwargs,
|
|
1102
1104
|
): # type: ignore
|
|
1103
1105
|
# Handle the new event types
|
agno/utils/team.py
CHANGED
|
@@ -9,19 +9,20 @@ if TYPE_CHECKING:
|
|
|
9
9
|
|
|
10
10
|
def format_member_agent_task(
|
|
11
11
|
task_description: str,
|
|
12
|
-
expected_output: Optional[str] = None,
|
|
13
12
|
team_member_interactions_str: Optional[str] = None,
|
|
13
|
+
team_history_str: Optional[str] = None,
|
|
14
14
|
) -> str:
|
|
15
|
-
|
|
16
|
-
member_agent_task += f"\n\n<task>\n{task_description}\n</task>"
|
|
17
|
-
|
|
18
|
-
if expected_output is not None:
|
|
19
|
-
member_agent_task += f"\n\n<expected_output>\n{expected_output}\n</expected_output>"
|
|
15
|
+
member_task_str = ""
|
|
20
16
|
|
|
21
17
|
if team_member_interactions_str:
|
|
22
|
-
|
|
18
|
+
member_task_str += f"{team_member_interactions_str}\n\n"
|
|
19
|
+
|
|
20
|
+
if team_history_str:
|
|
21
|
+
member_task_str += f"{team_history_str}\n\n"
|
|
22
|
+
|
|
23
|
+
member_task_str += f"{task_description}"
|
|
23
24
|
|
|
24
|
-
return
|
|
25
|
+
return member_task_str
|
|
25
26
|
|
|
26
27
|
|
|
27
28
|
def get_member_id(member: Union[Agent, "Team"]) -> str:
|
agno/workflow/condition.py
CHANGED
|
@@ -278,7 +278,8 @@ class Condition:
|
|
|
278
278
|
step_input: StepInput,
|
|
279
279
|
session_id: Optional[str] = None,
|
|
280
280
|
user_id: Optional[str] = None,
|
|
281
|
-
|
|
281
|
+
stream_events: bool = False,
|
|
282
|
+
stream_intermediate_steps: bool = False, # type: ignore
|
|
282
283
|
stream_executor_events: bool = True,
|
|
283
284
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
284
285
|
step_index: Optional[Union[int, tuple]] = None,
|
|
@@ -300,7 +301,10 @@ class Condition:
|
|
|
300
301
|
condition_result = self._evaluate_condition(step_input, session_state)
|
|
301
302
|
log_debug(f"Condition {self.name} evaluated to: {condition_result}")
|
|
302
303
|
|
|
303
|
-
|
|
304
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
305
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
306
|
+
|
|
307
|
+
if stream_events and workflow_run_response:
|
|
304
308
|
# Yield condition started event
|
|
305
309
|
yield ConditionExecutionStartedEvent(
|
|
306
310
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -315,7 +319,7 @@ class Condition:
|
|
|
315
319
|
)
|
|
316
320
|
|
|
317
321
|
if not condition_result:
|
|
318
|
-
if
|
|
322
|
+
if stream_events and workflow_run_response:
|
|
319
323
|
# Yield condition completed event for empty case
|
|
320
324
|
yield ConditionExecutionCompletedEvent(
|
|
321
325
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -354,7 +358,7 @@ class Condition:
|
|
|
354
358
|
current_step_input,
|
|
355
359
|
session_id=session_id,
|
|
356
360
|
user_id=user_id,
|
|
357
|
-
|
|
361
|
+
stream_events=stream_events,
|
|
358
362
|
stream_executor_events=stream_executor_events,
|
|
359
363
|
workflow_run_response=workflow_run_response,
|
|
360
364
|
step_index=child_step_index,
|
|
@@ -411,7 +415,7 @@ class Condition:
|
|
|
411
415
|
break
|
|
412
416
|
|
|
413
417
|
log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
|
|
414
|
-
if
|
|
418
|
+
if stream_events and workflow_run_response:
|
|
415
419
|
# Yield condition completed event
|
|
416
420
|
yield ConditionExecutionCompletedEvent(
|
|
417
421
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -546,6 +550,7 @@ class Condition:
|
|
|
546
550
|
step_input: StepInput,
|
|
547
551
|
session_id: Optional[str] = None,
|
|
548
552
|
user_id: Optional[str] = None,
|
|
553
|
+
stream_events: bool = False,
|
|
549
554
|
stream_intermediate_steps: bool = False,
|
|
550
555
|
stream_executor_events: bool = True,
|
|
551
556
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
@@ -568,7 +573,10 @@ class Condition:
|
|
|
568
573
|
condition_result = await self._aevaluate_condition(step_input, session_state)
|
|
569
574
|
log_debug(f"Condition {self.name} evaluated to: {condition_result}")
|
|
570
575
|
|
|
571
|
-
|
|
576
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
577
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
578
|
+
|
|
579
|
+
if stream_events and workflow_run_response:
|
|
572
580
|
# Yield condition started event
|
|
573
581
|
yield ConditionExecutionStartedEvent(
|
|
574
582
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -583,7 +591,7 @@ class Condition:
|
|
|
583
591
|
)
|
|
584
592
|
|
|
585
593
|
if not condition_result:
|
|
586
|
-
if
|
|
594
|
+
if stream_events and workflow_run_response:
|
|
587
595
|
# Yield condition completed event for empty case
|
|
588
596
|
yield ConditionExecutionCompletedEvent(
|
|
589
597
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -624,7 +632,7 @@ class Condition:
|
|
|
624
632
|
current_step_input,
|
|
625
633
|
session_id=session_id,
|
|
626
634
|
user_id=user_id,
|
|
627
|
-
|
|
635
|
+
stream_events=stream_events,
|
|
628
636
|
stream_executor_events=stream_executor_events,
|
|
629
637
|
workflow_run_response=workflow_run_response,
|
|
630
638
|
step_index=child_step_index,
|
|
@@ -682,7 +690,7 @@ class Condition:
|
|
|
682
690
|
|
|
683
691
|
log_debug(f"Condition End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
|
|
684
692
|
|
|
685
|
-
if
|
|
693
|
+
if stream_events and workflow_run_response:
|
|
686
694
|
# Yield condition completed event
|
|
687
695
|
yield ConditionExecutionCompletedEvent(
|
|
688
696
|
run_id=workflow_run_response.run_id or "",
|
agno/workflow/loop.py
CHANGED
|
@@ -226,6 +226,7 @@ class Loop:
|
|
|
226
226
|
step_input: StepInput,
|
|
227
227
|
session_id: Optional[str] = None,
|
|
228
228
|
user_id: Optional[str] = None,
|
|
229
|
+
stream_events: bool = False,
|
|
229
230
|
stream_intermediate_steps: bool = False,
|
|
230
231
|
stream_executor_events: bool = True,
|
|
231
232
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
@@ -245,7 +246,10 @@ class Loop:
|
|
|
245
246
|
|
|
246
247
|
loop_step_id = str(uuid4())
|
|
247
248
|
|
|
248
|
-
|
|
249
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
250
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
251
|
+
|
|
252
|
+
if stream_events and workflow_run_response:
|
|
249
253
|
# Yield loop started event
|
|
250
254
|
yield LoopExecutionStartedEvent(
|
|
251
255
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -266,7 +270,7 @@ class Loop:
|
|
|
266
270
|
while iteration < self.max_iterations:
|
|
267
271
|
log_debug(f"Loop iteration {iteration + 1}/{self.max_iterations}")
|
|
268
272
|
|
|
269
|
-
if
|
|
273
|
+
if stream_events and workflow_run_response:
|
|
270
274
|
# Yield iteration started event
|
|
271
275
|
yield LoopIterationStartedEvent(
|
|
272
276
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -302,7 +306,7 @@ class Loop:
|
|
|
302
306
|
current_step_input,
|
|
303
307
|
session_id=session_id,
|
|
304
308
|
user_id=user_id,
|
|
305
|
-
|
|
309
|
+
stream_events=stream_events,
|
|
306
310
|
stream_executor_events=stream_executor_events,
|
|
307
311
|
workflow_run_response=workflow_run_response,
|
|
308
312
|
step_index=composite_step_index,
|
|
@@ -363,7 +367,7 @@ class Loop:
|
|
|
363
367
|
should_continue = False
|
|
364
368
|
log_debug(f"Loop ending early due to step termination request at iteration {iteration}")
|
|
365
369
|
|
|
366
|
-
if
|
|
370
|
+
if stream_events and workflow_run_response:
|
|
367
371
|
# Yield iteration completed event
|
|
368
372
|
yield LoopIterationCompletedEvent(
|
|
369
373
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -388,7 +392,7 @@ class Loop:
|
|
|
388
392
|
|
|
389
393
|
log_debug(f"Loop End: {self.name} ({iteration} iterations)", center=True, symbol="=")
|
|
390
394
|
|
|
391
|
-
if
|
|
395
|
+
if stream_events and workflow_run_response:
|
|
392
396
|
# Yield loop completed event
|
|
393
397
|
yield LoopExecutionCompletedEvent(
|
|
394
398
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -523,6 +527,7 @@ class Loop:
|
|
|
523
527
|
step_input: StepInput,
|
|
524
528
|
session_id: Optional[str] = None,
|
|
525
529
|
user_id: Optional[str] = None,
|
|
530
|
+
stream_events: bool = False,
|
|
526
531
|
stream_intermediate_steps: bool = False,
|
|
527
532
|
stream_executor_events: bool = True,
|
|
528
533
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
@@ -542,7 +547,10 @@ class Loop:
|
|
|
542
547
|
# Prepare steps first
|
|
543
548
|
self._prepare_steps()
|
|
544
549
|
|
|
545
|
-
|
|
550
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
551
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
552
|
+
|
|
553
|
+
if stream_events and workflow_run_response:
|
|
546
554
|
# Yield loop started event
|
|
547
555
|
yield LoopExecutionStartedEvent(
|
|
548
556
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -563,7 +571,7 @@ class Loop:
|
|
|
563
571
|
while iteration < self.max_iterations:
|
|
564
572
|
log_debug(f"Async loop iteration {iteration + 1}/{self.max_iterations}")
|
|
565
573
|
|
|
566
|
-
if
|
|
574
|
+
if stream_events and workflow_run_response:
|
|
567
575
|
# Yield iteration started event
|
|
568
576
|
yield LoopIterationStartedEvent(
|
|
569
577
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -599,7 +607,7 @@ class Loop:
|
|
|
599
607
|
current_step_input,
|
|
600
608
|
session_id=session_id,
|
|
601
609
|
user_id=user_id,
|
|
602
|
-
|
|
610
|
+
stream_events=stream_events,
|
|
603
611
|
stream_executor_events=stream_executor_events,
|
|
604
612
|
workflow_run_response=workflow_run_response,
|
|
605
613
|
step_index=composite_step_index,
|
|
@@ -663,7 +671,7 @@ class Loop:
|
|
|
663
671
|
should_continue = False
|
|
664
672
|
log_debug(f"Loop ending early due to step termination request at iteration {iteration}")
|
|
665
673
|
|
|
666
|
-
if
|
|
674
|
+
if stream_events and workflow_run_response:
|
|
667
675
|
# Yield iteration completed event
|
|
668
676
|
yield LoopIterationCompletedEvent(
|
|
669
677
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -688,7 +696,7 @@ class Loop:
|
|
|
688
696
|
|
|
689
697
|
log_debug(f"Loop End: {self.name} ({iteration} iterations)", center=True, symbol="=")
|
|
690
698
|
|
|
691
|
-
if
|
|
699
|
+
if stream_events and workflow_run_response:
|
|
692
700
|
# Yield loop completed event
|
|
693
701
|
yield LoopExecutionCompletedEvent(
|
|
694
702
|
run_id=workflow_run_response.run_id or "",
|
agno/workflow/parallel.py
CHANGED
|
@@ -316,6 +316,7 @@ class Parallel:
|
|
|
316
316
|
step_input: StepInput,
|
|
317
317
|
session_id: Optional[str] = None,
|
|
318
318
|
user_id: Optional[str] = None,
|
|
319
|
+
stream_events: bool = False,
|
|
319
320
|
stream_intermediate_steps: bool = False,
|
|
320
321
|
stream_executor_events: bool = True,
|
|
321
322
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
@@ -342,7 +343,10 @@ class Parallel:
|
|
|
342
343
|
else:
|
|
343
344
|
session_state_copies.append({})
|
|
344
345
|
|
|
345
|
-
|
|
346
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
347
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
348
|
+
|
|
349
|
+
if stream_events and workflow_run_response:
|
|
346
350
|
# Yield parallel step started event
|
|
347
351
|
yield ParallelExecutionStartedEvent(
|
|
348
352
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -385,7 +389,7 @@ class Parallel:
|
|
|
385
389
|
step_input,
|
|
386
390
|
session_id=session_id,
|
|
387
391
|
user_id=user_id,
|
|
388
|
-
|
|
392
|
+
stream_events=stream_events,
|
|
389
393
|
stream_executor_events=stream_executor_events,
|
|
390
394
|
workflow_run_response=workflow_run_response,
|
|
391
395
|
step_index=sub_step_index,
|
|
@@ -483,7 +487,7 @@ class Parallel:
|
|
|
483
487
|
|
|
484
488
|
log_debug(f"Parallel End: {self.name} ({len(self.steps)} steps)", center=True, symbol="=")
|
|
485
489
|
|
|
486
|
-
if
|
|
490
|
+
if stream_events and workflow_run_response:
|
|
487
491
|
# Yield parallel step completed event
|
|
488
492
|
yield ParallelExecutionCompletedEvent(
|
|
489
493
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -622,6 +626,7 @@ class Parallel:
|
|
|
622
626
|
step_input: StepInput,
|
|
623
627
|
session_id: Optional[str] = None,
|
|
624
628
|
user_id: Optional[str] = None,
|
|
629
|
+
stream_events: bool = False,
|
|
625
630
|
stream_intermediate_steps: bool = False,
|
|
626
631
|
stream_executor_events: bool = True,
|
|
627
632
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
@@ -648,7 +653,10 @@ class Parallel:
|
|
|
648
653
|
else:
|
|
649
654
|
session_state_copies.append({})
|
|
650
655
|
|
|
651
|
-
|
|
656
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
657
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
658
|
+
|
|
659
|
+
if stream_events and workflow_run_response:
|
|
652
660
|
# Yield parallel step started event
|
|
653
661
|
yield ParallelExecutionStartedEvent(
|
|
654
662
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -691,7 +699,7 @@ class Parallel:
|
|
|
691
699
|
step_input,
|
|
692
700
|
session_id=session_id,
|
|
693
701
|
user_id=user_id,
|
|
694
|
-
|
|
702
|
+
stream_events=stream_events,
|
|
695
703
|
stream_executor_events=stream_executor_events,
|
|
696
704
|
workflow_run_response=workflow_run_response,
|
|
697
705
|
step_index=sub_step_index,
|
|
@@ -777,7 +785,7 @@ class Parallel:
|
|
|
777
785
|
|
|
778
786
|
log_debug(f"Parallel End: {self.name} ({len(self.steps)} steps)", center=True, symbol="=")
|
|
779
787
|
|
|
780
|
-
if
|
|
788
|
+
if stream_events and workflow_run_response:
|
|
781
789
|
# Yield parallel step completed event
|
|
782
790
|
yield ParallelExecutionCompletedEvent(
|
|
783
791
|
run_id=workflow_run_response.run_id or "",
|
agno/workflow/router.py
CHANGED
|
@@ -267,6 +267,7 @@ class Router:
|
|
|
267
267
|
session_id: Optional[str] = None,
|
|
268
268
|
user_id: Optional[str] = None,
|
|
269
269
|
session_state: Optional[Dict[str, Any]] = None,
|
|
270
|
+
stream_events: bool = False,
|
|
270
271
|
stream_intermediate_steps: bool = False,
|
|
271
272
|
stream_executor_events: bool = True,
|
|
272
273
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
@@ -288,7 +289,10 @@ class Router:
|
|
|
288
289
|
steps_to_execute = self._route_steps(step_input, session_state)
|
|
289
290
|
log_debug(f"Router {self.name}: Selected {len(steps_to_execute)} steps to execute")
|
|
290
291
|
|
|
291
|
-
|
|
292
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
293
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
294
|
+
|
|
295
|
+
if stream_events and workflow_run_response:
|
|
292
296
|
# Yield router started event
|
|
293
297
|
yield RouterExecutionStartedEvent(
|
|
294
298
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -304,7 +308,7 @@ class Router:
|
|
|
304
308
|
|
|
305
309
|
if not steps_to_execute:
|
|
306
310
|
# Yield router completed event for empty case
|
|
307
|
-
if
|
|
311
|
+
if stream_events and workflow_run_response:
|
|
308
312
|
yield RouterExecutionCompletedEvent(
|
|
309
313
|
run_id=workflow_run_response.run_id or "",
|
|
310
314
|
workflow_name=workflow_run_response.workflow_name or "",
|
|
@@ -332,7 +336,7 @@ class Router:
|
|
|
332
336
|
current_step_input,
|
|
333
337
|
session_id=session_id,
|
|
334
338
|
user_id=user_id,
|
|
335
|
-
|
|
339
|
+
stream_events=stream_events,
|
|
336
340
|
stream_executor_events=stream_executor_events,
|
|
337
341
|
workflow_run_response=workflow_run_response,
|
|
338
342
|
step_index=step_index,
|
|
@@ -390,7 +394,7 @@ class Router:
|
|
|
390
394
|
|
|
391
395
|
log_debug(f"Router End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
|
|
392
396
|
|
|
393
|
-
if
|
|
397
|
+
if stream_events and workflow_run_response:
|
|
394
398
|
# Yield router completed event
|
|
395
399
|
yield RouterExecutionCompletedEvent(
|
|
396
400
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -520,6 +524,7 @@ class Router:
|
|
|
520
524
|
session_id: Optional[str] = None,
|
|
521
525
|
user_id: Optional[str] = None,
|
|
522
526
|
session_state: Optional[Dict[str, Any]] = None,
|
|
527
|
+
stream_events: bool = False,
|
|
523
528
|
stream_intermediate_steps: bool = False,
|
|
524
529
|
stream_executor_events: bool = True,
|
|
525
530
|
workflow_run_response: Optional[WorkflowRunOutput] = None,
|
|
@@ -541,7 +546,10 @@ class Router:
|
|
|
541
546
|
steps_to_execute = await self._aroute_steps(step_input, session_state)
|
|
542
547
|
log_debug(f"Router {self.name} selected: {len(steps_to_execute)} steps to execute")
|
|
543
548
|
|
|
544
|
-
|
|
549
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
550
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
551
|
+
|
|
552
|
+
if stream_events and workflow_run_response:
|
|
545
553
|
# Yield router started event
|
|
546
554
|
yield RouterExecutionStartedEvent(
|
|
547
555
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -556,7 +564,7 @@ class Router:
|
|
|
556
564
|
)
|
|
557
565
|
|
|
558
566
|
if not steps_to_execute:
|
|
559
|
-
if
|
|
567
|
+
if stream_events and workflow_run_response:
|
|
560
568
|
# Yield router completed event for empty case
|
|
561
569
|
yield RouterExecutionCompletedEvent(
|
|
562
570
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -587,7 +595,7 @@ class Router:
|
|
|
587
595
|
current_step_input,
|
|
588
596
|
session_id=session_id,
|
|
589
597
|
user_id=user_id,
|
|
590
|
-
|
|
598
|
+
stream_events=stream_events,
|
|
591
599
|
stream_executor_events=stream_executor_events,
|
|
592
600
|
workflow_run_response=workflow_run_response,
|
|
593
601
|
step_index=step_index,
|
|
@@ -645,7 +653,7 @@ class Router:
|
|
|
645
653
|
|
|
646
654
|
log_debug(f"Router End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
|
|
647
655
|
|
|
648
|
-
if
|
|
656
|
+
if stream_events and workflow_run_response:
|
|
649
657
|
# Yield router completed event
|
|
650
658
|
yield RouterExecutionCompletedEvent(
|
|
651
659
|
run_id=workflow_run_response.run_id or "",
|
agno/workflow/step.py
CHANGED
|
@@ -404,6 +404,7 @@ class Step:
|
|
|
404
404
|
step_input: StepInput,
|
|
405
405
|
session_id: Optional[str] = None,
|
|
406
406
|
user_id: Optional[str] = None,
|
|
407
|
+
stream_events: bool = False,
|
|
407
408
|
stream_intermediate_steps: bool = False,
|
|
408
409
|
stream_executor_events: bool = True,
|
|
409
410
|
workflow_run_response: Optional["WorkflowRunOutput"] = None,
|
|
@@ -425,8 +426,11 @@ class Step:
|
|
|
425
426
|
# Create session_state copy once to avoid duplication
|
|
426
427
|
session_state_copy = copy(session_state) if session_state is not None else {}
|
|
427
428
|
|
|
429
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
430
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
431
|
+
|
|
428
432
|
# Emit StepStartedEvent
|
|
429
|
-
if
|
|
433
|
+
if stream_events and workflow_run_response:
|
|
430
434
|
yield StepStartedEvent(
|
|
431
435
|
run_id=workflow_run_response.run_id or "",
|
|
432
436
|
workflow_name=workflow_run_response.workflow_name or "",
|
|
@@ -548,7 +552,7 @@ class Step:
|
|
|
548
552
|
user_id=user_id,
|
|
549
553
|
session_state=session_state_copy, # Send a copy to the executor
|
|
550
554
|
stream=True,
|
|
551
|
-
|
|
555
|
+
stream_events=stream_events,
|
|
552
556
|
yield_run_response=True,
|
|
553
557
|
**kwargs,
|
|
554
558
|
)
|
|
@@ -588,7 +592,7 @@ class Step:
|
|
|
588
592
|
yield final_response
|
|
589
593
|
|
|
590
594
|
# Emit StepCompletedEvent
|
|
591
|
-
if
|
|
595
|
+
if stream_events and workflow_run_response:
|
|
592
596
|
yield StepCompletedEvent(
|
|
593
597
|
run_id=workflow_run_response.run_id or "",
|
|
594
598
|
workflow_name=workflow_run_response.workflow_name or "",
|
|
@@ -809,6 +813,7 @@ class Step:
|
|
|
809
813
|
step_input: StepInput,
|
|
810
814
|
session_id: Optional[str] = None,
|
|
811
815
|
user_id: Optional[str] = None,
|
|
816
|
+
stream_events: bool = False,
|
|
812
817
|
stream_intermediate_steps: bool = False,
|
|
813
818
|
stream_executor_events: bool = True,
|
|
814
819
|
workflow_run_response: Optional["WorkflowRunOutput"] = None,
|
|
@@ -831,7 +836,10 @@ class Step:
|
|
|
831
836
|
# Create session_state copy once to avoid duplication
|
|
832
837
|
session_state_copy = copy(session_state) if session_state is not None else {}
|
|
833
838
|
|
|
834
|
-
|
|
839
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
840
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
841
|
+
|
|
842
|
+
if stream_events and workflow_run_response:
|
|
835
843
|
# Emit StepStartedEvent
|
|
836
844
|
yield StepStartedEvent(
|
|
837
845
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -978,7 +986,7 @@ class Step:
|
|
|
978
986
|
user_id=user_id,
|
|
979
987
|
session_state=session_state_copy,
|
|
980
988
|
stream=True,
|
|
981
|
-
|
|
989
|
+
stream_events=stream_events,
|
|
982
990
|
yield_run_response=True,
|
|
983
991
|
**kwargs,
|
|
984
992
|
)
|
|
@@ -1015,7 +1023,7 @@ class Step:
|
|
|
1015
1023
|
final_response = self._process_step_output(final_response)
|
|
1016
1024
|
yield final_response
|
|
1017
1025
|
|
|
1018
|
-
if
|
|
1026
|
+
if stream_events and workflow_run_response:
|
|
1019
1027
|
# Emit StepCompletedEvent
|
|
1020
1028
|
yield StepCompletedEvent(
|
|
1021
1029
|
run_id=workflow_run_response.run_id or "",
|
agno/workflow/steps.py
CHANGED
|
@@ -207,6 +207,7 @@ class Steps:
|
|
|
207
207
|
session_state: Optional[Dict[str, Any]] = None,
|
|
208
208
|
session_id: Optional[str] = None,
|
|
209
209
|
user_id: Optional[str] = None,
|
|
210
|
+
stream_events: bool = False,
|
|
210
211
|
stream_intermediate_steps: bool = False,
|
|
211
212
|
stream_executor_events: bool = True,
|
|
212
213
|
step_index: Optional[Union[int, tuple]] = None,
|
|
@@ -223,7 +224,10 @@ class Steps:
|
|
|
223
224
|
|
|
224
225
|
self._prepare_steps()
|
|
225
226
|
|
|
226
|
-
|
|
227
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
228
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
229
|
+
|
|
230
|
+
if stream_events:
|
|
227
231
|
# Yield steps execution started event
|
|
228
232
|
yield StepsExecutionStartedEvent(
|
|
229
233
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -266,7 +270,7 @@ class Steps:
|
|
|
266
270
|
session_id=session_id,
|
|
267
271
|
user_id=user_id,
|
|
268
272
|
session_state=session_state,
|
|
269
|
-
|
|
273
|
+
stream_events=stream_events,
|
|
270
274
|
stream_executor_events=stream_executor_events,
|
|
271
275
|
workflow_run_response=workflow_run_response,
|
|
272
276
|
step_index=child_step_index,
|
|
@@ -309,7 +313,7 @@ class Steps:
|
|
|
309
313
|
|
|
310
314
|
log_debug(f"Steps End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
|
|
311
315
|
|
|
312
|
-
if
|
|
316
|
+
if stream_events:
|
|
313
317
|
# Yield steps execution completed event
|
|
314
318
|
yield StepsExecutionCompletedEvent(
|
|
315
319
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -438,6 +442,7 @@ class Steps:
|
|
|
438
442
|
session_state: Optional[Dict[str, Any]] = None,
|
|
439
443
|
session_id: Optional[str] = None,
|
|
440
444
|
user_id: Optional[str] = None,
|
|
445
|
+
stream_events: bool = False,
|
|
441
446
|
stream_intermediate_steps: bool = False,
|
|
442
447
|
stream_executor_events: bool = True,
|
|
443
448
|
step_index: Optional[Union[int, tuple]] = None,
|
|
@@ -454,7 +459,10 @@ class Steps:
|
|
|
454
459
|
|
|
455
460
|
self._prepare_steps()
|
|
456
461
|
|
|
457
|
-
|
|
462
|
+
# Considering both stream_events and stream_intermediate_steps (deprecated)
|
|
463
|
+
stream_events = stream_events or stream_intermediate_steps
|
|
464
|
+
|
|
465
|
+
if stream_events:
|
|
458
466
|
# Yield steps execution started event
|
|
459
467
|
yield StepsExecutionStartedEvent(
|
|
460
468
|
run_id=workflow_run_response.run_id or "",
|
|
@@ -497,7 +505,7 @@ class Steps:
|
|
|
497
505
|
session_id=session_id,
|
|
498
506
|
user_id=user_id,
|
|
499
507
|
session_state=session_state,
|
|
500
|
-
|
|
508
|
+
stream_events=stream_events,
|
|
501
509
|
stream_executor_events=stream_executor_events,
|
|
502
510
|
workflow_run_response=workflow_run_response,
|
|
503
511
|
step_index=child_step_index,
|
|
@@ -540,7 +548,7 @@ class Steps:
|
|
|
540
548
|
|
|
541
549
|
log_debug(f"Steps End: {self.name} ({len(all_results)} results)", center=True, symbol="-")
|
|
542
550
|
# Yield steps execution completed event
|
|
543
|
-
if
|
|
551
|
+
if stream_events:
|
|
544
552
|
yield StepsExecutionCompletedEvent(
|
|
545
553
|
run_id=workflow_run_response.run_id or "",
|
|
546
554
|
workflow_name=workflow_run_response.workflow_name or "",
|