format v4 message requires a producer-owned source kind 报错排查:DSH插件会话写入
format v4 message requires a producer-owned source kind 表示 DeepSeek Harness 的会话格式 v4 在做准入校验时,拒绝了一条消息的 source kind——v4 要求消息源报出「生产者自有的 kind」,而它看到的还是 v3 时代那个通用的 kind: 'plugin' 包装。对应动作是「把插件升级到适配 v4 的版本、或按官方说明把 source kind 改成本生产者自有 kind;改不动就卸载这个不兼容插件」(来源)。
这句报错的关键在于:它不是「会话文件坏了」,而是一条消息在写入前就被格式校验挡下了。有用户实跑遇到,/carry 这类由插件写入的消息在会话格式升到 v4 之后直接抛这句;判据在 dsh-session-format-v3-to-v4 的准入断言里,编码与解码两条路径都会调用,所以既是写不进去、也是读不出来(来源)。下面讲清含义、修法与它和「迁移被拒」的区别。
format v4 报错含义:为什么拒绝 plugin 这类 source kind
v4 的准入校验直接拒绝 kind: 'plugin' 这种泛型包装,只接受「生产者自己命名的 kind」——所以老插件沿用 v3 写法写出来的消息,在 v4 里连门都进不去(来源)。 形状对照看:
| 消息来源形状 | v4 结果 |
|---|---|
{ kind: 'plugin', plugin: 'compact' } | ❌ 抛错 |
{ kind: 'compact-checkpoint', compactionId } | ✅ 通过(官方 checkpoint 标记) |
{ kind: 'plugin:dsh-tui-compact-carry', compactionId } | ✅ 通过(第三方插件的生产者 kind 约定) |
按顺序认一遍:
- 它是「准入失败」,不是「数据损坏」:校验发生在消息写入或读取的入口,事件还没落进日志就被拒绝。预期:日志里可能看不到这条消息的痕迹。
- 它同时影响读写两条路径:
assertV4SourceRowAdmission/assertV4MessageSources在编码与解码两侧都调用,所以不只是「写不进去」,旧写法存在的消息读回来也会被挡。预期:升级或修正形状后,读写都恢复正常。 - 它是一次全回合失败,不只是这条消息失效:当消息在某个步骤能运行之前就被追加、又抛了错,整个回合会失败。预期:修好 source kind 后,该回合能正常跑完。
记住一句话:v4 要的是「谁写的就用谁的名字」,通用包装被退休了。
别把它读成会话文件损坏。 在准入环节被挡下的消息根本没写进日志,磁盘上的会话不受这个错影响;真的会话损坏是另一类报错(seq 缺口、格式版本拒绝)。此时去跑会话修复工具是方向错了——没有东西被写坏,没什么可修的。
- 这个命名约定是刻意设计的:要求 producer-owned kind,v4 才能让读端在不需要中心注册表的前提下,区分官方 checkpoint 与第三方插件的标记,消息来源因此自描述。预期:按约定实现的插件,在 v4 下能正确读回自己写的旧消息。
format v4 报错怎么修:升级插件、卸载不兼容插件与会话迁移
修法有三条主线:优先把插件升级到适配 v4 的修复版本;升级不了就按官方说明把 source kind 改回生产者自有 kind;实在不兼容就用市场卸载它,再按迁移流程处理受影响的会话。 按顺序执行:
- 升级插件:把触发报错的插件更新到适配 v4 的版本(
dsh plugin --profile web add <包名>@latest,或在其来源通道拉最新)。预期:升级后再执行同一操作,不再抛format v4 message requires a producer-owned source kind。 - 按官方说明改 source kind:如果插件源码在你手里,把消息来源从
kind: 'plugin'包装改成生产者自有的 kind——第三方插件按约定是带插件名前缀的形式,如plugin:<插件名>(来源)。预期:改完重跑,消息能通过 v4 准入。 - 卸载不兼容插件:拿不到修复版本、又没法改源码时,在 DSH Plugin Hub 的已安装列表里核对版本与来源,然后把不兼容的那个卸载掉,避免它继续往会话里写非法形状。预期:列表里不再出现该插件,相关操作不再触发校验失败。
- 处理受影响会话:对已经因为这条消息而失败、打不开或写不进新内容的会话,按官方会话迁移流程处理(不要手工改文件)。预期:会话能重新加载,后续写入不再被拒。
- 回归验证:重跑一次原本报错的操作(例如那条插件的命令),再打开受影响会话确认可读。预期:两步都通过,才算修完。
边界:如果你的现象是「升级 DeepSeek Harness 后老会话整体打不开、报 refuses this format v0」,那是另一个问题,属于迁移清单问题,见下方对比。
为什么升级比改源码省事:还在写退休包装的插件,通常没跟宿主的同一条发行线打过补丁,所以你在本地把某处调用改掉,只是造了个本地 fork,下次宿主升级又会漂移。升级到在维护的版本,能让 source kind 约定与执行它的宿主保持对齐;只有在你拥有该插件、又没有可用发行版时,才回退到改源码。
与 session format migration refusal 的区别
两者的共同点只是「都涉及会话格式」,机制完全不同:本篇是 v4 对 source kind 的准入失败,另一篇是旧数据迁移清单漏项导致的拒读(来源)。 对照看:
| 维度 | 本错(v4 source kind 准入) | session format migration refusal |
|---|---|---|
| 触发时机 | 插件按 v3 写法写入/读取消息时 | 升级后打开历史会话时 |
| 报错核心 | format v4 message requires a producer-owned source kind | refuses this format v0 / 迁移清单拒读 |
| 根因 | source kind 用了已退休的通用包装 | 迁移白名单漏了已发布过的形状 |
| 处理 | 升级插件、改 source kind、卸载不兼容插件 | 备份后走只读修复、等官方扩清单 |
- 方向相反:本错是「新格式不允许旧形状写入」,迁移拒读是「读端不认识自己过去写出的形状」。预期:先判断报错串,再选对应处理。
- 处理代价不同:本错多半升级或换插件就好;迁移拒读涉及历史数据,必须先备份再动。预期:不明白机制时,不要手工改会话文件。
- 别混为一谈:迁移被拒的完整背景在《DSH plugin 升级后老会话打不开?refuses this format v0 迁移拒读排查》里,本篇不重复。预期:两篇各修各的,不互相覆盖。
还有一组值得区分:v4 准入失败说的是消息来源的「形状」,而工具调用抛出的 schema / 校验错误说的是插件传入的「参数」。两者可能出现在同一个失败的回合里,所以要看报错串:这一条点名 source kind,另一条点名某个参数。修参数 schema 解不开 source kind 的错,反过来也一样。
DSH插件 排查注意事项
- 先看报错串:v4 source kind 准入与迁移拒读是两码事,按串选处理。
- 别手工改会话文件:格式与来源形状互相关联,改错一处会把可修复问题变成真损坏。
- 优先升级插件:能拿到适配 v4 的版本,就别去改源码。
- 卸载是最稳的兜底:不兼容插件先移除,再谈迁移历史会话。
- 回归验证两步:重跑原操作 + 打开受影响会话,都过才算修好。
DSH插件 消息 source kind 的官方约定
官方约定一句话:v4 之后消息来源必须由生产者自己命名,通用包装被退休;同一版还改了会话事件访问方式,插件需要跟着适配。 两点说明:
- 生产者自有 kind 是硬要求:v4 准入拒绝
kind: 'plugin',官方 checkpoint 用官方自己的类型,第三方插件用带插件名前缀的形式,两代读回同一个 kind(来源)。预期:插件作者按此约定改一次即可长期适配。 - 同一版还有别的破坏性变更:会随宿主升级而漂移,升级
dsh之后先跑一遍插件的离线冒烟/自检再上生产(来源)。预期:把「升级后先自检」当固定动作,能提前发现这类准入问题。
与其为一个 v4 不兼容的插件到处找补丁,不如先在 DSH Plugin Hub 的已安装列表里核对版本、把不兼容的那个卸掉再来。

