-
Notifications
You must be signed in to change notification settings - Fork 0
[Priority: Med] [Feature] Client 侧自动轮询回退机制 (GetTask) #310
Copy link
Copy link
Closed
Labels
status:todoPlanned but not startedPlanned but not started
Description
背景
当前 A2AClient 已不是“主要同步阻塞模式”。主干中的 facade 以 stream-first 为主:
send_message()直接流式消费 peer 返回的 A2A 事件;send()只是对流式结果做最终事件收敛;- 已提供
get_task()与resubscribe_task()作为显式任务查询/重订阅入口。
但当前 client 构建仍显式关闭 SDK polling(ClientConfig(... polling=False)),因此当对端 server 采用“先返回 non-terminal Task,再要求 client 通过 tasks/get 轮询结果”的模式时,当前 facade 仍缺少自动回退能力。
当前问题
当 peer A2A server:
- 不提供稳定 streaming;或
- 对
message/send返回working/ 其他 non-terminal Task;且 - 需要 client 继续通过
tasks/get才能拿到最终结果
则当前 A2AClient.send() / send_message() 不会自动接管后续 polling 流程,需要调用方自行组合 get_task() 或 resubscribe_task()。
期望方向
评估是否为 facade 增加一个可选的自动 polling fallback:
- 仅在收到 non-terminal Task 且未进入 streaming completion path 时触发;
- 采用有上限的退避与超时,而不是无限轮询;
- 保持当前显式
get_task()/resubscribe_task()API 不变; - 不改变默认的 stream-first 模型。
非目标
- 不把 facade 改回同步阻塞优先。
- 不取代
resubscribe_task()的显式订阅能力。 - 不在本 issue 内同时扩展 transport negotiation 或 peer capability discovery。
建议实施步骤
- 盘点当前
send()/send_message()对 non-terminal Task 的返回形态。 - 明确触发 polling fallback 的边界条件。
- 设计 polling 参数:间隔、退避、总超时、最大尝试次数。
- 先补 façade 层测试,再决定是否实现。
验收标准
- 明确 non-terminal Task 的自动 polling 触发条件。
- 明确 fallback 与显式
get_task()/resubscribe_task()的职责边界。 - 若进入实现阶段,补齐回归测试与超时/错误路径测试。
关联
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
status:todoPlanned but not startedPlanned but not started