🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

OpenCode 会话标头补全 NotKeKe/dsh-opencode-session-header

DeepSeek Harness
NotKeKe19 天前有提交已提供中文文档扫描:未发现敏感能力

为缺失会话标头的 OpenCode 请求自动补上,避免审查报错

29.6/100
综合分
1
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add NotKeKe/dsh-opencode-session-header
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:仅索引
是什么[目录]—
dsh 原生插件 · tool
暂无时间戳·判据 →
装得上吗[实装验证]—
本站尚未做安装检查
暂无时间戳·判据 →
安全吗[自动扫描]—
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
数据截至 2026/11/04·判据 →
还在维护吗[仓库]✓
活跃:最近一次提交在 19 天前
暂无时间戳·判据 →
图例:✓ 通过! 需注意— 未判定 / 无数据· 「未判定」= 本站尚无数据,不代表插件有问题
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

发起外部网络请求
查看扫描证据(共 11 处,展示前 11 条)
  • 请求外部主机opencode.ai
    verify.mjs:36
    await globalThis.fetch('https://opencode.ai/zen/go/v1/responses', {
  • 发起网络请求
    verify.mjs:36
    await globalThis.fetch('https://opencode.ai/zen/go/v1/responses', {
  • 请求外部主机opencode.ai
    verify.mjs:43
    await globalThis.fetch('https://opencode.ai/zen/go/v1/responses', {
  • 发起网络请求
    verify.mjs:43
    await globalThis.fetch('https://opencode.ai/zen/go/v1/responses', {
  • 请求外部主机api.deepseek.com
    verify.mjs:49
    await globalThis.fetch('https://api.deepseek.com/anthropic/v1/messages', {
  • 发起网络请求
    verify.mjs:49
    await globalThis.fetch('https://api.deepseek.com/anthropic/v1/messages', {
  • 请求外部主机edge.opencode.ai
    verify.mjs:55
    await globalThis.fetch('https://edge.opencode.ai/zen/go/v1/responses');
  • 发起网络请求
    verify.mjs:55
    await globalThis.fetch('https://edge.opencode.ai/zen/go/v1/responses');
  • 请求外部主机opencode.ai
    verify.mjs:59
    await globalThis.fetch(new Request('https://opencode.ai/zen/go/v1/responses', {
  • 发起网络请求
    verify.mjs:59
    await globalThis.fetch(new Request('https://opencode.ai/zen/go/v1/responses', {
  • 发起网络请求
    verify.mjs:65
    await globalThis.fetch('not a url');
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库
涉及外部主机:opencode.ai、api.deepseek.com、edge.opencode.ai

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

DeepSeek Harness 宿主包:给缺少 x-opencode-session 的 OpenCode Go 请求补上这个头,修复 400 MissingSessionID 报错,比如 Auto review 下的情况。

README

由 DeepSeek 最新模型翻译生成
dsh-opencode-session-header 给 DeepSeek Harness(DSH)用的 Host bundle:给发往 OpenCode Go 的请求补上缺失的 x-opencode-session 标头 —— 而且只在标头真的缺了的时候才补。 解决的问题 OpenCode Go(opencode.ai/zen/go)从 2026-09-05 前后开始强制要求每个推理请求携带 x-opencode-session,缺了就直接拒绝路由: INVALID_REQUEST 400: {"type":"MissingSessionID", "message":"Request is missing x-opencode-session and cannot be routed efficiently."} 在 DSH 里这个标头平常是带得上的:agent loop 每次对话都会填一个 session id,llm-pi-ai 走 pi-ai 目录 provider 时由其 withOpenCodeSessionHeader 从 options.sessionId 生成。所以一般对话不会出问题。 问题出在没有 session id 的手动组装请求。
展开完整文档(README 剩余 1 节)
dsh-opencode-session-header

给 DeepSeek Harness(DSH)用的 Host bundle:给发往 OpenCode Go 的请求补上缺失的 x-opencode-session 标头 —— 而且只在标头真的缺了的时候才补。

解决的问题

OpenCode Go(opencode.ai/zen/go)从 2026-09-05 前后开始强制要求每个推理请求携带 x-opencode-session,缺了就直接拒绝路由:

INVALID_REQUEST 400: {"type":"MissingSessionID",
"message":"Request is missing x-opencode-session and cannot be routed efficiently."}

在 DSH 里这个标头平常是带得上的:agent loop 每次对话都会填一个 session id,llm-pi-ai 走 pi-ai 目录 provider 时由其 withOpenCodeSessionHeader 从 options.sessionId 生成。所以一般对话不会出问题。

问题出在没有 session id 的手动组装请求。最典型的是内置的 @deepseek-ai/dsh-experimental-auto-review:它的 reviewer 调用(classifyRisk())只带 provider / model / system / messages / temperature / signal,没有 sessionId。结果就是 —— 把权限切成 Auto review 之后,每次工具执行前的审查请求都 400,工具本身也跟着失败。

这个插件怎么修

包装 host 进程的 globalThis.fetch,规则只有一条:

| 情况 | 行为 |
| host 是 opencode.ai(含子域名)且缺 x-opencode-session | 补上一个稳定的合法 token |
| 已经带了该标头(不分大小写) | 原封不动 |
| 其他 provider(DeepSeek 官方、Anthropic、OpenAI…) | 完全不碰 |
| URL 无法解析或任何异常 | 回退原始调用,不制造新的失败模式 |

「只在缺失时补」是这个插件存在的理由。 换成在 provider profile 直接写死一个标头(cordis.patch.yml 的 headers:)也能让 reviewer 通关,但那会把主对话原本正确的 per-session 值一起盖掉 —— 等于拿对话路由/缓存亲和性去换。这里不碰已存在的值,主对话维持原状。

网关只检查标头存在且格式合法,不验证 session 是否真的注册过,所以一个 process 稳定的 token 就足够;同一个 session 的多次审查请求也会共用同一个路由键。

为什么是包装 fetch,不是拦截 llm/stream

llm service 有 llm/stream waterfall,看起来是理想的拦截点,但它改不动最终送出去的请求:

// @deepseek-ai/dsh-llm —— stream() return this.ctx.waterfall(this, "llm/stream", options,
() => this.adapterStream(options, prepared));

final callback 用闭包捕获了 options 与 prepared,而且不吃参数,所以 listener 即使调用 next(newOptions) 也到不了 adapter。要在请求层补东西,只能往更下层、也就是 fetch 这一层走。

安装

用 DSH 的插件管理器(plugin_manager → install_bundle,target 指向这个目录),或命令行:

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,不修改任何文件、凭证或配置。

注意

- 以 link: 方式安装时,这个目录不能移动或删除,否则插件会失效。要清理请先移除 bundle。
- 目前没有 Config schema。要调整目标 host 或 token 前缀,请改 index.js 的 TARGET_HOSTS / TOKEN_PREFIX 常量。
- 把 VERBOSE 设成 true 可以让每次注入都印一行到 host console,方便排查;平常请保持 false。

文件

| 文件 | 作用 |
| index.js | 全部逻辑(fetch 包装) |
| package.json | Host-only bundle manifest,零依赖、无需 build |
| cordis.patch.yml | 插入 opencode-session-header 这一列 |
| verify.mjs | 离线行为检查 |

背景链接

- pi-ai issue:@earendil-works/pi-ai never sends the x-opencode-session header —— https://github.com/earendil-works/pi/issues/9326
- opencode issue:Go provider 400 MissingSessionID —— https://github.com/anomalyco/opencode/issues/47763
- OpenCode 官方公告(2026-09-03):自 09/06 起,缺少此标头的请求可能开始报错。

授权

MIT License —— 见 LICENSE。
预览分享卡片长什么样 ↓NotKeKe/dsh-opencode-session-header
分享 · DeepSeek Harness Hub
NotKeKe/dsh-opencode-session-header

为缺失会话标头的 OpenCode 请求自动补上,避免审查报错

这个插件是你维护的吗?
作者本人可认领并核对本条目;认领通过后,详情页会显示「作者已认领」标记。
认领条目 →
回到顶部