|
|
14aa0c880b
|
fix(a2a/acp): 回复闭环 + 会话延续 + 同步注入(不再抢占打断)
【问题】
1. 入站请求用 InjectInterruptText 抢占打断当前对话,立即回 202 submitted,
agent 的回复 emit 到未注册的 channel(a2a/acp)→ 请求方永远拿不到回复文本,
只能干等超时。(acp 的 session.Replying 从未被填真回复 → SSE 永远 "(未收到回复)")
2. 无法指定/延续 session:a2a 无 session 概念;acp session/new 每次新建、
不接受调用方 session_id,多轮上下文断裂。
3. a2a/acp 通道未注册为输出设备 → emitResponse 的回复无落点,
output_list_channels 也不可见 → agent 困惑"回复该发到哪"。
【修复】
- 入站改用 SDK InjectInputSync 同步注入:阻塞等待 agent 处理完成,
直接把最终回复文本返回给 HTTP 请求方(不再回 202)。
这是 A2A/ACP 协议的合理形态——客户端控制超时,服务端同步返回。
- session 支持:a2a tasks.send 与 acp session/new 均接受 params.session_id,
指定则延续已有会话(拼上下文前缀),不指定则新建并返回 session_id。
单会话保留最多 10 轮历史防膨胀;30min GC 清理 2h 未用会话。
- a2a/acp 注册为输出通道(RegisterOutputChannel):回复有落点,
output_list_channels 可见,agent 可主动 output_send 推消息。
- 注入提示词明确"直接以文本回复即可,无需调 output_send"——
agent 不再把回复走 queued 入队而返回干净文本。
端到端验证:
单轮:status=completed, reply=真实回复文本(非 submitted)
多轮:同 session_id 第二轮准确复述第一轮问题(上下文生效)
a2a v1.2.0 / acp v1.1.0 安装 config_kept=true
|
2026-08-26 19:16:46 +08:00 |
|