dsh-a2a

排障

English · 中文

按这个顺序排查,每一步都缩小一层:

  1. 插件挂载了吗? /a2a status 能返回快照。
  2. 实例存在且启用吗? /a2a inbound list / outbound list。
  3. 卡片可达吗? curl <cardUrl>。
  4. 协议端点可达吗? 用一个极短 prompt 发 SendMessage。
  5. 任务状态是什么? /a2a tasks、/a2a task get <id>。
  6. 宿主日志与会话日志? DSH 日志与 $DSH_HOME/sessions。
  7. 版本与兼容性? 见 §7。

1. (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 或更新版本仍然空回复:

  1. 确认已安装版本:
    node -p "require('/path/to/profile/node_modules/@hanphone/dsh-a2a/package.json').version"
    

    必须是 0.3.7 或更新。不是的话重装并重启 dsh web。

  2. 看任务状态与状态消息:
    /a2a task get <taskId>
    

    TASK_STATE_FAILED 会带错误消息;COMPLETED 但 artifact 为空,问题更可能在模型/会话层。

  3. 面板 连接与任务 → 入站会话,找到对应 contextId,看是运行中还是空闲。
  4. 检查 preset 的模型 provider:未认证或配错的 provider 可能产生空的 assistant 消息。 用同一个 preset 在普通 DSH 会话里试一下。
  5. 查 DSH 宿主日志里的 a2a 警告,以及 $DSH_HOME/sessions/... 下 a2a-<contextId> 的会话日志。

如果任务是 CANCELED,说明调用方或面板取消了它;在同一 contextId 上发新任务即可重开会话。

2. 入站请求返回 401

实例配置了 Bearer Token,而请求不匹配。

3. AgentCard 404 或 connection refused

4. 出站连接是 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)。失败记录会保留,直接编辑即可,不必删除重建。

5. 远端技能缺失或模型不调用工具

6. 工具调用返回远端错误

远端 agent 的任务落到了非终态或失败。用远端自己的 GetTask/面板查看,或读工具错误文本:

7. incompatible-version 或插件没加载

DSH 0.1.7+ 在导入插件前会评估 @deepseek-ai/dsh 与 @deepseek-ai/dsh-* 的 peer 范围。 拒绝表示运行时 harness 超出声明范围。

8. 两个 DSH 进程抢同一份存储

a2a 域是挂在 DSH_HOME 下的单一存储(默认 JSON)。两个进程共享同一个 home 会写同一个域, 可能互相覆盖实例/任务。一个 DSH_HOME 只跑一个写者;双实例测试请用独立 home 与端口。 hermetic e2e 就是这么做的。

9. 流式行为异常

10. 已知限制

11. bug 报告里带什么

请附上:

这些路径的自动防线见测试。如果你在贡献修复,把失败断言加到能看见它的那一层: 类型契约加镜像检查,持久化会话形状加真实持久化集成,发布产物路径加 e2e 冒烟。