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 {
  // ... 配置细节
}