[P1/高] sse-stream flushToolCallBuffer 静默丢弃 JSON 解析失败的工具调用 #25

Open
opened 2026-07-21 21:55:53 +08:00 by thzxx · 0 comments
Owner

问题类型

缺陷 / 高 / LLM 适配器

文件位置

electron/harness/adapters/shared/sse-stream.ts

问题描述

SSE 流接收工具调用 delta 时累积到 buffer,结束后尝试 JSON.parse。
解析失败时:

try {
  args = JSON.parse(buffer.argsBuffer);
} catch {
  // 静默丢弃
  return;
}

这导致:

  1. LLM 生成的非法 JSON 工具调用被完全丢弃,无错误事件
  2. LLM 可能误以为工具已执行,但实际未执行
  3. 前端无任何提示,调试困难
  4. ReAct 循环可能陷入死循环(LLM 反复尝试相同调用)

影响

  • 工具调用丢失
  • ReAct 循环异常
  • 用户体验差

建议修复

  1. 抛出错误事件:发射 RETRY ERROR 事件,让 Engine 重试
  2. 降级处理:尝试修复 JSON(如添加缺失的引号、逗号)
  3. 告知 LLM:将解析失败作为 tool result 返回,让 LLM 修正
try {
  args = JSON.parse(buffer.argsBuffer);
} catch (err) {
  // 发射错误事件,触发 Engine 重试
  this.emit('error', {
    type: 'error',
    error: {
      code: 'RETRY',
      message: `Tool call JSON parse failed: ${err.message}`,
      raw: buffer.argsBuffer,
    },
  });
  return;
}

同时记录日志便于排查。

## 问题类型 缺陷 / 高 / LLM 适配器 ## 文件位置 `electron/harness/adapters/shared/sse-stream.ts` ## 问题描述 SSE 流接收工具调用 delta 时累积到 buffer,结束后尝试 JSON.parse。 解析失败时: ```ts try { args = JSON.parse(buffer.argsBuffer); } catch { // 静默丢弃 return; } ``` 这导致: 1. **LLM 生成的非法 JSON 工具调用被完全丢弃**,无错误事件 2. LLM 可能误以为工具已执行,但实际未执行 3. 前端无任何提示,调试困难 4. ReAct 循环可能陷入死循环(LLM 反复尝试相同调用) ## 影响 - 工具调用丢失 - ReAct 循环异常 - 用户体验差 ## 建议修复 1. **抛出错误事件**:发射 RETRY ERROR 事件,让 Engine 重试 2. **降级处理**:尝试修复 JSON(如添加缺失的引号、逗号) 3. **告知 LLM**:将解析失败作为 tool result 返回,让 LLM 修正 ```ts try { args = JSON.parse(buffer.argsBuffer); } catch (err) { // 发射错误事件,触发 Engine 重试 this.emit('error', { type: 'error', error: { code: 'RETRY', message: `Tool call JSON parse failed: ${err.message}`, raw: buffer.argsBuffer, }, }); return; } ``` 同时记录日志便于排查。
thzxx added the LLM?????? labels 2026-07-21 21:55:53 +08:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: MetonaTeam/metona-ai-desktop#25