English · 中文
按这个顺序排查,每一步都缩小一层:
/a2a status 能返回快照。/a2a inbound list / outbound list。curl <cardUrl>。SendMessage。/a2a tasks、/a2a task get <id>。$DSH_HOME/sessions。(no reply) 或空 artifact任务 COMPLETED 但 artifact 是 (no reply),表示入站 session 执行器结束时没有 assistant 消息。
0.3.6 里这是已知 bug:执行器交给 agent 的消息 source 是
{ kind: 'plugin', plugin: 'a2a' }。JSONL v4 session codec 拒绝 kind: 'plugin';
写入在 session handle 的后台 flush 中失败,agent loop 吞掉错误,任务以 COMPLETED 落定但没有回复。
0.3.7 已修复,改用生产者自己的 { kind: 'a2a' }。
如果 0.3.7 或更新版本仍然空回复:
node -p "require('/path/to/profile/node_modules/@hanphone/dsh-a2a/package.json').version"
必须是 0.3.7 或更新。不是的话重装并重启 dsh web。
/a2a task get <taskId>
TASK_STATE_FAILED 会带错误消息;COMPLETED 但 artifact 为空,问题更可能在模型/会话层。
contextId,看是运行中还是空闲。a2a 警告,以及 $DSH_HOME/sessions/... 下
a2a-<contextId> 的会话日志。如果任务是 CANCELED,说明调用方或面板取消了它;在同一 contextId 上发新任务即可重开会话。
实例配置了 Bearer Token,而请求不匹配。
Authorization: Bearer <token>。A2A_INBOUND_<ID>(大写,非字母数字替换为 _);A2A_OUTBOUND_<ID>。200 之前鉴权;401 是干净状态,不是坏掉的流。/a2a inbound list 与面板显示启用状态。启用后重试。/a2a/<id>/agent-card.json)。
实例不使用 /.well-known/agent-card.json。curl -v http://127.0.0.1:3080/a2a/<id>/agent-card.json
/a2a/ 前缀,并保留了 web app 期望的
Host 头。failed面板会显示 lastError,常见原因:
| 症状 | 检查 |
|---|---|
HTTP 401 |
远端要求 token;编辑连接并设置 |
HTTP 404 |
卡片 URL 错了;用远端完整的 per-instance 卡片路径 |
invalid agent card |
URL 返回 HTML 或非卡片 JSON;确认 content-type 和形状 |
no JSON-RPC interface |
卡片没有带 JSON-RPC URL 的 supportedInterfaces 条目 |
| timeout | 调大连接的 timeoutMs,或检查网络可达性 |
| TLS/DNS 错误 | 检查远端证书/主机名与本地网络 |
修好后点 刷新(或调 outbound.refresh)。失败记录会保留,直接编辑即可,不必删除重建。
connected,且 skillCount > 0、toolCount > 0。
卡片没有技能就注册零个工具,这是设计行为。a2a__<连接名>__<技能 id>,规范化为 [A-Za-z0-9_-],截断到 64 字符。
远端名称含空格或标点时,检查模型工具列表里的实际名称,或让模型列出工具。{ "prompt": "..." },不是裸字符串。FAILED 远端任务会抛带远端消息的工具错误;
INPUT_REQUIRED / AUTH_REQUIRED 以文本返回。远端 agent 的任务落到了非终态或失败。用远端自己的 GetTask/面板查看,或读工具错误文本:
(remote agent returned no output)——远端完成但没有 artifact。Remote agent task failed: ...——远端报告 TASK_STATE_FAILED。[remote agent INPUT_REQUIRED] ...——远端需要更多输入;发后续 prompt。[remote agent AUTH_REQUIRED] ...——远端需要认证;更新连接 token。incompatible-version 或插件没加载DSH 0.1.7+ 在导入插件前会评估 @deepseek-ai/dsh 与 @deepseek-ai/dsh-* 的 peer 范围。
拒绝表示运行时 harness 超出声明范围。
package.json 查看精确范围,在
Harness 兼容性 查看验证记录。dsh plugin allow-version ... --accept-risk 是精确版本的应急豁免,不是测试的替代品。a2a 域是挂在 DSH_HOME 下的单一存储(默认 JSON)。两个进程共享同一个 home 会写同一个域,
可能互相覆盖实例/任务。一个 DSH_HOME 只跑一个写者;双实例测试请用独立 home 与端口。
hermetic e2e 就是这么做的。
POST 带 Accept: text/event-stream。不带就按非流式 JSON-RPC 处理。SendStreamingMessage 与 SubscribeToTask;其他方法返回 method-not-found 错误帧。data: 行;用 curl -N,不要缓冲。SendMessage 即使调用方期待流式也仍然阻塞;要流式就显式选流式方法。returnImmediately 与 historyLength 已实现;history 从持久化任务输入/输出重建。GetTask 不返回 history 数组。subagent 执行器不会被默认技能表选中。preset 只是元数据;还没有本地衔接会话。请附上:
0.4.0)、harness 版本、操作系统;/a2a task get <id>)与 AgentCard;a2a-<contextId> 的会话日志路径;lastError 文本。这些路径的自动防线见测试。如果你在贡献修复,把失败断言加到能看见它的那一层: 类型契约加镜像检查,持久化会话形状加真实持久化集成,发布产物路径加 e2e 冒烟。