Task (任务)
Task 是 A2A 协议中的一个核心概念,它代表一个有状态的实体,允许客户端与远程代理协作以达成特定的结果并生成相应的输出(工件)。
任务的生命周期与交互
- 创建: 任务总是由客户端创建。
- 状态管理: 任务的状态由远程代理(Server)决定和维护。
- 会话关联: 多个任务可以通过可选的
sessionId
归属于同一个会话,方便管理相关的交互。 - 代理行为: 收到任务请求后,代理可以采取多种行动:
- 立即满足请求
- 安排稍后执行的工作
- 拒绝请求
- 协商不同的执行方式
- 向客户端索要更多信息
- 委派给其他代理或系统
- 持续交互: 即使任务目标初步达成,客户端仍可在同一任务上下文中请求更多信息或进行修改(例如:“画一只兔子”,然后"把它画成红色")。
- 信息传递: 任务不仅用于传递最终结果(工件)和交互消息(思考、指令等),还维护着任务的状态及其可选的历史记录(状态变化和消息记录)。这对于支持多轮对话式的 AI 交互至关重要。
任务状态 (TaskState)
任务具有明确定义的状态,表示其在生命周期中所处的阶段:
submitted
: 任务已提交。working
: 任务正在处理中。input-required
: 任务需要客户端提供额外输入。completed
: 任务已成功完成。canceled
: 任务已被取消。failed
: 任务执行失败。unknown
: 任务状态未知。
任务相关接口
以下是与任务相关的关键接口定义(示意性):
// 任务主体
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 {
// ... 配置细节
}