Ayelsh/reasoning-setup

Ayelsh/reasoning-setup

为未声明思考档位的模型编辑推理强度档位与思考格式。

模型与账号接入deepseek-harness

dsh-reasoning-setup

DeepSeek Harness 的思考强度配置页:一个 out-of-tree profile bundle(插件)。它扫描已注册的 Provider 与模型,找出没有声明思考能力的模型(这类模型在任何模型选择器里都不会出现「思考强度」一行),并提供一个设置页,直接为自定义 Provider 的模型声明 reasoningEfforts 与 thinkingFormat——写入的正是 llm-pi-ai 插件的那个设置文档(与「模型」设置页、dsh-zhipu-plan 写的是同一份)。

为什么需要它

dsh 中思考强度是每个模型的声明式能力,不是全局开关:只有当 provider/model 路由解析出的模型元数据带 reasoning 档位表时,选择器才会出现「思考强度」(见 harness packages/llm/llm-pi-ai/src/catalog.ts 的 resolveModelReasoning)。手工在 models: 列表里声明的模型默认按非推理模型处理,必须逐模型声明 reasoningEfforts。手改 YAML 容易拼错档位名和 wire 值;本插件把这件事变成页面上的勾选与填写,并在写入前按 pi-ai 解析器的同套规则校验。

页面能做什么

  • 扫描:列出全部已注册 Provider 及其模型,标记每个模型当前是否提供思考档位、提供哪些档、默认档是什么。不可经 llm-pi-ai 设置文档编辑的 Provider(如 deepseek-official)只读展示。
  • 声明/修改:为可编辑模型勾选要提供的档位(off / minimal / low / medium / high / xhigh / max),逐档填写 wire 发送值(即请求里发给网关的字符串;off 可留空=选择该档时不发送思考参数),可选 thinkingFormat(openai / deepseek / qwen / zai 等 11 种)。
  • 移除声明:删掉本页写入的声明,让模型回到目录继承/默认行为。
  • 写入带 revision 乐观锁;文档在扫描后被其它页面改动会拒绝写入(reasoning-setup/conflict)而不是覆盖。

写到哪里

  • 路由带 models: 列表(自定义 provider 的常见形态)→ providers.<route>.models.<i>.reasoningEfforts(及同条目的 compat.thinkingFormat)。
  • 目录路由(如 zai / zai-coding-cn)→ providers.<route>.modelOverrides.<model>.reasoningEfforts。

保存后重新打开模型选择器即可看到「思考强度」一行。

安装

需要 0.1.7-rc.2 及以上、实测 0.2.0-rc.1 的安装(dsh-base 挂载 llm/settings/Typert seam)。

  • 插件市场一键安装:在 dsh 的插件市场(dshmarket)中搜索 dsh-reasoning-setup,点击安装并重启。市场条目指向下面那个已含构建产物的 tarball,安装时不需要本地工具链。

  • 预构建 tarball(离线/手动安装):dsh-reasoning-setup.tgz,在应用内 设置 → 插件 里选择该文件安装并重启。该地址始终指向最新 release,里面的 lib/ 已构建好。

  • 源码安装:

    dsh plugin --profile <profile> add github:Ayelsh/reasoning-setup
    

    构建产物 lib/ 已随仓库提交(见 .gitignore 注释),因此源码安装不需要本地构建工具链,也不用 prepare 在安装时跑 esbuild。

  • profile bundle 方式:把 dsh.profile.bundles 追加 dsh-reasoning-setup(lib/ 已随包提供)。

插件本身不声明运行时依赖,运行时通过 profile 的模块回退链接复用宿主已加载的 harness 包。

布局

路径内容
src/host/reasoningSetup 服务:scan() 连接 LLM runtime 的 provider/model 枚举与 llm-pi-ai 设置文档;apply() 校验草稿后经 ctx.settings.mutate 写入。scan.ts 是纯函数(表读取、声明定位、校验镜像、op 构建)。
src/wire/两个 Typert 面,按生成器输出形状手写(仓库生成器需要 workspace 的 ts.Program,out-of-tree 包没有)。typert-host.js 是 loader 从 ./typert 导出注册的清单;typert-remote-client.js 是浏览器侧经 ctx.remote.$mount 挂载的贡献。
src/client/设置页浏览器半边:注册 settings.section 插槽、双语字典、自注入样式表。界面是 Liquid Glass 材质:环境光场 + 浮起工具栏 + 每个 Provider 一张玻璃卡,行内不再叠玻璃。
scripts/build.mjs(esbuild 三产物 + 自检)、verify.mjs(对照 harness 校验:导入解析、loader 清单校验、档位/格式词表与 llm-pi-ai/src/catalog.ts 的门表比对、scan 规则夹具)、client-smoke.mjs(stub shell 物化浏览器包)、preview.mjs / preview-shots.mjs(截图夹具,见下)。

截图夹具

材质的判断只能靠看渲染结果,所以仓库里带了一套可复跑的夹具:它把真实组件挂进 jsdom,按设置面板的真实几何(800px 面板、188px 导航、.options 滚动列,顶部零内边距)输出独立 HTML,再用 Chromium 逐场景截图。

pnpm run preview                                   # 写 preview/*.html(明暗两套 + 忙碌背景)
PLAYWRIGHT_BROWSERS_PATH=$HOME/.cache/ms-playwright pnpm run preview:shots   # 写 preview/shots/*.png

场景覆盖 ready / loading / error / empty / editor / filtered / notice / press,以及滚动后的吸顶、忙碌背景、prefers-reduced-transparency、prefers-contrast、prefers-reduced-motion 三种偏好极值,全部明暗各一张。preview/ 是生成物,不入库;改材质后重跑这两条命令并逐张看。

构建

pnpm install
pnpm run build      # 写 lib/index.js, lib/typert.js, lib/client.js
pnpm run verify     # build + 对照 deepseek-harness 检验 + 浏览器冒烟

构建产物 lib/(index.js、typert.js、client.js)是提交进仓库的:github: 源码安装直接打包仓库内容,所以改动源码后请重跑 pnpm run build 并一并提交 lib/。prepack 与 build 相同,只用于 pnpm pack / 发布前刷新产物,安装时不会执行。

host 半边导入 @deepseek-ai/cordis、@deepseek-ai/dsh-settings、@deepseek-ai/dsh-typert-protocol、@deepseek-ai/schemastery(类型另有 dsh-llm、dsh-llm-pi-ai),全部在宿主应用的依赖闭包里,模块回退链接会解析到运行进程已加载的副本。

已知边界

  • 只能编辑经 llm-pi-ai 设置文档配置的路由;其它适配器(如 deepseek-official)的模型只读展示。
  • 「移除声明」只移除本页写入的 reasoningEfforts / compat.thinkingFormat,不会把目录模型改成 reasoningEfforts: false(剥离目录声明的思考能力不属于本页的编辑动作)。
  • 档位与格式词表镜像自 dsh-llm-pi-ai/src/catalog.ts(该包未导出);pnpm run verify 与 harness 源码比对,升级 harness 后请重跑。

许可证

本项目以 MIT 许可证发布,见 LICENSE。

档位词表与校验规则镜像自 deepseek-harness(MIT License, Copyright (c) 2026 DeepSeek)的 packages/llm/llm-pi-ai/src/catalog.ts,归属声明见 NOTICE。

本项目与 DeepSeek 无从属、背书或赞助关系。「DeepSeek」为其各自所有者的商标,此处仅为描述性使用。