前言¶
在 DeepSeek Harness(DSH)里走 OpenCode Go(opencode.ai/zen/go)时,出站推理请求需要携带 x-opencode-session。2026-09-05 前后起,缺该头会直接返回 400,错误类型为 MissingSessionID。主对话链路里 agent loop 通常会填 session id,llm-pi-ai 经 pi-ai provider 的 withOpenCodeSessionHeader 也能带上头,一般对话不受影响。问题集中在没有 session id 的手动组装的 LLM 请求——例如内置 @deepseek-ai/dsh-experimental-auto-review 的 reviewer 调用只传 provider、model、system、messages 等字段,不带 sessionId,权限切成 Auto review 后,工具执行前的审查请求会 400,工具随之失败。若在 profile 里用 cordis.patch.yml 的 headers: 写死一个头,reviewer 能过,但会覆盖主对话里正确的 per-session 值。下面介绍社区维护的 Host bundle dsh-opencode-session-header,只在头缺失时补全,不碰已有值。
这是什么¶
dsh-opencode-session-header(包名 @local/dsh-opencode-session-header)是 NotKeKe 发布的 DSH Host bundle,分类上属于联网工具类插件。它包装 host 进程里的 globalThis.fetch:当目标 host 为 opencode.ai(含子域)且请求里缺少 x-opencode-session 时,补上一个进程内稳定的合法 token;已有该头(大小写不敏感)则原样转发;其他 provider(DeepSeek 官方、Anthropic、OpenAI 等)与无法解析 URL 或发生异常时,回退原始 fetch,不引入新的失败模式。
核心功能¶
OpenCode 网关只检查头是否存在且格式合法,不验证 session 是否已注册,因此同一进程内稳定 token 即可;同一 session 的多次审查请求也会共用同一路由键。
行为可概括为:
| 情况 | 行为 |
|---|---|
host 为 opencode.ai 且缺 x-opencode-session |
补上稳定合法 token |
| 已带该头 | 不修改 |
| 其他 provider | 不拦截 |
| URL 无法解析或异常 | 回退原始 fetch |
典型错误形态如下(资料中的原文示例):
INVALID_REQUEST 400: {"type":"MissingSessionID",
"message":"Request is missing x-opencode-session and cannot be routed efficiently."}
实现上选择包装 fetch 而非挂 llm/stream waterfall:@deepseek-ai/dsh-llm 的 stream() 最终 callback 用闭包固定了 options 与 prepared,listener 即使 next(newOptions) 也到不了 adapter,要在请求层补头只能下沉到 fetch。
仓库为 MIT 授权,Host-only、零依赖、无需 build;当前 README 说明没有 Config schema,调整目标 host 或 token 前缀需改 index.js 里的 TARGET_HOSTS、TOKEN_PREFIX;调试可将 VERBOSE 设为 true 在 host console 打印每次注入。
安装与启用¶
插件以当前 DSH 进程权限运行,安装前建议自行查看 GitHub 仓库 源码与 LICENSE。
用 DSH 插件管理器(plugin_manager → install_bundle,target 指向插件目录),或 CLI:
dsh plugin --profile <profile> add <本目录绝对路径>
# 也可以直接从 GitHub 安装:
dsh plugin --profile <profile> add github:NotKeKe/dsh-opencode-session-header
成功时会回报 application: applied,通常无需重启。可用 Config.listConfigs(不需批准)或 dsh --profile <profile> --dump-config 确认是否出现 opencode-session-header 条目。
移除:
dsh plugin --profile <profile> remove @local/dsh-opencode-session-header
卸载会还原原始 fetch,不修改文件、凭据或 profile 配置。
典型用法与场景¶
适用:在 DSH 中通过 OpenCode Go 发推理请求,且存在不经 agent loop 填 session 的路径(尤其是 Auto review 的 classifyRisk() 一类调用)。
用法:安装 bundle 后即可生效,无额外配置步骤;需要排查注入行为时,在 index.js 打开 VERBOSE。
注意:
- 以
link:安装时,插件目录不可移动或删除,否则 bundle 失效;清理前先remove。 - 不要与「在 profile 里全局写死
x-opencode-session」混为一谈:本插件仅补缺,主对话 per-session 路由与缓存亲和性保持原状。
社区目录页:skillhub.cn/plugins/NotKeKe/dsh-opencode-session-header。DSH 生态强调「一切皆插件」;该目录为独立社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
经过上面的步骤,dsh-opencode-session-header 解决的是 OpenCode Go 强制 session 头之后、DSH 内部分请求未带 sessionId 导致的 400。若你已在 Auto review 下遇到 MissingSessionID,优先用官方 README 中的 dsh plugin add 命令安装 Host bundle,比全局覆盖 headers 更稳妥。
- 目录页:https://www.skillhub.cn/plugins/NotKeKe/dsh-opencode-session-header
- GitHub:https://github.com/NotKeKe/dsh-opencode-session-header