A2A
核心概念
Agent Skills
定义agent技能,能做什么。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
interface AgentSkill {
// 技能的唯一标识符
id: string;
name: string;
description: string;
// 分类和发现的关键词
tags: string[];
//示例提示或用例
examples: string[];
// 支持的输入和输出媒体类型,如 "text/plain", "application/json"
inputModes: string[];
outputModes: string[];
}
|
Agent Card
定义agent是谁以及如何访问它,通常由 A2A 服务器提供
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
interface AgentCard {
name: string;
description: string;
// 可访问 A2A 服务的端点
url: string;
version: string;
// 指定支持的 A2A 功能,如流式输出streaming、消息推送pushNotifications
capabilities: {
streaming: boolean;
pushNotifications: boolean;
};
//AgentSkill 对象列表
skills: Array<{}>;
// agent默认媒体类型,如 "text/plain", "application/json"
defaultInputModes: string[];
defaultOutputModes: string[];
}
|
Message
Message 是 A2A 协议中用于在客户端和agent之间传递非工件 (non-Artifact) 内容的基本通信单元。承载了交互过程中的各种信息,包括:
-
用户输入: 所有来自客户端的请求、指令或上下文信息都以消息的形式发送。
-
代理思考: 代理在处理任务时的中间步骤、思考过程或解释。
-
状态更新: 代理传达任务状态变化的信息。
-
指令: 代理向客户端发出的请求或指令(例如,请求更多信息)。
-
错误信息: 传递交互过程中发生的错误。
-
元数据: 附带的额外信息。
1
2
3
4
5
|
interface Message {
role: 'user' | 'agent'; // 消息发送者的角色
parts: Part[]; // 消息包含的部分数组
metadata?: Record<string, any>; // 扩展元数据
}
|
Part
Part 是 A2A 协议中构成 Message 或 Artifact 的原子内容单元。它允许将不同类型的数据组合在单个消息或工件中进行交换。
每个 Part 包含一段具体的内容。每个 Part 都明确其内容类型 (type),通常使用 MIME 类型(如 text/plain, image/png, application/json)或其他预定义的类型。通过组合不同的 Part,Message 和 Artifact 可以灵活地表示复杂的信息结构。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
// 示例结构 (具体定义可能不同)
interface TextPart {
type: 'text' | 'text/plain'; // 或其他文本相关 MIME 类型
text: string;
}
interface FilePart {
type: 'file' | string; // 例如 "image/jpeg", "application/pdf"
uri?: string; // 指向文件的 URI
data?: string; // Base64 编码的文件内容
filename?: string;
}
interface JsonPart {
type: 'json' | 'application/json';
json: any; // 实际的 JSON 对象或数组
}
|
Agent Executor
agent执行者,负责处理A2A agent请求和生成响应/事件的核心逻辑
Task
任务代表一个有状态的实体,允许客户端与服务端协作以达成特定的结果并生成相应的输出(工件)。任务由客户端创建,任务的状态由服务端决定和维护。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
// 任务主体
interface Task {
id: string; // 任务的唯一标识符
sessionId: string; // 客户端生成的会话 ID
status: TaskStatus; // 任务当前状态
history?: Message[]; // 消息历史记录
artifacts?: Artifact[]; // 代理创建的工件集合
metadata?: Record<string, any>; // 扩展元数据
}
// 任务状态及附带消息
interface TaskStatus {
state: TaskState;
message?: Message; // 向客户端提供的额外状态更新
timestamp?: string; // ISO 日期时间值
}
// 任务状态枚举
type TaskState =
| 'submitted'
| 'working'
| 'input-required'
| 'completed'
| 'canceled'
| 'failed'
| 'unknown';
// 用于创建、继续或重启任务的客户端参数
interface TaskSendParams {
id: string; // 任务 ID
sessionId?: string; // 会话 ID (如果未设置,服务器会为新任务创建)
message: Message; // 发送的消息
historyLength?: number; // 要检索的最近消息数量
pushNotification?: PushNotificationConfig; // 断开连接时服务器发送通知的配置
metadata?: Record<string, any>; // 扩展元数据
}
// 服务器在 sendSubscribe 或 subscribe 请求期间发送的状态更新事件
interface TaskStatusUpdateEvent {
id: string;
status: TaskStatus;
final: boolean; // 指示事件流是否结束
metadata?: Record<string, any>;
}
// 服务器在 sendSubscribe 或 subscribe 请求期间发送的工件更新事件
interface TaskArtifactUpdateEvent {
id: string;
artifact: Artifact;
metadata?: Record<string, any>;
}
// 推送通知配置 (具体结构未在源文档中详细说明)
interface PushNotificationConfig {
// ... 配置细节
}
|
Artifact
Artifact (工件) 用于表示 Agent 作为 Task 最终结果生成的输出。一个任务可以生成多个工件,一旦生成,工件的内容通常是不可变的。
1
2
3
4
5
6
7
8
9
|
interface Artifact {
name?: string; // 工件的可选名称
description?: string; // 工件的可选描述
parts: Part[]; // 工件包含的部分数组
metadata?: Record<string, any>; // 扩展元数据
index: number; // 工件在其所属任务中的索引
append?: boolean; // 是否允许追加 Part (用于流式传输)
lastChunk?: boolean; // 是否是流式传输的最后一块
}
|
Message和Task
在 Agent2Agent (A2A) 协议中,交互既可以是简单的无状态请求,也可以是复杂、长时间运行的流程。当服务端智能体收到客户端消息时,通常会以两种基本方式响应:
首次交互时,服务端会生成标识contextId,用于把一组相关的 Task 和 Message 组织在一起(如果创建任务,也会同时有 taskId)。
有的智能体总是返回 Message;有的总是返回 Task(即便是简单回答也会建一个已完成任务);也有 混合型:先用 Message 协商范围,再创建 Task 执行。
如何发现agent
三类常见发现策略:
众所周知路径(well-known)
策展注册表(目录/市场)
-
由中心目录统一索引 AgentCard。
-
适合企业治理、权限过滤、按能力检索。
-
A2A 当前不强制统一注册表 API。
私有配置(直连模式)