dsh-model-session-headers

DSH PLUGIN模型与账号接入

仓库 jiangwennn/dsh-model-session-headers

模型与账号接入 L5 · 运行验证通过 安全审查:低风险 可信度:金 可安装插件
安装这个插件

dsh-model-session-headers 是 jiangwennn 维护的 模型与账号接入 类 DSH 可安装插件, 仓库为 jiangwennn/dsh-model-session-headers,许可证 MIT。 下面按「装什么、怎么装、验没验过、跑起来要注意什么」逐项列出。

一句话选型结论

按资料字段整理

dsh-model-session-headers 是模型与账号接入类的 DSH 可安装插件,验证等级 L5 · 运行验证通过,安全审查为低风险,有可直接复制的安装命令。验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么;涉及密钥或系统权限的,建议先在隔离环境试装。

分类模型与账号接入 收录类型可安装插件 验证等级L5 · 运行验证通过 安全审查低风险
验证等级 L5 L5 · 运行验证通过
GitHub 星标 0 复刻 0 · 未关闭 issue 0
最近更新 2026-10-24 创建于 2026-10-23
README 9.7 KB 正文体量,越大说明说明书写得越细

安装

可安装插件
在 DSH 里执行,装完用 dsh plugin list 确认已挂上;标了 L4 / L5 的命令已在沙盒里真实跑通
dsh plugin --profile web add github:jiangwennn/dsh-model-session-headers
  1. 1
    确认版本与运行环境

    仓库没有标注兼容版本与 Node.js 要求,先确认你的 DSH 版本能装,再继续。

  2. 2
    执行安装命令

    在 DSH 里执行上面的命令;多包仓库要注意区分具体子包名,别装错包。

  3. 3
    确认已挂载

    用 dsh plugin list 查看列表里是否出现这个插件,出现即挂载成功。

  4. 4
    试跑并检查权限

    加载后跑一个最小用例,确认它能正常工作;同时看它申请了哪些文件、命令或网络权限。

兼容 DSH 版本未标注版本不匹配时安装会报错
Node.js 要求未标注来自仓库 package.json 的 engines 字段
前置依赖无需要同时安装的同级依赖
npm 包名未发布到 npm可用 npm view 查看包信息

能做什么

模型与账号接入
字段来自项目仓库与公开索引,中文说明由本站标注

上游标签

cordis-plugindeepseek-harnessdshdsh-pluginllm-gateway

验证等级与安全审查

L5 · 运行验证通过
自动化流程结论,不是人工审核
验证等级L5 · 运行验证通过在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来
安全审查低风险静态分析结论,未标注不代表已通过审查
仓库健康度活跃按仓库活跃度与最近更新时间给出
可信度金综合仓库活跃度与验证结果

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 验证等级 L5:安装和运行都在沙盒里跑通过,装完能直接用的概率高。
  • 静态安全审查为低风险,没有发现明显可疑行为。
  • 有可直接复制的安装命令,不用自己翻文档找入口。

先想清楚的地方

  • 没有声明 Node.js 版本要求,版本不匹配可能装不上。
  • 验证通过不等于安全:插件会读写文件、执行命令或联网,装前先到仓库确认它做了什么。

更适合

  • 需要在模型与账号接入场景里给 DSH 补能力的人。
  • 想装完就能用、不想自己排依赖的人。
  • 能接受在本地装依赖、愿意自己确认权限的人。

不太适合

  • 只使用 DSH 官方内置能力、不接受第三方插件的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
插件验证等级安全审查星标兼容版本安装命令
dsh-model-session-headers当前 L5 · 运行验证通过 低风险 0 未标注 有
archify L4 · 沙盒安装通过 低风险 8.0 万 未标注 有
DeepSeek-Reasonix L4 · 沙盒安装通过 低风险 3.6 万 未标注 有
nocobase L3 · 安装规范通过 低风险 2.5 万 0.1.1-rc.2 无
learn-harness-engineering L4 · 沙盒安装通过 低风险 2.0 万 未标注 有
dsh-our-free-model 未做沙盒验证 未标注 8,064 未标注 无

仓库档案

模型与账号接入
字段来自项目仓库与公开索引,中文说明由本站标注
作者 / 维护方jiangwennn仓库 dsh-model-session-headers · 默认分支 main
分类模型与账号接入ai
收录类型可安装插件声明了 dsh.bundle、可用 dsh plugin add 安装的条目
开发语言未标注仓库主语言
许可证MIT商用或二次分发前请确认条款原文
星标 / 复刻 / issue0 / 0 / 0收录时的数值,非实时
创建 / 更新2026-10-23 · 2026-10-24最后推送 2026-10-24
本站收录2026-10-30首次进入本站目录的时间

