A2A Agent Card 怎么声明代理能力和服务地址
来源:17golang原创
时间:2026-11-11 05:38:46 165浏览 收藏
A2A Agent Card 的写法可以先记住一句话:它要让调用方在真正发送任务前知道“这个代理是谁、能做什么、接受什么输入、从哪个协议地址接收请求”。服务地址不能只写成一个孤立的 endpoint 字符串,而应放在 supportedInterfaces 的接口条目中,与 protocolBinding 和 protocolVersion 一起声明。
本文只讨论 Agent Card 的身份、能力、技能和服务接口,不展开代理内部使用哪个模型。下面的示例域名是文档示例,读者需要替换成自己的真实服务地址。
官方规范:https://a2a-protocol.org/latest/specification/
A2A Agent Card 是“发现与协商入口”,不是把 OpenAPI 字段换一个名字后的普通接口文档。先把能力边界写清楚,再按偏好顺序声明可用协议和 URL,客户端才有稳定的选择依据。
先把 Agent Card 和普通 API 文档分开
普通 API 文档主要回答“某个 HTTP 接口怎样调用”;Agent Card 还要回答“是否值得把任务交给这个代理”。A2A 规范要求服务端提供 Agent Card,它描述服务端的身份、能力、技能和交互要求,客户端据此发现合适的代理并配置交互。
因此,Agent Card 的信息可以按三层理解:
| 层次 | 字段示例 | 要解决的问题 |
|---|---|---|
| 身份 | name、description、version、provider | 这是哪个代理,由谁提供,当前描述版本是什么 |
| 能力 | capabilities、skills | 能否流式返回、是否支持推送、具体能完成哪些任务 |
| 交互 | supportedInterfaces、输入输出模式、安全方案 | 调用方用什么协议、哪个 URL、什么数据格式和认证要求访问 |
一份 Agent Card 至少要表达哪些信息
下面是一份可作为起点的最小扩展示例。它刻意保留了多个接口和一项技能,便于观察“能力描述”和“服务地址”之间的分工。JSON 必须保持有效,因此字段含义放在代码块之后解释。
{
"name": "文档检索代理",
"description": "根据企业知识库检索文档并返回结构化摘要。",
"provider": {
"organization": "Example AI Lab",
"url": "https://example.com/"
},
"version": "1.0.0",
"supportedInterfaces": [
{
"url": "https://agent.example.com/a2a/jsonrpc",
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0"
},
{
"url": "https://agent.example.com/a2a/http",
"protocolBinding": "HTTP+JSON",
"protocolVersion": "1.0"
}
],
"capabilities": {
"streaming": true,
"pushNotifications": false,
"extendedAgentCard": false
},
"defaultInputModes": ["text/plain", "application/json"],
"defaultOutputModes": ["text/plain", "application/json"],
"skills": [
{
"id": "knowledge-search",
"name": "知识库检索",
"description": "按主题检索文档并生成带引用位置的摘要。",
"tags": ["search", "knowledge-base"],
"examples": ["查找报销制度中关于差旅住宿的规定"],
"inputModes": ["text/plain"],
"outputModes": ["text/plain", "application/json"]
}
]
}
这份卡片的验收基线不是“字段越多越好”,而是调用方能否据此完成选择:
name、description、version负责稳定地说明代理身份和用途;描述要写任务结果,不要只写“智能助手”。provider可以补充组织及其公开地址,适合在目录或多租户环境中区分提供方。capabilities描述协议层能力,例如是否支持流式更新、推送通知或扩展 Agent Card;它不等于“模型有多少参数”。defaultInputModes和defaultOutputModes是默认的数据模式。技能还可以用自己的inputModes和outputModes缩小范围。skills面向任务发现,id应稳定,description说明边界,examples帮助调用方判断是否匹配。

服务地址要跟协议绑定一起声明
当前规范使用 supportedInterfaces 表示代理支持的协议组合。每个接口条目至少要把三件事对应起来:调用 URL、传输/协议绑定以及协议版本。这样客户端拿到地址时,不需要猜这个 URL 究竟接收 JSON-RPC、HTTP+JSON 还是其他绑定。
列表本身还有顺序含义。服务端应按偏好顺序列出支持的接口,第一项表示首选接口;客户端在自己支持的选项中优先选择排在前面的条目,并使用该条目的 url。所以不要把不稳定的随机地址放在第一项,也不要让同一个地址在不同条目下声明出互相矛盾的协议。
{
"supportedInterfaces": [
{
"url": "https://agent.example.com/a2a/jsonrpc",
"protocolBinding": "JSONRPC",
"protocolVersion": "1.0"
},
{
"url": "https://agent.example.com/a2a/grpc",
"protocolBinding": "GRPC",
"protocolVersion": "1.0"
},
{
"url": "https://agent.example.com/a2a/http",
"protocolBinding": "HTTP+JSON",
"protocolVersion": "1.0"
}
]
}
这里的三个 URL 只是说明格式。部署时要把它们换成真实的、可由客户端访问的服务地址,并确认每个地址的协议实现和声明一致。若某个接口还声明了 tenant,客户端发送请求时要使用该接口条目给出的租户值;没有声明时则不要凭空补一个租户字段。

