openclaw/bug-report.md

5.4 KiB
Raw Blame History

Moltbot 空响应 Bug 报告

🐛 Bug 描述

Moltbot Gateway 在 WebChat 中显示空的 Assistant 响应,即使 APIOpenAI 和 Google Gemini返回了正确的内容。

📊 症状

  1. WebChat 显示空响应

    • 只显示 "Assistant" 标签和时间戳
    • 没有任何文本内容
    • 按钮从 "Stop" 变成 "Send",说明 agent 已完成
  2. 日志显示成功

    • embedded run done: aborted=false
    • 没有任何错误信息
    • Agent 正常完成运行
  3. API 返回正常

    • 直接测试 OpenAI API返回 insufficient_quota 错误(配额问题)
    • 直接测试 Gemini API返回正确的文本内容

🔬 测试证据

Gemini 2.0 Flash 测试

直接 API 调用

curl -x http://192.168.1.110:8899 \
  -H 'Content-Type: application/json' \
  -d '{"contents":[{"parts":[{"text":"你好,请用中文回复\"收到\""}]}]}' \
  "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=AIzaSyCB..."

返回

{
  "candidates": [{
    "content": {
      "parts": [{"text": "收到。\n"}],
      "role": "model"
    },
    "finishReason": "STOP"
  }]
}

API 返回了正确的内容:"收到。"

Moltbot WebChat 测试

  • 发送消息:"Gemini 2.0 测试:你好,请用中文回复"收到""
  • 结果Assistant 回复为空(只显示标签和时间)
  • 日志:embedded run done: durationMs=56381 aborted=false

Moltbot 没有显示任何内容

OpenAI GPT-4o-mini 测试

直接 API 调用

curl -x http://192.168.1.110:8899 \
  -H "Authorization: Bearer sk-proj-..." \
  -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"你好"}]}'

返回

{
  "error": {
    "message": "You exceeded your current quota",
    "type": "insufficient_quota"
  }
}

OpenAI 配额用完(这是预期的错误)

Moltbot WebChat 测试

  • 发送消息:"OpenAI 配置成功测试:你好"
  • 结果Assistant 回复为空
  • 日志:embedded run done: durationMs=33063 aborted=false

Moltbot 没有显示错误信息

🔍 根本原因分析

问题 1响应文本提取失败

Moltbot 的 buildEmbeddedRunPayloads 函数(src/agents/pi-embedded-runner/run/payloads.ts)负责从 API 响应中提取文本。

可能的原因:

  1. assistantTexts 数组为空
  2. extractAssistantText() 函数无法正确解析 Gemini 2.0 的响应格式
  3. 文本被 shouldSuppressRawErrorText() 或其他过滤器过滤掉了

问题 2错误信息不显示

当 OpenAI 返回 insufficient_quota 错误时Moltbot 应该:

  1. 检测到 API 错误
  2. 在 WebChat 中显示友好的错误信息
  3. 提示用户检查 API 配额

但实际上Moltbot 只是返回空响应,没有任何错误提示。

🛠️ 复现步骤

环境

  • Moltbot 版本2026.1.27-beta.1
  • 部署方式Docker Compose
  • 操作系统Synology NAS (Linux)
  • 代理mihomo (http://192.168.1.110:8899)

配置

moltbot.json

{
  "agents": {
    "defaults": {
      "model": {
        "primary": "google/gemini-2.0-flash"
      },
      "models": {
        "google/gemini-2.0-flash": {},
        "openai/gpt-4o-mini": {}
      }
    }
  },
  "env": {
    "GOOGLE_API_KEY": "AIzaSyCB-kAc2xCTwLAVBBmGs6Up7NKAg03PQ5Q",
    "HTTP_PROXY": "http://192.168.1.110:8899",
    "HTTPS_PROXY": "http://192.168.1.110:8899"
  }
}

auth-profiles.json

{
  "version": 1,
  "profiles": {
    "google:default": {
      "type": "api_key",
      "provider": "google",
      "key": "AIzaSyCB-kAc2xCTwLAVBBmGs6Up7NKAg03PQ5Q"
    }
  }
}

复现步骤

  1. 配置 Moltbot 使用 google/gemini-2.0-flash 模型
  2. 在 WebChat 中发送任意消息
  3. 观察 Assistant 回复为空
  4. 检查日志:embedded run done: aborted=false(成功完成)
  5. 直接测试 Gemini API返回正确内容

💡 建议修复

1. 改进响应解析

src/agents/pi-embedded-runner/run/payloads.ts 中:

  • 添加调试日志,记录 assistantTexts 的内容
  • 检查 extractAssistantText() 是否正确处理 Gemini 2.0 的响应格式
  • 确保文本不会被意外过滤

2. 改进错误处理

当 API 返回错误时:

  • 检测错误类型quota, rate_limit, invalid_key 等)
  • 在 WebChat 中显示友好的错误信息
  • 提供可操作的建议(如"请检查 API 配额"

3. 添加诊断工具

  • 在 WebChat 中添加"显示原始响应"选项
  • 在日志中记录 API 响应的完整内容
  • 提供调试模式,显示响应解析的每个步骤

📝 相关文件

  • src/agents/pi-embedded-runner/run.ts - Agent 运行逻辑
  • src/agents/pi-embedded-runner/run/payloads.ts - 响应解析逻辑
  • src/agents/pi-embedded-subscribe.ts - 响应订阅和文本提取
  • src/agents/pi-embedded-utils.ts - 文本提取工具函数

🔗 相关 Issue

  • 这个 bug 影响所有使用 Gemini 2.0 和 OpenAI 的用户
  • 可能与 Gemini 3.0 的空响应问题相关
  • 需要检查 Moltbot 对不同 API 版本的兼容性

临时解决方案

目前没有有效的解决方案。建议:

  1. 等待 Moltbot 官方修复
  2. 或者使用其他支持良好的模型(如 Claude
  3. 向 OpenClaw 项目提交 Issue

报告时间: 2026-01-30 16:55 报告人: Kiro AI Assistant 严重程度: 高(核心功能无法使用) 影响范围: Gemini 2.0, OpenAI, 可能还有其他 provider