custom-first-control-prompt:在 persona 之前注入系统段与参考对话

前言

在 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.ps1restart-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.mdINSTALL.mdINSTALL-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[].texthistory 文本应保持静态,避免时间戳等易变值——任何变化都可能从首个变化的 token 起破坏前缀复用。history 的 user/assistant 文本须非空,且不得包含保留标签(大小写不敏感:<user><assistant><exchange><custom-history 及对应闭合标签)。

验证注入是否生效:新建会话,提问只有注入历史才能回答的问题,例如「重复我们最早的那条用户消息」;模型答出配置内容即证明生效。session.history 中无种子消息属正常。更细粒度检查可用面板 LLM 监听查看完整请求。

适用场景与注意

适合需要在部署层统一前置系统规则、并在每次请求中稳定附带参考对话的 DSH 运营方或智能体开发者——例如全局行为约束写在 persona 之前,或固定一段「示范对话」引导模型格式。

使用前须知:

  1. 插件以当前 dsh 进程权限运行,安装前应阅读源码与 MIT 许可证,确认配置内容可信。
  2. 种子文本对模型可见,应视为提示词材料,不是可信侧信道。
  3. 配置变更需重启 web 后对新请求生效;不支持会话中段热更新。
  4. Token 开销:每个系统段与整段参考历史在每次普通对话请求中重复出现,成本随文本长度线性增长。
  5. 勿在 profile patch 中重复 insert 同 id 行:bundle 已激活后若再有遗留 - insert: 同 id,可能导致 web fail-loud;可用仓库 uninstall.ps1 清理残留。
  6. 离线 junction 安装未经对账时 bundle 层不会激活,需按 install.ps1 -Offline 等方式手动写入 profile patch。

结尾

custom-first-control-prompt 把「persona 之前的系统段」与「请求级参考对话」收敛到一份部署配置:组装路径与出厂段一致,注入路径不进日志、每请求重注、前缀稳定。若你正在 DSH 上做多租户或统一合规提示词,可以把它作为 bundle 层插件接入现有 profile。

羽毛球分组比赛记分
小程序二维码

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

小夜