← 返回藏书阁

A2A CLI 0.3.1:总预算、合成流与发现凭据分验

wiki/ai/sources/a2a-cli-client-timeouts-fallback-and-credential-scope.md
分类:ai / sources · 更新:2026-10-20 09:06

A2A CLI 0.3.1:总预算、合成流与发现凭据分验

知识点轴:A2A / harness-runtime / benchmark-evaluation / sandbox-security;关联 MCP Gateway。 官方CLI的 v0.3.1 于10-16发布,本轮10-20发现;固定提交 919d8e6f4ed0a0443ded5e16bf1596bf1fa2afff。已读客户端、send、polling、timeout、错误分类实现,部分测试与官方skill。这是固定源码审阅,不是本机CLI/真实Agent/多租户E2E实测;未安装CLI或skill,未调用生产agent。

为什么值得沉淀

A2A-Agent2Agent-Protocol 定义互操作,但 Hermes/cron/CI 往往不是完整A2A client。官方 a2a-cli 提供 Card发现、JSON-RPC/REST/gRPC协商、send/task/get/subscribe,以及现有公开skill;GitHub API本轮157 stars,仅作快照。真正价值不是多装一个工具,而是把上层委托承诺→CLI模式→实际网络预算/凭据/事件来源→业务效果连成可验收合同。以下机制可直接用于 Harness-Engineering 的长任务适配器。

机制一:一个 timeout 不是一份全链总预算

固定 client.go L159–177 给v1/v0.3 REST与JSON-RPC显式创建无总时限的 http.Client{Transport: ...}。这修正上游SDK默认3分钟总HTTP时限压过用户 --timeout 25m 的问题;取消底层固定上限,不等于允许无限等候。Card resolver另有30秒client;send.go L66–71先以 cfg.timeout 建client,再取消该context;L97另开普通send的同长context,流模式L76则开可重置的不活跃时限。所以发现与send不共享一只倒计时,流模式持续来事件可以超过 --timeout 指定的时长。调用者若要约束cron总预算,须另设外层绝对deadline,并记录Card、发送、空闲、整体四个口径。^[raw/articles/a2a-cli-031-client-contract-selected-2026-10-20.md]

PR #87 的review指出:把旧3分钟cap放回去时仅stream测试失败,非stream仍通过。固定 TestSend_TimeoutBoundsHTTPRequests 记录请求context deadline,不真正运行25分钟;因此作者测试能支持部分配置回归,不能把四个子测试名当四条生产路径的长时成功证明,更不代表代理/LB没有自己的180秒/空闲限制。

机制二:屏幕在流,不等于服务端提供SSE、历史完整或 exactly-once

send --stream 在Card未列streaming或返回 ErrUnsupportedOperation 时会退回polling;不是任意断流或超时都自动续订。polling.Stream 先发普通 SendMessage,强制 ReturnImmediately=true,然后GetTask采样;对活动态用 a2aevent.Recover(prev, task) 合成变化事件,终态/INPUT_REQUIRED/AUTH_REQUIRED直接产出Task并停止。连续三次GetTask失败才放弃,成功一次会清零。^[raw/articles/a2a-cli-031-client-contract-selected-2026-10-20.md]

因此stdout连续有JSON对象只能证明CLI在输出;可能是原生stream,也可能是快照差分。采样间发生又消失的状态、未持久化的chunk,不能凭 Recover 名称当作已恢复。fallback还会进入普通send路径;若服务在部分执行之后才返回unsupported,是否再次提交造成重复effect取决于服务去重,本次代码审阅没有验证这类场景。评测应记录选择的binding、协议版本、native/fallback、messageId/taskId、每次真实请求和独立副作用;不能把合成流当原生流吞吐/延迟样本。

机制三:错误保真、等待态和业务完成是不同维度

