fix: prevent duplicate TTS when LLM streams text before tool call

This commit is contained in:
Rui Xu
2026-04-06 21:49:28 +08:00
parent c5f82369e5
commit 389e8559aa
+14 -8
View File
@@ -1082,11 +1082,12 @@ class ConnectionHandler:
f"工具调用统计更新: 当前轮次={current_turn}"
)
# 如需要大模型先处理一轮,添加相关处理后的日志情况
# LLM 流式阶段已播报过的文本
streamed_text = ""
if len(response_message) > 0:
text_buff = "".join(response_message)
self.tts_MessageText = text_buff
self.dialogue.put(Message(role="assistant", content=text_buff))
streamed_text = "".join(response_message)
self.tts_MessageText = streamed_text
self.dialogue.put(Message(role="assistant", content=streamed_text))
response_message.clear()
# 收集所有工具调用的 Future
@@ -1134,7 +1135,7 @@ class ConnectionHandler:
# 统一处理工具调用结果
if tool_results:
self._handle_function_result(tool_results, depth=depth)
self._handle_function_result(tool_results, depth=depth, streamed_text=streamed_text)
# 存储对话内容
if len(response_message) > 0:
@@ -1194,7 +1195,7 @@ class ConnectionHandler:
result = "".join(datas)
return result
def _handle_function_result(self, tool_results, depth):
def _handle_function_result(self, tool_results, depth, streamed_text=""):
need_llm_tools = []
for result, tool_call_data in tool_results:
@@ -1202,9 +1203,14 @@ class ConnectionHandler:
Action.RESPONSE,
Action.NOTFOUND,
Action.ERROR,
]: # 直接回复前端
]:
text = result.response if result.response else result.result
self.tts.tts_one_sentence(self, ContentType.TEXT, content_detail=text)
if streamed_text:
self.logger.bind(tag=TAG).debug(
f"Skipping duplicate TTS for tool {tool_call_data['name']}, already streamed"
)
else:
self.tts.tts_one_sentence(self, ContentType.TEXT, content_detail=text)
self.dialogue.put(Message(role="assistant", content=text))
elif result.action == Action.REQLLM:
# 收集需要 LLM 处理的工具