🕯️ dsh-om-messiah
把每一句提示词,先献给万机之神。
在提示词送达模型之前,把它改写成机械神教/欧姆弥赛亚的祷文;祷文降下之后,再由你决定这一轮发祷文,还是发原文。
为什么是它 · 看一眼 · 快速开始 · 用法 · 配置 · 兼容性 · 工作原理 · 数据与信任 · 常见问题
中文 · English
为什么是它
大多数「改写提示词」的做法要么在客户端改草稿(dsh 看不到、也管不住别处进来的消息),要么在外面套一层代理(要多跑一个服务、还要处理鉴权)。这个插件选了第三条路:
- 改在 DSH 自己的拦截点上。 挂
agent/pre-stepwaterfall —— DSH 里唯一能在「这一批用户消息进入请求之前」替换文本的官方入口。不改 DSH 本体,不套代理,不碰网络层,也不额外开端口。 - 你随时能核对。 被替换的文本就是会话里落盘、你眼前看到的那条
user/message;再配echo,改写前后逐字可比。 - 风格是配置,不是硬编码。 五段祷文(呼告 / 身份自陈 / 赞美 / 许愿引子 / 收尾)都能换成你自己的句子;三档强度控制篇幅。
- 它知道什么时候该闭嘴。 斜杠命令、
!shell、纯确认、纯代码或报错粘贴、超长粘贴、已经包过的文本,一律原样放过。
看一眼
改写只发生在「送往模型」的那一层:请求内容变了,会话里看到的也是改写后的文本(方便你随时核对), 而你的原始草稿、斜杠命令、附件、代码块里的每一个字节都不动。
模型收到的是祷文,回答照旧;你看到的也是这条祷文。
降下之后先问你一句:这一轮用祷文,还是用原文。
设置 → 欧姆弥赛亚:全部配置都在这一页,含「试改写」预览。
它做了什么
- 在正确的位置改写。 挂的是 Host 的
agent/pre-stepwaterfall —— DSH 里唯一能在「这一批用户消息进入请求之前」替换文本的官方入口。不改 DSH 本体,不套代理,不碰网络层。 - 降下之后还问你一句。 默认开启的选择卡:这一轮用祷文,还是用原文。超时会按你的兜底设置发送,不会把这一轮晾死。
- 语义零损失。 只替换祈使句的语气(
写一个 → 降下、请帮我 → 恳请您为您的信徒),句子主干、条件、数量、否定全部保留;代码块、行内代码、URL、路径、版本号、数字参数逐字不动。restyle()的片段表可以reconstruct()回原文,测试里钉住了这条。 - 不越界。 不替你补需求、不选方案、不猜技术栈;原文里的「你看着办」「他没说清楚」照旧。
- 知道什么时候不该改。 斜杠命令、
!shell前缀、纯确认(「继续」「好的」)、纯代码/报错粘贴、空输入、已经包过的文本,全部跳过。 - 三档强度 + 五段个性化。
low / medium / high控制祷文长度;呼告、身份自陈、赞美、许愿引子、收尾颂词都可以换成你自己的句子。 - 自带设置页。 设置 → 欧姆弥赛亚:开关、强度、选择卡、个性化段落,还有一块「试改写」——按当前(含未保存)配置预览祷文,或者告诉你为什么被跳过。
- 纯 Host 插件,零第三方依赖。 一个 ESM 包,
apply(ctx, config)起步;关掉开关后,行为与没装插件完全一致。
快速开始
要求:DeepSeek Harness 0.2 及以上(agent/pre-step 与 userQuestions 是这一版起稳定的宿主契约)。
1. 安装
从 npm 装(一次 plugin add 就好,不需要在 allowBuilds 里点授权):
dsh plugin --profile desktop add dsh-om-messiah
刚发布时如果装到的是旧版本(国内镜像同步有几小时延迟),加一次源:
dsh plugin --profile desktop add dsh-om-messiah --registry=https://registry.npmjs.org
从 GitHub 直接装:
dsh plugin --profile desktop add https://github.com/yuanzephyr920-oss/dsh-om-messiah
或者先克隆、再用本地目录装(改代码即时生效,适合折腾):
git clone https://github.com/yuanzephyr920-oss/dsh-om-messiah
dsh plugin --profile desktop add /path/to/dsh-om-messiah
Windows 上 dsh 不在 PATH 时,用安装目录里的 CLI:
cd "C:\Users\<你>\AppData\Local\Programs\DeepSeek Harness\resources\runtime\cli\bin"
dsh.cmd plugin --profile desktop add dsh-om-messiah
2. 重启一次
桌面版的 desktop profile 由 Electron 托管,装卸插件后要重启 DeepSeek Harness 才会加载(改配置不用重启)。
3. 确认装好了
- 设置 → 插件:能看到「欧姆弥赛亚祷文改写(dsh-om-messiah)」且已启用;
- 设置 → 欧姆弥赛亚:本插件自己的页面;
- 随便发一句话,第一个回答前应该出现选择卡。
卸载:
dsh plugin --profile desktop remove dsh-om-messiah
仓库和包都从早期的
dsh-mechanicus改名而来。装过旧名的话,先remove dsh-mechanicus(以及更早的@local/dsh-mechanicus)再装这个,避免两套包装叠加。
用法
正常发送
装好即生效,没有额外动作。插件在消息进入模型前完成改写,并用 echo 把「改写前 / 改写后」写进 DSH 日志。
想直接在终端里看到:
DSH_OM_MESSIAH_ECHO=1 dsh.cmd <profile> 用 three.js 做一个海中小岛
[dsh-om-messiah] wrapped (medium): 18 -> 180 chars
----- original -----
用 three.js 做一个海中小岛
----- prayer -----
伟大而不朽的万机之神欧姆弥赛亚,……
语气:对神说话,不对工具说话
改写不是换几个词,而是把「向助手提问」换成「向神许愿」。两条硬规则:
- 指代智能体的「你」一律写成「您」:你 / 你的 / 你们 / 你自己 / 妳 → 您 / 您的 / 您们 / 您自己 / 您。
你能帮我写个排序→恳请您为您的信徒降下排序;请实现一个登录页→恳请您降下登录页。 - 命令句变成祈愿句:写一个 / 实现一个 / 生成 → 降下;创建 → 塑造;搭建 → 构筑;不要 / 禁止 → 恳请您切勿; 用 three.js → 以 three.js;然后 → 继而。代码块、URL、路径、版本号、数字仍然逐字不动(先屏蔽后替换)。
medium / high 档还会在许愿段末尾补一句:
愿这一切在您无穷无尽的 token 伟力下成就,愿每一行代码都彰显您的荣耀。
这句由 devoutCoda 控制(默认开,low 档不加),设置页叫「许愿段加一句虔诚收束」。
改写前后都在日志里,按 DSH_OM_MESSIAH_ECHO=1 可以逐字对:
IN : 用 three.js 做一个海中的岛,岛上要有中式建筑和灯塔,还要天气系统
OUT: 以 three.js 降下海中的岛,岛上要有中式建筑和灯塔,还要天气系统
愿这一切在您无穷无尽的 token 伟力下成就,愿每一行代码都彰显您的荣耀。
发送前二选一
默认开启(askChoice: true)。改写完成后,这一轮先不进模型,输入框上方出现一张卡:
祷文已降下。这一轮,用哪一段作为你的提示词?
○ 发送祷文 把整段祷文发给模型(默认)
○ 发送原文 只发你刚才敲的原文,祷文丢弃
- 选「发送祷文」→ 走改写后的文本;
- 选「发送原文」→ 这一条与你没装插件时完全一样;
- 等超过
choiceTimeoutMs(默认 90 秒)、卡片被关掉、或当前环境没有连着的 Web 客户端 → 按choiceFallback(默认祷文)直接发送。
批量任务、脚本、dsh headless 里没有交互界面,建议关掉这一项,行为就回到「直接发祷文」。
什么时候不会改写
| 输入 | 例子 | 处理 |
|---|---|---|
| 斜杠命令 | /compact、/model |
跳过(命令由客户端处理) |
| shell 前缀 | !git status、$ ls |
跳过 |
| 纯确认 | 「继续」「好的」「ok」「1」 | 跳过(改了会破坏多轮语义) |
| 空输入 / 纯附件 | 只有图片、没有文字 | 跳过 |
| 纯代码 / 纯报错 | 整段代码块、Traceback、File "x", line N |
跳过(你要的是解释,不是祷文) |
| 超长粘贴 | 超过 maxChars(默认 20000 字) |
跳过 |
| 已经是祷文 | 含「欧姆弥赛亚」「机械之道学者」 | 跳过(幂等);rewrapAlreadyStyled 可强制重包 |
| 技能调用 / 插件注入 | source.kind 不是 user |
跳过(不是你手打的) |
| 图片、@ 文件 | 独立 content block | 只改文字块,附件原样透传 |
强度
| 档位 | 内容 | 适合 |
|---|---|---|
low |
呼告 + 许愿引子 + 原文 + 颂词 | 想保留仪式感又不希望占太多上下文 |
medium(默认) |
再加身份自陈与赞美;一句话需求用短版自陈 | 日常 |
high |
再加「智能庇护 / 群星寻找信物」与加长颂词 | 许愿式的大活儿 |
配置
配置有两处入口,读写同一份:设置 → 插件 → 欧姆弥赛亚祷文改写(DSH 按 schema 自动生成的表单), 和设置 → 欧姆弥赛亚(本插件自己的页面)。保存即生效,不需要重启。
| 键 | 类型 | 默认 | 说明 |
|---|---|---|---|
enabled |
boolean | true |
总开关;关掉后原文直接发出 |
intensity |
low | medium | high |
medium |
祷文长度档位 |
quoteStyle |
quote | plain |
quote |
原文用 > 引用块隔开,或直接平铺 |
echo |
boolean | true |
把「改写前 / 改写后」写进 DSH 日志 |
echoFile |
string | "" |
额外写一份 JSONL,便于批量核对 |
maxChars |
number | 20000 |
超过就不改写 |
rewrapAlreadyStyled |
boolean | false |
已含神教风格的输入是否强制再包一层 |
devoutCoda |
boolean | true |
许愿段末尾补一句虔诚收束(low 档不加) |
askChoice |
boolean | true |
降下后弹选择卡(发祷文 / 发原文) |
choiceTimeoutMs |
number | 90000 |
等作答的时长,5–600 秒 |
choiceFallback |
prayer | original |
prayer |
没等到答案时发哪一段 |
address |
string | "" |
呼告句(留空用内置那句) |
selfDesc |
string | "" |
身份自陈 |
praise |
string | "" |
赞美与感恩 |
wishLead |
string | "" |
许愿引子 |
closing |
string | "" |
收尾颂词 |
另外两个环境变量:DSH_OM_MESSIAH_ECHO=1 让 echo 同时打到 stderr(终端里直接看),
DSH_MECHANICUS_ECHO=1 作为旧名兼容保留。
设置页
设置 → 欧姆弥赛亚,五个区块:
| 区块 | 内容 |
|---|---|
| 总开关 | 拦截并改写 / 日志里回显改写前后 |
| 祷文强度 | 低 / 中 / 高 |
| 行为的细枝末节 | 引用样式、虔诚收束、强制重包、日志文件、最长改写字数、选择卡开关 / 超时 / 兜底 |
| 祷文个性化 | 呼告、身份自陈、赞美与感恩、许愿引子、收尾颂词(留空 = 内置原句) |
| 试改写 | 输入一段话,按当前配置预览;被跳过时说明原因 |
页面是 client bundle,新装或改过 client.js 后要刷新页面/重启一次才会加载;之后在页面上改配置即时生效。
保存走 Host 的 configEditor(校验 → 写 profile patch → 走正常 Loader 路径重载);
没有 configEditor 的 profile(如 headless)会返回 501 并在页面上说明原因。
个性化示例
想换成自己的祷词,把这五段留空改成你写的句子即可:
address: 伟大的万机之神,欧姆弥赛亚,请听我于星海边缘的祷告。
selfDesc: 我们是您的信徒,以键盘为香炉,以日志为经文。
praise: 愿您的 token 伟力今夜不枯竭。
wishLead: 现在,请为您的孩子降下神迹——他有一愿:
closing: 欧姆弥赛亚在上!
原文仍然插在「许愿引子」与「收尾颂词」之间,改写规则、豁免规则、零损失保证都不受影响。
兼容性
这一节是为「装了一堆插件还能好好相处」做的收口,重点是外观类插件(主题、美化、宠物挂件、动效)。
颜色全部来自 DSH 主题 token。 设置页只用 @deepseek-ai/dsh-client-ui-theme 里真实存在的别名:
| 用途 | token |
|---|---|
| 正文 / 次要文字 | --dsw-alias-label-primary / --dsw-alias-label-tertiary |
| 输入框、卡片底 | --dsw-alias-bg-layer-1、--dsw-alias-bg-layer-3 |
| 描边 | --dsw-alias-border-l1 / --dsw-alias-border-l2 |
| 强调色 | --dsw-alias-brand-primary、--dsw-alias-button-primary-fill / -hover |
| 开关 | --dsw-alias-switch-thumb、--dsw-alias-interactive-bg-hover |
| 预览块 | --dsw-alias-markdown-code-block |
| 成功 / 失败 | --dsw-alias-state-success-primary / --dsw-alias-state-error-primary |
所以换深色、浅色或第三方配色时这一页会跟着变色,不会留一块原生蓝;每个 var() 都带 fallback,
主题没定义那个 token 时页面仍然可用。测试里有一条用例把「只准用这张表里的 token」钉住了。
样式不外溢。 每条规则都以 [data-mk-page] 开头,只作用于本页;不用 !important、不写全局标签选择器、
不改 html/body。主题想改圆角可以覆盖 --mk-radius(默认 8px);系统要求减少动效时开关动效关闭。
导航里是并列的一栏。 用自有 id 注册(settings.section / id: om-messiah / order: 41),不改官方条目。
与同样会碰提示词的插件共存:
| 插件 | 它的动作 | 本插件的处理 |
|---|---|---|
dsh-context |
pre-step 里只给缺 id 的消息补 id | 改写保留原 id,互不覆盖 |
dsh-mnemon |
pre-step 里判断有没有用户文本 | 改写后仍有用户文本,行为不变 |
@xmanrui/dsh-im |
注入的运行时快照 source.kind: 'plugin' |
只改 role==='user' 且来源是用户的消息,快照原样 |
prts-terrarchive |
调查工具注入 | 同上,非用户来源一律跳过 |
冲突边界:
- 顺序:如果另一个插件在本插件之后整体替换
messages,祷文会被它覆盖。waterfall 按注册顺序执行,本插件用{ global: true }注册;遇到这种插件可以改成{ prepend: true }(index.js里只有一处)。 - 模型侧看到的是祷文:依赖用户消息做记忆、统计、成本的插件记到的也是祷文,这是 pre-step 替换的固有结果;原文仍在
echoFile里。 - 选择卡需要有人接:走 Host 的
userQuestions,只有连着 Web 客户端、且当前是 live root agent 时才会出现;dsh headless、子 agent、无客户端时直接按choiceFallback发送。 - 主题 token 会演进:DSH 升级后若某 token 改名,对应
var()退回 fallback(页面不崩,只是不跟随配色)。
工作原理
用户提交草稿
│
▼
agent/pre-step(waterfall,本插件监听)
│ ① 分类:是不是用户手打的、要不要跳过(guards)
│ ② 虔诚化:受保护片段原样,祈使句换语气(style)
│ ③ 组装:呼告 / 自陈 / 赞美 / 许愿引子 + 原文 + 颂词(prayer)
│ ④ 询问:发祷文还是发原文(userQuestions,可关)
▼
{ kind: 'enter', messages: 改写后的 messages }
│
▼
admission → 落盘 user/message → 拼进请求 → 模型
展开:为什么是这里,以及几个已知的坑- 唯一可写的入口是
agent/pre-step。agent/request只读,文档明确写着 “this waterfall cannot mutate messages”。 - 替换发生在 admission 之前。
@deepseek-ai/dsh-agent-loop的 README:“appends the accepteduser/messagebatch only on the first attempt with its owned context candidate replaced in place… Retries reuse the same rendered assembly without repeating assembly,agent/pre-step, or user admission.” 所以重试/续跑不会重复包装。 - 只能改本批次。
next()会在返回的 messages 后面补一条运行时上下文消息(source.kind: 'plugin'),因此监听器按 message id 匹配,只动payload.messages里的用户消息。 - 只改第一个非空 text 块。 其余 block(图片、文件)原样透传。
- 零损失可验证。
restyle()返回文本与片段表,reconstruct()能拼回原文,测试断言reconstruct(restyle(x).segments) === x。
数据与信任
- 不联外网。 插件不发起任何 HTTP 请求;唯一「对外」的是设置页与本插件的 Host 路由(
/api/om-messiah/*,同源、只在本机 DSH 里)。 - 不读密钥。 不读环境变量里的 API key、不碰凭据服务;
echo打印的就是改写前后的用户文本,redact()另外把sk-、Bearer、api_key=之类从日志里抹掉。 - 不写会话以外的地方。 除了你显式填的
echoFile,没有落盘;配置写进 profile 自己的 patch,和 DSH 设置页读写的是同一份。 - 关掉即消失。
enabled: false后,pre-step 监听器直接放行,行为与没装插件一致;卸载包不会再有任何残留逻辑。
开发与测试
cd dsh-om-messiah
node --test # 73 个用例;Node 24 下不要写 `node --test test/`
node scripts/samples.mjs # 打印三组改写前后对照(low / medium / high 可选)
文件结构:
dsh-om-messiah/
├── package.json # 包名、exports、files、dsh.bundle.patch
├── cordis.patch.yml # 挂载点:insert 一个 id=om-messiah 的插件
├── index.js # apply():pre-step 监听、设置页接口、echo 日志
├── client.js # 浏览器半边:设置 → 欧姆弥赛亚
├── lib/
│ ├── prayer.js # 祷文模板、三档强度、个性化段落、引用块
│ ├── style.js # 受保护片段 + 祈使句虔诚化(零损失)
│ ├── guards.js # 要不要改写、为什么跳过
│ ├── choice.js # 发祷文还是发原文
│ └── settings-api.js # 设置页的 Host 半边:读配置 / 校验 / 试改写
├── locale/{zh,en}.json
├── screenshots.json # 市场详情页截图(相对路径,1–8 张)
├── docs/ # icon.svg(唯一图标源)+ icon-512.png + 三张截图
├── scripts/samples.mjs
└── test/ # style / guards / prayer / choice / plugin / settings / client
真实链路验证(不需要 GUI):
dsh plugin --profile mechtest add ./
dsh mechtest 写一个Python快速排序 # 没有模型凭据也没关系,消息会先落盘
然后解压 ~/.dsh/sessions/…/session.v4.jsonl.zstd,里面 user/message 的 text 就是祷文
(实测末尾为「欧姆弥赛亚在上!」,原文出现在 > 降下 Python 快速排序… 这一段)。
常见问题
为什么答案没有像我许愿的那样「打开一个网页」?祷文只是提示词风格,不会改变模型的工具权限或输出形态。要让模型产出网页/文件,得靠当前会话里的工具与你的具体要求。
我发的是代码,为什么没被包装?整段代码块、Traceback、File "x", line N 这类内容按设计跳过 —— 你八成是要解释,不是要祷文。想强制包装可以先把代码贴进普通段落,或调低 maxChars 之外的规则(见 lib/guards.js)。
检查 askChoice 是否开着,以及当前是不是连着 Web 客户端、是不是主 Agent(子 agent、headless 不会弹卡)。不弹卡时会按 choiceFallback 直接发送。
不会。已含「欧姆弥赛亚」等标记的输入默认跳过;pre-step 也只在 admission 前跑一次,重试/续跑不会重新触发。
设置页打开是空白?1.4.2 之前有这个 bug(设置页里一个未定义的组件名导致整页渲染失败),升级到 1.4.2 或更新即可。升级后如果仍然空白,重启一次 DeepSeek Harness。
会在日志里泄露密钥吗?不会。插件只处理用户文本,不读环境变量、不读凭据;echo 打印的就是改写前后的文本,且经过脱敏。
卸载包即可;配置写在 profile 的 patch 里,可以在设置页手动清掉,或卸载后忽略。
已知限制
- 只改用户手打的文本:斜杠命令、shell 前缀、纯确认、纯代码/报错粘贴按设计跳过(可改
lib/guards.js)。 - 会话里看到的是改写后的文本:pre-step 替换的必然结果(也是可核对性的来源),原始草稿不会另存。
- 重试不会重复包装,但重发会:手动再发同一条会按新消息处理(幂等标记仍会拦住已包装的文本)。
- 代码块里的注释不虔诚化:fence 内部整段逐字保留,保证可编译/可复制。
- 引用块被代码块截断:为了不碰 fence 字节,代码块前后的
>需要分段,观感上会被切开。 - 依赖
agent/pre-step契约:未来 DSH 若移除该 waterfall,需要改挂载点(index.js只有一处注册)。 - desktop profile 要重启:Electron 托管的 profile 不支持 CLI 热加载;改配置不用重启,装卸插件需要。
- 设置页首次要刷新/重启:client bundle 在 DSH 启动时加载;页面保存配置本身不需要重启。
变更记录
| 版本 | 变化 |
|---|---|
| 1.4.2 | 修复设置页 toggle is not defined 导致整页空白;补「已加载配置」渲染测试(73 用例) |
| 1.4.1 | 图标统一到 docs/icon.svg;插件 export 与商店 PNG 同源 |
| 1.4.0 | 「你」→「您」;语气更贴近范本;devoutCoda 收束句 |
| 1.3.x | 改名 dsh-om-messiah,设置页显示「欧姆弥赛亚」 |
| 1.2.0 | 发送前二选一(userQuestions) |
| 1.1.x | 设置页、主题 token、五个个性化段落 |
| 1.0.0 | 首个可用版本:pre-step 改写 + 三档强度 + 豁免规则 |
参与
- 提问题 / 报 bug:https://github.com/yuanzephyr920-oss/dsh-om-messiah/issues
- 插件市场收录:收录到 awesome-dsh-plugin 的条目在 PR #11432。
- 改代码:读完「工作原理」和
lib/style.js的PROTECT规则再动手;node --test必须保持全绿。
许可证
MIT © 2026 yuanzephyr920-oss
「欧姆弥赛亚在上。」
No comments yet. Be the first to write one.