dsh-session-user-id:为每条 DSH 会话分配独立的 DeepSeek API user_id

前言

DeepSeek API 的请求体支持 user_id 字段,用于内容安全隔离、KVCache 隔离和调度隔离。官方要求该字段不得包含用户隐私信息,格式为 [a-zA-Z0-9\-_]+,最长 512 字符。

DSH 默认通过 getOrCreateAnonymousUserId() 维护一个全局匿名 user id,没有「按会话区分」的概念。若你希望不同聊天会话在 API 侧拥有彼此独立的 user_id,又不想改 DSH 源码,社区插件 dsh-session-user-id(维护者 abluefan,分类:模型推理)就是针对这一点的实现:每条会话对应一个持久、唯一、随机的 user_id,并用本地文件保存映射。

这是什么

dsh-session-user-id 在 DSH 调用 DeepSeek 时,通过 deepseekLlmApiExtensions 扩展点把 user_id 合并进请求体顶层。扩展点入参带有 sessionId;插件第一次见到某个 sessionId 时生成 UUID v4 并写入映射,之后同一 sessionId 始终使用同一个值。user_id 仅使用随机 UUID v4,不包含可识别个人的信息。

依赖 DSH 自带的 deepseekLlmApiExtensions(README 写明需 DSH ≥ 0.2.1;package.json 中 engines.dsh 为 >=0.2.1-rc.2)。插件版本 0.1.0,许可证 MIT。

行为说明

下面介绍插件在几种请求场景下的表现。

  1. 有 sessionId 的会话请求:生成或读取已保存的 UUID v4,作为 user_id 注入请求。
  2. 没有 sessionId 的请求(例如部分内部调用):不注入,保持 DSH 默认行为。
  3. compaction、session-title 等子请求:若沿用同一 sessionId,则使用与同一会话相同的 user_id。

映射持久化在 $DSH_HOME/session-user-ids.json,结构如下:

{ "version": 1, "sessions": { "<sessionId>": "<uuid>" } }

写入采用先写临时文件再 rename 的方式,避免产生半截文件。

安装与启用

插件以当前 dsh 进程权限运行;安装前建议在 GitHub 仓库核对源码与 MIT 许可证。社区目录可在 SkillHub 插件页 或 awesome-dsh-plugin 查找,与 DeepSeek / 幻方无官方从属关系。

通过插件市场(推荐)

在 awesome-dsh-plugin 目录中找到本插件,或在 dsh 的 插件 → 发现 里搜索 dsh-session-user-id 并安装。

手动安装

任选一种方式,不要两种同时使用。

A. 复制目录 + 手写 insert(适合本地开发)

  1. 将插件目录复制到 $DSH_HOME/profiles/web/node_modules/dsh-session-user-id/。
  2. 在 $DSH_HOME/profiles/web/cordis.patch.yml 增加:
- insert:
    - id: session-user-id
      name: 'dsh-session-user-id'
  1. 重启 dsh,或让 Loader 重载配置。

B. 使用 dsh plugin add(需包已发布到 npm)

dsh plugin --profile web add dsh-session-user-id

使用 B 之后,包名会进入 dsh.profile.bundles,bundles 层会读取包内自带的 cordis.patch.yml;此时不要再做 A 的第 2 步,否则同一 id 会被插入两次,DSH 启动会失败。

典型用法

安装并启用后,无需额外配置项:正常在 DSH 里发起带会话的请求即可。插件会在首次见到某个 sessionId 时写入 $DSH_HOME/session-user-ids.json,后续同会话请求自动带上对应 user_id。

若要确认映射是否生成,可查看该 JSON 文件中 sessions 下是否出现你的 sessionId 与 UUID 对应关系(注意不要对外泄露完整 sessionId 若其具有敏感含义)。

适用场景与注意

适合谁:需要在 DeepSeek API 侧按会话隔离 KVCache、内容安全或调度上下文,且接受「会话之间不共享缓存」的开发者。

权衡:user_id 按会话隔离意味着每条会话独立的 KVCache。会话之间不再共享缓存,共同的 system prompt、人设等前缀需要重新计算,KV 命中率可能下降、调用成本可能上升。这是隔离带来的代价,换来的是会话之间减少互相污染。

安全与运维:插件读写 $DSH_HOME 下的映射文件;安装前请自行审查 GitHub 仓库 中的 index.js 与补丁配置。

结尾

dsh-session-user-id 在不修改 DSH 源码的前提下,利用 deepseekLlmApiExtensions 为每个 sessionId 绑定持久、随机的 DeepSeek user_id,映射保存在 $DSH_HOME/session-user-ids.json。

  • 目录页:https://www.skillhub.cn/plugins/abluefan/dsh-session-user-id
  • GitHub:https://github.com/abluefan/dsh-session-user-id
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye