Skip to content

fix(client): propagate outbound headers through SDK transports - #514

Merged
liujuanjuan1984 merged 4 commits into
mainfrom
fix/513-outbound-auth-headers
Aug 24, 2026
Merged

fix(client): propagate outbound headers through SDK transports#514
liujuanjuan1984 merged 4 commits into
mainfrom
fix/513-outbound-auth-headers

Conversation

@liujuanjuan1984

@liujuanjuan1984 liujuanjuan1984 commented Aug 24, 2026

Copy link
Copy Markdown
Collaborator

变更摘要

  • 将默认 Bearer/Basic 鉴权、固定 A2A-Version、trace 与显式 per-call 请求头写入 ClientCallContext.service_parameters,使 SDK transport 真正将其发送到对端。
  • 继续通过 ServiceParametersFactory 合并 A2A-Extensions,保留显式 Authorization 覆盖默认凭据的既有语义。
  • 删除 SDK 不消费的 ClientCallContext.state["headers"] / state["http_kwargs"] 双写,避免无效兼容状态误导后续测试和维护。
  • 新增跨真实 SDK Agent Card resolver、JSON-RPC/HTTP+JSON transport 到最终 httpx.Request 的回归测试,覆盖 Bearer、Basic、SendMessageGetTask、协议版本、trace、扩展头和显式鉴权覆盖。
  • 仅在 CONTRIBUTING.md 增加 wire-boundary 测试规范,不在用户指南和兼容性指南中重复维护开发说明。

设计与风险审查

a2a-sdk 1.1.2 的 HTTP transports 仅从 service_parameters 构造 HTTP headers,gRPC transport 也将其转换为 metadata;SDK 自身的 AuthInterceptor 使用同一正式通道。因此本实现比在共享 httpx.AsyncClient 上固化 headers 更完整,能够覆盖 per-call Authorization、trace、extension 以及外部注入 HTTP client 的场景。

服务端 credential allowlist 路径未改动:非 allowlisted host 仍会在创建 A2AClient 前剥离凭据。请求 metadata 中的普通业务字段仍留在协议 payload,仅允许的 header 字段进入 transport context。

独立复审未发现新的功能、安全或兼容性阻断项。复审期间发现新增 wire-level 测试只覆盖 JSON-RPC,而生产默认也支持 HTTP+JSON;现已将同一组请求头断言扩展到两个真实 SDK HTTP transports。

SDK 与 override 审计

  • a2a-sdk v1.1.3 的 GitHub Release 已创建,但 PyPI 发布因 action 不支持 Core Metadata 2.5 而失败;本 PR 保持可安装的 1.1.2 pin。上游跟踪:https://github.com/a2aproject/a2a-python/issues/1199。
  • 已使用上游 v1.1.3 release 精确 commit 运行 235 项 client、transport、task-store shape/parity 与 extension contract 测试,全部通过;正式升级继续由 升级 a2a-sdk 至 1.1.3 并审计下游兼容层 #515 跟踪。
  • DatabaseTaskStoreCompat 仍是 first-terminal-state-wins 原子写入所必需,上游暂无等价公开 API,因此保留。
  • pyasn1>=0.6.4click>=8.3.3 安全下限仍有必要;本轮依赖审计未发现已知漏洞。

验证

  • ./scripts/doctor.sh
  • 819 项测试通过,总覆盖率 93.34%
  • pre-commit、mypy、依赖兼容检查、构建和 wheel smoke test 全部通过
  • ./scripts/dependency_health.sh:无已知漏洞
  • 基于上游 v1.1.3 release commit 的定向兼容测试:235 项通过

Closes #513
Relates to #515

@liujuanjuan1984

Copy link
Copy Markdown
Collaborator Author

补充审计已完成:

  • 删除无消费者的 ClientCallContext.state headers/http_kwargs 双写,测试统一断言正式 service_parameters 通道;
  • 上游 v1.1.3 GitHub release commit 的 235 项关键兼容测试通过,但 PyPI 尚未发布 1.1.3,因此正式 pin/lock 更新由 升级 a2a-sdk 至 1.1.3 并审计下游兼容层 #515 继续跟踪;
  • 当前锁定环境 ./scripts/doctor.sh 通过;新提交触发的 default toolchain、Python 3.11、Python 3.12 CI 已全部通过。

@liujuanjuan1984 liujuanjuan1984 changed the title fix(client): send outbound headers through SDK transport fix(client): propagate outbound headers through SDK transports Aug 24, 2026
@liujuanjuan1984
liujuanjuan1984 merged commit a350a80 into main Aug 24, 2026
3 checks passed
@liujuanjuan1984
liujuanjuan1984 deleted the fix/513-outbound-auth-headers branch August 24, 2026 02:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[bug] 出站 A2A 客户端在 JSON-RPC 调用中未发送已配置凭据(a2a-sdk 1.1.2 忽略 ClientCallContext.state 中的请求头)

1 participant