README 全文

9.7 KB
作者原文,中文版优先;只做安全转义,不改内容

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 组件。

对话右上角的发送状态

每个对话的头部(固定在「后台任务」按钮左侧,后台任务出现或消失时不会被挤动)会显示一个状态标记:圆点 + 最近一次请求的头名称。

圆点 含义
绿 已发送:DSH 已带上这个头发出请求
黄 跳过:请求里已有同名头且 overwrite 关闭,保留了原值
灰 未命中规则,或还没有请求记录

点开后列出会话 id 和这个对话最近 10 次请求:时间、provider / 模型、状态、实际发出的头和值(跳过时显示已存在的值)。

  • 默认开启。在设置卡片里取消「在对话右上角显示发送状态」即可关闭,保存后无需重启;关闭期间不再记录。等价 YAML:showStatus: false。
  • 记录只在内存中,每个对话最多 10 条、最多保留 100 个对话,DSH 重启后清空。
  • 没有会话 id 的内部辅助请求无法归属到某个对话,不会出现在列表里。
  • 只能证明 DSH 这一跳已发出。中间网关(如 magpie)是否把头转发给上游,这里看不到——那需要看网关自己的日志。

实现:host 端注册只读接口 GET /model-session-headers/api/status?session=,经 connection.requestRejection 做浏览器信任校验;前端每 3 秒(页面不可见时暂停)按页面自身的 base 解析相对路径请求它——desktop 页面是 dsh-app://app/,直接请求 host 的 127.0.0.1 源会因跨域被浏览器拦截。

配置

写在 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}"

默认规则

未配置 rules 时内置两条规则(本包自带的 cordis.patch.yml 也写的是这两条):

模型 flavor 示例
opencode/*、*/opencode/* opencode-go opencode/deepseek-v4.1-flash、aihub/opencode/deepseek-v4.1-flash
claude-* claude-code claude-sonnet-4-6、anthropic/claude-sonnet-4-6

显式写 rules: [] 表示停用全部注入;profile 里已有的 rules 会整体覆盖默认规则。

规则匹配

  • 规则自上而下求值,首条命中生效;未命中任何规则的调用原样透传。
  • 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 安装成功,--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

常见问题

6 问
答案由本站依据条目字段整理,不引用上游原文
dsh-model-session-headers 怎么安装?

在 DSH 里执行 `dsh plugin --profile web add github:jiangwennn/dsh-model-session-headers` 即可。

dsh-model-session-headers 的验证等级是什么意思?

L5 · 运行验证通过。在 dsh 沙盒中完成安装与运行冒烟——装得上、跑得起来

dsh-model-session-headers 安全吗?

低风险。

dsh-model-session-headers 装之前要先确认什么?

先看它会读写哪些文件、执行哪些命令、连接哪些网络地址;验证等级只说明装得上、跑得起来,不等于安全。涉及密钥或系统权限的,建议先在隔离环境试装。

dsh-model-session-headers 用的是什么许可证?

上游标注为 MIT。商用或二次分发前请到仓库确认许可证原文。

这条记录的数据可靠吗?

本站按仓库名去重后合并整理,字段以作者仓库与 npm 元数据为准;安装命令、仓库地址与 README 保持原文,带 L4 / L5 标记的安装命令已在隔离沙盒里真实跑通。

模型与账号接入
按星标排序,可作替代方案

archify

archify

从仓库或系统描述生成经过校验的自包含交互式架构图、流程图、时序图、数据流图和生命周期图。

L4 · 沙盒安装通过 8.0 万 星

nocobase

nocobase

L3 · 安装规范通过 2.5 万 星

dsh-our-free-model

dsh-our-free-model

为 DeepSeek Harness 挂载免登录、免 API Key 的免费前沿模型通道,装完即用,并附用量看板与 OpenAI 兼容本地转

未标注验证等级 8,064 星

dsh-purge

dsh-purge

dsh-purge 是一款 DeepSeek Harness 设置插件,可修改默认副本、权限策略和工具限制,并添加规则卡片以分组应用补丁,支

L5 · 运行验证通过 4,573 星

插件的元信息来自作者仓库;分类、验证等级与安全结论的中文说明为中文整理,最近核验 —。