@zyfgood/dsh-a2a:为 DSH 补上 A2A 双向互操作

前言

DeepSeek Harness(DSH)在进程内互操作上主要走 ACP 与 MCP:前者适合程序化驱动 agent,后者适合挂载外部工具与资源。若要把 DSH 里的 agent 接到 Google ADK、a2a-python / a2ajava SDK 或各类 A2A 网关,需要标准 Agent2Agent(A2A)协议面,而不是再包一层私有 RPC。

下面介绍社区插件 @zyfgood/dsh-a2a(维护者 zyfgood,分类:工作流)。它在 DSH 侧同时提供入站 A2A 服务器与出站 a2a_* 工具,零额外 npm 运行时依赖(Node ≥20 标准库 + 全局 fetch),与同一作者体系的 dsh-feishu-bot 等插件安装方式一致。

这是什么

一句话:@zyfgood/dsh-a2a 是 DSH 的 A2A 协议插件——把 DSH agent 暴露为标准 A2A 服务器,并注册模型工具让任意 DSH agent 呼叫远端 A2A agent。

当前 npm 版本为 0.2.1(MIT)。社区目录页:skillhub.cn/plugins/zyfgood/dsh-a2a;源码与文档:github.com/zyfgood/dsh-a2a。SkillHub 为独立社区目录,与 DeepSeek / 幻方无官方从属关系。

核心功能

入站:DSH agent 作为 A2A 服务器

  • Agent Card:/.well-known/agent-card.json(0.3.x)与 /.well-known/agent.json(0.2.x 兼容)。
  • JSON-RPC 2.0:message/send(同步)、message/stream(SSE)、tasks/get、tasks/cancel、tasks/resubscribe(断线续订)、agent/authenticatedExtendedCard。
  • 任务生命周期:submitted → working → completed/failed/canceled;支持 input-required 暂停与同一 taskId 多轮续答。
  • 运维相关:版本协商(A2A-Version / X-A2A-Version)、可选 Bearer 鉴权、CORS、单轮超时、任务 TTL 回收。

出站:agent 调用远端 A2A

默认注册四个模型工具(配置 tools: false 可关闭):

工具 协议 用途
a2a_discover 拉取 Agent Card 能力 / 技能 / 鉴权
a2a_send message/stream(可降级 send + 轮询) 发消息并等待最终回复
a2a_task_status tasks/get 查询远端任务
a2a_cancel tasks/cancel 取消远端任务

出站目标由 clientAllowPatterns 白名单约束。

可视化运维(v0.2.0 起)

在 DSH Web 客户端:Plugins → @zyfgood/dsh-a2a 配置卡,以及 Settings → Plugins 分区的 A2A 标签页。面板读取插件自带的 /admin/status、/admin/tasks(Bearer 与 JSON-RPC 同门禁),展示服务器状态、最近任务板、常用远端 Agent Card 目录等。

安装与启用

安装前请自行审阅仓库源码与 MIT 许可证;插件随当前 DSH profile 进程权限运行,公网暴露需配合 bearerToken 与网络策略。

npm 裸名 dsh-a2a 指向无关项目(TtTRz/dsh-a2a),本插件发布在 @zyfgood scope 下,安装时必须带 scope。

# 官方 CLI 一键安装(npm 渠道,推荐;bundle patch 自动挂载)
dsh plugin --profile <name> add @zyfgood/dsh-a2a

# 或 GitHub
dsh plugin --profile <name> add github:zyfgood/dsh-a2a

# 或本地路径
dsh plugin --profile <name> add file:D:/DSHProjects/dsh-a2a

重启 profile 后生效。默认监听 127.0.0.1:7310。仓库随包发布预构建 lib/,无需本地构建。

profile 的 cordis.patch.yml 中典型片段:

- id: a2a
  name: '@zyfgood/dsh-a2a'
  config:
    port: 7310
    mode: agent

常用配置项(完整表见 README)包括:host、publicUrl(反代 / TLS 必填外部 URL)、bearerToken、mode(agent / llm / echo)、provider / model、persistSessions、turnTimeoutMs、clientAllowPatterns 等。

典型用法

快速验证 Agent Card 与同步消息

先确认服务已启动,再在本机执行:

# 1) Agent Card(0.3 路径)
curl http://127.0.0.1:7310/.well-known/agent-card.json

# 2) 发一条消息(同步)
curl -X POST http://127.0.0.1:7310/ -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "message/send",
  "params": {
    "message": {
      "kind": "message",
      "role": "user",
      "parts": [{"kind": "text", "text": "你好,介绍一下你自己"}],
      "messageId": "m-1",
      "contextId": "ctx-demo"
    }
  }
}'

成功时 result 为 A2A Task:status.state === "completed",回复文本在 artifacts[0].parts[0].text。同一 contextId 再次调用会复用同一 DSH agent 会话(多轮记忆)。

流式 message/stream

curl -N -X POST http://127.0.0.1:7310/ \
  -H "Content-Type: application/json" -H "Accept: text/event-stream" -d '{
  "jsonrpc": "2.0", "id": 2, "method": "message/stream",
  "params": {"message": {"kind": "message", "role": "user",
    "parts": [{"kind": "text", "text": "流式演示"}], "messageId": "m-2", "contextId": "ctx-demo"}}
}'

SSE 会依次推送 status-update(working) → artifact-update → status-update(completed, final=true) 后结束。

入站三种模式

  • agent(默认):每个 A2A contextId 对应持久 DSH agent 会话(工具、技能、工作目录完整);映射可落盘到 $DSH_HOME/a2a/,重启可恢复。
  • llm:经 ctx.llm 直答,不建 agent 会话,短期记忆由 maxHistory 控制。
  • echo:回显原文,用于链路验证。

agent 模式需要可用模型:插件会解析配置的 provider / model,否则回退 profile 默认模型;两者皆无时任务会明确失败而非空回复。

出站对话示例

在 DSH agent 对话中可自然表述,例如:用 a2a_send 呼叫 http://其它机器:7310/ 的 agent,询问其技能并汇总结果。实际可达地址须落在 clientAllowPatterns 内。

与 DSH 内置能力如何选型

需求 建议
进程外程序化驱动 DSH agent 内置 ACP(dsh-acp)
挂载外部工具 / 资源 内置 MCP 客户端
与 A2A 生态(ADK、A2A SDK、网关)互操作 @zyfgood/dsh-a2a

结尾

若你的 workflow 需要标准 A2A 入站暴露或多 agent 经协议互联,可在 profile 安装 @zyfgood/dsh-a2a,用 curl 或 Web 面板验证后再接外部客户端。详情与配置表以 GitHub README 为准:https://github.com/zyfgood/dsh-a2a;目录入口:https://www.skillhub.cn/plugins/zyfgood/dsh-a2a。

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

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

小夜