DeepSeek Harness 的 DSH plugin:Conversation node 匹配、注册与回放

插件开发发布于 2026-10-02作者: DeepSeek Plugin 插件市场
DSH pluginDeepSeek HarnessConversation nodeWeb ClientSession 事件
DeepSeek Harness 的 DSH plugin 用 Conversation node 给 Chat 视图加业务行:以 (kind, id) 匹配事件、注册 Definition 并注入 conversation.chat.node 槽,再按 replace/prepend/append 回放。

想给 Web Client 的 Chat 视图加一行业务 UI,DSH插件(DSH plugin)的做法是注册 Conversation node:用稳定 (kind, id) 把一组持久 Session 事件匹配成一个 Context,再用 Definition 折叠出 State,最后按 key 注入 conversation.chat.node 渲染器。 Conversation 是 Client 事件窗口与浏览器 view 之间的 target-neutral 组装层,业务行是它的既有扩展路径。

DSH plugin 的 Conversation node 怎么匹配:以稳定 (kind, id) 关联事件族

你在编写 Definition 前先选定稳定的业务 id——构成同一个 Node 的每条事件都必须携带该 id,或只凭自身 payload 独立推导出该 id(来源)。 官方以 review job 为例给出事件约定:

事件角色必须持久化的事实
review/start唯一 startreviewId、Turn/Step 坐标、标题
review/progressupdate相同的 reviewId、坐标、可回放进度
review/endupdate相同的 reviewId、坐标、最终摘要

核心纪律:match(event) 是身份提取器而不是 fold——它只收到当前 SessionEventLike,返回 Definition 内部 id 与生命周期角色;命中后由 Assembler 通过 (kind, id) 定位 Context。Client 绝不能把一条 update 猜成属于「最近一个未完成的 Context」,每个 (kind, id) 最多只能有一条 start 事件。

DSH plugin 怎么注册 Conversation node:Definition 与 chat node 槽

Definition 需要 match、start、update,再加 target 与 buildViewNode;注册分两步:注册 Definition、注入渲染器(来源)。

ts
export const inject = ['uiConversation', 'slots']

export function apply(ctx: ClientContext): void {
  ctx.uiConversation.events.register(reviewDefinition)
  ctx.slots.inject('conversation.chat.node', () => ctx.slots.register({
    name: 'conversation.chat.node',
    key: 'review-job',
  }, ReviewNodeView))
}

按三步理解:

  1. 注册 Definition — ctx.uiConversation.events.register(definition),声明 kind 与 target。预期:同一 target 的同一 key 只注册一次,渲染期可被识别。
  2. 按 key 注入渲染器 — 向 conversation.chat.node 槽注册组件。预期:渲染器只读 node.data 与受限 Location hook。
  3. 处理可见性 — 暂时离开可见流时返回 visibility: 'hidden',不要返回 null 撤回已发布的 node。预期:key 稳定,回放不会错位。

节点身份要稳定:某个 target Node 一旦发布就要继续返回同一个 key,并把 context.key 保留为 React 侧身份;anchorSeq 依据持久排序证据选择。

DSH plugin 的 Conversation node 怎么回放:replace、prepend 与 publication

历史可能从尾部一页页向前请求,Assembler 按每个已接受 input 的首 seq 排序后进入 State 回放(来源)。 三条窗口路径:

  1. replace(open / resync / gap repair) — 重建已加载窗口,每条事件对每个 Definition 匹配一次,再回放已有 start 的 Context。预期:先 start 再按 seq 升序 update。
  2. prepend(更早一页) — 只匹配新增的更早 input,按 (kind, id) 合并进 Context,只重放受影响者。预期:新发现的 start 会激活已收集的 update。
  3. append(实时事件) — 每个 Definition 各调一次 match,只更新命中的 Context。预期:热路径不扫描全窗口。

publication 控制何时物化:结构或终态变化用 immediate,高频可见 delta 用 animation-frame,只为后续发布积累 State 用 none。性能硬约束:正常 append 热路径不得遍历完整事件窗口、所有 Context 与已渲染 Node——累计事实放进 State,同 Turn/Step 共享信息放进 Location data,有索引的前序依赖用 reader.previous()。

写完时你可以自检三项:业务 id 是否在每条事件里稳定携带;渲染器是否只消费 node.data;是否可以只补充更早分页而不替换既有 keyed node。想找一个把 UI 落到别的槽位的做法,见 界面插件开发;想找现成的界面类插件对照,可在 DSH Plugin Hub 检索。

常见问题

DSH plugin 的 Conversation node 是什么?能往 Chat 视图加什么?

DSH plugin 的 Conversation node 是 client 侧的一种扩展形态,用来往 Chat 视图加一行业务 UI。它把持久 Session 事件族折叠成一个 Context,再按 view target 发布成可渲染的 node;官方示例是给一个 review job 加一条进度行。

DSH plugin 怎么写一个 Conversation node 的 Definition?

DSH plugin 的 Definition 需要 match、start、update 三个核心方法,外加 target 与 buildViewNode。match(event) 只做身份提取,返回内部 id 与 start/update 角色;start 初始化 State,后续所有命中都走 update。

DSH plugin 的 match() 和 start()、update() 分别做什么?

DSH plugin 里 match(event) 是身份提取器而不是 fold,只接收当前 SessionEventLike 并返回内部 id 与生命周期角色;命中最早的 start 初始化 State,后续所有 Match(包括其他 start)都调用 update。移除瞬态 Match 时引擎会重选 start 并重算 State。

DSH plugin 的 Conversation node 怎么注册渲染器?

DSH plugin 先声明 inject = ['uiConversation', 'slots'],再在 apply 里 ctx.uiConversation.events.register(definition) 注册 Definition,并用 ctx.slots.inject('conversation.chat.node', ...) 按 key 注册渲染组件。渲染器只消费 node.data 与受限 Location hook。

DSH plugin 的 Conversation node 怎么保证历史回放一致?

DSH plugin 靠稳定业务 id 与可回放事件族保证一致:构成同一 Node 的每条事件都要携带同一 id,且按日志 seq 升序回放能确定性地产生 State。若尾部窗口只有 update,Assembler 会保留 pending Context,等更早分页补齐 start 再构造 State。

相关术语

ConversationNodeDefinition
ConversationNodeDefinition 是 DSH plugin 注册 Conversation node 的定义对象,包含 kind、target、match、start、update、可选的 buildLocationData 与 buildViewNode,把一段持久 Session 事件族折叠成可渲染节点。— https://deepseek-harness.github.io/deepseek-harness/reference/subsystems/conversation
Event Definition
Event Definition 是 DSH plugin 的匹配单元,一次匹配一个持久事件或 Client-only 瞬态事件,以稳定 (kind, id) 关联输入、折叠确定性 State,并可选择物化为 target node。— https://deepseek-harness.github.io/deepseek-harness/reference/subsystems/conversation
publication
publication 是 DSH plugin 控制 State 变更后何时物化视图的选项,结构或终态变化用 immediate,高频可见 delta 用 animation-frame,只为后续发布积累 State 用 none。— https://deepseek-harness.github.io/deepseek-harness/reference/subsystems/conversation
conversation.chat.node
conversation.chat.node 是 DSH plugin 注册 Chat 业务节点渲染器的 keyed slot,注册时按 key 绑定组件,渲染器读取 target 自有 node 数据。— https://deepseek-harness.github.io/deepseek-harness/reference/cookbook/extension-cookbook

来源