deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
PROJECT TOPICS
PROJECT README
给 DeepSeek Harness(DSH)的 text-only 会话加一个「视觉代理」开关:
⚠️ 诚实声明(请先读)
这个插件是作者用 deepseek-v4-pro 通过 vibe coding(人机来回试错式开发)写出来的。 作者并不是 DSH 的开发者,对 DSH 内部机制的理解大量来自读源码 + 踩坑 + 猜, 不保证正确、不保证稳定,有 bug 是常态。它目前只在一个人的 Windows 机器上、 配合 deepseek-v4-pro + 火山方舟豆包跑通过。请自行评估、自行修改,出问题别指望作者。 具体的不确定点和已知坑见文末 不确定与已知问题。
你在会话里选了任意文本模型,然后点开「视觉代理」开关
│
├─ 纯文本消息 ──→ 你原来的模型(插件只是把历史里的旧图片块剥掉后原样转发)
│
└─ 当前消息带图 ──→ 视觉服务商(只发:这张图 + 这句话,无历史/无 system/无工具)
↑ 可在「设置 → Vision 模型」面板换服务商
开关的本质是:开启时把会话的模型切到本插件注册的 vision-fallback 路由
(因为 DSH 的 read_image 要求当前路由声明图片输入,纯文本模型过不了这个门槛),
同时记住你原来的模型;关闭时恢复。所以开启后模型选择器里会显示「视觉代理」,
这是机制使然,不代表你的文本模型变了。
lib/index.js 宿主插件:注册路由、设置 schema(llm-vision-fallback 段)、凭据解析、模型发现
lib/adapter.js VisionFallbackAdapter:路由判定(仅最后一条消息带图才走视觉)+ SSE 流式翻译
lib/translate.js OpenAI 兼容 SSE → DSH StreamChunk 协议(改写自官方 dsh-llm-deepseek)
lib/serialize.js 视觉请求序列化:只发最后一条消息;原图直发;文本历史图片剥离
client/index.js 浏览器半:输入框旁「视觉代理」开关 + 设置页「Vision 模型」面板
cordis.patch.yml bundle patch:插入插件行
test/vf-smoke.mjs 冒烟测试:文本透传 + 真实视觉请求(自包含,无需外部图片)
# 1. 安装进 profile
dsh plugin --profile web add D:\dsh-vision-fallback
# 2. 把插件加入 profile 的 bundle 列表
# 编辑 %DSH_HOME%\profiles\web\package.json,在 dsh.profile.bundles 里追加:
# "@local/dsh-vision-fallback"
# 3. 插件依赖自包含
cd D:\dsh-vision-fallback
pnpm install
# 4. 重启 dsh web
dsh web
坑:
dsh plugin add会以link:方式把插件链入 profile,Node 解析插件内部 import 时 会还原到真实路径,所以插件目录里必须有自己的 node_modules(上面第 3 步)。 另外 package.json 的exports里必须保留"./package.json"条目, 否则 client-modules 扫描会报 ERR_PACKAGE_PATH_NOT_EXPORTED 并永久缓存“不是客户端包”。
热生效于 %DSH_HOME%\settings.yaml 的 llm-vision-fallback: 段:
llm-vision-fallback:
defaultProvider: ark # 含图请求走哪个服务商
providers: # 可配多个,面板里也可管理
ark:
displayName: 豆包(火山方舟)
baseUrl: https://ark.cn-beijing.volces.com/api/v3
model: doubao-seed-2-1-turbo-260628
apiKeyEnv: ARK_API_KEY # 凭据引用:key 本身存在 DSH 凭据库,绝不在配置文件里
read_image)= 自动转发视觉服务商node test\vf-smoke.mjs # 文本透传(假dispatch) + 真实视觉请求;凭据读 %DSH_HOME%\.credentials.yaml
开发性质
使用中需要注意
/chat/completions + SSE + /models)vision-fallback 上:若插件卸载/停用,该会话会失效,需手动切回原模型已知坑(都在这上面摔过)
link: 安装 + Node realpath → 插件目录必须自包含依赖(见安装第 3 步)exports 缺 ./package.json → 设置面板永远不加载{result:{ok,value}} 信封,忘了解包 = 面板永远“不可写”developer 角色、不认 thinking 参数 → 已做归一化/剥离未做 / 可能坏的地方
MIT
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。