工具图像修复 Anonymousnake/dsh-cline-pass-toolimage-fix
DeepSeek Harness让工具返回的图片真正送达模型,不再被静默丢弃
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
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 44 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
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).预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Anonymousnake/dsh-cline-pass-toolimage-fix
让工具返回的图片真正送达模型,不再被静默丢弃
相关插件 · 视觉能力
智能体工作台Devin-AXIS/iPolloWork
企业级、本地优先的智能体工作台,面向个人和智能体团队——一个工作区,容纳多个智能体引擎;一套统一体系,管理插件和技能;支…
★ 7,364已汉化DSH
72
开源设计工作台nexu-io/open-design
OpenDesign:首个协作式 AI 设计智能体工作区
★ 105,709已汉化DSH
71.8
GPT 图像提示词库freestylefly/awesome-gpt-image-2
Prompt as Code | GPT Image 2 / 2.5 提示词与案例库,530+ 个案例、20+…
★ 34,534已汉化DSH
71.5
多智能体编码工作区spacering-net/codeg
多智能体协作的 AI 编程工作区:汇总 Claude Code、Codex、OpenCode、Pi、Grok Build 等来源的会话。支持桌面应用、自托管服务器或 Docker。
★ 4,319已汉化DSH
71.5
AI 用量桌面小部件Javis603/token-monitor
EN | 简 | 繁 | KO | JA | PT
★ 3,533已汉化DSH
71.1
架构图生成器tt-a1i/archify
把你想理解、规划或分享的事,变成可以互动的可视化作品。
★ 93,105已汉化DSH
71.1
这是你的仓库?认领条目