A2A AgentSkill:描述智能体能做什么

A2A AgentSkill:描述智能体能做什么

AgentSkill 是 Agent Card 中 skills 数组的一项,描述智能体能做的一件事:名称、说明、标签,以及可选的示例提示、媒体类型和安全要求。在 v1.0 中,skills 是卡片的必填字段。

proto 定义对技能的定位很直接:它"主要是一个描述性概念",即智能体大概率能做好的一组较聚焦的行为。

技能是描述,不是端点

没有任何 A2A 操作用来选择技能。SendMessageRequest 只有 tenant、message、configuration 和 metadata,SendMessageConfiguration 里同样没有技能字段。客户端发送一条普通的 Message ,由智能体决定如何处理。

所以技能是写给卡片读者看的。客户端智能体,或者在注册中心浏览的人,用它判断这个智能体是否适合当前任务,以及该发送哪些媒体类型。

字段

字段必填含义
id是技能的唯一标识
name是人类可读的名称
description是技能的详细说明
tags是描述技能能力的关键词
examples否该技能可处理的示例提示或场景
inputModes否该技能支持的输入媒体类型,覆盖智能体的默认值
outputModes否该技能支持的输出媒体类型,覆盖智能体的默认值
securityRequirements否该技能需要的安全方案

规范规定,标记为必填的数组必须至少包含一个元素(第 5.7 节)。按这条规则,skills 为空的卡片无效,没有 tags 的技能同样无效。

规范中的示例

下面是规范示例 Agent Card(GeoSpatial Route Planner Agent)的第一个技能:

{
  "id": "route-optimizer-traffic",
  "name": "Traffic-Aware Route Optimizer",
  "description": "Calculates the optimal driving route between two or more locations, taking into account real-time traffic conditions, road closures, and user preferences (e.g., avoid tolls, prefer highways).",
  "tags": ["maps", "routing", "navigation", "directions", "traffic"],
  "examples": [
    "Plan a route from '1600 Amphitheatre Parkway, Mountain View, CA' to 'San Francisco International Airport' avoiding tolls.",
    "{\"origin\": {\"lat\": 37.422, \"lng\": -122.084}, \"destination\": {\"lat\": 37.7749, \"lng\": -122.4194}, \"preferences\": [\"avoid_ferries\"]}"
  ],
  "inputModes": ["application/json", "text/plain"],
  "outputModes": ["application/json", "application/vnd.geo+json", "text/html"]
}

examples 是字符串列表。第二条示例是序列化成字符串的 JSON 对象,与 inputModes 中的 application/json 对应:示例是客户端会放进请求里的任何内容,不限于自然语言。

技能级的输入输出模式

卡片上的 defaultInputModes 和 defaultOutputModes 是必填字段,对所有技能生效。技能自己的 inputModes 和 outputModes 会替换这些默认值。示例卡片展示了两个方向:

inputModesoutputModes
卡片默认值application/json、text/plainapplication/json、image/png
route-optimizer-trafficapplication/json、text/plainapplication/json、application/vnd.geo+json、text/html
custom-map-generatorapplication/jsonimage/png、image/jpeg、application/json、text/html

第二个技能把输入收窄到只接受 JSON,第一个技能列出了不在卡片默认值中的输出类型。请如实声明:规范对 ContentTypeNotSupportedError 的描述是,请求中的媒体类型"不被智能体或被调用的具体技能支持"时返回。见 A2A 错误码 。

在请求一侧,客户端还可以通过 SendMessageConfiguration 中的 acceptedOutputModes 说明自己接受哪些返回媒体类型。

技能级的安全要求

技能可以带自己的 securityRequirements,结构与卡片级字段相同:每一项把方案名称(定义在卡片的 securitySchemes 中)映射到 scope 列表。规范的示例卡片没有在技能上设置它。下面的片段沿用同一示例中卡片级的要求,仅用来说明该字段的位置:

{
  "id": "route-optimizer-traffic",
  "securityRequirements": [{ "schemes": { "google": { "list": ["openid"] } } }]
}

方案本身如何声明,见 A2A SecurityScheme 。

从 v0.3 升级?

根据 proto 定义,AgentSkill 的 1 至 7 号字段编号及含义保持不变,只有一个字段变了:

v0.3.0v1.0.1
security(8 号字段),类型 Securitysecurity_requirements(8 号字段),类型 SecurityRequirement,因此 JSON 键为 securityRequirements

消息结构不变(map<string, StringList> schemes),变的只是名称。官方迁移指南没有列出这次重命名,两个版本的 proto 文件可以看到。AgentCard.security(9 号字段)也做了同样的重命名。见 Agent Card Proto 字段编号:v0.3.0 与 v1.0.1 。

相关页面

  • Agent Card :skills 所在的位置,以及 capabilities 和 supportedInterfaces。
  • Part :消息如何承载媒体类型。
  • 数据结构 :Agent Card 各对象的汇总表。

来源:A2A 官方规范:AgentSkill 与 Sample Agent Card ;a2a.proto 的 v1.0.1 与 v0.3.0 版本