dsh-customisations:用单包补丁修正 DSH 美元符号被误解析为行内公式

前言

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 等同一条缝),分两趟处理:

  1. Streaming deltas:流式到达时,对「长得像货币」的 $ 立刻转义,直播视图尽量正确。
  2. 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 并列):

  1. 在 lib/fixes/<id>.js 导出 id 与 apply(ctx, config),并在该处安装所需 seam(waterfall、slot、instruction 等)。
  2. 在 lib/fixes/index.js 登记 id。
  3. 若 fix 依赖其他服务,在 lib/index.js 的 inject 中扩展。
  4. 增加测试: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
羽毛球分组比赛记分
小程序二维码

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

小夜