@@ -663,7 +663,13 @@ async def run(
663663 tool_output_guardrail_results = tool_output_guardrail_results ,
664664 context_wrapper = context_wrapper ,
665665 )
666- await self ._save_result_to_session (session , [], turn_result .new_step_items )
666+ if not any (
667+ guardrail_result .output .tripwire_triggered
668+ for guardrail_result in input_guardrail_results
669+ ):
670+ await self ._save_result_to_session (
671+ session , [], turn_result .new_step_items
672+ )
667673
668674 return result
669675 elif isinstance (turn_result .next_step , NextStepHandoff ):
@@ -672,7 +678,13 @@ async def run(
672678 current_span = None
673679 should_run_agent_start_hooks = True
674680 elif isinstance (turn_result .next_step , NextStepRunAgain ):
675- await self ._save_result_to_session (session , [], turn_result .new_step_items )
681+ if not any (
682+ guardrail_result .output .tripwire_triggered
683+ for guardrail_result in input_guardrail_results
684+ ):
685+ await self ._save_result_to_session (
686+ session , [], turn_result .new_step_items
687+ )
676688 else :
677689 raise AgentsException (
678690 f"Unknown next step type: { type (turn_result .next_step )} "
@@ -1041,15 +1053,29 @@ async def _start_streaming(
10411053 streamed_result .is_complete = True
10421054
10431055 # Save the conversation to session if enabled
1044- await AgentRunner ._save_result_to_session (
1045- session , [], turn_result .new_step_items
1046- )
1056+ if session is not None :
1057+ should_skip_session_save = (
1058+ await AgentRunner ._input_guardrail_tripwire_triggered_for_stream (
1059+ streamed_result
1060+ )
1061+ )
1062+ if should_skip_session_save is False :
1063+ await AgentRunner ._save_result_to_session (
1064+ session , [], turn_result .new_step_items
1065+ )
10471066
10481067 streamed_result ._event_queue .put_nowait (QueueCompleteSentinel ())
10491068 elif isinstance (turn_result .next_step , NextStepRunAgain ):
1050- await AgentRunner ._save_result_to_session (
1051- session , [], turn_result .new_step_items
1052- )
1069+ if session is not None :
1070+ should_skip_session_save = (
1071+ await AgentRunner ._input_guardrail_tripwire_triggered_for_stream (
1072+ streamed_result
1073+ )
1074+ )
1075+ if should_skip_session_save is False :
1076+ await AgentRunner ._save_result_to_session (
1077+ session , [], turn_result .new_step_items
1078+ )
10531079 except AgentsException as exc :
10541080 streamed_result .is_complete = True
10551081 streamed_result ._event_queue .put_nowait (QueueCompleteSentinel ())
@@ -1719,6 +1745,24 @@ async def _save_result_to_session(
17191745 items_to_save = input_list + new_items_as_input
17201746 await session .add_items (items_to_save )
17211747
1748+ @staticmethod
1749+ async def _input_guardrail_tripwire_triggered_for_stream (
1750+ streamed_result : RunResultStreaming ,
1751+ ) -> bool :
1752+ """Return True if any input guardrail triggered during a streamed run."""
1753+
1754+ task = streamed_result ._input_guardrails_task
1755+ if task is None :
1756+ return False
1757+
1758+ if not task .done ():
1759+ await task
1760+
1761+ return any (
1762+ guardrail_result .output .tripwire_triggered
1763+ for guardrail_result in streamed_result .input_guardrail_results
1764+ )
1765+
17221766
17231767DEFAULT_AGENT_RUNNER = AgentRunner ()
17241768_TOOL_CALL_TYPES : tuple [type , ...] = get_args (ToolCallItemTypes )
0 commit comments