前言¶
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),本插件发布在@zyfgoodscope 下,安装时必须带 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(默认):每个 A2AcontextId对应持久 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。