deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
dsh-show-image
展示给用户,绝不喂给模型。
🖼️ 纯文本 LLM 也能"发图" · 🔒 图片永不进入模型上下文 · 💡 点击悬浮窗全屏查看
为 DeepSeek Harness(DSH)而写的图片展示插件
[!NOTE] 本插件由 AI agent 编写并经过真机验证(WebUI 实际跑通:卡片渲染、悬浮窗、会话不报错), 但未经安全审计、与 DeepSeek 官方无关、不提供任何担保。代码不大(host 端约 200 行、 client 端约 300 行),用之前建议通读一遍
lib/。review / PR 都欢迎。
DSH 的模型路由(pi-ai、deepseek 直连等)有个硬规则:会话历史里出现图片内容块,而当前模型不支持多模态,就抛 UNSUPPORTED_CONTENT。
由于内容块已持久化在会话日志里,之后每一轮都会重放同样的失败——会话直接废掉。
这个插件补上缺失的"输出方向":让纯文本 LLM 也能把本地图片展示给用户, 而图片字节只走展示通道,模型永远只看到文本(路径列表)。
| 场景 | 原生 DSH | 本插件 |
|---|---|---|
| 文本模型想把本地截图/渲染图/图表给你看 | 没有展示工具;硬塞图片块进结果 → 会话报废 | 调用 show_image,卡片秒出,会话安全 |
| 多模态模型展示图片 | 可以,但图片进了模型上下文(费 token) | 同样展示,但模型只收到文本路径 |
| 点击图片查看大图 | — | 页面内悬浮窗(lightbox) |
模型调用 show_image(路径)
│
▼
Host 端 execute
├─ 读取本地图片(png / jpg / jpeg / webp / gif)
├─ 存入附件库(内容寻址去重 + 校验元数据)
└─ 生成 base64 data URL
│
▼
render(模型可见) presentationMeta(用户可见)
┌──────────────┐ ┌──────────────────────────┐
│ 1. C:\a.png │ │ images: [{ dataUrl, ... }]│
│ 2. C:\b.png │ └──────────────────────────┘
└──────────────┘ │
│ ▼
纯文本,安全 Client 端 toolview
渲染图片卡片
│ 点击
▼
shell.overlay 悬浮窗
(✕ / 点外部 / Esc 关闭)
三个设计点:
render 输出纯文本路径列表——任何路由、任何纯文本模型都不会触发图片内容检查;meta(presentationMeta),由客户端直接渲染,不经过会话消息内容;session.readAttachment 要求图片块出现在模型可见内容里("被会话引用"),与纯文本模型天然冲突,所以弃用;附件库仅用于元数据校验与去重。UNSUPPORTED_CONTENT;columns(1-6 列)与 captions 参数;shell.overlay 槽位),右上角 ✕、点击遮罩、Esc 三种方式关闭;dsh plugin add 安装,卸载自动 dispose 全部副作用。# ~/.dsh/profiles/<profile>/cordis.patch.yml
- insert:
- id: show-image
name: 'dsh-show-image'
config:
maxImages: 12
maxBytes: 83886080
maxEmbedBytes: 2097152
装完重启 dsh web、硬刷新浏览器,然后让模型调用 show_image:
请调用 show_image 工具,把 C:\Users\xxx\shot.png 显示给我。
本包是标准 bundle(package.json 声明 dsh.client,lib/ 已编译提交,无构建步骤)。
dsh plugin --profile web add ./dsh-show-image
dsh plugin --profile web add github:<你的用户名>/dsh-show-image
lib/是纯 JS,没有prepare脚本,不需要allowBuilds放行。
把整个目录拷到 ~/.dsh/profiles/<profile>/node_modules/dsh-show-image(hoisted 布局拷贝即可被 loader 解析),再在 cordis.patch.yml 挂载。
show_image,看到图片卡片即成功;dsh plugin --profile web remove dsh-show-image(或 patch 行加 disabled: true),重启。| 配置项 | 默认 | 说明 |
|---|---|---|
maxImages |
12 | 单次最多显示的图片数 |
maxBytes |
8 MiB | 单张读取上限(与附件服务上限取更小者) |
maxEmbedBytes |
2 MiB | 单张可嵌入会话展示的最大字节数;data URL 会随会话日志持久化,超限直接报错,避免日志膨胀 |
Esc。maxEmbedBytes 会报错而不是静默降级(防止日志膨胀);调大配置即可;社区项目(codex-vision-proxy、codex-deepseek-vision、pi-vlm-proxy、dsh-tool-see-image 等)解决的是输入方向:拦截图片,用 OpenAI 兼容视觉模型(如免费 GLM-4V-Flash)把图转成文字,让文本模型"看见"。本插件解决输出方向:让用户在回复中看到本地图片。两者互补,可共存。
手工验证清单(真机跑通项):
show_image 显示 4 张图(含 columns/captions)→ 卡片按 2 列渲染、caption 正确;UNSUPPORTED_CONTENT;maxEmbedBytes 的图 → 得到明确报错文本而非崩溃。PR、issue、review 都欢迎。改动后请同步 lib/index.js(host)与 lib/client.js(client)两端的协议(输出 schema、meta 结构)。
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。