前言¶
DeepSeek Harness(DSH)在聊天里用 micromark 开启 singleDollarTextMath 时,回复里常见的美元金额会被当成一对行内数学公式。首尾的 $ 被 KaTeX 吞掉后,空格会坍缩、粗体标记会显示成字面量,段落里的 &(例如 P&L)还可能让渲染整块标红。若你为每个边角修正单独装一个插件,安装清单和 health 行会越来越长。dsh-customisations 把多类小修正收进同一个 profile 插件:每个修正有稳定 id,一次安装对应一行 patch 与健康检查;当前包内首项是 currency-guard,专门处理上述货币美元误解析问题。
这是什么¶
dsh-customisations 由 drm-nz 维护,分类上归入模型推理相关能力,本质是一个 profile 插件包(README 描述为 one profile plugin)。它不承担大功能模块,而是挂载若干彼此独立、可单独开关的 fix;bundle 设计目标是「一次安装、一行 patch、一条 health」,修正列表可增而不拆包。仓库:drm-nz/dsh-customisations;社区目录:SkillHub 插件页(路径以目录站为准)。许可协议为 MIT;package.json 当前版本为 0.2.0。
问题从哪来:single-dollar 行内数学与正文美元¶
DSH 聊天 Markdown 在启用单行 $ 数学时 没有内置 currency guard。同一段正文里,凡是在代码块(围栏或行内)之外的、未转义的一对 $,按规则会结成一段 inline math:第 1 与第 2 个 $ 一对,第 3 与第 4 个一对,以此类推。货币写法只是最常见的触发方式。
README 给出的典型坏例:
NVDA fell to **$187.43**; 53 shares remain at a $229.18 average.
在 unguarded 解析下,可能整段被收成一个 math span:空格坍缩、正文变斜体、** 变成 ∗ ∗;span 内裸 & 会让 KaTeX 失败并以 #cc0000 输出整段源码。GenUI 自带的行内规则对「闭 $ 后跟数字」更严,同一句话在那里往往正常——问题出在 DSH 聊天这条 micromark 路径。
修正因此要在 每一对美元对 上判断:这是公式还是正文(金额 / 散文)。
核心功能:currency-guard¶
挂载位置¶
currency-guard 包装文档中的 llm/stream waterfall(与 dsh-llm-retry、dsh-llm-replay、dsh-session-checkpoint-policy 等同一条缝),分两趟处理:
- Streaming deltas:流式到达时,对「长得像货币」的
$立刻转义,直播视图尽量正确。 - Terminal
block-end:以适配器给出的完整块文本为准(BlockAssembler的权威来源),对块做通用配对:在围栏与行内代码之外,给每一对未转义的$归类;若对内正文读作散文(例如体长大于 80 字符、含**/==、空行、裸&、或命令参数外的普通英文词等),则转义该对两端;真数学保留。
Markdown 把 \$ 渲染为字面 $,用户可见回复不变。
行为边界(README 已写明)¶
- 货币形态会转义(含未成对的
$1,234、$5.、($5)、$97,600,、$5k、$1.2M、$0.5%等)。 - 散文型成对
$会转义;真数学保留(如$x^2$、$2\pi r$、$E = mc^2$、$5$)。 - 围栏代码块与行内代码不改动(含 shell 的
$1)。 - 流式分片时,尾部
$/金额或反引号会跨 delta 暂存,避免 token 被切断后误判。 - 纯文本消费者(如
purpose: "session-title"的会话标题)跳过处理,避免存下的\$带反斜杠。 - Fail-open:变换出错时原样放行 chunk。
限制¶
- 仅 新的 assistant 文本 受保护;历史消息里的
$不改。 - 用户消息不经过
llm/stream。 - 非货币的
$对在块未结束前,直播界面仍可能短暂显示为数学;完整判定依赖 terminal pass。 - 若上游 DSH tokenizer 自带 currency guard,应移除此 fix。
安装与启用¶
插件在宿主启动时加载 profile 插件,安装后需 重启应用。
官方安装(desktop profile):
dsh plugin --profile desktop add github:drm-nz/dsh-customisations
从本机已检出目录安装(路径换成你的绝对路径):
dsh plugin --profile desktop add link:/absolute/path/to/dsh-customisations
确认挂载状态,可看共享 health 日志最后一行:
tail -1 ~/.dsh/health.log
# ... dsh-customisations ok fixes=currency-guard
cordis.patch.yml 由 bundle 元数据引用;具体 patch 行以你环境里的 health / 插件管理输出为准。
配置¶
在 profile 插件配置中可按 bundle 与单 fix 开关(字段名以 README 为准):
- id: customisations
name: dsh-customisations
config:
enabled: true # whole bundle
disabled: [] # fix ids to skip, e.g. [currency-guard]
fixes: # per-fix options, keyed by fix id
currency-guard: {}
将 currency-guard 填入 disabled 即可跳过该项,其余 fix 不受影响。
典型效果(可对照测试思路)¶
README 中的开发测试说明:未防护文本会解析出三个 inlineMath 节点(其一含 P&L);防护后无 inlineMath 节点,且正文仅在每个货币 $ 前增加反斜杠。维护者本地验证命令:
node --test test/
扩展 bundle:如何加一个新 fix¶
面向插件作者的约定(与 currency-guard 并列):
- 在
lib/fixes/<id>.js导出id与apply(ctx, config),并在该处安装所需 seam(waterfall、slot、instruction 等)。 - 在
lib/fixes/index.js登记 id。 - 若 fix 依赖其他服务,在
lib/index.js的inject中扩展。 - 增加测试:fix 能安装,且出现在
disabled时会被跳过。
每个 fix 应保持 fail-open、幂等:bundle 每 profile 只装一次,单个坏 fix 不应拖垮同包其余项。
适用场景与注意¶
适合谁:长期在 DSH desktop(或其它使用同一 profile 插件链的环境)里看模型回复,且回复中频繁出现 $ 金额、财务缩写或带 & 的公司名;又不想为每个小修补单独维护一个 GitHub 仓库的人。
安全与权限:DSH 插件与当前 dsh 进程同权运行。安装前请自行阅读仓库源码与 MIT 许可证,确认 patch 与 llm/stream 监听行为符合你的策略;社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系,并非「官方应用商店」。
生态背景:DSH 奉行「一切皆插件」;dsh-customisations 走的是「单包多 fix」路线,与「一问题一插件」相比,health 与依赖面更集中,适合体量小、边界清晰的补偿逻辑。
结尾¶
若你遇到的只是聊天里美元被 KaTeX 吞掉、直播偶尔闪一下数学样式,安装 bundle、启用 currency-guard、重启后在 health 里看到 fixes=currency-guard 即可验证。后续修正会以新 fix id 进同一包,用 disabled 或 fixes.<id> 细调。
- 目录页:https://www.skillhub.cn/plugins/drm-nz/dsh-customisations
- GitHub:https://github.com/drm-nz/dsh-customisations