来源:deepseek-ai/deepseek-harness(官方仓库)、社区插件 dsh-tui-compact-carry、Web UI 指南(官方文档)。
常见问题
它表示 DeepSeek Harness 的会话格式 v4 在做准入校验时,拒绝了这条消息的 source kind——v4 要求消息源报出「生产者自有的 kind」,而它看到的还是旧的 plugin 包装。 编码与解码两条路径都会校验,所以既写不进去也读不出来。
producer-owned source kind 是 DeepSeek Harness 消息来源标识里由生产者自己命名的那一类 kind。 v4 准入直接拒绝 kind: 'plugin' 这种通用包装,只接受生产者自己声明的 kind:第三方插件按约定用带插件名前缀的形式,官方 checkpoint 标记用官方自己的类型。
会话升到 v4 后老插件写入被拒,DeepSeek Harness 里的修法是三步走:把插件升级到适配 v4 的修复版本,或按官方说明把 source kind 改成本生产者自有 kind。 确认改不动就卸载这个不兼容插件,受影响的会话按迁移流程处理;改完先跑一次相关操作,确认不再抛错。
在 DeepSeek Harness 的插件市场里卸载与核对:本项目的社区市场入口是 DSH Plugin Hub。 它的已安装列表能看到插件来源、版本与更新时间,并支持卸载;核对版本后把不兼容的那一个移除,避免它继续往会话里写非法形状。
在 DeepSeek Harness 里这两者不是一回事:format v4 message requires a producer-owned source kind 是 v4 写入/读取时的 source kind 准入失败,而 session format migration refusal 是旧会话迁移清单漏项、把合法历史数据当非法格式拒读。 两者都涉及会话格式,但一个是新格式准入、一个是旧数据迁移。
相关术语
- source kind
- source kind 是 DeepSeek Harness 会话事件里标识消息来源的字段,v4 格式要求它报出生产者自有的值,而不再接受通用的 plugin 包装。— deepseek-ai/deepseek-harness
- format v4
- format v4 是 DeepSeek Harness 会话格式的一代 schema,它对消息来源执行更严格的准入校验,编码与解码两条路径都会检查 source kind。— deepseek-ai/deepseek-harness
- assertV4MessageSources
- assertV4MessageSources 是 DeepSeek Harness 会话格式 v3 到 v4 转换里的准入断言,用于校验每条消息的来源形状是否为生产者自有 kind。— 社区插件 dsh-tui-compact-carry
- plugin-namespace wrapper
- plugin-namespace wrapper 是 v3 时代把消息来源包成 kind: 'plugin'、plugin: '<name>' 的通用包装;v4 已退休这种形状,读到或写入都会被拒绝。— 社区插件 dsh-tui-compact-carry