问题概述
在使用 WorkBuddy 调用小米 MiMo 模型(mimo-v2.5)进行图片理解时,遇到 API 返回 400 错误,错误信息为:Param Incorrect - text is not set。
本文详细记录了这个问题的发现、分析和修复过程,供有类似问题的开发者参考。
错误信息
{ "error": { "code": "400", "message": "Param Incorrect", "param": "text is not set", "type": "" } }
问题根因分析
经过对请求数据的深入分析,发现问题由两个原因共同导致:
问题 1:role 角色错误
WorkBuddy 将工具返回的图片结果放在 role: "tool" 消息中,但 MiMo API 遵循 OpenAI 的 Chat Completion 格式标准,tool 角色消息不支持多模态内容(图片)。只有 user 角色消息可以包含 image_url。
WorkBuddy 实际发送的格式:
{ "role": "tool", "content": [{ "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo..." } }] }
问题 2:缺少 text 对象
即使角色修正为 user,MiMo API 还要求 content 数组必须同时包含图片对象和独立的 text 对象。
MiMo API 期望的格式:
{ "role": "user", "content": [{ "type": "image_url", "image_url": { "url": "data:image/png;base64,iVBORw0KGgo..." } }, { "type": "text", "text": "请描述这张图片的内容" }] }
修复方案
在 WorkBuddy 构造多模态请求时,需要同时做两件事:
- 修正 role:将工具返回的图片消息的 role 从
"tool"改为"user",并清理tool_call_id字段 - 补充 text:当 content 数组中包含 image_url 时,确保同时存在
type: "text"对象
参考实现代码
def build_multimodal_message(msg): content = msg.get("content", []); has_image = any(item.get("type") == "image_url" for item in content if isinstance(item, dict)); if has_image and msg.get("role") == "tool": msg["role"] = "user"; msg.pop("tool_call_id", None); has_text = any(item.get("type") == "text" for item in content if isinstance(item, dict)); if has_image and not has_text: content.append({"type": "text", "text": "请描述这张图片的内容"})
临时解决方案(代理层修复)
已通过 WorkBuddy Monitor 的 MITM 代理实现请求时自动修复:
- 拦截发往
token-plan-cn.xiaomimimo.com的请求 - 检测
role: "tool"消息中的图片,自动转为role: "user" - 检测缺失的
text对象,自动补上默认描述 - 已确认修复生效(连续 5 次请求成功,200)
影响范围
影响模型:Xiaomi MiMo (mimo-v2.5, mimo-v2-omni)
触发场景:任何涉及图片理解的功能(截图分析、OCR、图表解读等)
错误类型:API 400 错误,请求被拒绝
根本责任方:WorkBuddy 官方(请求构造逻辑)
总结
这是一个典型的多模态 API 兼容性问题。WorkBuddy 在构造请求时未充分考虑 MiMo API 的特殊要求,导致图片理解功能无法正常使用。
建议 WorkBuddy 官方尽快在正式版本中修复此问题,或者在调用 MiMo 等特殊模型时自动进行格式转换。
报告人:Starry
报告日期:2026-05-07
验证状态:已通过代理层临时修复
