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