在 DSH 手动启用 OpenCode Go DeepSeek v4.1 新模型

在 DSH 手动启用 OpenCode Go DeepSeek v4.1 新模型

💡 原文中文,约2100字,阅读约需5分钟。
📝

内容提要

DSH 对接 OpenCode Go 时缺少 DeepSeek V4.1 模型并报错。由于内置路由采用混合协议,无法直接添加模型,需在 settings.yaml 中新建单协议路由 opencode-go-v41,配置 api、baseURL 及模型参数,并添加 x-opencode-session 请求头以解决 400 错误。静态会话头会导致缓存失效,建议改用社区插件 dsh-opencode-session 复用会话 ID。

🔎

延伸解读

为何不能直接添加模型

DSH 的模型清单来自上游静态目录,滞后于 OpenCode 实际提供的模型。内置 opencode-go 路由是混合协议路由,包含 27 个模型、分属 3 种 wire protocol,而 api 和 baseURL 是路由级字段,单个模型条目无法继承。直接添加新模型会报错,在路由级写 api 又会强制所有模型使用同一协议。因此需要新建单协议路由来隔离配置。

静态会话头的代价

配置中使用的 x-opencode-session 是静态值,所有会话共用一个 ID。这能解决 400 MissingSessionID 错误,但服务端会视所有对话为同一段,导致 prompt 缓存失效。该模型缓存读取费用为 $0.003,而输入为 $0.15,长对话下成本差异明显。建议改用社区插件 dsh-opencode-session,它复用 DSH 会话 ID,每会话唯一且跨轮次稳定。

配置注意事项

新路由必须放在 providers 字典下,键名即路由名,层级错误会导致配置无效。两条路由可共用同一个 apiKeyEnv,无需重复配置凭据。改动下次请求生效,不必重启。设置后 GUI 模型选择器会出现 OpenCode Go (V4.1) 分组。若使用社区插件,安装后需删除配置中的 headers 段,并完全重启 dsh。

Q&A

DSH 对接 OpenCode Go 时为什么找不到 DeepSeek V4.1 模型?

因为 DSH 不维护模型清单,opencode-go 的模型来自上游 @earendil-works/pi-ai 的静态目录,该目录滞后于 OpenCode 实际提供的模型,所以需要手动在 ~/.dsh/settings.yaml 中补充。

为什么不能直接在 DSH 的内置 opencode-go 路由里添加 DeepSeek V4.1 模型?

因为 opencode-go 是混合协议路由(27 个模型分属 3 种 wire protocol),单个 model 条目只接受 name/contextWindow/maxTokens/input/reasoningEfforts/compat,api 和 baseURL 是路由级字段。直接加模型会报错:model "xxx" needs an api; the installed catalog does not describe it;而在路由级写 api 又会把全部 27 个模型强制成同一协议。

如何手动配置 DSH 以使用 OpenCode Go 的 DeepSeek V4.1 模型?

编辑 ~/.dsh/settings.yaml,在 llm-pi-ai.providers 下新建单协议路由 opencode-go-v41,配置 api: openai-completions、baseURL: https://opencode.ai/zen/go/v1、headers 包含 x-opencode-session: dsh-local-<随机串>,并添加模型条目(如 deepseek-v4.1-flash),设置 contextWindow、maxTokens、input、reasoningEfforts、compat 等参数。同时可设置 agent-default-model 指向该路由和模型。

配置后如何验证 DeepSeek V4.1 模型已启用?

改动下次请求生效,不必重启。设定后在 GUI 模型选择器中会出现 OpenCode Go (V4.1) 分组,即可正常调用。

为什么需要添加 x-opencode-session 请求头?

因为 OpenCode Go 自 2026-09-05 起要求 x-opencode-session 请求头,而 pi-ai 不发送该头,否则会报 400 MissingSessionID 错误。

使用静态 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。

🏷️

标签

➡️

继续阅读