Skip to content

照片传输幻觉问题 #43

Description

@OUENMING

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,不涉及架构变动
本地测试通过。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions