DSH plugin 协议驱动怎么接?DeepSeek Harness 的 ACP 对端与 ctx.agents

插件开发发布于 2026-10-07作者: DeepSeek Plugin 插件市场
DSH pluginDeepSeek Harness协议驱动ctx.agentsACP
DSH plugin 外部协议驱动怎么接?本文按官方扩展手册的外部协议驱动节,讲清把 ACP 等协议对端接进 ctx.agents、followup() 的持久入队回执与不靠 MessageId 关联 turn/end,以及 AgentHandle.dispose() 拆除至完全停稳。

DSH plugin 的外部协议驱动把协议对端接入 ctx.agents,让一个外部协议(如 ACP)的对端可以驱动 agent,服务于 UI 或自动化客户端(来源)。 本文面向 DSH插件 / DeepSeek插件 作者,讲清协议驱动是什么、请求映射与交付语义(含 followup() 的持久入队回执),以及用 AgentHandle.dispose() 拆除到完全停稳;方向相反的 Host→Client 暴露见 API 网关解析,把轮次委派给另一个产品见 subagent 提供方,这里只讲协议对端进来这一侧。

DSH plugin 协议驱动是什么

协议驱动将协议对端接入 ctx.agents;它可以服务于 UI 或自动化客户端(来源)。 基本形态:

  • stdio 驱动拥有 stdout,因此它必须独占这条输出通道来与对端通信。
  • 它通过工厂创建或恢复 agent,并把协议请求映射为 followup() 或 cancel()。
  • 它需要注入相应服务:export const inject = ['agents', 'sessions', 'sessionPersistence']。
  • 出站方向监听会话事件流,把助手文本/推理增量转发给客户端:
ts
export const name = 'my-protocol-bridge'
export const inject = ['agents', 'sessions', 'sessionPersistence']

export function apply(ctx: Context) {
  // Stream every logged assistant text/reasoning delta out to the client.
  ctx.on('session/event', (_session, event) => {
    if (event.type === 'assistant/chunk') {
      const chunk = event.data.chunk
      if (chunk.type === 'text-delta') {
        // sendToClient({ kind: 'message_chunk', text: chunk.text })
      }
    }
  })
}

参考实现是 packages/acp/acp,它是仅面向自动化的完整示例:通过 ACP(Agent Client Protocol)JSON-RPC stdio 提供全新文本会话、发出已提交的助手文本,并为其拥有的 agent 注册一次性机器权限应答器;其 README 定义了确切的方法、事件顺序与生命周期约定。

DSH plugin 协议驱动的请求映射与交付语义

底层提示词请求返回的是它的持久入队回执;它不会通过关联 MessageId 与 turn/end 来获得结果(来源)。 这条语义决定了两件事:

  1. 入站 prompt = 创建/恢复 + 喂给 + 返回入队回执 — 收到一个协议 prompt,创建或恢复一个 agent、把内容交给它,然后返回入队回执。
  2. 整个 agent 的状态应单独发布 — 不要把「这次 prompt 的结论」硬绑在 MessageId 与某个 turn/end 上;没有哪个轮次结束属于这次 prompt,agent 整体状态是一条独立通知。

两种消费方各自等待的方式不同(来源):

  • 自动化方法可以从回执等待到下一次 idle,并把这段区间概括为一个显式拥有的范围;
  • UI 通常则持续观察开放式事件流,而不是等一次性的完成信号。

DSH plugin 协议驱动的拆除与生命周期

通过 AgentHandle.dispose() 拆除 agent,以使 dispose 达到完全停稳(停止并等待退出)(来源)。 这一点容易被忽略:只发一个取消信号就返回并不等于拆除完成——AgentHandle.dispose() 才让拆除到达完全停稳,避免留下仍在运行的轮次或未释放的资源。

生命周期约定以参考实现为准:packages/acp/acp 的 README 明确了确切的方法、事件顺序与生命周期约定,因此写自己的协议驱动时应先读它,而不是自行发明事件顺序。

写完自检三项:入站 prompt 是否只返回入队回执、状态是否单独发布(没有假装用 turn/end 关联结果);stdio 驱动是否独占 stdout;拆除是否走了 AgentHandle.dispose() 到完全停稳。想找协议 / 集成类插件的社区实现,你可以在 DSH Plugin Hub 检索;扩展点归属判据见 功能→机制映射。

常见问题

DSH plugin 的外部协议驱动是什么?ctx.agents 接入怎么做

DSH plugin 的外部协议驱动把协议对端接入 ctx.agents,用于服务 UI 或自动化客户端。stdio 驱动拥有 stdout,通过工厂创建或恢复 agent,并把协议请求映射为 followup() 或 cancel()。它与网关暴露方向相反:协议驱动是外部协议对端进来,而不是把 Host 能力用 @Remote 暴露给客户端。

DSH plugin 协议驱动怎么把协议请求映射成一次提示词?

DSH plugin 协议驱动在收到入站 prompt 时创建一个新 agent 或恢复已有 agent,把内容喂给它,并返回其持久入队回执。关键语义是:底层提示词请求返回的是入队回执,它不会通过关联 MessageId 与 turn/end 来获得结果;整个 agent 的状态应当作为单独的发布(通知)送出,而不是挂在这次 prompt 上。

DSH plugin 协议驱动怎么把助手输出流式发出去?session/event 怎么监听

DSH plugin 协议驱动监听 session/event 事件流,遇到 assistant/chunk 且 chunk 类型为 text-delta 时把文本增量转发给客户端;这依赖注入 agents、sessions 与 sessionPersistence 服务。UI 通常持续观察这个开放式事件流,而自动化客户端可以从入队回执等待到下一次 idle,并概括这段显式拥有的区间。

DSH plugin 协议驱动怎么正确拆除 agent?AgentHandle.dispose 用法

DSH plugin 协议驱动通过 AgentHandle.dispose() 拆除 agent,好让 dispose 达到完全停稳(停止并等待退出),而不是只发一个取消就返回。官方参考实现是 packages/acp/acp:它通过 ACP(Agent Client Protocol)JSON-RPC stdio 提供全新文本会话、发出已提交的助手文本,并为其拥有的 agent 注册一次性机器权限应答器,其 README 定义了确切的方法、事件顺序与生命周期约定。

相关术语

外部协议驱动(protocol driver)
外部协议驱动是 DeepSeek Harness 的一种扩展形态:它把协议对端接入 ctx.agents,可服务 UI 或自动化客户端;stdio 驱动拥有 stdout,通过工厂创建或恢复 agent,并把协议请求映射为 followup() 或 cancel(),方向与 Host→Client 的 @Remote 暴露相反。— https://deepseek-harness.github.io/deepseek-harness/reference/cookbook/extension-cookbook
followup()(持久入队回执)
协议驱动里,底层提示词请求经 followup() 交付并返回持久入队回执;它不通过关联 MessageId 与 turn/end 取得结果,整个 agent 的状态须单独发布,自动化调用方可以从回执等待到下一次 idle。— https://deepseek-harness.github.io/deepseek-harness/reference/cookbook/extension-cookbook
AgentHandle.dispose()
AgentHandle.dispose() 是协议驱动拆除 agent 的方式,它使 dispose 达到完全停稳(停止并等待退出),而不是仅发出取消即返回,从而保证拆除彻底、无遗留运行。— https://deepseek-harness.github.io/deepseek-harness/reference/cookbook/extension-cookbook

来源