Skip to content

[Priority: Med] [Feature] Client 侧自动轮询回退机制 (GetTask) #310

@liujuanjuan1984

Description

@liujuanjuan1984

背景

当前 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:

  1. 不提供稳定 streaming;或
  2. message/send 返回 working / 其他 non-terminal Task;且
  3. 需要 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。

建议实施步骤

  1. 盘点当前 send() / send_message() 对 non-terminal Task 的返回形态。
  2. 明确触发 polling fallback 的边界条件。
  3. 设计 polling 参数:间隔、退避、总超时、最大尝试次数。
  4. 先补 façade 层测试,再决定是否实现。

验收标准

  • 明确 non-terminal Task 的自动 polling 触发条件。
  • 明确 fallback 与显式 get_task() / resubscribe_task() 的职责边界。
  • 若进入实现阶段,补齐回归测试与超时/错误路径测试。

关联

Metadata

Metadata

Assignees

No one assigned

    Labels

    status:todoPlanned but not started

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions