最近在使用 DeepSeek Harness 时,对接 DeepSeek 官方模型,奈何消耗过高,一会儿就几块钱出去了,于是打算对接 opencode go 订阅,但是发现对接时 dsh 一方面没有 dsv4.1 模型,一方面是对接直接报错。
考虑到这个问题应该会很快被解决,但是由于需要立刻用上,就简单整理一下解决方案,出现同样的问题的朋友可以参考一下。
背景
DSH 不维护模型清单,opencode-go 的模型来自上游 @earendil-works/pi-ai 的静态目录。该目录滞后于 OpenCode 实际提供的模型,需要在 ~/.dsh/settings.yaml 手工补充。
但是直接加也不行,会有几个约束:
约束
-
不能往内置
opencode-go路由里直接加模型。 单个 model 条目只接受name/contextWindow/maxTokens/input/reasoningEfforts/compat,api和baseURL是路由级字段。而opencode-go是混合协议路由(27 个模型分属 3 种 wire protocol),新模型无处继承api,直接加会报:model "xxx" needs an api; the installed catalog does not describe it在路由级写
api又会把全部 27 个模型强制成同一协议。解法是新开一条单协议路由。 -
OpenCode Go 自 2026-09-05 起要求
x-opencode-session请求头,pi-ai 不发送该头,否则报400 MissingSessionID。见 discussions#5495。
配置方法
编辑 ~/.dsh/settings.yaml:
注,这里面的随机串记得替换
llm-pi-ai:
providers:
opencode-go:
apiKeyEnv: OPENCODE_GO_API_KEY
opencode-go-v41:
displayName: OpenCode Go (V4.1)
apiKeyEnv: OPENCODE_GO_API_KEY
api: openai-completions
baseURL: https://opencode.ai/zen/go/v1
headers:
x-opencode-session: dsh-local-<随机串>
models:
- id: deepseek-v4.1-flash
name: DeepSeek V4.1 Flash
contextWindow: 1000000
maxTokens: 384000
input: [ text, image ]
reasoningEfforts: { low: low, high: high, max: max }
compat:
supportsStore: false
supportsDeveloperRole: false
maxTokensField: max_tokens
requiresReasoningContentOnAssistantMessages: true
thinkingFormat: deepseek
agent-default-model:
provider: opencode-go-v41
model: deepseek-v4.1-flash
reasoningEffort: high
注意:
- 路由必须放在
providers字典下,键名即路由名,不要写错层级了。 - 两条路由共用同一个
apiKeyEnv,无需重复配置凭据。 - 改动下次请求生效,不必重启。
设定后在GUI 模型选择器中会出现 OpenCode Go (V4.1) 分组。
最后就可以正常调用了:

关于 x-opencode-session 的说明
上面用的是静态值,所有会话共用一个 id。能解除 400,但服务端会认为所有对话是同一段,prompt 缓存会失效(该模型缓存读取 $0.003 vs 输入 $0.15,长对话差异明显)。
更好的替代:社区插件 dsh-opencode-session 复用 DSH 会话 id,每会话唯一且跨轮次稳定。
dsh plugin --profile web add dsh-opencode-session
装后删掉配置里的 headers 段。需完全重启 dsh。该插件会 patch 全局 fetch,安装前建议先审查源码。
官方修复进展见 discussions#5495;届时两种 workaround 都可退役。