Skip to content

dsh:注册 (modlens vision) 变体后(默认开启),普通 DeepSeek 纯文本档的粘贴接管永不触发 #36

Description

@Taz-dingo

环境

  • @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 里两条规则互相冲突:

  1. registerVisionProvider 注册变体时原样复用了上游模型的 id
const withVision = (info) => ({
  ...info,                       // id 保持原样,例如 "deepseek-v4-pro"
  provider: providerId,
  inputModalities: ['text', 'image'],
})
  1. pasteTakeoverVerdict 的否决规则:选择器标签中出现的任何模型,只要声明了图片输入就一票否决:
if (!Array.isArray(modalities) || modalities.includes('image')) {
  return false
}

选中普通 DeepSeek-V4-Pro 时,标签 DeepSeek-V4-Pro 同时命中两个模型:

  • deepseek-officialdeepseek-v4-pro —— 纯文本,确认通过;
  • 包装器双胞胎 deepseek-modlensdeepseek-v4-pro —— 声明图片输入,一票否决。

包装器默认开启(visionProvider !== false),因此 deepseek/glm 系纯文本模型的接管永远无法生效。"未知即保守"的策略本身没错,但这个双胞胎是插件自己注册、自己认识的(判定函数里已经用正则特判过 (modlens vision) 标签),被自己的双胞胎误杀属于无意的自我冲突,而不是对未知模型的保守。

建议修法

  1. 给变体模型用独立 id(如 deepseek-v4-pro-vision),在 resolveModel/stream 请求时再映射回上游 id;或
  2. pasteTakeoverVerdict 里排除本插件自己的包装器 provider(deepseek-modlensmodlens-*)——既然已经用正则特判了 (modlens vision) 标签,说明双胞胎在代码里是显式可知的。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions