A2A Artifact 是什么:产出物字段与流式分块

A2A Artifact 是什么:产出物字段与流式分块

Artifact 是智能体在处理 Task 时生成的具体产出:一份文档、一张图像、一块结构化数据。它是任务真正的交付物,而不是围绕任务的对话。与消息一样,产出物也由 Part 构成。

字段

字段必填说明
artifactId是产出物的唯一标识,在任务内必须唯一
parts是内容,是一组 Part ,至少包含一个 part
name否便于阅读的名称
description否便于阅读的描述
metadata否额外的键值元数据
extensions否出现在本产出物中或由其贡献的扩展 的 URI

产出物存放在 Task 的 artifacts 列表里。为了控制响应体积,ListTasks 默认不返回它们,除非请求把 includeArtifacts 设为 true。

由产出物而非消息承载结果

A2A 的核心交互是:客户端发送消息来启动任务,任务产生一个或多个产出物。规范指出消息不应用来交付任务输出,结果应当以产出物形式返回。消息的用途见 Message 。

下面是一个携带一个文本产出物的已完成任务,取自规范的基础场景:

{
  "id": "task-uuid",
  "contextId": "context-uuid",
  "status": {"state": "TASK_STATE_COMPLETED"},
  "artifacts": [{
    "artifactId": "artifact-uuid",
    "name": "Weather Report",
    "parts": [{"text": "Today will be sunny with a high of 75°F"}]
  }]
}

文件也用同样的结构承载。在文件交换场景中,智能体把图像作为产出物返回,其 part 通过 url 指向内容,完整响应见 Part 页面。

分块流式传输产出物

较长的结果不必等任务结束。使用流式传输时,只要有新的产出物或其新增片段可用,智能体就会发送一个 TaskArtifactUpdateEvent,以 artifactUpdate 形式送达。事件包含这些字段:

字段说明
taskId、contextId产出物所属的任务及其上下文
artifact生成或更新的产出物
append为 true 时,把本次内容追加到之前发送的、同一 ID 的产出物
lastChunk为 true 时,表示这是该产出物的最后一块
metadata关于这次更新的可选元数据

规范的流式示例展示了位于 working 与 completed 状态之间的一次产出物更新。示例是简化的:真实的产出物还必须带 artifactId。

HTTP/1.1 200 OK
Content-Type: text/event-stream

data: {"task": {"id": "task-uuid", "contextId": "context-uuid", "status": {"state": "TASK_STATE_WORKING"}}}

data: {"artifactUpdate": {"taskId": "task-uuid", "contextId": "context-uuid", "artifact": {"parts": [{"text": "# Climate Change Report\n\n"}]}}}

data: {"statusUpdate": {"taskId": "task-uuid", "contextId": "context-uuid", "status": {"state": "TASK_STATE_COMPLETED"}}}

流式传输要求 Agent Card 中有 capabilities.streaming: true。任务的事件流以 Task 开头,任务进入终态时关闭。见流式传输与异步操作 。

细化产出物

已进入终态的任务不能重新打开,所以细化是在同一个 contextId 下启动的新任务,它的输出是新的产出物。在任务的生命周期 的示例中,智能体先生成一张帆船图像。第一个任务的产出物:

{
  "artifactId": "artifact-boat-v1-xyz",
  "name": "sailboat_image.png",
  "description": "A generated image of a sailboat on the ocean.",
  "parts": [
    {
      "filename": "sailboat_image.png",
      "mediaType": "image/png",
      "raw": "base64_encoded_png_data_of_a_sailboat"
    }
  ]
}

客户端要求把船改成红色之后,新任务产生一个 name 相同、artifactId 是新值的产出物:

{
  "artifactId": "artifact-boat-v2-red-pqr",
  "name": "sailboat_image.png",
  "description": "A generated image of a red sailboat on the ocean.",
  "parts": [
    {
      "filename": "sailboat_image.png",
      "mediaType": "image/png",
      "raw": "base64_encoded_png_data_of_a_RED_sailboat"
    }
  ]
}

跟踪哪个产出物替代了哪个,是客户端的事,不属于 A2A 规范。官方的建议是:提供服务的智能体在生成细化版本时沿用一致的产出物 name;客户端自己保存版本历史,并明确指出要细化的那个产出物,最好是以自己的视角看到的最新版本。

相关页面

  • Task :产出物存放的位置,以及任务如何结束。
  • Part :产出物包含什么。
  • Task 运行时指南 :产出物如何随事件流到达,以及怎样检查事件顺序、从断流中恢复。
  • 数据结构 :完整字段参考。

来源:A2A 官方规范:Artifact、Streaming Events 与 Common Workflows 与 Life of a Task