@@ -603,22 +603,23 @@ def _handle_values_event(
603603 if not values_messages :
604604 return responses
605605
606+ new_messages : list [dict [str , T .Any ]] = []
606607 if not state .baseline_initialized :
607608 state .baseline_initialized = True
608609 for idx , msg in enumerate (values_messages ):
609610 if not isinstance (msg , dict ):
610611 continue
612+ new_messages .append (msg )
611613 msg_id = get_message_id (msg )
612614 if msg_id :
613615 self ._remember_seen_message_id (state , msg_id )
614616 continue
615617 state .no_id_message_fingerprints [idx ] = self ._fingerprint_message (msg )
616- return responses
617-
618- new_messages = self ._extract_new_messages_from_values (
619- values_messages ,
620- state ,
621- )
618+ else :
619+ new_messages = self ._extract_new_messages_from_values (
620+ values_messages ,
621+ state ,
622+ )
622623 latest_text = ""
623624 if new_messages :
624625 state .run_values_messages .extend (new_messages )
@@ -675,28 +676,30 @@ def _handle_message_event(
675676 state .clarification_text = maybe_clarification
676677 return response
677678
678- def _resolve_final_output (self , state : _StreamState ) -> tuple [MessageChain , bool ]:
679- failures_only = False
680- final_chain = MessageChain ()
681-
682- # Clarification tool output should take precedence over partial AI/tool-call text.
679+ def _select_final_chain (self , state : _StreamState ) -> tuple [MessageChain , bool ]:
683680 if state .clarification_text :
684- final_chain = MessageChain (chain = [Comp .Plain (state .clarification_text )])
685- else :
686- latest_ai_message = extract_latest_ai_message (state .run_values_messages )
687- if latest_ai_message :
688- final_chain = self ._build_chain_from_ai_content (
689- latest_ai_message .get ("content" ),
690- )
681+ return MessageChain (chain = [Comp .Plain (state .clarification_text )]), False
682+
683+ latest_ai_message = extract_latest_ai_message (state .run_values_messages )
684+ if latest_ai_message :
685+ chain_from_values = self ._build_chain_from_ai_content (
686+ latest_ai_message .get ("content" ),
687+ )
688+ if chain_from_values .chain :
689+ return chain_from_values , False
690+
691+ if state .latest_text :
692+ return MessageChain (chain = [Comp .Plain (state .latest_text )]), False
691693
692- if not final_chain .chain and state .latest_text :
693- final_chain = MessageChain (chain = [Comp .Plain (state .latest_text )])
694+ failure_text = build_task_failure_summary (state .task_failures )
695+ if failure_text :
696+ return MessageChain (chain = [Comp .Plain (failure_text )]), True
694697
695- if not final_chain . chain :
696- failure_text = build_task_failure_summary ( state . task_failures )
697- if failure_text :
698- final_chain = MessageChain ( chain = [ Comp . Plain ( failure_text )])
699- failures_only = True
698+ return MessageChain (), False
699+
700+ def _resolve_final_output ( self , state : _StreamState ) -> tuple [ MessageChain , bool ] :
701+ # Clarification and values/message-derived output share a single selection path.
702+ final_chain , failures_only = self . _select_final_chain ( state )
700703
701704 if not final_chain .chain :
702705 logger .warning ("DeerFlow returned no text content in stream events." )
0 commit comments