agno 2.1.9__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.
Files changed (83) hide show
  1. agno/agent/agent.py +2048 -1204
  2. agno/culture/__init__.py +3 -0
  3. agno/culture/manager.py +954 -0
  4. agno/db/async_postgres/async_postgres.py +232 -0
  5. agno/db/async_postgres/schemas.py +15 -0
  6. agno/db/async_postgres/utils.py +58 -0
  7. agno/db/base.py +83 -6
  8. agno/db/dynamo/dynamo.py +162 -0
  9. agno/db/dynamo/schemas.py +44 -0
  10. agno/db/dynamo/utils.py +59 -0
  11. agno/db/firestore/firestore.py +231 -0
  12. agno/db/firestore/schemas.py +10 -0
  13. agno/db/firestore/utils.py +96 -0
  14. agno/db/gcs_json/gcs_json_db.py +190 -0
  15. agno/db/gcs_json/utils.py +58 -0
  16. agno/db/in_memory/in_memory_db.py +118 -0
  17. agno/db/in_memory/utils.py +58 -0
  18. agno/db/json/json_db.py +129 -0
  19. agno/db/json/utils.py +58 -0
  20. agno/db/mongo/mongo.py +222 -0
  21. agno/db/mongo/schemas.py +10 -0
  22. agno/db/mongo/utils.py +59 -0
  23. agno/db/mysql/mysql.py +232 -1
  24. agno/db/mysql/schemas.py +14 -0
  25. agno/db/mysql/utils.py +58 -0
  26. agno/db/postgres/postgres.py +242 -0
  27. agno/db/postgres/schemas.py +15 -0
  28. agno/db/postgres/utils.py +58 -0
  29. agno/db/redis/redis.py +181 -0
  30. agno/db/redis/schemas.py +14 -0
  31. agno/db/redis/utils.py +58 -0
  32. agno/db/schemas/__init__.py +2 -1
  33. agno/db/schemas/culture.py +120 -0
  34. agno/db/singlestore/schemas.py +14 -0
  35. agno/db/singlestore/singlestore.py +231 -0
  36. agno/db/singlestore/utils.py +58 -0
  37. agno/db/sqlite/schemas.py +14 -0
  38. agno/db/sqlite/sqlite.py +274 -7
  39. agno/db/sqlite/utils.py +62 -0
  40. agno/db/surrealdb/models.py +51 -1
  41. agno/db/surrealdb/surrealdb.py +154 -0
  42. agno/db/surrealdb/utils.py +61 -1
  43. agno/knowledge/reader/field_labeled_csv_reader.py +0 -2
  44. agno/memory/manager.py +28 -11
  45. agno/models/anthropic/claude.py +2 -2
  46. agno/models/message.py +0 -1
  47. agno/models/ollama/chat.py +7 -2
  48. agno/os/app.py +29 -7
  49. agno/os/interfaces/a2a/router.py +2 -2
  50. agno/os/interfaces/agui/router.py +2 -2
  51. agno/os/router.py +7 -7
  52. agno/os/routers/evals/schemas.py +31 -31
  53. agno/os/routers/health.py +6 -2
  54. agno/os/routers/knowledge/schemas.py +49 -47
  55. agno/os/routers/memory/schemas.py +16 -16
  56. agno/os/routers/metrics/schemas.py +16 -16
  57. agno/os/routers/session/session.py +382 -7
  58. agno/os/schema.py +254 -231
  59. agno/os/utils.py +1 -1
  60. agno/run/agent.py +49 -1
  61. agno/run/team.py +43 -0
  62. agno/session/summary.py +45 -13
  63. agno/session/team.py +90 -5
  64. agno/team/team.py +1118 -857
  65. agno/tools/gmail.py +59 -14
  66. agno/utils/agent.py +372 -0
  67. agno/utils/events.py +144 -2
  68. agno/utils/print_response/agent.py +10 -6
  69. agno/utils/print_response/team.py +6 -4
  70. agno/utils/print_response/workflow.py +7 -5
  71. agno/utils/team.py +9 -8
  72. agno/workflow/condition.py +17 -9
  73. agno/workflow/loop.py +18 -10
  74. agno/workflow/parallel.py +14 -6
  75. agno/workflow/router.py +17 -9
  76. agno/workflow/step.py +14 -6
  77. agno/workflow/steps.py +14 -6
  78. agno/workflow/workflow.py +245 -122
  79. {agno-2.1.9.dist-info → agno-2.2.0.dist-info}/METADATA +60 -23
  80. {agno-2.1.9.dist-info → agno-2.2.0.dist-info}/RECORD +83 -79
  81. {agno-2.1.9.dist-info → agno-2.2.0.dist-info}/WHEEL +0 -0
  82. {agno-2.1.9.dist-info → agno-2.2.0.dist-info}/licenses/LICENSE +0 -0
  83. {agno-2.1.9.dist-info → agno-2.2.0.dist-info}/top_level.txt +0 -0
