WASD258-jpg/dsh-prompt-inject ↗★ 0
@wasd258/dsh-prompt-inject
Per-session system prompt injection for DSH: template library, per-session picker, default template for new sessions. 会话级系统提示词注入器:模板库、按会话选择、新会话默认模板。
- 包名
- @wasd258/dsh-prompt-inject
- 版本
- 0.1.2
- 许可证
- NOASSERTION
- 最近更新
- 2026年8月15日
dsh-prompt-inject
English | 中文
DeepSeek Harness(DSH)的会话级系统提示词注入器:每个会话可独立选择一段注入到系统提示词的文本(渲染在 persona 之后、工具引导之前)。
社区项目——非 DeepSeek 官方插件,不代表 DeepSeek 背书。
功能特性
- 按会话注入——每个会话独立选择模板(或「无」),不同会话互不干扰。section 从
agent.ctx 注册(cordis caller 绑定 → 该会话的 scope 层),只影响顶层会话。
- 模板库——保存/编辑/删除命名模板(
name + text + order);可设默认模板,新会话自动套用。
- 输入框工具行下拉——「会话提示词」选择器(
conversation.input.right 插槽)直接在输入行为当前会话挑选模板,无需敲命令。
- 设置页两个区块——设置 →「会话提示词模板」管理模板库与新会话默认模板;设置 →「系统提示词」是只读查看器,展示任意 live 会话完整组装出的系统提示词。
- 分层查看——按来源分组:全局层(所有模式共有)、preset 层(该模式专有段)、会话层(仅本会话)、注入段(本插件自定义)——每段带名称、order、字数。
- 变量插值——模板文本支持
{{model}} / {{cwd}}。
- 运行中即时生效——切换模板 = dispose 旧段 + 注册新段,该会话下一个模型请求生效,无需重启。
- 验证端点——
GET /assemble 返回实际组装出的系统提示词,并在 preset 锁定提示词时如实报告 completeBlocksInjection。
- 多入口——
/prompt 命令、prompt_inject 工具、HTTP API、UI 全部驱动同一份配置。
安装
这是 bundle 型插件:运行在 DSH web profile 进程内,注册宿主端服务 + web 客户端模块。需要 DSH web profile(@deepseek-ai/dsh-web-app)。
-
克隆或下载本仓库:
git clone https://github.com/WASD258-jpg/dsh-prompt-inject.git
-
安装进 DSH profile 依赖目录(二选一):
Option A:npm 安装(推荐)
cd "$env:USERPROFILE\.dsh\profiles"
npm install @wasd258/dsh-prompt-inject --no-save
Option B:从源码复制
$src = '.\dsh-prompt-inject'
$dst = "$env:USERPROFILE\.dsh\profiles\node_modules\@wasd258\dsh-prompt-inject"
New-Item -ItemType Directory -Force -Path "$dst\lib" | Out-Null
Copy-Item "$src\package.json", "$src\lib\index.js", "$src\lib\client.js", "$src\LICENSE", "$src\NOTICE" $dst -Force
Linux/macOS 请把 $env:USERPROFILE\.dsh 换成 ~/.dsh(或 $DSH_HOME)。
-
把包加入 profile 的 bundle 列表——在 $DSH_HOME/profiles/ /package.json(如 )的 数组追加 :
@wasd258/dsh-prompt-inject · DSH Hubweb
dsh.profile.bundles
"@wasd258/dsh-prompt-inject"
{
"name": "dsh-profile-web",
"private": true,
"dependencies": {},
"dsh": {
"profile": {
"bundles": [
"@deepseek-ai/dsh-base",
"@deepseek-ai/dsh-web-app",
"@wasd258/dsh-prompt-inject"
]
}
}
}
重启 DSH web(或热装配 bundle),然后刷新浏览器页面加载客户端模块(lib/client.js——immediately: true,页面加载即注册进 slots 系统)。输入框工具行出现「会话提示词」下拉,设置页出现两个新区块。
使用
命令
| 命令 | 说明 |
|---|
/prompt(或 status/list/?) | 查看当前会话提示词、默认模板与模板库 |
/prompt use | 当前会话应用 / 移除模板 |
/prompt save | 保存模板(名称须为不含空格的一个词;其余整行作为文本) |
/prompt delete | 删除模板(若为默认模板则同时清除) |
/prompt default | 设置 / 清除新会话默认模板 |
示例会话(输出与插件实际输出一致;模板 id 自动生成:名称 slug 化 + 4 位 base36 时间戳后缀,如 code-reviewer-9k2m):
/prompt
当前会话提示词:「Code Reviewer」(code-reviewer-9k2m)
默认模板:(无)
模板库:
code-reviewer-9k2m「Code Reviewer」(120 字) ← 当前会话
safety-auditor-1b7e「安全审查员」(85 字)
用法:
/prompt use —— 当前会话应用 / 移除模板
/prompt save —— 保存新模板
/prompt delete —— 删除模板
/prompt default —— 设置新会话默认模板
/prompt use code-reviewer-9k2m
当前会话已应用「Code Reviewer」(下一轮生效)。
/prompt use none
当前会话已移除提示词(下一轮生效)。
/prompt save 安全审查员 You are a strict safety auditor.
模板已保存:安全审查员-abc1「安全审查员」
使用:/prompt use 安全审查员-abc1
/prompt delete safety-auditor-1b7e
模板已删除:safety-auditor-1b7e
/prompt default code-reviewer-9k2m
默认模板已设置:code-reviewer-9k2m(此后新会话自动应用)。
/prompt default none
已清除默认模板。
/prompt use missing-id
模板不存在:missing-id(/prompt list 查看)
UI 操作
- 输入框工具行 →「会话提示词」下拉:为当前会话挑模板(「提示词:无」= 不注入)。选择立即应用、下一轮请求生效;下拉每 5 秒向服务端刷新一次。
- 设置 →「会话提示词模板」:新建 / 编辑 / 删除模板(删除带确认)并设置新会话默认模板。
- 设置 →「系统提示词」:选一个 live 会话,按层(全局 / preset / 会话 / 注入)查看完整组装出的系统提示词;若该会话 preset 是 complete persona,显示琥珀色警告说明注入不生效。
prompt_inject 工具
模型自己也能通过 prompt_inject 工具管理提示词("Per-session system prompt injection… Changes take effect on the NEXT model request of that session"):
| action | 必填参数 | 效果 |
|---|
get | — | 当前会话模板、默认模板、完整模板库 |
apply | templateId("none" 解除) | 设置 / 解除当前会话模板 |
save | name、text;可选 templateId、order | 新建模板;templateId 命中已有模板则更新 |
delete | templateId | 删除模板 |
default | templateId("none"/"" 清除) | 设置新会话默认模板 |
HTTP API
宿主端在 /api/dsh-prompt-inject 下注册路由:
| 方法 | 路径 | 说明 |
|---|
| GET | /status?sessionId= | 会话当前模板 + 默认模板 + 模板库(sessionId 可选) |
| GET | /assemble?sessionId= | 完整组装出的系统提示词 + 分层明细 + complete persona 检测 |
| GET | /sessions | 运行中的(顶层)会话及 preset id |
| POST | /apply | {"sessionId","templateId"} —— 给会话应用模板 |
| POST | /save | {"name","text","id"?,"order"?} —— 新建/更新模板 |
| POST | /delete | {"id"} —— 删除模板 |
| POST | /default | {"templateId"} —— 设置新会话默认模板 |
GET /status
GET /api/dsh-prompt-inject/status?sessionId=abc123
{ "ok": true, "sessionId": "abc123", "current": "code-reviewer-9k2m", "currentName": "Code Reviewer", "defaultTemplate": "", "templates": [{ "id": "code-reviewer-9k2m", "name": "Code Reviewer", "text": "You are a strict code reviewer…", "order": 1 }] }
GET /assemble
GET /api/dsh-prompt-inject/assemble?sessionId=abc123
{ "ok": true, "sessionId": "abc123", "presetId": "standard", "presetName": "Standard",
"length": 3842, "injectedLength": 120, "injected": "You are a strict code reviewer…",
"complete": null, "completeBlocksInjection": false,
"sections": [
{ "name": "persona", "order": 0, "text": "…", "layer": "global", "category": "system" },
{ "name": "tool-guidance", "order": 100, "text": "…", "layer": "standard", "category": "system" },
{ "name": "prompt-inject", "order": 1, "text": "…", "layer": "agent", "category": "injected" } ],
"prompt": "…" }
sections 是逐段明细:layer 为 global / preset id / agent;category 为 injected(本插件自定义段)或 system。遇到 complete persona preset 时,响应含 complete: "" 且 completeBlocksInjection: true。
错误情况
| 条件 | 状态码 | 响应体 |
|---|
| 非回环来源 | 403 | {"ok":false,"error":"prompt-inject API is loopback-only"} |
Host 头非法 | 403 | {"ok":false,"error":"invalid host header"} |
| 跨域 POST | 403 | {"ok":false,"error":"cross-origin request rejected"} |
Content-Type 非 JSON | 415 | {"ok":false,"error":"Content-Type 必须是 application/json"} |
| JSON 无效 / 请求体超限(上限 128 KiB) | 400 | {"ok":false,"error":"请求体不是有效 JSON"} |
| 未知路由 | 404 | {"ok":false,"error":"unknown route: "} |
会话不在运行(/assemble、/apply) | 404 | {"ok":false,"error":"会话 不在运行中"} |
| 模板不存在 / 入参非法(业务错误) | 200 | {"ok":false,"error":"模板不存在:"}(或 name 不能为空、文本过长(上限 65536 字符)) |
工作原理
- agent 作用域注入——
agent/created 时按 sessions[id] ?? defaultTemplate 解析该会话模板,从 agent.ctx 注册 prompt-inject section;cordis caller 绑定让段落落在该 agent 的 scope 层,只影响这一个会话。只注入顶层(root)会话,agent/disposed 时自动清理。
- 运行中切换——
applyForSession 先 dispose 旧段再注册新段;section 的 text 是函数,每次组装动态求值,所以下一轮请求即生效——无需重启。
- 持久化——配置存于
$DSH_HOME/dsh-prompt-inject.json(templates、sessions、defaultTemplate),原子写入(临时文件 + rename);resume/重启后 agent 重建,选择自动重新应用。
- 排序与变量——模板默认
order: 1(persona 在 0、工具引导在 100+);文本支持 {{model}} / {{cwd}};空文本段自动从组装中消失。
- KV 缓存说明——注入文本进入该会话每个请求的系统提示词;修改会改变 KV 缓存前缀,下一轮缓存复用失效——这是修改的正常代价。
- 宿主端——注入
systemPrompt、tools、commands、agents、webServer;web 端注入 slots 系统(conversation.input.right + 两个 settings.section)。
隐私与安全
- 威胁模型——本 API 设计上无鉴权,只服务本机:任何本地进程都能读取组装出的系统提示词与模板库,并能驱动写操作。请在可信的本机环境运行 DSH;不要把 DSH 绑到公网接口并指望本插件防护——回环校验是纵深防御,不是认证边界。
- 仅限回环——来源地址必须是
127.0.0.1、::1 或 ::ffff:127.0.0.1,否则直接 403。
- 防 DNS rebinding——
Host 头必须是当前端口的回环主机名(无 Host 头回退到地址校验)。GET /assemble 可能返回敏感数据,因此 GET/POST 一视同仁。
- 写操作防跨站——POST 额外要求同源
Origin 头 + Content-Type: application/json,阻止恶意网页驱动修改。
- 无遥测——不发起外部请求、不采集统计、不读写凭据。配置明文落盘在
$DSH_HOME/dsh-prompt-inject.json;模板本身可能敏感,请保护好 home 目录。
- 请求体上限 128 KiB(131072 字节)。
兼容性
- 需要 DSH(DeepSeek Harness)web profile(
@deepseek-ai/dsh-web-app)。
- Node.js >= 22.19.0。当前版本
0.1.1(npm 包名 @wasd258/dsh-prompt-inject)。
- 官方仓库 commit
47f9438 时代实测(bundle 接口、web profile、Windows 11)。
- complete persona 边界——persona 配置
complete: true 的 preset(如 minimal、anchored-standard)会把系统提示词锁定为唯一段:注入对这类会话不生效。/assemble 通过 completeBlocksInjection 如实报告,设置页查看器显示琥珀色警告。请使用非 complete 的 preset(Standard、Creator…),或把文本写进 preset 的 persona。
- 查看器默认优先选中非 complete 会话(这类会话才能看到有意义的注入结果)。
官方生态要求
许可