Skip to content

Commit 8a40e14

Browse files
committed
fix: preserve first deerflow values payload and simplify runner flow
1 parent ce1a79c commit 8a40e14

2 files changed

Lines changed: 141 additions & 221 deletions

File tree

astrbot/core/agent/runners/deerflow/deerflow_agent_runner.py

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)