环境
@liustack/modlens 3.16.3(dsh 插件;已 diff 确认 3.16.4 的 dsh/index.js 与 3.16.3 逐字节相同,问题未变)
@deepseek-ai/dsh 0.1.0-rc.6,web profile,macOS
- 会话选中的模型:普通档
deepseek-official / deepseek-v4-pro(非变体)
预期行为
按 3.14.0 changelog 的承诺("dsh: pasting into a text-only model now just works — the paste becomes a file path"),选中普通 DeepSeek 纯文本模型时贴图,应当被浏览器半边接管:图片字节走回环 /modlens/paste 路由,输入框收到纯文本文件路径,DSH 的图片准入检查根本不会触发。
实际行为
只要视觉变体包装器处于注册状态(默认就是),任何 DeepSeek/GLM 纯文本模型的接管判定都永远不会通过。贴图保持原生路径,撞上 DSH 自己的准入闸门,报 MODEL_DOES_NOT_SUPPORT_IMAGES("当前模型不支持图片")。(modlens vision) 变体路径本身工作正常,本 issue 只针对普通档的 paste-to-path 流程。
重启后的活进程实测(所有包含 deepseek 模型名的标签一律 false):
GET /modlens/paste?model=DeepSeek-V4-Pro -> {"takeover":false}
GET /modlens/paste?model=deepseek-v4-pro -> {"takeover":false}
GET /modlens/paste?model=DeepSeek-V4-Flash -> {"takeover":false}
默认配置下,任何可包装的纯文本模型都拿不到 true。
时间线(回归定位)
- 3.10.0(2026-08-14):
(modlens vision) 变体上线,包装器复用上游模型 id 并声明图片输入;
- 3.14.0(同日):paste-to-path 接管上线,changelog 记载以纯文本 DeepSeek-V4-Flash 端到端验证通过,普通档接管当时可用;
- 3.16.0(同日):裁决搬至服务端(修复客户端正则误劫持视觉模型贴图),引入"标签命中的模型中任一声明图片输入即否决",回归自此引入;
- 3.16.4:
pasteTakeoverVerdict 与包装器逻辑未变,问题延续至今。
根因
dsh/index.js 里两条规则互相冲突:
registerVisionProvider 注册变体时原样复用了上游模型的 id:
const withVision = (info) => ({
...info, // id 保持原样,例如 "deepseek-v4-pro"
provider: providerId,
inputModalities: ['text', 'image'],
})
pasteTakeoverVerdict 的否决规则:选择器标签中出现的任何模型,只要声明了图片输入就一票否决:
if (!Array.isArray(modalities) || modalities.includes('image')) {
return false
}
选中普通 DeepSeek-V4-Pro 时,标签 DeepSeek-V4-Pro 同时命中两个模型:
deepseek-official 的 deepseek-v4-pro —— 纯文本,确认通过;
- 包装器双胞胎
deepseek-modlens 的 deepseek-v4-pro —— 声明图片输入,一票否决。
包装器默认开启(visionProvider !== false),因此 deepseek/glm 系纯文本模型的接管永远无法生效。"未知即保守"的策略本身没错,但这个双胞胎是插件自己注册、自己认识的(判定函数里已经用正则特判过 (modlens vision) 标签),被自己的双胞胎误杀属于无意的自我冲突,而不是对未知模型的保守。
建议修法
- 给变体模型用独立 id(如
deepseek-v4-pro-vision),在 resolveModel/stream 请求时再映射回上游 id;或
- 在
pasteTakeoverVerdict 里排除本插件自己的包装器 provider(deepseek-modlens、modlens-*)——既然已经用正则特判了 (modlens vision) 标签,说明双胞胎在代码里是显式可知的。
环境
@liustack/modlens3.16.3(dsh 插件;已 diff 确认 3.16.4 的dsh/index.js与 3.16.3 逐字节相同,问题未变)@deepseek-ai/dsh0.1.0-rc.6,web profile,macOSdeepseek-official / deepseek-v4-pro(非变体)预期行为
按 3.14.0 changelog 的承诺("dsh: pasting into a text-only model now just works — the paste becomes a file path"),选中普通 DeepSeek 纯文本模型时贴图,应当被浏览器半边接管:图片字节走回环
/modlens/paste路由,输入框收到纯文本文件路径,DSH 的图片准入检查根本不会触发。实际行为
只要视觉变体包装器处于注册状态(默认就是),任何 DeepSeek/GLM 纯文本模型的接管判定都永远不会通过。贴图保持原生路径,撞上 DSH 自己的准入闸门,报
MODEL_DOES_NOT_SUPPORT_IMAGES("当前模型不支持图片")。(modlens vision)变体路径本身工作正常,本 issue 只针对普通档的 paste-to-path 流程。重启后的活进程实测(所有包含 deepseek 模型名的标签一律 false):
默认配置下,任何可包装的纯文本模型都拿不到
true。时间线(回归定位)
(modlens vision)变体上线,包装器复用上游模型 id 并声明图片输入;pasteTakeoverVerdict与包装器逻辑未变,问题延续至今。根因
dsh/index.js里两条规则互相冲突:registerVisionProvider注册变体时原样复用了上游模型的 id:pasteTakeoverVerdict的否决规则:选择器标签中出现的任何模型,只要声明了图片输入就一票否决:选中普通
DeepSeek-V4-Pro时,标签DeepSeek-V4-Pro同时命中两个模型:deepseek-official的deepseek-v4-pro—— 纯文本,确认通过;deepseek-modlens的deepseek-v4-pro—— 声明图片输入,一票否决。包装器默认开启(
visionProvider !== false),因此 deepseek/glm 系纯文本模型的接管永远无法生效。"未知即保守"的策略本身没错,但这个双胞胎是插件自己注册、自己认识的(判定函数里已经用正则特判过(modlens vision)标签),被自己的双胞胎误杀属于无意的自我冲突,而不是对未知模型的保守。建议修法
deepseek-v4-pro-vision),在resolveModel/stream请求时再映射回上游 id;或pasteTakeoverVerdict里排除本插件自己的包装器 provider(deepseek-modlens、modlens-*)——既然已经用正则特判了(modlens vision)标签,说明双胞胎在代码里是显式可知的。