Issue #7 主要讨论图片"收不到"的问题(已修复),但即使图片成功下载并传给 Claude,识别准确度也远不如终端直接粘贴。用 mimo-v2.5 时尤其明显——同一张图终端能精准描述,微信端出现幻觉。
根因
当前 provider.ts 的图片传递方式多了两次 API 往返:
图片 → saveImageTemp(/tmp/xxx.png)
→ prompt "[图片已下载到本地] 请用 Read 工具"
→ Claude 调用 Read(tool_use)
→ tool_result 返回图片
→ Claude 分析
模型在处理这种"间接引用"时容易在文字 prompt 和图片数据之间产生混淆。
修复:stream-json base64 直接注入
参考 Pikiloom 的 buildClaudeUserMessage(agent/drivers/claude.ts:35)和 cc-connect 的 MCP ImageContent schema,图片应该以 base64 content block 直接嵌入 stdin,用 --input-format stream-json:
// provider.ts — 替换 saveImageTemp / cleanupTempFiles 逻辑
const hasImages = images && images.length > 0;
if (hasImages) args.push("--input-format", "stream-json");
let stdinInput: string;
if (hasImages) {
const content: any[] = [];
for (const img of images!) {
content.push({
type: "image",
source: {
type: "base64",
media_type: img.source.media_type,
data: img.source.data,
},
});
}
content.push({ type: "text", text: prompt });
stdinInput = JSON.stringify({
type: "user",
message: { role: "user", content },
}) + "\n";
} else {
stdinInput = prompt;
}
child.stdin!.write(stdinInput);
同时删除 system prompt 里关于 Read 工具的指令(main.ts 中 "当收到 [图片已下载到本地] 标记时..." 那段)。
效果
之前: prompt → tool_call(Read) → tool_result → answer(3+ hops,mimo-v2.5 幻觉严重)
现在: prompt + image → answer(1 hop,跟终端直接粘贴完全相同的 API 路径)
仅图片走 base64 注入;文件(PDF/Word/语音)仍走 Read 工具(stream-json 不支持 file content block)
base64 会让 stdin 变大(截图约 2-6MB),但 Node.js pipe 完全能处理
只改 provider.ts ~30 行 + main.ts 删一行 system prompt,不涉及架构变动
本地测试通过。
Issue #7 主要讨论图片"收不到"的问题(已修复),但即使图片成功下载并传给 Claude,识别准确度也远不如终端直接粘贴。用 mimo-v2.5 时尤其明显——同一张图终端能精准描述,微信端出现幻觉。
根因
当前 provider.ts 的图片传递方式多了两次 API 往返:
图片 → saveImageTemp(/tmp/xxx.png)
→ prompt "[图片已下载到本地] 请用 Read 工具"
→ Claude 调用 Read(tool_use)
→ tool_result 返回图片
→ Claude 分析
模型在处理这种"间接引用"时容易在文字 prompt 和图片数据之间产生混淆。
修复:stream-json base64 直接注入
参考 Pikiloom 的 buildClaudeUserMessage(agent/drivers/claude.ts:35)和 cc-connect 的 MCP ImageContent schema,图片应该以 base64 content block 直接嵌入 stdin,用 --input-format stream-json:
// provider.ts — 替换 saveImageTemp / cleanupTempFiles 逻辑
const hasImages = images && images.length > 0;
if (hasImages) args.push("--input-format", "stream-json");
let stdinInput: string;
if (hasImages) {
const content: any[] = [];
for (const img of images!) {
content.push({
type: "image",
source: {
type: "base64",
media_type: img.source.media_type,
data: img.source.data,
},
});
}
content.push({ type: "text", text: prompt });
stdinInput = JSON.stringify({
type: "user",
message: { role: "user", content },
}) + "\n";
} else {
stdinInput = prompt;
}
child.stdin!.write(stdinInput);
同时删除 system prompt 里关于 Read 工具的指令(main.ts 中 "当收到 [图片已下载到本地] 标记时..." 那段)。
效果
之前: prompt → tool_call(Read) → tool_result → answer(3+ hops,mimo-v2.5 幻觉严重)
现在: prompt + image → answer(1 hop,跟终端直接粘贴完全相同的 API 路径)
仅图片走 base64 注入;文件(PDF/Word/语音)仍走 Read 工具(stream-json 不支持 file content block)
base64 会让 stdin 变大(截图约 2-6MB),但 Node.js pipe 完全能处理
只改 provider.ts ~30 行 + main.ts 删一行 system prompt,不涉及架构变动
本地测试通过。