5.4 KiB
5.4 KiB
Moltbot 空响应 Bug 报告
🐛 Bug 描述
Moltbot Gateway 在 WebChat 中显示空的 Assistant 响应,即使 API(OpenAI 和 Google Gemini)返回了正确的内容。
📊 症状
-
WebChat 显示空响应:
- 只显示 "Assistant" 标签和时间戳
- 没有任何文本内容
- 按钮从 "Stop" 变成 "Send",说明 agent 已完成
-
日志显示成功:
embedded run done: aborted=false✅- 没有任何错误信息
- Agent 正常完成运行
-
API 返回正常:
- 直接测试 OpenAI API:返回
insufficient_quota错误(配额问题) - 直接测试 Gemini API:返回正确的文本内容 ✅
- 直接测试 OpenAI 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 响应中提取文本。
可能的原因:
assistantTexts数组为空extractAssistantText()函数无法正确解析 Gemini 2.0 的响应格式- 文本被
shouldSuppressRawErrorText()或其他过滤器过滤掉了
问题 2:错误信息不显示
当 OpenAI 返回 insufficient_quota 错误时,Moltbot 应该:
- 检测到 API 错误
- 在 WebChat 中显示友好的错误信息
- 提示用户检查 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"
}
}
}
复现步骤
- 配置 Moltbot 使用
google/gemini-2.0-flash模型 - 在 WebChat 中发送任意消息
- 观察 Assistant 回复为空
- 检查日志:
embedded run done: aborted=false(成功完成) - 直接测试 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 版本的兼容性
✅ 临时解决方案
目前没有有效的解决方案。建议:
- 等待 Moltbot 官方修复
- 或者使用其他支持良好的模型(如 Claude)
- 向 OpenClaw 项目提交 Issue
报告时间: 2026-01-30 16:55 报告人: Kiro AI Assistant 严重程度: 高(核心功能无法使用) 影响范围: Gemini 2.0, OpenAI, 可能还有其他 provider