🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

工具图像修复 Anonymousnake/dsh-cline-pass-toolimage-fix

DeepSeek Harness
Anonymousnake44 天前有提交已提供中文文档扫描:含敏感能力

让工具返回的图片真正送达模型,不再被静默丢弃

29.3/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/9/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add Anonymousnake/dsh-cline-pass-toolimage-fix
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:已验证
是什么
dsh 原生插件 · vision
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 44 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🔵 扫描:含敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。

读写/删除本地文件读取剪贴板或密钥环境变量发起外部网络请求
查看扫描证据(共 16 处,展示前 15 条)
  • 读取本地文件
    apply-fix.mjs:42
    if (!existsSync(profiles)) return []
  • 读取本地文件
    apply-fix.mjs:44
    for (const profile of readdirSync(profiles)) {
  • 读取本地文件
    apply-fix.mjs:46
    if (existsSync(target) && statSync(target).isFile()) found.push(target)
  • 读取本地文件
    apply-fix.mjs:46
    if (existsSync(target) && statSync(target).isFile()) found.push(target)
  • 读取本地文件
    apply-fix.mjs:59
    const current = readFileSync(target)
  • 写入本地文件
    apply-fix.mjs:72
    copyFileSync(target, backup)
  • 读取本地文件
    apply-fix.mjs:73
    writeFileSync(target, readFileSync(fixedPath))
  • 写入本地文件
    apply-fix.mjs:73
    writeFileSync(target, readFileSync(fixedPath))
  • 写入本地文件
    apply-fix.mjs:75
    copyFileSync(backup, target)
  • 发起网络请求
    files/adapter-0.1.1.fixed.js:559
    response = await fetch(chatURL(account.baseURL), {
  • 发起网络请求
    files/adapter-0.1.1.orig.js:507
    response = await fetch(chatURL(account.baseURL), {
  • 写入本地文件
    repro/generate-sample.mjs:77
    writeFileSync(target, png)
  • 读取密钥环境变量
    repro/probe.mjs:30
    const key = process.env.CLINE_PASS_API_KEY
  • 读取本地文件
    repro/probe.mjs:36
    const png = readFileSync(new URL('./sample.png', import.meta.url))
  • 发起网络请求
    repro/probe.mjs:42
    const response = await fetch(`${baseURL}/chat/completions`, {
扫描于 2026/11/4(0 天前) · 范围 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 修复工具图片丢失
  • 图片送达模型

dsh-cline-pass:工具(read_image)返回的图片从未送达模型——根因、修复与复现

README

由 DeepSeek 最新模型翻译生成
dsh-cline-pass:工具结果图像从未到达模型 针对 dsh-cline-pass 提供商上由工具(harness 的 read_image)产生的图像的即插即用修复。用户附加的图像本来就能正常工作;由工具调用返回的图像在请求序列化期间被静默丢弃,因此模型只能读到文本信封(image/png image, 754x547 px, 17193 bytes),背后没有任何像素。 简体中文说明见下方。 根本原因 dsh-cline-pass/lib/adapter.js,serializeMessages()。工具结果被仅按文本展平为 OpenAI 的 role:"tool" 消息: content: flattenText(result.content) || '(no output)' read_image 返回 [{type:'text'}, {type:'image', attachment:{...}}] (dsh-tool-fs → imageReadContent()),因此 image 块从未到达传输层。 role:"user" 路径没有问题,这就是为什么只有工具产生的图像受到影响。
展开完整文档(README 剩余 1 节)
dsh-cline-pass:工具结果图像从未到达模型

针对 dsh-cline-pass 提供商上由工具(harness 的 read_image)产生的图像的即插即用修复。用户附加的图像本来就能正常工作;由工具调用返回的图像在请求序列化期间被静默丢弃,因此模型只能读到文本信封(image/png image, 754x547 px, 17193 bytes),背后没有任何像素。

简体中文说明见下方。

根本原因

dsh-cline-pass/lib/adapter.js,serializeMessages()。工具结果被仅按文本展平为 OpenAI 的 role:"tool" 消息:

content: flattenText(result.content) || '(no output)'

read_image 返回 [{type:'text'}, {type:'image', attachment:{...}}] (dsh-tool-fs → imageReadContent()),因此 image 块从未到达传输层。
role:"user" 路径没有问题,这就是为什么只有工具产生的图像受到影响。

为什么图像不能搭载在工具消息内部

针对 Cline Pass 端点、同一合成样本、三种传输形态进行测量:

| 形态 | 结果 |
| 用户消息内的 image_url | 模型描述该图像 |
| role:"tool" 内容数组内的 image_url | 模型回答 NO_IMAGE |
| 在工具消息之后将图像提升到用户消息中 | 模型描述该图像 |

因此网关会忽略 role:"tool" 上的图像部分。修复方案是将它们提升出来,而不是试图让工具消息承载它们。

修复

serializeMessages() 中有两处改动,外加一个新辅助函数:

1. toolResultImageParts(result, images) 遍历工具结果(递归地),并将每个嵌套的 image 块具体化为 image_url data URI。无法解析的引用会抛出 UNSUPPORTED_CONTENT,与现有行为一致。
2. serializeMessages() 记录 tool-call id → name 的映射,保持工具消息仅含文本,并追加一条用户消息,携带该步骤提升出的图像,每个都标注为 Image returned by the tool call ():。

纯文本历史记录和用户附加的图像与之前走完全相同的路径。

应用

node apply-fix.mjs # patches every profile holding the plugin
node apply-fix.mjs --dry-run # report only

该脚本仅重写随附的 0.1.1 版 adapter.js(通过 SHA-256 13927d66… 匹配),将其备份到原文件旁边,并在验证失败时回滚。
任何其他修订版本只会被报告,不会被改动——请改用补丁:

git apply adapter-toolimage.patch # inside dsh-cline-pass/lib

然后重启 dsh web:插件代码在启动时加载,没有宿主插件 HMR。
dsh plugin update dsh-cline-pass 会覆盖此修复;之后请重新应用。

验证

node repro/generate-sample.mjs repro/sample.png # synthetic sample, no real documents
set CLINE_PASS_API_KEY=sk_...
node repro/probe.mjs

形态 A 和 C 必须描述该样本(三条色带);形态 B 预期会回答 NO_IMAGE——这种不对称正是整个 bug 所在。

文件

| 路径 | 内容 |
| files/adapter-0.1.1.orig.js | 未修改的随附适配器(0.1.1) |
| files/adapter-0.1.1.fixed.js | 已修补的适配器 |
| adapter-toolimage.patch | 针对 0.1.1 的统一 diff |
| apply-fix.mjs | 安装 / 验证 / 回滚 |
| repro/probe.mjs | 三种形态的复现 |
| repro/generate-sample.mjs | 构建合成示例 PNG |

上游状态

已发布的包(最新 0.1.1)仍然存在该 bug。其 npm 元数据中没有 repository 字段,因此没有可提交 pull request 的上游仓库——本仓库取而代之,作为分发点。

已知限制

dsh-cline-pass 没有请求图像预算:历史记录中的每张图像都会被重新编码进每个请求体。包含大量图像的长时间会话会相应地增长。此处不予讨论。

中文说明

现象:模型 cline-pass/* 下调用 read_image 读图,工具成功返回 image/png image, 754x547 px,但模型只拿到这段文字元数据,看不到图像内容;用户自己贴图正常。

根因:dsh-cline-pass/lib/adapter.js 的 serializeMessages() 把工具结果压成 role:"tool" 消息时只取文本(flattenText(result.content)),read_image 返回的 image 块被丢在这一步。

为什么不能塞进 tool 消息:实测网关会忽略 role:"tool" 里的 image_url(模型回 NO_IMAGE),放进 user 消息才可见。所以修复采取"把工具产出的图提升为紧随其后的 user 消息"。

应用:node apply-fix.mjs,然后重启 dsh web(无 host 插件 HMR)。
dsh plugin update 会覆盖,升级后重打一次。

License

MIT. The patched files are derivative works of dsh-cline-pass (MIT, © its authors).
预览分享卡片长什么样 ↓Anonymousnake/dsh-cline-pass-toolimage-fix
分享 · DeepSeek Harness Hub
Anonymousnake/dsh-cline-pass-toolimage-fix

让工具返回的图片真正送达模型,不再被静默丢弃

这是你的仓库?认领条目

回到顶部