关键词:Agent2Agent / A2A / 任务编排 / 云原生 / LLM 上下文管理
1. 背景:为什么需要“Task”而不仅是“Message”?
在纯 Chat 场景里,一轮问答用一条 Message 就能结束。但当我们把 Agent 视为可编排的“微服务” 时,单条消息显然无法承载:
- 长时间运行的批量任务
- 需要多次人机交互(输入、授权)
- 多 Agent 并行协作
- 任务可追踪、可审计、可回滚
A2A(Agent2Agent)协议因此定义了 Task 这一核心概念,它把一次“请求-响应”升级为“请求-多次状态同步-终态”的完整生命周期。
2. Task 的一生:一张图先睹为快
┌────────────┐ ┌──────────────┐
│ Client Msg │───────▶│ Agent Core │
└────────────┘ └──────┬───────┘
│
1. 返回 Task ID
│
┌───────────────────┴───────────────────┐
│ │
▼ ▼
┌────────────────┐ ┌────────────────┐
│ TaskStatus: │ 2. 运行中 … │ TaskStatus: │
│ "working" │◀───流式事件──────────────│ "input-required│
└────────────────┘ └────────────────┘
│ │
│ 3. 用户补填数据 │
│<──────────────────────────────────────────┘
▼
┌────────────────┐
│ TaskStatus: │
│ "completed" │───▶ 4. 生成 Artifacts 供下游引用
└────────────────┘
3. 关键概念拆解
| 概念 | 作用说明 | 最佳实践 |
|---|---|---|
| contextId | 逻辑会话 ID,可跨多个 Task 共享 LLM 上下文 | 长对话/多轮协作务必复用同一 contextId,降低 token 消耗 |
| taskId | 单次任务的唯一标识 | 一旦 Task 到达终态(completed/failed/cancelled/rejected),不可重启,只能新建 Task |
| Artifacts | Task 输出的产物(文件、JSON、图片等) | 命名保持语义化,版本更新时 artifact-name 不变,仅 artifactId 变,方便客户端做“最新版本”追踪 |
| referenceTaskIds | 在新 Message 中引用历史 Task | 做“链式任务”或“refine”场景时必须携带,帮助 Agent 精准定位上下文 |
4. 客户端实战:三步完成“帆船图 → 改红色 → 加海鸥”
Step 1:首任务——生成帆船图
{
"method": "message/send",
"params": {
"message": {
"role": "user",
"parts": [{ "kind": "text", "text": "生成一张海上帆船的图片" }]
}
}
}
Agent 返回:
contextId = ctx-abctaskId = task-boat-123artifactId = sailboat_v1.png
Step 2:精细化——把船改成红色
{
"method": "message/send",
"params": {
"message": {
"role": "user",
"contextId": "ctx-abc",
"referenceTaskIds": ["task-boat-123"],
"parts": [{ "kind": "text", "text": "把帆船涂成红色" }]
}
}
}
新 Task 生成:
taskId = task-boat-red-456- artifact-name 仍为
sailboat.png,但artifactId更新为sailboat_v2.png
Step 3:并行扩展——加一只海鸥
在 ctx-abc 内同时发起第三个 Task,无需等待 Step 2 完成:
"parts": [{ "text": "在天空中加一只飞翔的海鸥" }]
Agent 即可并行渲染,客户端用不同 taskId 独立跟踪。
5. 架构启示:如何设计自己的 A2A Agent
-
无状态 or 有状态?
- 纯 LLM 问答 → 直接回
Message - 需要工具调用/人机交互 → 回
Task
- 纯 LLM 问答 → 直接回
-
contextId 存储策略
- 推荐 Redis + TTL 维护对话上下文
- 每个 contextId 对应一个 LLM session key,减少重复加载
-
Artifacts 版本链
- 内部可用链表结构记录 artifactId 的父子关系
- 对外只暴露最新 artifactId,简化客户端逻辑
-
幂等性保障
- 终态 Task 禁止修改,确保“可重放、可追溯”
- 对相同输入做指纹(hash)去重,防止重复创建 Task
6. 小结
A2A 协议把“消息”升维到“任务”,为云原生时代的 Agent 编排提供了标准生命周期管理。牢记 contextId 管会话、taskId 管任务、artifactId 管产物,就能优雅地实现:
- 多轮人机协作
- 并行任务编排
- 精细化版本追踪
下一篇我们将结合 Kubernetes CRD,展示如何把 A2A Task 映射为 K8s Job,实现弹性伸缩与故障自愈,敬请期待!
深入解析 A2A 协议:Task 全生命周期与实践
1233

被折叠的 条评论
为什么被折叠?