v0.3.1的PR #80让连续polling失败以 %w 保留最后cause;clierr.Classify 才能把A2A error保留为 A2ACLI_ERR_PROTOCOL+a2aCode,而非都归内部错误。超时、IO、Card无效、用法错误另有类别;重试策略应按可恢复性、原请求是否已执行、任务ID是否已获知决定,不能一律重新send。^[raw/articles/a2a-cli-031-client-contract-selected-2026-10-20.md]

官方skill把 INPUT_REQUIRED / AUTH_REQUIRED 放在同一“回复 Yes, proceed”的步骤。它是命令教学,不是授权政策:根据 a2a-auth-required-state-is-not-authorization,AUTH_REQUIRED首先要走带外凭据/真实批准,普通同意文本不能替代token、issuer/audience/scope/撤销校验。polling停止、CLI无错误、Task completed与独立业务完成也不能互相替代。固定polling测试有停止于interrupted的fixture,但没有证明用户审批通道实际可达。

机制四:发现与调用共用service parameters,要另验接收方

client.go L131–139把全部 svcParams 作为Card抓取header;L190–195又把同组参数附在client请求context。--auth 是service parameter简写。这个设计便于需要认证的Card,但本层代码没有按Card URL和Card声明的调用URL分别配置凭据集合。Card本身可来自URL或本地文件,直接 -e --transport 又跳过发现;应核可信Card来源、实际接口origin及令牌受众,不向未知Card位置塞生产Bearer。未审完底层resolver的重定向处理,也未实测跨origin转发,因此这是条件性验收项,不是已证实泄漏或用户现网漏洞。与 foundry-apim-a2a-discovery-and-credential-hops 的逐跳认证互补。^[raw/articles/a2a-cli-031-client-contract-selected-2026-10-20.md]

对 Hermes / llm-wiki 可执行的验收清单(未部署)

检查正例与负例独立记录
时间预算慢Card、慢send、持续事件、长时间静默;外层deadline须能收口实际耗时、各层deadline、HTTP client/LB配置、退出原因
原生/合成流streaming true/false、unsupported、任意中途断流,逐一核是否fallbackwire请求、native/poll标签、taskId与后端计数;不靠stdout猜
合法继续与授权INPUT_REQUIRED同任务回复;AUTH_REQUIRED无授予拒绝、合法授予后可完成caller/owner、凭据范围/受众、合法终态与违规effect分别判
错误与重试GetTask not-found、IO、超时、连续失败和间歇成功原始cause/a2aCode、任务查回、重试前后独立effect
发现与调用凭据固定本地可信Card、受保护Card、Card接口origin改变Card hash、各hop的目标/凭据接收方;仅合成token

-o jsonl 每行一对象适合harness消费;-o json --stream 是多个indented记录,不能当一个JSON文档解析。官方echo/exec只是演示/测试;它们能证明连通性,不提供任务owner、sandbox、网络出口或业务验权。specification/COMPLIANCE.md 在固定版仍是带占位符的自测模板,不是已填实测tier报告;模板自己也说明Agent TCK不直接认证CLI。和 a2a-tck-conformance-coverage-and-security-boundaries 一样,声明/适用/执行/判定必须分账。

边界与开放问题

未执行上游Go测试、没有本地二进制或真实Card/task回包,未验证gRPC、push、重定向、外层代理、跨caller owner或重复提交效果。执行采集受cron策略限制时改用获准的只读GitHub Contents API,未关闭安全策略。下一步应在隔离fixture里验证上述矩阵,而不是给当前Hermes全局安装外部skill、开放服务或转交真实凭据。AI-Knowledge-Point-Radar 已增加对应双语检索和准入门;llm-wiki-optimization-2026-10-20记选材和运行边界。

写入记录

  • 2026-10-20 09:05 CST:固定官方CLI 0.3.1与已读源码选段,深析分段/空闲/总时限、合成流、错误cause与发现凭据、skill等待态边界;加入隔离验收矩阵,不宣称本机E2E或生产采纳。