@@ -671,6 +671,9 @@ async def execute_tools_and_side_effects(
671671 potential_final_output_text = (
672672 ItemHelpers .extract_text (message_items [- 1 ].raw_item ) if message_items else None
673673 )
674+ potential_final_output_refusal = (
675+ ItemHelpers .extract_refusal (message_items [- 1 ].raw_item ) if message_items else None
676+ )
674677
675678 if not processed_response .has_tools_or_approvals_to_run ():
676679 has_tool_activity_without_message = not message_items and bool (
@@ -691,14 +694,33 @@ async def execute_tools_and_side_effects(
691694 tool_input_guardrail_results = tool_input_guardrail_results ,
692695 tool_output_guardrail_results = tool_output_guardrail_results ,
693696 )
697+ if (
698+ output_schema
699+ and not output_schema .is_plain_text ()
700+ and potential_final_output_refusal
701+ ):
702+ return await execute_final_output_call (
703+ public_agent = public_agent ,
704+ original_input = original_input ,
705+ new_response = new_response ,
706+ pre_step_items = pre_step_items ,
707+ new_step_items = new_step_items ,
708+ final_output = potential_final_output_refusal ,
709+ hooks = hooks ,
710+ context_wrapper = context_wrapper ,
711+ tool_input_guardrail_results = tool_input_guardrail_results ,
712+ tool_output_guardrail_results = tool_output_guardrail_results ,
713+ )
694714 if not output_schema or output_schema .is_plain_text ():
695715 return await execute_final_output_call (
696716 public_agent = public_agent ,
697717 original_input = original_input ,
698718 new_response = new_response ,
699719 pre_step_items = pre_step_items ,
700720 new_step_items = new_step_items ,
701- final_output = potential_final_output_text or "" ,
721+ final_output = potential_final_output_text
722+ or potential_final_output_refusal
723+ or "" ,
702724 hooks = hooks ,
703725 context_wrapper = context_wrapper ,
704726 tool_input_guardrail_results = tool_input_guardrail_results ,
0 commit comments