⚠️ 已退役 —— dsh ≥ 0.2.0 已在运行时根治本插件要补的问题
32.8/100
综合分
4
GitHub 星标
195
npm 周下载
—/5
用户评分
数据截至 2026/10/3 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add dsh-messages-sanitizernpm 源 · dsh-messages-sanitizer 的发布者账号已校验与本仓库一致
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:仅索引
是什么
dsh 原生插件 · market
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 34 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查✓ 自动检查通过展开查看检查明细 ↓
以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。
✓npm 包dsh-messages-sanitizer @ 0.1.1
✓Node 引擎要求 >=18 · 基线 Node 22.19 满足
✓dsh CLI 依赖未声明 dsh 版本约束
✓入口文件main/exports/bin 已声明
验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/21 07:06:11
安全扫描自动 · 静态分析源码v2.7.0🟢 扫描:未发现敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。
扫描于 2026/11/4(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 npm 发布包
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
依赖的 DSH / Cordis 模块
@deepseek-ai/cordis@deepseek-ai/dsh-agent@deepseek-ai/dsh-llm@deepseek-ai/dsh-session@deepseek-ai/schemastery给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 避免会话崩溃
DeepSeek Harness 插件:自动修复 messages 数组里 tool_calls 与 tool 消息配对失效的问题,避免 400 INVALID_REQUEST 导致会话崩溃。
最近更新
在 GitHub 查看全部 →v0.1.02026-08-16
工具调度崩溃后自动修复非法的 messages 数组(孤立的 tool_calls / tool 消息),避免 400 INVALID_REQUEST 导致会话卡死。
· 四层防御
· 自动恢复(agent/status)——工具调度崩溃后,把错误回传给 LLM 并唤醒智能体,让 AI 消息始终排在最后,对话永不挂起。错误原样、中立地报告;由 LLM 决定换工具、重试还是告知你。
· 预防(agent/pre-step)——在下一次请求前插入一条合成的错误 tool-result,从源头消除 400。
· 修复(agent/request-error)——如果 API 仍返回 400,就通过表面替换修复配对/相邻性违规,然后强制重试一次。
· 兜底(llm/stream)——纯数组校正(配对 + 相邻性重排 + 丢弃孤立/重复/空项)。
49 个测试,含真实 cordis + 真实 Session 集成。
· 安装
已发布到 npm:dsh-messages-sanitizer
· 从 npm 安装:dsh plugin --profile web add dsh-messages-sanitizer
· 从源码安装:dsh plugin --profile web add github:Leeminjing/dsh-messages-sanitizer
数据来自仓库的 GitHub Release,可能与插件实际版本不一致。
README
由 DeepSeek 最新模型翻译生成dsh-messages-sanitizer
⚠️ 已退役 —— dsh ≥ 0.2.0 已在运行时根治本插件要补的问题
本插件的前提是:工具调度崩溃会在会话里留下孤儿 tool_calls,导致之后每一轮都被 400 INVALID_REQUEST 拒绝。这个前提在 dsh 0.2.0 已不成立:
- @deepseek-ai/dsh-agent-loop 在 step 抛错时用 ToolCallRecovery 为所有未应答的调用合成并追加 tool/result 事件(带 TOOL_NOT_STARTED / TOOL_OUTCOME_UNKNOWN 错误码);
- 会话恢复时 interruptedTurnClosers() 会把修复写进持久日志;
- deriveMessages() 自身就会丢弃空 content 的 assistant 消息。
而且插件的主路径在 0.2.0 上无法实现:agent/pre-step 返回的每条消息都被循环以
session.append("user/message", …) 落盘,而会话校验强制该事件的消息 role 必须是
user——注入 tool 角色的合成结果会直接抛错。
展开完整文档(README 剩余 1 节)
dsh-messages-sanitizer
⚠️ 已退役 —— dsh ≥ 0.2.0 已在运行时根治本插件要补的问题
本插件的前提是:工具调度崩溃会在会话里留下孤儿 tool_calls,导致之后每一轮都被 400 INVALID_REQUEST 拒绝。这个前提在 dsh 0.2.0 已不成立:
- @deepseek-ai/dsh-agent-loop 在 step 抛错时用 ToolCallRecovery 为所有未应答的调用合成并追加 tool/result 事件(带 TOOL_NOT_STARTED / TOOL_OUTCOME_UNKNOWN 错误码);
- 会话恢复时 interruptedTurnClosers() 会把修复写进持久日志;
- deriveMessages() 自身就会丢弃空 content 的 assistant 消息。
而且插件的主路径在 0.2.0 上无法实现:agent/pre-step 返回的每条消息都被循环以
session.append("user/message", …) 落盘,而会话校验强制该事件的消息 role 必须是
user——注入 tool 角色的合成结果会直接抛错。其余分层所依赖的 Session#events、
surfaceOp.{start,end}、tool-result 内容块在 0.2.0 也均已移除或改名。
结论:不要安装本插件。直接用 dsh ≥ 0.2.0。 本仓库已归档,仅作历史记录保留;
npm 包已标记 deprecated。0.1.1 只对仍停留在 dsh 0.1.x 的用户有意义。
🔧 你在 DeepSeek Harness 里创建 / 加载插件,对话崩了吗?本插件专治这个。
开发或加载本地插件时,一次工具调度崩溃(Cannot read properties of undefined (reading 'prepare'))就会在会话里留下孤儿 tool_calls,之后每一轮都被 400 INVALID_REQUEST 拒绝、重试无效、会话卡死。本插件自动把 messages 数组修回合法,让对话继续,不再卡死。
💥 Before ✅ After (安装本插件后) 插件崩溃 插件崩溃 ↓ ↓ 留下孤儿 tool_calls messages 自动修复 ↓ ↓ 400 INVALID_REQUEST 死循环 对话继续 ↓ 对话卡死
DeepSeek Harness 消息数组自动矫正插件:防止一切因 messages 数组不合法导致的聊天崩溃。
背景:你遇到的那个崩溃
OpenAI 兼容协议要求工具调用成对出现,且 tool 消息必须紧邻其 assistant tool_calls 消息(中间不能插入任何 user / assistant 消息):
assistant { content: ..., tool_calls: [{ id: "call_A", ... }] }
tool { tool_call_id: "call_A", ... } ← 必须紧跟覆盖每个 id
当一次工具调度在「记录 assistant tool_calls / tool/call 之后、产出 tool 结果之前」崩溃时(例如 ctx.tools[symbol].prepare 抛 Cannot read properties of undefined),会话日志会留下一个没有 tool 消息响应的孤儿 tool_calls。下一轮请求把历史拼成:
[..., assistant{tool_calls:[write]}, user{...}] ← 非法
API 直接返回 400 INVALID_REQUEST,且重试时历史原封不动,反复被拒,会话卡死。
如果崩溃后还有多次失败重试,日志里还会留下多条重复的 user 消息横在孤儿 assistant 与注入点之间,让"补插 tool 消息"也无法满足紧邻约束。
背景(与 DSH 官方讨论对照)
同类故障在 DeepSeek Harness 官方仓库也已被跟踪: Discussion #4843「残缺或孤立的 tool_calls 记录导致 DeepSeek 接口返回 400」 描述了「会话历史中存在无配对 result、或 id/name/arguments 残缺的 tool_calls 时,chat-completions 接口返回 400」,并从 harness 源码层(agent-loop 剥离、llm-deepseek 合成 fallback id、compaction 的 tool-pairing 按 callId 而非计数)给出根因修复 patch。
本插件与那个修复是互补而非替代:它在 DSH 源码里根治;本插件是一个 不修改 DSH 源码、在运行时自动矫正 messages 数组的安全网——已中毒的旧会话,或跑在仍带该 bug / 工具调度崩溃的 harness 版本上的用户,都能被自动救回并继续对话,而不必等待 harness 发版。
插件如何修复(四层防御)
1. 自动续跑(agent/status,主路径):工具调度崩溃(如 prepare 崩)后,趁 agent 回到 idle 时,把合成 error tool-result 送回报文箱并唤醒它——把错误原样上报给 LLM,下一步换工具、重试还是向用户报告,由 LLM 自己决定。这保证 "AI 消息始终是最后一条、对话不卡死"。
2. 预防(agent/pre-step):追踪每个会话中「已声明但从未被 tool/result 响应」的调用;下一轮请求构建前把合成 error tool-result 消息插到该步消息最前面(覆盖重启后恢复的旧孤儿)。合成消息随 decision.messages 以 user/message 事件落盘,
deriveMessages() 从根上恢复合法,从源头杜绝 400。
3. 治愈(agent/request-error):若 API 仍因 tool_calls 配对/紧邻违规返回 400 (例如旧版本已污染的会话、或孤儿 assistant 后面已横着过期消息),用 surface 替换完成修复,然后强制重试一次(重试基于修复后的日志重建请求,一次成功):
- 把悬空 assistant 消息改写成不含 tool_calls 的版本(剥离无响应的调用);
- 把孤儿 tool 消息(无前置 tool_calls 的 tool-result)中和成纯文本 user 消息;
- 恢复被误剥但结果仍紧邻的 assistant(还原 tool_calls,保留历史工具上下文);
- 折叠崩溃重试留下的重复 user 消息。
修复幂等:第二次遇到同一违规时无事可做,自然回退下游策略,不会无限重试。
4. 兜底(llm/stream):对每个请求做纯数组矫正(配对 + 紧邻重排 + 孤儿/重复丢弃 + 空 assistant 丢弃)。循环构建的请求是冻结的,只告警不改写; compaction、session-title 等自建 messages 的非冻结请求直接原地替换。
安装
dsh plugin --profile web add github:Leeminjing/dsh-messages-sanitizer
重启 harness 即生效(插件随 profile 层栈自动加载)。
更新到最新版:
dsh plugin --profile web update dsh-messages-sanitizer
配置
| 键 | 类型 | 默认 | 说明 |
| enabled | boolean | true | 总开关 |
停用方式:删除 cordis.patch.yml 中的插入行,或改为:
- insert:
- id: messages-sanitizer
name: 'dsh-messages-sanitizer'
disabled: true
验证
cd dsh-messages-sanitizer
node --test # 40 个用例:纯函数矫正 + 会话追踪 + 请求失败修复 + 真实 cordis/Session 集成
测试覆盖(均用真实 @deepseek-ai/dsh-session 的 foldSurface / Session 校验):
- 真实崩溃序列端到端:assistant/message{tool_calls} → tool/call → 崩溃 → step/end → turn/end error → 下一回合注入后 wire 合法;
- 真实污染日志(孤儿 + 过期重复 user 消息)经修复后纯 user/assistant,无任何 tool 消息,且修复幂等;
- 真实 Session 上执行 surface 替换(通过 Session 自带校验);
- 请求失败修复只在 tool_calls 配对 400 时干预、修复后强制重试一次、且不会无限重试。
目录结构
dsh-messages-sanitizer/
├── package.json # 声明 dsh.bundle(dsh plugin add 的安装入口) ├── cordis.patch.yml # bundle 补丁层(挂载 messages-sanitizer) ├── LICENSE ├── README.md ├── README.en.md ├── lib/ │ ├── index.js # 插件入口(name / inject / Config / apply) │ ├── sanitize.js # 纯函数消息数组矫正器(配对/紧邻/孤儿/重复/空消息) │ └── repair.js # 孤儿追踪 + 预步预防 + surface 替换治愈 + 请求失败强制重试 └── tests/ ├── sanitize.test.mjs # 纯函数矫正用例 ├── repair.test.mjs # 追踪器 + 预步修复 + 请求失败修复(假 ctx) ├── integration.test.mjs # 真实崩溃序列端到端模拟 ├── heal.test.mjs # 治愈路径:正常回合不误判 / 孤儿中和 / 误剥恢复 └── cordis-integration.test.mjs # 真实 cordis + 真实 Session 集成
说明
- 插件是零构建的纯 ESM,直接可被 cordis 加载器加载;运行期依赖 @deepseek-ai/dsh-llm(合成消息)、@deepseek-ai/dsh-session(surface 折叠)、 @deepseek-ai/cordis、@deepseek-ai/schemastery(配置 schema),与 harness 运行时同源。
- 已崩溃的旧会话在重启后继续聊天时,会被治愈路径自动修复(第一次请求失败时自动剥离悬空调用并重试成功)。
- 本目录下的 node_modules 是一个指向 harness 运行时 ~/.dsh/profiles/node_modules 的 junction,仅为本地 node --test 提供依赖解析;harness 运行期不依赖它。
- 修改插件代码后无需重新构建;重启 harness(或让 cordis HMR 重载)即生效。预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
Leeminjing/dsh-messages-sanitizer
⚠️ 已退役 —— dsh ≥ 0.2.0 已在运行时根治本插件要补的问题
相关插件 · 市场 / 管理
插件精选列表awesome-dsh-plugin/awesome-dsh-plugin
DeepSeek Harness(dsh)插件精选列表
★ 22,225未汉化DSH
73.6
新词雷达zhuyansen/new-term-radar
new-term-radar新词雷达
★ 2,049已汉化MCP
72.8
插件生态导航0xsline/awesome-deepseek-harness
安装 贡献指南 DeepSeek Docs 公开插件目录 Issues
★ 1,188已汉化DSH
72.6
技能注册中心iflytek/skillhub
企业级开源智能体技能注册中心——发布、发现并管理组织内可复用的技能包。
★ 5,370已汉化DSH
71.9
插件市场目录imsai-sh/awesome-deepseek-harness-plugins
面向 DeepSeek Harnessdsh生态的社区插件目录,共收录 13941 个插件含 PR 收录与…
★ 355已汉化DSH
71.8
插件精选清单Anil-matcha/awesome-dsh-plugin
DeepSeek Harnessdsh精选指南——DeepSeek…
★ 1,013已汉化DSH
71.7
这是你的仓库?认领条目