@dan-ai-studio/dshopencodego:让 DSH 用上 OpenCode Go 订阅

前言

在 DSH 里接 OpenCode Go 订阅时,你通常只能拿到一个内置 provider:模型列表是构建期写死的快照,网关新增模型要等上游发版才能用;看不到额度窗口,也看不到花费;想单独关掉某个模型,也没有开关。@dan-ai-studio/dshopencodego 补的就是这几件事。

这个插件由 dan-ai-studio 维护,仓库分类是「模型推理」,目前 GitHub 星标 1、fork 0,License 为 MIT。它不是一个新模型,也不是新的推理服务,而是在 DSH 的插件机制上给 opencode-go 路由换了一个适配器,并附带用量与设置界面。

这是什么

一句话定位:给 DeepSeek Harness(DSH)提供的 OpenCode Go provider 适配器,让模型列表实时来自网关,并保证每个推理请求都携带网关要求的 x-opencode-session 头。

它解决的问题分两层:

  1. 网关侧的接口约束。Go 要求每个请求带稳定的 x-opencode-session,缺失会直接返回 400 MissingSessionID。
  2. 使用体验。模型目录、额度、花费、逐模型开关这些原生 DSH 不提供的信息,由插件补齐。

原生 DSH 已经能连 OpenCode Go(llm-pi-ai 内置该 provider)。安装前建议先看清下面的对照表,确认你要的是本插件独有的能力,而不是只想连通。

与原生能力对照

能力 原生 DSH 本插件
实时模型目录 构建期快照,网关新增模型要等 pi-ai 发版 实时读取网关目录,多级回退 + TTL 缓存
额度窗口(5 小时 / 本周 / 本月) 无 有
花费估算 无 有
逐模型开关 modelVisibility 无 有

关于会话头有一点需要说明:它曾是这个插件的原始存在理由,但 pi-ai 已在 2026-09-09(commit 561a2e06)实现注入,llm-pi-ai 现在会自动携带该头,原生 DSH 也不会缺会话头。插件目前仍保留自己的实现(为缺失会话 id 的请求提供一次性 UUID 兜底),后续待上游收敛后再收缩,评估过程见仓库的 docs/scope-review-2026-10.md。

核心能力

下面按插件实际声明的能力列,不额外推断。

  1. 实时模型目录。模型列表从网关读取,配多级回退和 TTL 缓存,不再依赖 pi-ai 打包时生成的固定表。缓存时长由 refreshMinutes 控制,默认 60 分钟,取值 1 ~ 10080(7 天)。
  2. 额度窗口。展示 5 小时 / 本周 / 本月三个窗口的用量。
  3. 花费估算。按轮给出花费,配合请求日志可看到单轮花费。
  4. 逐模型开关 modelVisibility。在设置页直接开关某个模型;未写到的模型走默认规则。
  5. 逐模型容量与协议覆盖。modelLimits 覆盖 contextWindow 与 maxTokens,modelProtocols 作为最后兜底指定协议。
  6. 请求日志。默认关闭,打开后提供侧边栏整页与「会话内请求日志」标签页两个入口,记录时间、模型、会话、输入/输出/缓存、缓存命中、tok/s、首字、耗时与状态,点击行可展开 HTTP 明细。
  7. 连接保留。keepAliveTimeoutMs 决定与网关的连接在两次请求之间保留多久,计时器每次收到回答后重新计时。
  8. 重试策略。retryPolicy 由 dsh-llm-retry 执行,支持 normal / always 两种模式。

安装与启用

前提:DSH 在 0.2.0 系列(0.2.0-rc.1 及之后);Node ^22.19.0 || >=24.0.0;dsh 与 pnpm 可用。

先注意路由互斥:同一个 profile 里 opencode-go 只能由一个适配器提供。装本插件前,先卸载旧插件,或清空 llm-pi-ai 配置里名为 opencode-go 的 provider:

dsh plugin --profile <p> remove @dan-ai-studio/dsh-opencode-go

否则插件会记录一条明确的占用诊断,路由不会注册(其余功能照常)。

方式一:npm(推荐)

dsh plugin --profile web add @dan-ai-studio/dshopencodego@<版本>

仓库 package.json 当前版本为 0.1.77。

安装后要确认插件真的加载了,--dump-config 不能作为证据。启动输出里应出现插件自己的注册日志:

