Skip to content

Releases

dsh-gateway-models v0.2.6 — 文档重构

Choose a tag to compare

@itchenshi itchenshi released this 05 Oct 10:14

文档重构版:README 重写为「能做什么 / 安装 / 使用或首次启动 / 配置 / 兼容性 / FAQ / 开发 / 许可」的统一结构,
中英各一份,所有声明都对着代码核过(核不到的旧说法已删除)。功能代码未改动。

同批:CI 在没有 NPM_TOKEN 时跳过发布步骤(此前每次 tag 都白报一次 ENEEDAUTH 失败)。

dsh-gateway-models v0.2.5

Choose a tag to compare

@itchenshi itchenshi released this 05 Oct 07:14

审计收尾:把上一轮列出的剩余项处理掉。

修的内容

  • 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 — 审计修复

Choose a tag to compare

@itchenshi itchenshi released this 05 Oct 06:24

审计修复版。详见 GUI 仓库同批次提交(含逐条证据)。

要点:Command Code 半边此前因未定义标识符整条死掉;V4.1 守卫读错层,会给从没配置过该路由的
用户写入 30 条模型列表;会话头补丁在认不出目标主机时失败开放;未设 \ 时把缓存写进
当前工作目录。

dsh-gateway-models v0.2.3 — debugFile 加上限;兼容性声明收窄到 0.2.0

Choose a tag to compare

@itchenshi itchenshi released this 05 Oct 00:40

审计修复

按「长期驻留进程」的标准把四个内置插件重新过了一遍(定时器/监听器释放、集合无界增长、
路由入参校验、密钥是否进日志)。

修掉的两个问题:

  1. 磁盘无界增长:debugFile 此前无上限 —— 它按每个匹配的 LLM 流事件追加一行,用户一旦
    开启(或配了 debugFile),而 GUI 又常年不关,文件只增不减。现在到 8 MiB 就停止追加,
    并按文件只警告一次。(debugFile 是可选功能,不配就不写。)
  2. 兼容性声明不再真实:本插件的读/写路径已按引擎 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 — 兼容性声明(范围 + 在跑的引擎版本)

Choose a tag to compare

@itchenshi itchenshi released this 04 Oct 23:55

与另外三个随包插件对齐的清单元数据改动,运行时代码不变:

  • 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 补模型恢复

Choose a tag to compare

@itchenshi itchenshi released this 04 Oct 23:54

这一版让插件的两个功能在引擎 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

Choose a tag to compare

@itchenshi itchenshi released this 25 Sep 04:51

原 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

Choose a tag to compare

@itchenshi itchenshi released this 23 Sep 02:33

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