dsh-unicode-guard

前言

在 DeepSeek Harness (DSH) 的使用中,有时会遇到 HTTP 400 错误,提示 Content Exists Risk。这通常是因为请求体中包含了特定的 Unicode 字形,例如区域指示符对(Regional Indicator Pair,即旗帜 Emoji 的编码方式)。当智能体抓取的网页中包含此类内容时,它会进入工具结果,进而被后续的每次请求重放,导致整个会话永久失败。dsh-unicode-guard 插件旨在拦截这些字形,将其替换为可读的 ASCII 标签,防止会话崩溃。

插件简介

dsh-unicode-guard 是一个 DSH 插件,由 KAsyori 维护,采用 MIT 许可证。它通过三个钩子层面对请求进行过滤:工具结果层、会话修复层和 LLM 请求层。插件会将区域指示符对替换为 [FLAG:AB] 等标签,并丢弃直接跟在后面的变体选择器。

核心功能

插件在三个不同的生产者层级介入:

  • tools/post-execute:在工具结果被追加到会话之前进行重写。
  • agent/pre-step:在会话已受影响的情况下,替换受污染的表面节点,使下一轮请求自动干净。
  • llm/stream:在序列化请求体发送给适配器之前进行清理。这能处理摘要、指令正文、MCP 服务器指令等从未以单一文本流传输的数据。

安装与启用

安装插件需要 DSH 版本 >= 0.1.7-rc.2。

通过 Bundle 安装(推荐)

使用官方安装命令即可,包内包含 cordis.patch.yml,会自动插入配置行:

dsh plugin add dsh-unicode-guard

手动安装

若需手动配置,需将插件目录链接到配置文件中,并在 cordis.patch.yml 中追加配置。修改 cordis.patch.yml 支持热重载,但添加链接本身需要重启 DSH。

配置说明

配置项通过 YAML 写入 cordis.patch.yml。若存在未知键或错误的值类型,插件会在挂载时直接报错。

配置项 默认值 说明
mode regional 过滤模式。regional 仅过滤区域指示符对;astral 会替换所有非 BMP 字符(默认替换为 U+FFFD),这可能会破坏合法输出,需谨慎开启。
toolResults true 是否在日志前清理工具结果。
userMessages true 是否在修复阶段清理用户消息。
assistantMessages false 是否在修复阶段清理助手消息。
request true 是否启用 llm/stream 层的请求清理。
verbose true 是否通过 ctx.logger 记录每条重写日志。

示例配置:

- insert:
    - id: unicode-guard
      name: dsh-unicode-guard
      config:
        mode: regional
        verbose: true

验证与用法

安装完成后,检查日志确认插件已挂载:

[I] [unicode-guard] unicode-guard: mounted (mode=regional, toolResults=true, ...)

插件会记录重写行为,例如:

[W] [unicode-guard] unicode-guard: scrubbed the web_fetch tool result
[W] [unicode-guard] unicode-guard: healed 1 surface node(s), removed 2 glyph(s)
[W] [unicode-guard] unicode-guard: scrubbed the outgoing request

进行端到端测试时,读取一个包含区域指示符对的文件,工具结果中应显示 [FLAG:AB] 而非原始 Emoji。

注意事项

  • 日志完整性:修复操作不会减少会话日志大小。原始记录保留在磁盘上,只是当前表面被阴影覆盖。
  • 客户端特性:这是一个客户端健壮性措施,并非服务器端内容的替代品。如果端点不再拒绝这些字形,插件仅作为一个无害的标准化器。
  • 修复时机:已受损的会话会在下一轮自动修复,无需重试。

总结

dsh-unicode-guard 通过在数据进入模型可见表面之前进行清洗,解决了特定字形导致 HTTP 400 错误引发的会话死锁问题。它通过 ASCII 标签保留了信息可读性,同时移除了破坏请求的字节。

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

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

Xiaoye