客户端怎样选择正确的接口
可以把客户端选择逻辑压缩成四步,重点是“先匹配支持的绑定,再取对应地址”,而不是扫描到第一个 url 就直接调用:
- 解析 Agent Card 中的
supportedInterfaces。 - 从前到后寻找客户端支持的协议绑定和版本。
- 如果有多个可用项,优先选择列表更靠前的条目。
- 把请求发送到选中条目的
url,并遵守该条目的tenant约束。
一个实用的匹配表如下:
| 客户端情况 | 卡片处理 | 结果 |
|---|---|---|
| 支持 JSONRPC | 第一项是 JSONRPC | 使用第一项 URL |
| 只支持 HTTP+JSON | 前项不可用,后项可用 | 跳到 HTTP+JSON 的 URL |
| 一个绑定都不支持 | 没有可选接口 | 停止调用并报告协议不兼容 |
| 多个条目都可用 | 按列表顺序取首个兼容项 | 使用首个兼容接口,不自行排序 |
如果要在客户端记录诊断信息,建议同时记录选中的 protocolBinding、protocolVersion 和 URL。这样当请求失败时,可以区分“没有找到兼容接口”和“已经找到接口但服务端返回错误”,而不是把所有问题都归结为网络不可达。
发现入口、认证和扩展卡怎么配合
公开发现时,规范给出的 well-known 地址是 https://{server_domain}/.well-known/agent-card.json。也可以通过注册表、目录或预配置的 Agent Card 地址发现代理。生产部署不应把私有 Token、临时内网地址或用户个人路径写入公开卡片。
认证要求通过 securitySchemes 和相关安全要求表达。客户端先从卡片发现需要的认证方案,再通过规范之外的凭据获取流程拿到凭据,最后在 A2A 请求使用的 Header 或元数据中发送。Agent Card 声明“需要认证”不代表可以把凭据直接放进卡片。
如果公开卡片只展示有限能力,可以用 capabilities.extendedAgentCard 表示支持扩展卡。客户端完成认证后再请求 /extendedAgentCard 获取额外信息;公开卡片和扩展卡的技能集合应有清晰的权限边界。
卡片更新频率通常低于客户端读取频率,服务端和客户端可以使用标准 HTTP 缓存机制减少重复获取。缓存策略不改变接口选择规则:卡片变化后,客户端仍按新的 supportedInterfaces 顺序重新选择。
写完后的六项检查
- 身份字段能否让调用方知道代理用途、提供方和版本。
- 每个
skill.id是否稳定且与具体任务对应,而不是把所有能力写成一个“万能助手”。 capabilities是否只表达协议能力,没有夸大模型或业务效果。- 每个
supportedInterfaces条目是否同时有正确的url、protocolBinding和protocolVersion。 - 接口顺序是否体现真实偏好,客户端是否能找到至少一个自己支持的绑定。
- 认证、扩展卡和缓存说明是否与公开信息边界一致,没有暴露凭据或把缓存内容当成永久事实。
当这六项都能回答清楚时,Agent Card 就完成了它最重要的工作:让远端调用方在发送第一条任务消息前,知道该找谁、能做什么,以及应该把请求送到哪里。
相关问题
Agent Card 能不能只写一个 endpoint 字段?
不建议按当前规范这样写。服务地址应放在 supportedInterfaces 条目中,并和协议绑定及版本一起表达;单独的 endpoint 无法告诉客户端怎样使用它。
skills 和 capabilities 有什么区别?
capabilities 说明协议交互能力,例如流式或推送;skills 说明代理能完成的任务。前者适合做传输与交互协商,后者适合做任务发现和匹配。
多个服务地址应该怎么排序?
按服务端的偏好顺序列出。客户端从中选择自己支持的第一个接口,不要根据 URL 字母序或临时延迟自行改写服务端的优先级。
-
284 收藏
-
387 收藏
-
328 收藏
-
426 收藏
-
147 收藏
-
468 收藏
-
科技周边 · 人工智能 | 15小时前 | python · 人工智能 · Hugging Face Transformers tokenizer max_length truncation 句子对分词 only_second471 收藏
-
378 收藏
-
367 收藏
-
403 收藏
-
241 收藏
-
123 收藏
-
215 收藏
-
366 收藏
-
科技周边 · 人工智能 | 22小时前 | 人工智能 · Hugging Face Datasets DatasetDict train_test_split stratify_by_column 机器学习数据集410 收藏
-
268 收藏
-
240 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习