按模型给网关请求附加对应生态的会话 ID 头
29.9/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/10/24 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
相关生态插件(非 dsh 原生,按其对应运行时安装)
git clone https://github.com/jiangwennn/dsh-model-session-headers.git状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
生态应用
桌面端 / Web 外壳,不以 dsh plugin add 安装
装得上吗
本站尚未做安装检查
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
活跃:最近一次提交在 8 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件
查看扫描证据(共 1 处,展示前 1 条)
- 写入本地文件index.js:425
appendFile(debugFile, `${JSON.stringify(entry)}\n`).catch((error) => {
扫描于 2026/10/31(0 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
README
由 DeepSeek 最新模型翻译生成dsh-model-session-headers
给 DeepSeek Harness (DSH) 用的插件:按模型(而不是按 provider 路由)给发往网关的请求附加会话 ID 头,内置两种生态的写法:
| 生态 | 请求头 | 谁在读 |
| Claude Code | x-claude-code-session-id | Claude Code 兼容网关 / 中转(按会话聚合流量、计费、粘性路由) |
| OpenCode Go | x-opencode-session | OpenCode / OpenCode Go(缺头会 400 MissingSessionID,同值请求粘在同一后端以保 prompt cache) |
| 通用 | x-session-id | LiteLLM / one-api 等自建中转 |
同一个 provider 路由下的两个模型可以走两套头:claude- 发 Claude Code 头,deepseek- 发 OpenCode 头,互不干扰。
为什么需要它
DSH 没有「单请求头」的扩展点:GenerateOptions 里没有 headers 字段,每个适配器在 stream() 内部自己拼 wire headers。
展开完整文档(README 剩余 1 节)
dsh-model-session-headers
给 DeepSeek Harness (DSH) 用的插件:按模型(而不是按 provider 路由)给发往网关的请求附加会话 ID 头,内置两种生态的写法:
| 生态 | 请求头 | 谁在读 |
| Claude Code | x-claude-code-session-id | Claude Code 兼容网关 / 中转(按会话聚合流量、计费、粘性路由) |
| OpenCode Go | x-opencode-session | OpenCode / OpenCode Go(缺头会 400 MissingSessionID,同值请求粘在同一后端以保 prompt cache) |
| 通用 | x-session-id | LiteLLM / one-api 等自建中转 |
同一个 provider 路由下的两个模型可以走两套头:claude- 发 Claude Code 头,deepseek- 发 OpenCode 头,互不干扰。
为什么需要它
DSH 没有「单请求头」的扩展点:GenerateOptions 里没有 headers 字段,每个适配器在 stream() 内部自己拼 wire headers。本插件组合两个官方拦截点补上这一层:
1. llm/stream waterfall —— 拿到这次调用的 options.provider / options.model / options.sessionId;
2. 打补丁的 globalThis.fetch —— 真正把头写进出站请求。
AsyncLocalStorage 把补丁的作用域限定在这一次流式调用内,所以 Web RPC、遥测、工具请求等无关 fetch 完全不受影响。
和「provider 级请求头」类插件的区别:那类插件只能对整个路由生效,无法区分同一路由下的不同模型;本插件按模型 id 匹配,粒度更细。
安装
本地目录(开发时用,link 安装,改完重启 DSH 即生效)
dsh plugin --profile web add /abs/path/to/dsh-model-session-headers
或从 git
dsh plugin --profile web add github:jiangwennn/dsh-model-session-headers
装完重启 profile(bundle 层在启动时读取)。确认层已生效:
dsh --profile web --dump-config | grep model-session-headers
设置界面
web profile 里,打开「设置 → 插件 → Installed plugins → dsh-model-session-headers」,可以直接编辑规则:添加/删除、填模型 glob、选 flavor、启用开关。保存后无需重启,下一次模型调用即生效。
设置页里的规则编辑器
保存写入的是 profile 的 cordis.patch.yml(行 id model-session-headers),与手写 YAML 完全等价,两种方式可以混用。
实现上有两个坑,都已在代码里处理:
- rules 必须声明 .volatile(),否则 SettingsForms.write() 以 not volatile 拒绝写入;但 volatile 字段会被 DSH 换成 observable 传给插件,直接 .filter() 会抛错,所以读取统一走 unwrapRules()。
- 插槽渲染器以普通函数调用的方式执行组件,函数组件里的 React hooks 不生效(组件静默不渲染),所以卡片写成 class 组件。
配置
写在 profile 的 cordis.patch.yml(或本包自带的同名文件,安装后按 id 覆盖整个 config,需写全量):
- insert:
- id: model-session-headers
name: dsh-model-session-headers
config:
mode: session-id # session-id | uuid | fixed
keepPrefix: false
overwrite: false
debug: false
rules:
Claude Code 兼容:所有 claude 系模型
- models: ["claude-", "anthropic/claude-"]
flavor: claude-code
OpenCode Go:只对走 opencode-go 路由的 deepseek 模型
- models: ["deepseek-v4"]
providers: [opencode-go]
flavor: opencode-go
完全自定义:一个模型挂多套头
- models: ["my-gateway-model"]
headers:
x-session-id: "{sessionId}"
x-opencode-session: "{sessionId}"
x-tenant: acme
x-routing-key: "{provider}/{model}"
规则匹配
- 规则自上而下求值,首条命中生效;未命中任何规则的调用原样透传。
- models 支持 / ? 通配,大小写不敏感。完整 id 和最后一段(/ 之后)都会参与匹配,所以 claude-* 能命中 anthropic/claude-sonnet-4-6。
- models 留空 = 不限模型;providers 留空 = 不限路由;两者都空 = 该规则匹配全部调用(相当于全局)。
- enabled: false 可临时停用某条规则。
头信息
flavor 提供预设,headers 在其之上追加或覆盖(同名后者胜):
| flavor | 默认头 |
| claude-code | x-claude-code-session-id: {sessionId} |
| opencode-go | x-opencode-session: {sessionId} |
| generic | x-session-id: {sessionId} |
模板变量:{sessionId}、{model}、{provider}。模板里没有变量时就是固定值。
取值语义
| mode | 头的值 |
| session-id(默认) | 本次调用的 DSH 会话 id;默认去掉 session- 前缀,只发裸 UUID(keepPrefix: true 可保留) |
| uuid | 会话 id 的 SHA-256 派生的 UUIDv5 形态,跨进程稳定、对上游不可读 |
| fixed | 配置里的 value,所有调用相同(value 为空则该规则不注入) |
会话 id 缺失的调用(部分内部辅助请求)不注入任何头,不会把空值发出去。
覆盖行为
默认不覆盖已存在的同名头(HTTP 语义上大小写不敏感),这样适配器自己设置的值优先。某些官方 provider 会写死占位符(如 x-opencode-session: dsh-web-search),此时把 overwrite 打开(全局或单条规则),或让规则里的 headers 覆盖预设。
调试
debug: true # 控制台打印每次注入 debugFile: /tmp/session-headers.jsonl # 每次注入追加一行 JSON
JSONL 每行:{"ts","provider","model","session","headers"}。
工作原理
llm/stream(options, next)
├─ selectRule(): provider + model 匹配 → 命中规则 ├─ buildHeaders(): flavor/headers 模板 → [[header, value], ...] └─ 每次 iterator.next() 都在 als.run(scope) 内执行 └─ 适配器内部 fetch() └─ 补丁后的 fetch: 读 als store → 合并 headers → 发请求
- ctx.on('llm/stream') 与 ctx.effect() 都是可逆注册,卸载插件时自动移除监听并还原 fetch(若期间被别的插件再次替换则不强行还原,只告警)。
- 合并 headers 覆盖两种 fetch 写法:Request 对象自带的 headers,以及 init.headers 覆盖。
限制
- 只覆盖 llm/stream 内的对话/流式请求。GET /models 这类模型发现请求是独立流程,不会带头;如果网关连列表接口都拒绝,需要另做适配。
- 依赖 DSH 出站 LLM 请求走 Node 全局 fetch。未来若 DSH 换网络栈,注入会失效(症状是原来的缺头报错回归)。
- 不伪造 TLS 指纹、user-agent、anthropic-beta 等其他头;需要时用规则的 headers 显式添加。
- 不把内部会话 id 泄露给第三方:只有命中规则的出站请求会被改写,其他 fetch 原样通过。
开发
npm install
npm test # node:test,含本地 echo server 的端到端断言
无构建步骤,index.js 即产物。
已验证
- DSH 0.2.1-rc.2(Node 24):dsh plugin --profile web add <dir> 安装成功,--dump-config 中可见 # == dsh-model-session-headers 层,web profile 启动时 apply 被真实调用。
- 16 个本地测试通过,含 llm/stream → 补丁 fetch → echo server 的端到端断言(Claude Code / OpenCode Go / 未匹配模型 / 不覆盖 / 覆盖 / Request 对象 / 卸载还原)。
- 未对真实 Claude Code 或 OpenCode Go 网关发过请求。头名按官方文档核对:Claude Code 网关的 x-claude-code-session-id、OpenCode 的 x-opencode-session。
License
MIT预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
jiangwennn/dsh-model-session-headers
按模型给网关请求附加对应生态的会话 ID 头
相关插件 · 模型接入
API 中继安全审计toby-bridges/api-relay-audit
面向 AI API 中转与 LLM 代理的本地安全审计。
★ 897已汉化DSH
69.4
免费搜索插件DDDMUC/dsh-free-search
DeepSeek Harness 免费搜索插件 —— 无需 API key,零成本,多引擎可切换。 一个给…
★ 761已汉化DSH
68.7
免费联网搜索liustack/modsearch
在官方 App 里模型能联网,切到 API 就不能了。ModSearch 把联网补回来:网页搜索、X…
★ 863已汉化DSH
68.5
OpenCode 免费模型FishBottle7/opencode2dsh
在 DSHDeepSeek Harness里原生使用 OpenCode Zen 的免费匿名模型。
★ 379已汉化DSH
67.8
AI 模型网关tingly-dev/tingly-box
Tingly Box Web UI 演示
★ 373已汉化DSH
67.4
WorkBuddy 账号池XDTrees/dsh-xdpool
把你能白嫖的模型额度接进 DSH 同一个池:WorkBuddy 多账号自动容错、十三家扫码登录、76…
★ 359已汉化DSH
67.1