@@ -33,6 +33,7 @@ def print_response_stream(
33
33
  images: Optional[Sequence[Image]] = None,
34
34
  videos: Optional[Sequence[Video]] = None,
35
35
  files: Optional[Sequence[File]] = None,
36
+ stream_events: bool = False,
36
37
  stream_intermediate_steps: bool = False,
37
38
  knowledge_filters: Optional[Dict[str, Any]] = None,
38
39
  debug_mode: Optional[bool] = None,
@@ -80,6 +81,9 @@ def print_response_stream(
80
81
 
81
82
  input_content = get_text_from_message(input)
82
83
 
84
+ # Consider both stream_events and stream_intermediate_steps (deprecated)
85
+ stream_events = stream_events or stream_intermediate_steps
86
+
83
87
  for response_event in agent.run(
84
88
  input=input,
85
89
  session_id=session_id,
@@ -90,7 +94,7 @@ def print_response_stream(
90
94
  videos=videos,
91
95
  files=files,
92
96
  stream=True,
93
- stream_intermediate_steps=stream_intermediate_steps,
97
+ stream_events=stream_events,
94
98
  knowledge_filters=knowledge_filters,
95
99
  debug_mode=debug_mode,
96
100
  add_history_to_context=add_history_to_context,
@@ -221,6 +225,7 @@ async def aprint_response_stream(
221
225
  images: Optional[Sequence[Image]] = None,
222
226
  videos: Optional[Sequence[Video]] = None,
223
227
  files: Optional[Sequence[File]] = None,
228
+ stream_events: bool = False,
224
229
  stream_intermediate_steps: bool = False,
225
230
  knowledge_filters: Optional[Dict[str, Any]] = None,
226
231
  debug_mode: Optional[bool] = None,
@@ -266,6 +271,9 @@ async def aprint_response_stream(
266
271
  if render:
267
272
  live_log.update(Group(*panels))
268
273
 
274
+ # Considering both stream_events and stream_intermediate_steps (deprecated)
275
+ stream_events = stream_events or stream_intermediate_steps
276
+
269
277
  result = agent.arun(
270
278
  input=input,
271
279
  session_id=session_id,
@@ -276,7 +284,7 @@ async def aprint_response_stream(
276
284
  videos=videos,
277
285
  files=files,
278
286
  stream=True,
279
- stream_intermediate_steps=stream_intermediate_steps,
287
+ stream_events=stream_events,
280
288
  knowledge_filters=knowledge_filters,
281
289
  debug_mode=debug_mode,
282
290
  add_history_to_context=add_history_to_context,
@@ -497,7 +505,6 @@ def print_response(
497
505
  images: Optional[Sequence[Image]] = None,
498
506
  videos: Optional[Sequence[Video]] = None,
499
507
  files: Optional[Sequence[File]] = None,
500
- stream_intermediate_steps: bool = False,
501
508
  knowledge_filters: Optional[Dict[str, Any]] = None,
502
509
  debug_mode: Optional[bool] = None,
503
510
  markdown: bool = False,
@@ -543,7 +550,6 @@ def print_response(
543
550
  videos=videos,
544
551
  files=files,
545
552
  stream=False,
546
- stream_intermediate_steps=stream_intermediate_steps,
547
553
  knowledge_filters=knowledge_filters,
548
554
  debug_mode=debug_mode,
549
555
  add_history_to_context=add_history_to_context,
@@ -615,7 +621,6 @@ async def aprint_response(
615
621
  images: Optional[Sequence[Image]] = None,
616
622
  videos: Optional[Sequence[Video]] = None,
617
623
  files: Optional[Sequence[File]] = None,
618
- stream_intermediate_steps: bool = False,
619
624
  knowledge_filters: Optional[Dict[str, Any]] = None,
620
625
  debug_mode: Optional[bool] = None,
621
626
  markdown: bool = False,
@@ -661,7 +666,6 @@ async def aprint_response(
661
666
  videos=videos,
662
667
  files=files,
663
668
  stream=False,
664
- stream_intermediate_steps=stream_intermediate_steps,
665
669
  knowledge_filters=knowledge_filters,
666
670
  debug_mode=debug_mode,
667
671
  add_history_to_context=add_history_to_context,
@@ -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
- stream_intermediate_steps = True # With streaming print response, we need to stream intermediate steps
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
- stream_intermediate_steps=stream_intermediate_steps,
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
- stream_intermediate_steps = True # With streaming print response, we need to stream intermediate steps
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
- stream_intermediate_steps=stream_intermediate_steps,
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
- stream_intermediate_steps = True # With streaming print response, we need to stream intermediate steps
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
- stream_intermediate_steps=stream_intermediate_steps,
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
- stream_intermediate_steps = True # With streaming print response, we need to stream intermediate steps
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 await workflow.arun(
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
- stream_intermediate_steps=stream_intermediate_steps,
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
- member_agent_task = "You are a member of a team of agents. Your goal is to complete the following task:"
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
- member_agent_task += f"\n\n{team_member_interactions_str}"
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 member_agent_task
25
+ return member_task_str
25
26
 
26
27
 
27
28
  def get_member_id(member: Union[Agent, "Team"]) -> str:
@@ -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
- stream_intermediate_steps: bool = False,
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
- if stream_intermediate_steps and workflow_run_response:
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 stream_intermediate_steps and workflow_run_response:
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
- stream_intermediate_steps=stream_intermediate_steps,
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 stream_intermediate_steps and workflow_run_response:
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
- if stream_intermediate_steps and workflow_run_response:
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 stream_intermediate_steps and workflow_run_response:
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
- stream_intermediate_steps=stream_intermediate_steps,
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 stream_intermediate_steps and workflow_run_response:
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
- if stream_intermediate_steps and workflow_run_response:
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 stream_intermediate_steps and workflow_run_response:
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
- stream_intermediate_steps=stream_intermediate_steps,
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 stream_intermediate_steps and workflow_run_response:
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 stream_intermediate_steps and workflow_run_response:
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
- if stream_intermediate_steps and workflow_run_response:
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 stream_intermediate_steps and workflow_run_response:
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
- stream_intermediate_steps=stream_intermediate_steps,
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 stream_intermediate_steps and workflow_run_response:
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 stream_intermediate_steps and workflow_run_response:
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
- if stream_intermediate_steps and workflow_run_response:
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
- stream_intermediate_steps=stream_intermediate_steps,
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 stream_intermediate_steps and workflow_run_response:
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
- if stream_intermediate_steps and workflow_run_response:
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
- stream_intermediate_steps=stream_intermediate_steps,
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 stream_intermediate_steps and workflow_run_response:
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
@@ -131,7 +131,7 @@ class Router:
131
131
  """Async version of step routing"""
132
132
  if callable(self.selector):
133
133
  has_session_state = session_state is not None and self._selector_has_session_state_param()
134
-
134
+
135
135
  if inspect.iscoroutinefunction(self.selector):
136
136
  if has_session_state:
137
137
  result = await self.selector(step_input, session_state) # type: ignore[call-arg]
@@ -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
- if stream_intermediate_steps and workflow_run_response:
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 stream_intermediate_steps and workflow_run_response:
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
- stream_intermediate_steps=stream_intermediate_steps,
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 stream_intermediate_steps and workflow_run_response:
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
- if stream_intermediate_steps and workflow_run_response:
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 stream_intermediate_steps and workflow_run_response:
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
- stream_intermediate_steps=stream_intermediate_steps,
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 stream_intermediate_steps and workflow_run_response:
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 "",