dshopencodego: route "opencode-go" registered as OpenCode Go

enabled: false 时是 dshopencodego: disabled by configuration; …。没有这条日志就没加载;被版本门禁拒绝时,同一条输出流里会打印 Plugin … is incompatible with dsh …。

没有 HMR 的 profile 安装后会回报 restart-required(restartReason: no-hmr),需要重启 DSH 后才生效。日志位置:启动失败会把完整诊断写到 $DSH_HOME/logs/startup-<时间戳>-<uuid>.log 并打印该路径;dsh plugin 失败会打印 dsh: plugin command failed; diagnostics: <路径>。

确认会话头是否真的发出去了,可以用仓库自带的零成本预检:

node tools/verify/live-check.mjs --check-only

它会打印本次将会携带的 x-opencode-session 与 x-session-affinity。去掉 --check-only、加 --allow-live 才会真发一次最小请求(会产生费用),脚本随后断言并打印 OK x-opencode-session: <会话 id>。

方式二:GitHub Release

dsh plugin --profile web add https://github.com/dan-ai-studio/dshopencodego/releases/download/v<版本>/dan-ai-studio-dshopencodego-<版本>.tgz

方式三:本地构建

npm ci
npm run build
npm pack
dsh plugin --profile web add ./dan-ai-studio-dshopencodego-<版本>.tgz

用本地路径安装 tarball。把远程 tarball URL 装进一个已有缓存的 profile 会撞上 pnpm 的 ERR_PNPM_MISSING_TARBALL_INTEGRITY。

升级与卸载:

dsh plugin --profile web add <新版本 tarball 或包名>
dsh plugin --profile web remove @dan-ai-studio/dshopencodego

pnpm 对同名本地 tarball 会静默复用旧内容(added 0),升级本地构建时请改文件名再装。

桌面端

DSH 桌面端是 Electron 壳 + 完整的 dsh Web 应用,本插件的 client 半边声明的平台就是 web。桌面端使用自己的 profile $DSH_HOME/profiles/desktop,与 profiles/web 互不共享:凭证、模型可见性与插件设置都要在桌面端重新配一次。

安装必须走应用内界面,不要用上面的 dsh plugin 命令,因为桌面端 profile 由 Electron 自己拥有,CLI 不能启动也不能修改它。

  1. 打开桌面端 → 设置 → Plugins(插件)页;
  2. 安装规格填 @dan-ai-studio/dshopencodego(或指定版本,如 @dan-ai-studio/dshopencodego@0.1.11),确认安装;
  3. 按提示重启应用,再到设置页填 API Key,引用名 OPENCODE_GO_API_KEY。

桌面端内置的 DSH 版本要落在已声明并验证过的版本带内(>=0.2.0-rc.1 <0.3.0)。若插件导致启动失败,桌面端的原生恢复对话框可以一键禁用第三方插件、备份 cordis.patch.yml 后重启。

配置

配置写在 profile 的 cordis.patch.yml:

- id: dshopencodego
  name: '@dan-ai-studio/dshopencodego'
  config:
    enabled: true
    apiKeyEnv: OPENCODE_GO_API_KEY
    baseURL: https://opencode.ai/inference/go/v1
    refreshMinutes: 60
    streamIdleTimeoutMs: 300000
    keepAliveTimeoutMs: 600000
    imageBudgetPreset: dsh
    modelVisibility:
      glm-5: true
    modelLimits:
      kimi-k3:
        contextWindow: 262144
        maxTokens: 32768
    modelProtocols:
      some-new-model: openai-responses
    pinnedAddresses:
      opencode.ai: 104.18.32.47
    requestLogEnabled: false
    requestLogDebug: false
    requestLogMaxEntries: 200
    retryPolicy:
      mode: normal
      maxRetries: 2
      retryableCodes: [RATE_LIMIT, TIMEOUT]
      backoff:
        initialDelayMs: 500
        maxDelayMs: 10000
        jitterRatio: 0.1

