dsh-model-capabilities
kalospacer/dsh-model-capabilities
在设置里新增「模型能力」一页,为每个模型声明思考档位与视觉能力。
安装
dsh plugin --profile web add github:kalospacer/dsh-model-capabilitiesREADME
dsh-model-capabilities
给 DSH 的设置里加一页 模型能力:为 pi-ai 路由编辑上下文窗口、最大输出 token 数、输入类型(文本 / 图片等模态)和思考强度映射。改的每一项都通过 settings.mutate 真正写回配置,不是展示页。
安装与使用
dsh plugin --profile web add github:Kalospacer/dsh-model-capabilities#main
安装后重启 DSH Web Host,打开 设置 → 模型能力。
页面分两级:列表页列出全部可配置模型(模型名 + 一行小摘要),点哪一行就进哪一行的 详情页。窄屏自动转单列布局;移动端、暗色模式均跟随宿主。
详情页从上到下依次为:模型名与别名 → 快速预设 面板 → 上下文窗口与最大输出 token 数(左右并排)→ 输入类型(文本 / 图片勾选)→ 思考强度映射 → 底部 保存 / 放弃更改。
- 首次进入一个没有任何已保存能力字段的模型时,插件会用 OpenRouter 目录的保守匹配自动填一次初始值(只填在内存草稿里,不会静默写盘)。
- 若自动匹配没找到、或想换成另一个模型的元数据,可在 快速预设 里手动搜索并 采纳此预设:采纳会把上下文、最大输出、输入类型全量套到当前草稿,思考映射保持原状。
- 核对 / 修改后点 保存 真正写回
llm-pi-ai配置;点 放弃更改 丢弃未保存草稿。
仅在模型能力页打开时扫描当前模型与宿主推送的新模型;不修改 DSH 自己的模型发现流程,也不在后台探测或发送聊天请求。
四项能力
| 设置 | DSH 字段 | 说明 |
|---|---|---|
| 上下文窗口 | contextWindow | 正整数;支持 128k、1m 输入,k = 1024;留空继承上游目录 |
| 最大输出 token 数 | maxTokens | 正整数;预填按 128k 封顶(上游标称更小就用上游值)——上游给的是理论峰值,DSH 会把它当作每次请求的预留输出,照抄会把自动压缩阈值压塌 |
| 输入类型 | input | 继承上游目录 / 自定义「文本」「图片」勾选;host 原本的 audio/video 等模态原样保留 |
| 思考强度 | reasoningEfforts | 继承上游目录 / 不支持思考 / 自定义各档位的实际发送值 |
数字字段留空表示继承;清空已保存的覆盖值后保存,会删除这个字段的覆盖。
「最大输出 token 数」下方会实时显示一行自动压缩阈值估算:DSH 的压缩插件在会话 token 超过 min(0.8×窗口, 窗口−输出上限−65536) 时自动压缩上下文(默认值,见 DSH compaction-basic)。输出上限填得越大阈值越低;估算结果 ≤ 0 时 DSH 会直接报配置错误,本行也会给出警示。该行为纯只读提示,不参与保存。
思考值不是通用档位名
左侧是 DSH 的界面选项,右侧是模型或当前线路实际接受的字符串。两者不一定同名:
reasoningEfforts:
off: none
low: low
high: high
xhigh: extra
- 选择
off时,发送none,而不是擅自改成off。 - 选择
xhigh时,可以发送extra;也可以手动填写当前网关要求的其他值。 - 非
off选项必须有实际发送值。low: null不是“默认发送 low”,会被当前宿主拒绝。 off: null是特例,表示关闭选项不发送思考参数。reasoningEfforts: false表示不支持推理,不等同于off → none。
自动映射仅处理明确的界面别名(none → off、extra → xhigh),右侧原值保留大小写。不会按数组位置映射,也不猜测 ultra、supra 等未知值的强弱;遇到未知值或冲突时显示提示,思考设置保持原状,允许手动修正。
OpenRouter 匹配与默认值
数据源:https://openrouter.ai/api/v1/models。
context_length→ 上下文窗口。top_provider.max_completion_tokens→ 最大输出 token(按 128k 封顶后预填;原始标称值在详情页「标称最大输出」灰框中只读展示,供对照)。architecture.input_modalities→ 图像/文本能力。reasoning.supported_efforts→ 思考真实值。reasoning.default_effort仅展示参考,不写入宿主未声明的字段。
名称搜索采用 token 边界与稀有词加权的匹配方式。不存在于目录中的自拟前缀可以忽略;只有版本与有效名称完整吻合,或 ID/slug 精确吻合且没有歧义时才自动补齐。模糊结果仍能手动选取,但不会自动认领成某个模型。置信标签表示名称匹配质量,不是官方正确率。
OpenRouter 是聚合目录,不保证其发送值等同于每条接入线路的原生 API。 保存前应核对线路实际接受的值;插件不会因为模型叫 Claude 就把所有 xhigh 擅自改成 extra。目录没有思考枚举时,也不会补一套猜测的 low / medium / high。
不覆盖已有修正
- 自动填只在「这个模型还没有任何已保存能力字段」时触发一次,填在内存草稿里,绝不静默写盘;保存动作由用户发起。
- 已保存的上下文、最大输出、输入类型、思考映射任何一项存在,该模型就被视为「老模型」,进入详情页不再重新自动填。
- 快速预设 采纳是全量套用:会覆盖当前草稿里的上下文 / 最大输出 / 输入类型,但思考映射保持原状——目录里那些
supra/ultra等未映射值仍由用户手动核对。 - 输入类型只切换「文本」「图片」两个明确开关;host 原本的
audio、video等陌生模态原样保留,不会被静默清空。 - 浏览器记忆已经处理过的模型,避免放弃草稿后刷新又自动塞回。浏览器存储禁用时只在当前页面内记忆。
- 未保存的修改保留在当前页面内,离开或刷新时浏览器会提示;草稿不是持久化设置。
目录在浏览器缓存 6 小时,共享一次请求。联网失败时可以保留旧缓存并标记;没有缓存时仍可完整使用手动配置。公开目录请求不携带线路密钥、Cookie,也不会把本地模型名称发送到 OpenRouter;搜索在本地完成。
保留原有保存模式
- 手写模型路由编辑自己的
models数组;同一路由的多模型修改合并为一次数组写入,不丢失邻居条目。 - Catalog 路由只写
modelOverrides.<modelId>.<field>,不把整个官方目录替换成手写列表。 - 修改其他字段时,原有
compat、audio/video 等输入模态、扩展思考值都保持不变。 - 保存使用草稿建立时的 revision。其他窗口更新后不会默默换用新 revision 强行覆盖;草稿保留,显式加载最新设置并按字段重新核对。
只对 llm-pi-ai 的配置路由生效。实际能力写入 DSH 自己的设置,卸载插件后已保存配置仍在;插件不使用 CPA,也不读写 CPA 配置。
开发与验证
pnpm install
pnpm run check
check 包含类型检查、发布 bundle 构建、原有宿主兼容性冒烟和新增能力检查。新增检查覆盖真实 wire 值、保守匹配、四项元数据、继承、双保存路径、revision 冲突和目录缓存。
可选的真实浏览器验证(不增加插件运行时依赖):
npm install --prefix .client-build/browser-tools --ignore-scripts --no-audit --no-fund react@18.3.1 react-dom@18.3.1 playwright@1.58.2
$env:DSH_TEST_CHROME = 'C:\path\to\chrome.exe'
node scripts/browser-smoke.mjs
浏览器验证运行实际 lib/client/index.js、React 与 Chromium,宿主 RPC 使用隔离 fixture,不修改正在使用的 DSH 配置。涵盖自动回填、手动修正、两种保存路径、新模型推送、冲突重试、继承、只读、离线、移动端与深色模式。截图保存在 .client-build/artifacts/。
源码按宿主类型、设置存储、模型草稿、OpenRouter、推荐转换、页面工作区和编辑组件拆分,发布入口仍为 lib/client/index.js。
MIT