Repository navigation
Releases
dsh-gateway-models v0.2.6 — 文档重构
dsh-gateway-models v0.2.5
审计收尾:把上一轮列出的剩余项处理掉。
修的内容
- dsh-keys-setting:共享
<style>不再由实例的 disposer 移除(第二个实例会跳过注入,第一个实例的
disposer 却把它删掉 → 行样式丢失到下次刷新);把「settings.yaml 是文档化配置路径」的过时注释改对;
引擎默认值改用宿主返回的defaults(此前state.defaults写了没人读,UI 用的是另一份硬编码常量,
两边会漂移)。 - dsh-model-surplus:
toIsoOrNull真正支持秒级时间戳(文档早就这么写,代码没实现 → 一旦上游改用
秒,所有重置时间会显示成 1970 且没有任何报错);删掉limitTooltip里两个分支完全相同的三元;
UA 不再写死版本号(此前写 0.3.1,包已经是 0.4.x);给「pending 占位」补上说明它为何存在。 - dsh-gateway-models:
debugFile允许列表按引擎的方式解析 home(非空$DSH_HOME,否则~/.dsh)
—— 之前只读环境变量,而引擎从不设置它,于是文档化的<home>/logs/...被拒、<cwd>/logs/...反被接受;
重复了两次的 header-source 表达式抽成一个函数;补上「路由级 api/baseURL 会盖过每个模型自己的值」这个
事实的说明(这条是刻意保留的行为,见下)。 - 测试完整性:两个插件测试里未
await的check(...)补上(汇总数字此前少算,且未来异步断言会丢)。
一条我改了又改回去的(重要)
审计建议把 planRouteUpdate 写 baseURL 的条件收紧到「列表里所有模型都不在目录中」。我照做后发现
本插件自己的 V4.1 条目不带 baseUrl,而引擎只从目录条目解析 base?.baseUrl —— 目录里没有的模型
就只剩「路由级 baseURL」这一个来源。收紧后,混合路由上的 V4.1 模型会被引擎静默丢弃,正是这个插件
存在的意义。所以恢复原判据,并把取舍写进注释:路由级 api/baseURL 会盖过目录里各模型自己的值,
这在引擎提供不了「按模型」开关的前提下无法两全 —— 不写就丢模型,写了就改协议。
(引擎侧优先级已在源码核实:baseUrl = request.baseURL ?? base?.baseUrl ?? providerBaseUrl,
api = request.api ?? base?.api ?? routeApi,其中 request 是路由层。)
dsh-gateway-models v0.2.4 — 审计修复
审计修复版。详见 GUI 仓库同批次提交(含逐条证据)。
要点:Command Code 半边此前因未定义标识符整条死掉;V4.1 守卫读错层,会给从没配置过该路由的
用户写入 30 条模型列表;会话头补丁在认不出目标主机时失败开放;未设 \ 时把缓存写进
当前工作目录。
dsh-gateway-models v0.2.3 — debugFile 加上限;兼容性声明收窄到 0.2.0
审计修复
按「长期驻留进程」的标准把四个内置插件重新过了一遍(定时器/监听器释放、集合无界增长、
路由入参校验、密钥是否进日志)。
修掉的两个问题:
- 磁盘无界增长:debugFile 此前无上限 —— 它按每个匹配的 LLM 流事件追加一行,用户一旦
开启(或配了 debugFile),而 GUI 又常年不关,文件只增不减。现在到 8 MiB 就停止追加,
并按文件只警告一次。(debugFile 是可选功能,不配就不写。) - 兼容性声明不再真实:本插件的读/写路径已按引擎 0.2.0 的 SettingsForms API 重写
(get/section 已从引擎移除),因此把声明收窄为 dsh >= 0.2.0-rc.2,只列出有实测
证据的版本 —— 原先同时声称兼容 0.1.x 已经是假声明(在 0.1.x 上读不到条目、补模型整条失效)。
查过、确认没问题的:fetch 超时与 refreshLimits 的定时器都有清理;uuidBySession 用上限
做了 FIFO 淘汰;路由走引擎信任围栏且失败即关闭;入参经长度上限的 JSON 解析与校验;日志里没有
任何地方打印密钥。
环境要求
- DSH >= 0.2.0-rc.2、Node >= 20、零运行时依赖
安装 / 升级
dsh plugin --profile web add github:itchenshi/dsh-gateway-models或本 Release 的 tarball(dsh-gateway-models-0.2.3.tgz)。用 DSH Ready GUI 的话,随包版本已
抬高到 0.2.3,下次启动会自动换过来。
验证
本仓库
pm test:40 项通过(新增 debugFile 上限用例:超限后不再写入、警告恰好一次)。
dsh-gateway-models v0.2.2 — 兼容性声明(范围 + 在跑的引擎版本)
与另外三个随包插件对齐的清单元数据改动,运行时代码不变:
- dsh.compatibility.dsh = ">=0.1.5-rc.2" —— 商城建议的范围写法;
- dshReleases 补上 �.2.0-rc.2 —— 本插件的读/写路径已按该版本的 SettingsForms API
重写(见 v0.2.1),两个半边都能在它上面应用。
这一条此前没做,是因为工作区里当时有别人未提交的改动,不便把清单元数据混进那批改动里。
环境要求
- DSH >= 0.1.5-rc.2(0.2.0-rc.2 已按新 API 适配)
- Node >= 20
- 零运行时依赖
安装
dsh plugin --profile web add github:itchenshi/dsh-gateway-models或本 Release 的 tarball(dsh-gateway-models-0.2.2.tgz)。
dsh-gateway-models v0.2.1 — V4.1 置顶与 Command Code 补模型恢复
这一版让插件的两个功能在引擎 0.2.0 上重新工作
在引擎 0.2.0-rc.2 上,本插件的两半此前都在静默失效:
- DeepSeek V4.1 模型置顶不再发生
- Command Code 的模型不再自动补齐
而插件照常加载、路由照常在,日志里什么都不说 —— 这正是本仓库最反对的那种失效方式。
原因
引擎 0.1.5 → 0.2.0 把 settings 服务换成了 SettingsForms:
旧:get(ns) / section(ns) ← 全部移除
新:describe() / update(ns, patch, revision) / replace() / mutate() / configure()
本插件用 settings.get() / settings.section() 读配置(读到就是 TypeError,被吞掉),
settings.update() 也需要调用方补上 revision 了。
修法
两个小适配器,把新旧差异收在一处:
settingsEntry(settings)—— 一次describe()取出三层信息:
resolved(= 旧的get())、user(= 旧的section(),只有它才算「用户自己配过」)、
以及revision;updateEntry(settings, patch)—— 写之前重新读 revision。用旧 revision 写,遇到
Models 页面或手工编辑插进来会被引擎以SETTINGS_CONFLICT拒绝,表现为「模型莫名没补上」。
waitForNamespace() 本来就用 describe(),未受影响。
环境要求
- DSH ≥ 0.2.0-rc.2
- Node ≥ 20
- 零运行时依赖
安装 / 升级
dsh plugin --profile web add github:itchenshi/dsh-gateway-models或本 Release 的 tarball(dsh-gateway-models-0.2.1.tgz)。
用 DSH Ready GUI:随包版本已抬高到 0.2.1,下次启动 GUI 会自动换过来。
验证
- 本仓库
npm test:39 项通过(新增settingsEntry/updateEntry用例:三层信息、
异常形状返回 null、写必须带上刚读到的 revision) - 运行时探测无法覆盖这个插件:它没有 HTTP 路由,唯一效果是「能描述出 opencode-go 目录时才写
settings」,而一次性 profile 里没有这样的目录(引擎自带目录不含该 provider,profile 也没配),
所以它在任何状态下都不会写 —— 这一点已在 GUI 的验证脚本里写清,避免把「测不到」误当成
「已通过」
说明
本 Release 对应的提交里包含两处并非本次修复的文案改动(README 中英双版不再写死模型条数、
以及代码里同一处注释的改写)。它们来自工作区里已有的未提交改动,内容与本仓库主题一致且不含
行为变化。
dsh-gateway-models v0.2.0 — 支持 Command Code;改名自 dsh-opencode-go-path
原
dsh-opencode-go-path—— 2026-09-25 改名为dsh-gateway-models:它已经不只管
OpenCode Go,还给 Command Code 声明协议和地址、并从上游目录同步模型清单。
新增:Command Code 支持
- 声明协议和地址:为
commandcode路由补上api+baseURL—— 你只填密钥,
不用每次再手填 API 地址。 - 自动补齐模型:启动时读上游公开目录(
GET /provider/v1/models,81 个模型,
不需要密钥)把清单补全。只增不改:你已有的条目(含你改过的名字、容量)原样保留,
缺的追加在后面,你自己的排序不乱。跑第二遍不再写(幂等)。 - 按接口地址识别,不按名字:所以
commandcode-pro、commandcode-max,或沿用社区插件的
commandcode一样会被补齐;对补丁没覆盖的名字,还会把该路由解析不出的api/baseURL
一并写上(引擎拒绝给「协议解析不出来」的路由存模型,不补则整笔写入被静默拒绝)。
一个路由名覆盖所有套餐
默认路由名由 opencode-go 改为 commandcode,不带档位后缀:套餐是跟着账号和密钥走的
(planId 在 /alpha/billing/subscriptions 里报 individual-go / individual-goat /
individual-pro / individual-max-10x / individual-max-20x …),不是路由或地址决定的。
所以 Go / GOAT / Pro / MAX 共用一条路由,升级套餐只换 key,配置一个字都不用动。
旧名(commandcode-goat 等)继续可用。
安装
# 推荐:直接从 GitHub 装(记进 profile,之后可跟着更新)
dsh plugin --profile web add github:itchenshi/dsh-gateway-models
# 备选:本 Release 的 tarball(git 协议走不通、但 HTTPS 能通时用这条)
dsh plugin --profile web add https://github.com/itchenshi/dsh-gateway-models/releases/download/v0.2.0/dsh-gateway-models-0.2.0.tar.gz改名的影响
- 补丁层的行 id 仍是
opencode-go(与包名解耦)—— GUI 的启用/禁用是写在补丁层上的
- id: <rowId> + disabled:,所以你已有的选择不会丢。 - 旧包名由 GUI 的
LEGACY_PLUGIN_PKGS做一次性清理(旧登记摘掉、装回新的,不会两份同时加载)。 - 旧仓库名由 GitHub 自动重定向,老链接不断。
验证
npm test:37 项通过(新增 Command Code 目录映射、路由按地址识别、api/baseURL 补齐与幂等,
以及一条断言「补丁声明的路由与代码常量一致」的防漂移测试)。- 真实引擎端到端:
commandcode与旧的commandcode-goat各自动补齐 81 个模型
(81 个唯一 id、81 个带contextWindow),二次启动幂等(settings 哈希不变)。
边界(给会静态扫描的商城看的)
- 出站网络:只有一个公开 GET(
https://api.commandcode.ai/provider/v1/models),
请求里不带任何凭据。OpenCode Go 那一半走引擎自己的llm.discoverModels(),不触网。 - 插件从不读取任何 API key:它只写路由配置,密钥始终由引擎按
apiKeyEnv解析。 - 写入门槛:只为你自己配置过的路由写模型清单。补丁层为所有人声明默认路由只是为了提供
地址,不代表你在用它 —— 不会往没在用的人的设置里塞 81 个模型。 - 该目录接口是第三方转售方的公开接口,不是官方承诺的 API。它不可用时插件只在日志给出原因并
保持你的列表不动,不会写坏配置。 - npm 上暂无此包(注册环节走不通),请用上面的方式安装。
dsh-opencode-go-path v0.1.4
Fixes four concrete OpenCode / OpenCode Go failures, and adds the DeepSeek V4.1 models to the route when missing.
| Symptom | Fix |
|---|---|
Model not in the list, adding it fails with needs an api |
Declares the wire protocol for the opencode-go route |
| Model added but requests fail / saving is rejected | Fills in the route baseURL for models outside the catalog |
400 MissingSessionID on multi-turn conversations |
Attaches a per-conversation x-opencode-session header |
400 reasoning_content must be passed back |
Declares reasoning-content passthrough for the route |
The engine detects DeepSeek-family models by vendor or domain; OpenCode Go matches neither, which is why the last error occurs.
Install: dsh plugin --profile web add github:itchenshi/dsh-opencode-go-path