前言¶
在 DeepSeek Harness(DSH)里部署智能体时,常见需求有两类:一是在出厂 persona 之前插入稳定的「家规」类系统提示词;二是在每次对话请求里,让模型「看到」一段固定的 user/assistant 参考对话,而不把这段内容写进会话日志。直接在 profile 里改 system prompt 或手工往 session 里 append 消息,要么动不到 persona 之前的组装顺序,要么会污染日志、影响 turn 编号与压缩行为。
下面介绍的 custom-first-control-prompt 由 WM-CODER 维护,通过部署配置完成上述两件事:有序系统段注册在 persona 之前,参考对话以真实交替消息前置在每个普通对话请求上,走 llm/stream 拦截、会话日志零写入。
这是什么¶
@wm-coders/dsh-custom-first-control-prompt 是 DSH 的部署侧提示词前缀插件(npm 包名与 Cordis 注册名一致)。它在插件加载时注册系统提示词段,并在每次普通对话请求前注入配置的 user/assistant 参考对话;静态内容在每次请求中逐字节一致渲染,便于前缀 KV 缓存复用。当前版本为 v0.2.3,许可证 MIT。
核心功能¶
有序系统提示词段¶
每个启用的 sections 条目在加载时通过 ctx.systemPrompt.section() 注册,与 dsh-system-prompt 出厂段一样参与组装:变量插值、scope 遮蔽、组装 waterfall 均适用。order 小于 0 时渲染在 persona(出厂约定 order 为 0)之前;harness identity 约定为 −100,工具指导为 100–199。
参考对话注入¶
history 中配置的有序 user/assistant 对,在插件激活时一次性构建为深冻结的 Message 对象,由 llm/stream waterfall 监听器在每个普通对话请求上克隆请求、前置种子消息、经 ctx.llm.stream 重分发。模型侧可见的序列形如:
[user] configured user text 1
[assistant] configured assistant text 1
[user] the real prompt…
种子消息只存在于请求路径,不写会话日志;真实 turn 从 1 开始,压缩不会遮蔽参考历史,每个请求都会重新注入同一份冻结序列。
范围过滤与面板¶
辅助调用(带 purpose 标记,如 session-title、compaction)和无 sessionId 的手工请求直接放行;默认跳过 subagent 来源会话(includeSubagents: true 可纳入)。设置页与对话输入框上方 dock 提供配置编辑与 LLM 监听,用于查看注入后的真实请求——聊天 transcript 里看不到种子消息是预期行为。
安装与启用¶
从 GitHub 安装(README 推荐,构建产物已提交):
dsh plugin --profile web add github:WM-CODER/custom-first-control-prompt
或从 npm:
dsh plugin --profile web add @wm-coders/dsh-custom-first-control-prompt
本地开发可从目录安装:
dsh plugin --profile web add ./path/to/custom-first-control-prompt
安装后重启 web 应用:
dsh --profile web
也可运行仓库中的 restart-web.ps1 或 restart-web.sh。卸载:
dsh plugin --profile web remove @wm-coders/dsh-custom-first-control-prompt
包声明 dsh.bundle(包内 cordis.patch.yml),dsh plugin add 对账会激活 bundle 层并注册核心行 custom-first-control-prompt,无需手写 insert 行。安装、部署与调试的阻碍与验证方法见仓库内 DEBUG-NOTES.zh.md、INSTALL.md、INSTALL-FULL.zh.md。
典型用法¶
在 profile 的 cordis.patch.yml 中为本插件写带 id 的定向覆盖(非 insert),或通过面板「配置编辑」保存(语义相同,只更新 custom-first-control-prompt 行,保留文件内其它条目)。配置骨架如下:
- id: custom-first-control-prompt
name: '@wm-coders/dsh-custom-first-control-prompt'
config:
sections:
- name: house-rules
order: -50
text: |
…stable system text…
history:
- user: …
assistant: …
includeSubagents: false
sections[].text 与 history 文本应保持静态,避免时间戳等易变值——任何变化都可能从首个变化的 token 起破坏前缀复用。history 的 user/assistant 文本须非空,且不得包含保留标签(大小写不敏感:<user>、<assistant>、<exchange>、<custom-history 及对应闭合标签)。
验证注入是否生效:新建会话,提问只有注入历史才能回答的问题,例如「重复我们最早的那条用户消息」;模型答出配置内容即证明生效。session.history 中无种子消息属正常。更细粒度检查可用面板 LLM 监听查看完整请求。
适用场景与注意¶
适合需要在部署层统一前置系统规则、并在每次请求中稳定附带参考对话的 DSH 运营方或智能体开发者——例如全局行为约束写在 persona 之前,或固定一段「示范对话」引导模型格式。
使用前须知:
- 插件以当前
dsh进程权限运行,安装前应阅读源码与 MIT 许可证,确认配置内容可信。 - 种子文本对模型可见,应视为提示词材料,不是可信侧信道。
- 配置变更需重启 web 后对新请求生效;不支持会话中段热更新。
- Token 开销:每个系统段与整段参考历史在每次普通对话请求中重复出现,成本随文本长度线性增长。
- 勿在 profile patch 中重复 insert 同 id 行:bundle 已激活后若再有遗留
- insert:同 id,可能导致 web fail-loud;可用仓库uninstall.ps1清理残留。 - 离线 junction 安装未经对账时 bundle 层不会激活,需按
install.ps1 -Offline等方式手动写入 profile patch。
结尾¶
custom-first-control-prompt 把「persona 之前的系统段」与「请求级参考对话」收敛到一份部署配置:组装路径与出厂段一致,注入路径不进日志、每请求重注、前缀稳定。若你正在 DSH 上做多租户或统一合规提示词,可以把它作为 bundle 层插件接入现有 profile。