数据截至 (上游 commit 788fdeda3adf)
内容块、工具调用状态机与权限
ACP 的设计哲学里有一条是 UX-first(
architecture.mdx:13):协议要让编辑器能清晰渲染 agent 的意图——正在说什么、在调什么工具、改了哪个文件、要不要授权。本章就是这套「可渲染的语义」。
1. ContentBlock —— 一切可显示内容的统一载荷
它要解决的小问题。 prompt 里要带文本、图片、引用的文件;agent 的输出也是文本、图片、资源。如果各处各定义一套,就乱了。
思路。 定义一个 ContentBlock 枚举,prompt、流式输出、工具结果全都复用它(content.rs:25-31)。而且它刻意兼容 MCP 的 JSON 表示——这样 agent 能把 MCP 工具的输出原样转发,不用再转换一层(content.rs:30-31、introduction.mdx:37)。
五种内容块(content.rs:38):
| 变体 | 是什么 | 备注 |
|---|---|---|
Text | 纯文本或 Markdown | 所有 agent 必须支持;client 应按 Markdown 渲染(content.rs:39-42) |
ResourceLink | 指向 agent 可访问的资源的引用 | 所有 agent 必须支持 |
Image | 图片 | 在 prompt 中需 image 能力 |
Audio | 音频 | 在 prompt 中需 audio 能力 |
Resource | 直接内嵌完整资源内容 | 需 embeddedContext 能力;优先用它,省一次往返(content.rs:56-60) |
用 tag = "type" 做区分(content.rs:35),线缆上长这样:{ "type": "text", "text": "..." }。
2. SessionUpdate —— agent 往 UI 推的所有「实时进度」种类
回合进行中,agent 发的每条 sessionUpdate 通知里包一个 SessionUpdate(client.rs:99),用 sessionUpdate 字段区分类型。完整种类:
变体(线缆 sessionUpdate 值) | 含义 |
|---|---|
user_message_chunk | 用户消息的分片(回放/回显) |
agent_message_chunk | agent 回复的分片(主要的「正文流」) |
agent_thought_chunk | agent 内部思考的分片(可单独渲染) |
tool_call | 新工具调用开始 |
tool_call_update | 工具调用状态/结果更新 |
plan | agent 的执行计划(见 §5) |
available_commands_update | 可用命令变化 |
current_mode_update | 当前模式变化 |
config_option_update | 会话配置项更新 |
session_info_update | 会话元信息(标题、时间戳)更新 |
usage_update | 上下文窗口占用与花费更新 |
注意「思考」和「回复」是分开的变体——这样编辑器能把 agent 的内心独白折叠/灰显,和正式回复区分开。这就是 UX-first 的体现。