abluefan/dsh-session-user-id ↗★ 0
dsh-session-user-id
為每條 session 分配持久、唯一、隨機嘅 DeepSeek API user_id,用文件保存 sessionId → userId 映射。用 deepseekLlmApiExtensions 擴展點,唔改 DSH 源碼。 适合需要利用DeepSeek API的user_id进行KVCache或安全隔离,且不泄露隐私的用户。
インストール
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:abluefan/dsh-session-user-idドキュメント
README 全文を読む ↗dsh-session-user-id
给每条 DSH 会话分配一个持久、唯一、随机的 DeepSeek API user_id。
背景
DeepSeek API 的请求体支持 user_id 字段([a-zA-Z0-9\-_]+,最长 512),用于内容安全隔离、KVCache 隔离、调度隔离。
官方明确要求:不要在 user_id 中包含用户隐私信息 —— 所以本插件只用随机 UUID v4。
DSH 本身只有一个全局匿名 user id(getOrCreateAnonymousUserId()),没有会话概念。但 deepseekLlmApiExtensions 扩展点的 request 带 sessionId,而 provider 返回的 value 会 merge 成 request body 的顶层字段 —— 正好用来注入 user_id。
不改 DSH 源码。
行为
- 第一次见到某个
sessionId→ 生成 UUID v4、写入映射文件、之后永久不变 - 没有
sessionId的请求(例如某些内部调用)→ 不注入,保持默认 - compaction / session-title 等子请求沿用同一
sessionId⇒ 同一个user_id
映射文件
$DSH_HOME/session-user-ids.json
{ "version": 1, "sessions": { "": "" } }
写入用「先写临时文件再 rename」的原子方式,避免半截文件。
权衡
user_id 隔离 = 每条会话独立的 KVCache。
会话之间不再共享缓存,共同前缀(system prompt、人设)要重新计算 → 命中率可能下降、成本上升。这是隔离的代价,换来的是会话之间不互相污染。
安装
① 通过插件市场(推荐)
在 awesome-dsh-plugin 的目录里找到本插件,
或在 dsh 的 插件 → 发现 里搜索 dsh-session-user-id,点安装。
② 手动安装
任选一种,不要两种同时用:
A. 复制 + 手写 insert(适合本地开发)
-
把本目录复制到
$DSH_HOME/profiles/web/node_modules/dsh-session-user-id/ -
在
$DSH_HOME/profiles/web/cordis.patch.yml加:- insert: - id: session-user-id name: 'dsh-session-user-id' -
重启 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 启动会直接失败。
依赖
deepseekLlmApiExtensions(DSH ≥ 0.2.1 自带)