前言¶
在 DeepSeek Harness(DSH)里走 OpenCode Go、Command Code 这类网关路由时,常见麻烦是:路由缺 api 会报 needs an api、要自己填 baseURL、模型列表不完整,发往 OpenCode 的请求还可能因缺少会话头触发 400 MissingSessionID。手工改路由配置能缓解,但每个宿主、每条路由都要重复维护,且引擎目录里未必已经包含 DeepSeek V4.1 等新型号。
itchenshi/dsh-gateway-models 是社区维护的只有宿主半边的 DSH 插件(分类:模型推理)。它在装配层自动补全上述路由的 wire 协议、默认端点与模型清单,并为 OpenCode 相关请求附加 x-opencode-session,装好后重启引擎即可生效,无需单独打开插件页面。
这是什么¶
- 名称:
dsh-gateway-models(GitHub:itchenshi/dsh-gateway-models) - 维护者:itchenshi
- 定位:DeepSeek Harness 插件,面向
opencode-go与commandcode网关路由,声明 OpenCode Go / Command Code 的路由协议与 endpoint,补齐模型列表,并处理会话头。 - 许可:MIT(见仓库 README)
插件不注册页面半边,也不读本机 HTTP 路由;密钥仍由引擎按 apiKeyEnv 解析,插件不写、不读 API key。
核心功能¶
下面按两条路由分别说明插件在启动装配阶段做了什么(事实以仓库 README 为准)。
OpenCode Go(opencode-go)¶
- 为路由声明 wire 协议
api: openai-completions,避免目录外模型报needs an api。 - 读取引擎自身的模型目录,把 DeepSeek V4.1 系列补进
opencode-go清单,并排到第一位;用户已配置的条目保留且顺序不变。 - 若路由没有
baseURL,补上https://opencode.ai/zen/go/v1;已配置的地址不会被修改。
重启后可在模型选择器里核对:第一项应为 DeepSeek V4.1 Flash;llm-pi-ai.providers.opencode-go 中 V4.1 排在首位。
Command Code(commandcode)¶
- 为路由声明
api与baseURL,用户侧通常只需填密钥,不必手填 API 地址。 - 通过公开目录接口
GET https://api.commandcode.ai/provider/v1/models(无需 key、请求不带 Authorization)补齐模型清单,策略为只增不改、幂等。
Command Code 半侧只对用户层已配置过的路由生效(例如填过密钥),并按接口地址 api.commandcode.ai 识别路由;路由名叫 commandcode、commandcode-goat 等均可。
会话头 x-opencode-session¶
对发往 OpenCode / OpenCode Go 路由的请求附加 x-opencode-session:
- 默认
mode: uuid:每个会话一个随机 UUID,不把内部会话 ID 发给第三方。 - 可选
mode: session-id:显式发送内部会话 ID。
用于缓解 MissingSessionID 一类错误,并支持会话亲和等场景。
安装与启用¶
安装命令须来自官方 README,装完按提示重启引擎(无页面半边,无需额外界面配置)。
DSH Ready GUI(推荐)¶
插件随 GUI 内置:打开 GUI → 设置窗口 →「第三方插件」勾选网关路由,安装后重启引擎。
其它 DSH 宿主(dsh web / CLI)¶
任选一条(两条装到的都是仓库完整内容,含 cordis.patch.yml):
# 推荐:直接从 GitHub 装
dsh plugin --profile web add github:itchenshi/dsh-gateway-models
# 备选:从 Release tarball 装(示例版本 v0.2.6)
dsh plugin --profile web add https://github.com/itchenshi/dsh-gateway-models/releases/download/v0.2.6/dsh-gateway-models-0.2.6.tgz
本包不在 npm 上(
registry.npmjs.org查无此包),只能用 GUI 内置或上述两种方式安装。
配置(可选)¶
cordis.patch.yml 里 id: opencode-go 对应行的 config 全部可选:
| 键 | 默认 | 说明 |
|---|---|---|
providers |
[opencode, opencode-go] |
附加会话头的路由名;自定义路由名时加入 |
commandcodeProviders |
无 | 额外的 Command Code 路由 id;仅当某条路由的地址在配置里看不到时才要填 |
mode |
uuid |
uuid = 每会话随机 UUID;session-id = 发送内部会话 ID |
debug |
false |
true 时记录每个收到会话头的流式调用 |
debugFile |
无 | 追加 JSON 日志的路径;仅 $DSH_HOME/logs 或系统临时目录下生效,超过 8 MiB 停止追加 |
不改动配置时,使用上述默认值即可。
典型用法与验证¶
没有独立 UI:安装并重启引擎后,插件在装配层改路由配置。
- OpenCode Go:在模型选择器确认第一项为
DeepSeek V4.1 Flash;必要时查看llm-pi-ai.providers.opencode-go中排序。 - Command Code:在已配置密钥的路由上查看模型列表是否相对安装前增多;启动日志中正常会出现类似
[gateway-models] "commandcode": N model(s) from the provider catalog (list X -> Y)的行。 - 会话头:默认 UUID 模式;若需调试,将
debug设为true或指定合规的debugFile路径。
宿主启动日志中若出现
[gateway-models] active for providers [opencode, opencode-go] with mode uuid (debug=off),表示 OpenCode 相关半侧已激活。
适用场景与注意¶
适合谁
- 使用 DSH 网关路由(OpenCode Go、Command Code),希望少填
baseURL、少手工维护模型列表的开发者。 - 需要 DeepSeek V4.1 在 OpenCode Go 列表置顶,或需要从 Command Code 公开目录同步完整模型清单的场景。
- 遇到 OpenCode 路由
MissingSessionID、需要稳定 per-conversation 会话头时。
环境与兼容性
- DSH >= 0.2.0-rc.2(0.1.x 因设置服务 API 变更无法写入路由配置)。
- Node >= 20。
- 依赖引擎装配层、
settings服务与llm事件的公开契约;契约变更时引擎会在启动时显式报插件加载失败,而非静默失效。
安全与信任
插件以当前 DSH 进程权限运行;安装前应阅读仓库源码与 MIT 许可证。除 Command Code 公开模型目录的 GET 请求外,插件不发起需密钥的出站调用,也不注册本机 HTTP 路由。配置写入经 settings 服务校验,失败时整笔拒绝,不会留下半份配置。
常见问题(摘自 README)
- V4.1 未出现:若日志为
llm.discoverModels() is unavailable或could not detect the "opencode-go" model catalog,插件会跳过自动补模型,而不是猜测。 - Command Code 列表未补齐:若出现
could not read the Command Code model catalog (...),说明公开目录请求失败,原列表保持不变。
DSH 生态理念是「一切皆插件」;SkillHub 目录页 为社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-gateway-models 把 OpenCode Go 与 Command Code 网关路由上重复的协议、端点、模型与会话头工作收到一个宿主插件里:V4.1 置顶、Command Code 目录同步、默认 x-opencode-session,装完重启即可在模型选择器与日志里验证。