几个默认值和取值范围:

  1. baseURL 默认 https://opencode.ai/inference/go/v1,也可指定为 https://opencode.ai/inference/v1(Console 主端点,含按量/免费模型)。只能是不带 query / fragment 的 http(s) 地址,写 ?x=1 会在保存配置时被拒。
  2. refreshMinutes 取值 1 ~ 10080。
  3. streamIdleTimeoutMs 默认 300000,上限 2147483647。它约束的是两次流事件之间的最长静默,不是请求总时长,长思考模型只要持续产出事件就不会被误判。超时抛出 TIMEOUT,属可重试类。
  4. keepAliveTimeoutMs 默认 600000,取值 1 ~ 1800000。它只影响固定了地址(pinnedAddresses)的部署:没有固定地址时走系统自己的 fetch,插件不加任何东西。连接一旦断开,下一轮第一个 token 要多付一次约 200ms 的 TCP 与 TLS 握手,所以这条配置在对话场景下有实际意义。设置页以秒显示与填写,存储时换算成毫秒。
  5. imageBudgetPreset 三选一:dsh / dshopencodego / pi-ai,默认 dsh。
  6. modelProtocols 合法值只有 anthropic-messages / openai-completions / openai-responses。写错会让该模型以「配置缺失」出现(开关关闭、不可选),而不是回退到猜测。
  7. requestLogEnabled 默认关闭。关闭后入口一并消失,请求路径与没有该日志时逐字节一致。保留条数 requestLogMaxEntries 取值 50 ~ 500,默认 200。
  8. retryPolicy 是联合类型:normal 读 maxRetries / retryableCodes / backoff,always 只读 backoff。maxRetries 默认 5,backoff 的 initialDelayMs 默认 500、maxDelayMs 默认 10000、jitterRatio 默认 0.1。

上述约束在写入 profile 时就校验,不会拖到第一次请求。

API Key 通过 Harness 凭证库提供(引用名 OPENCODE_GO_API_KEY),也可以直接 export OPENCODE_GO_API_KEY=...。

典型用法

装完插件、填好 API Key 之后,常规流程是:

  1. 重启 DSH(无 HMR 的 profile 必须重启),确认启动输出里有插件注册日志。
  2. 打开设置页,在模型列表里用 modelVisibility 关掉不需要的模型,或用 modelLimits 为个别模型指定 contextWindow 与 maxTokens。
  3. 如果要排查某一轮为什么慢,打开 requestLogEnabled,在会话内的「请求日志」标签页看本会话请求的耗时、tok/s、首字与状态,点开行可看 HTTP 明细。
  4. 网关侧新增模型后,目录会在 refreshMinutes 到期后自动刷新;希望立刻生效就缩短该值或等待下一轮缓存过期。

需要确认插件在跑而不想发真实请求时,用 --check-only 预检即可,它会把这次将会携带的 x-opencode-session 与 x-session-affinity 打印出来。

适用场景与注意

适合这几类情况:

  1. 已经用原生 provider 连通 OpenCode Go,但需要实时模型目录、额度窗口或花费估算。
  2. 需要在设置页逐个开关模型,或为特定模型覆盖容量参数。
  3. 需要逐请求日志来定位慢请求、缓存命中与连接复用情况。

不适合:只是要一个能用的 OpenCode Go 连接,且不需要上面任何一项能力——原生 DSH 已经内置该 provider。

注意事项:

  1. 插件以当前 DSH 进程的权限运行,会访问网络与 Harness 凭证库(引用名 OPENCODE_GO_API_KEY)。安装前先读一遍源码与许可证(MIT),确认行为符合你的部署环境。
  2. 路由互斥。同一个 profile 里 opencode-go 只能由一个适配器提供,装之前先卸载旧插件或清空对应 provider 配置。
  3. profile 之间不共享凭证。桌面端的 profiles/desktop 与 profiles/web 互不共享,凭证、模型可见性与插件设置都要在桌面端重新配一次。
  4. 目录页与社区目录是独立站点,与 DeepSeek / 幻方无官方从属关系,它不是官方应用商店,安装与版本信息以 GitHub 仓库为准。
  5. 本插件当前版本为 0.1.77,DSH 版本需落在 >=0.2.0-rc.1 <0.3.0-0;星标 1、fork 0,属于早期阶段的社区项目,改动节奏以仓库 release 为准。

小结

这个插件做的事情很窄:给 DSH 的 opencode-go 路由换一个适配器,把模型目录、额度、花费和逐模型开关补上,再附带一份逐请求日志。如果你的使用场景正好落在这几项上,值得一试;如果只是要连通,原生 DSH 已经够用。

  • 目录页:https://www.skillhub.cn/plugins/dan-ai-studio/dshopencodego
  • GitHub:https://github.com/dan-ai-studio/dshopencodego
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye