① 四层协议栈全景
四层互补不竞争,各管一段。记忆口诀:LLM-API 脑和模型 / MCP 脑和手 / A2A 脑和脑 / AG-UI 脑和眼。
L3AG-UI / A2UI展示层:输出怎么到前端(8 种 SSE 事件 + HITL)
L2A2A协作层:Agent 间异步任务委派(Task + Agent Card)
L1MCP工具层:怎么调工具(JSON-RPC 2.0)
L0LLM-API模型层:模型怎么开口要工具(tool_calls)
边界一句话:一次用户请求,先经 AG-UI 进到 Agent,Agent 通过 LLM-API 让模型决策,用 MCP 调工具、用 A2A 委派子 Agent,最终输出再经 AG-UI 渲染回前端。
② 全链路流转(一次「分析 Pod」请求)
从上往下看一次完整请求如何穿过四层。自动播放会依序高亮当前层。
L3AG-UI① 用户「分析 payment-service Pod」→ POST /threads 创建会话 → SSE 连接
↓
L0LLM-API② 模型决策 → 输出 tool_calls: kubectl_get_pods → 框架解析意图
↓
L1MCP③ 通过 MCP 客户端调 kubectl_get_pods 工具 → 返回 Pod 状态 JSON
↓
L2A2A④ 需要深度诊断 → POST /tasks 委派给 K8s 诊断子 Agent → 异步取回报告
↓
L3AG-UI⑤ RUN_FINISHED → 前端渲染诊断卡片给用户
③ L0 + L1:模型开口,框架动手
LLM 只输出 JSON(tool_calls),真正执行的是框架 + 工具层。
L0 LLM-API(模型开口)
llm.chat(messages) →
{ "tool_calls": [{
"name": "kubectl_get_pods",
"arguments": "{\"ns\":\"prod\"}" }] }
模型只是「说想调这个工具」,两轮循环:工具意图 → 执行结果喂回 → 再决策
L1 MCP(框架动手)
- Resources:暴露数据(文档/DB schema)
- Tools:可执行函数(kubectl、API)
- Prompts:可复用提示模板
- JSON-RPC 2.0 + stdio/SSE 传输
④ L2 A2A:Agent 间的委派
MCP 管「怎么调工具」,A2A 管「怎么让另一个 Agent 帮自己做一件事」。
A-->>B: POST /tasks {description, context, artifacts}
B-->>A: 202 {taskId, state: "submitted"}
loop 执行中(异步,不阻塞)
A->>B: GET /tasks/{taskId} → {state:"working", progress:"60%"}
end
A->>B: GET /tasks/{taskId} → {state:"completed", artifacts:[{name:"report.md"}]}
四概念:Agent Card(我是谁,能力发现)→ Task(帮我做件事,异步追踪)→ Message(执行中说什么)→ Artifact(做完了,这是结果)。生产四坑:payload 传引用不传全文、任务绝不同步等待、看 capabilities.streaming 决定推送 vs 轮询、Task 必须带 sessionId 隔离。
⑤ L3 AG-UI:输出到 UI
前端怎么知道 Agent 执行中每一步发生了什么?——SSE 事件流 + REST 控制面。
SSE 事件流(Agent→前端)
RUN_STARTED →
TEXT_MESSAGE(流式)→
TOOL_CALL_START/ARGS/END/RESULT →
AGENT_STATE → CUSTOM →
RUN_FINISHED
8 种标准事件,让前端能渲染「正在调 kubectl → 参数 → 结果」
REST 控制面(前端→Agent)
POST /threads(建会话)
POST /threads/{id}/messages
POST /interrupts/{id}/resume ← HITL
POST /cancel
人工在环(HITL)是 AG-UI 独有——Agent 卡在需确认节点,前端弹审批
协议栈一句话:MCP 是数据面(怎么调工具)、A2A 是控制面(怎么委派)、AG-UI/A2UI 是展示面(怎么连怎么画)——三协议边界清晰、互补不竞争。MCP + A2A 组合 = Agent 网络的操作系统。