a2a

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) 协议中,交互既可以是简单的无状态请求,也可以是复杂、长时间运行的流程。当服务端智能体收到客户端消息时,通常会以两种基本方式响应:

  • 无状态 Message:立即完成、无需跟踪状态的交互。

  • 有状态 Task:需要跟踪进度与状态的工作,可能分多步执行、需要补充输入,并在过程中产生工件(Artifacts)。

首次交互时,服务端会生成标识contextId,用于把一组相关的 Task 和 Message 组织在一起(如果创建任务,也会同时有 taskId)。

有的智能体总是返回 Message;有的总是返回 Task(即便是简单回答也会建一个已完成任务);也有 混合型:先用 Message 协商范围,再创建 Task 执行。

如何发现agent

三类常见发现策略:

众所周知路径(well-known)

  • 常见地址:https://{agent-domain}/.well-known/agent-card.json

  • 适合公开或域内统一管理的发现模式。

策展注册表(目录/市场)

  • 由中心目录统一索引 AgentCard。

  • 适合企业治理、权限过滤、按能力检索。

  • A2A 当前不强制统一注册表 API。

私有配置(直连模式)

  • 通过内部配置、密钥系统或私有 API 提供卡片地址/内容。

  • 固定拓扑简单高效,但动态扩展能力相对弱。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计