ASTER ACP / 08
文本、工具与执行状态的显示
文本片段、推理、工具输出、图片和可选 Run 观测。
分开渲染不同更新
- 01文本增量直接流向界面
TextDelta 形成用户可见消息增量。
turn.rsL26 ↗ - 02参数就绪后建立工具行
ToolStart 只有预告。ToolExecutionStart 才带实际参数。
- 03用原 ID 更新结果
ToolEnd 更新同一工具行。重复预告不会新增一次执行。
代理把 Core 事件适配为 ACP session/update。客户端至少按 sessionId 与工具调用 ID 建立状态,不要把所有更新追加成一段聊天文本。
| 更新 | 界面处理 |
|---|---|
| 用户与模型文本 chunk | 按消息与轮次追加;重试替换时保留身份 |
| 推理相关内容 | 按实际收到的字段展示;不能由空内容推断模型未推理 |
| tool call 与 tool call update | 按 toolCallId 合并标题、参数、状态、内容和位置 |
| 计划更新 | 更新检查清单;计划完成不代替工具证据 |
| 可用命令更新 | 在 new/load 返回会话后安装该会话的命令目录 |
| 模式和模型变化 | 更新当前会话控件,保留未应用或失败的状态 |
| 错误、最终停止 | 记录停止原因,区分成功、取消、预算与故障 |
工具开始时没有输出很正常;工具结束时可能有工具级错误。内容预览被裁剪时展示截断信息,保留 artifact URI。未知内容类型给出受控的降级提示,不应悄悄丢掉附件。
事件分派入口见 handle_event L26 ↗,事件消费与终态结算见 drain_turn L463 ↗。
图片与文档产物
图片与产物消息依赖实际适配器和构建能力。artifact_image 处理受限 SVG/PNG 相关产物,svg-png 开关控制渲染支持。展示时核对媒体类型、大小和来源,不能执行工具输出携带的 HTML 或脚本。
源文件读取、模型图片输入和交付图片是不同路线。当前 ACP prompt 只接受 text;image、audio、resource、resource_link 都明确拒绝,不会静默丢弃。Core 的附件 API 不能直接视为 ACP 已支持的输入协议。初始化的 promptCapabilities 应与实际能力一致,产出 PNG 不等于模型能接受图片输入。
请求可选的 Run 观测
希望区分“客户端正在等待”和“Core Run 已准入”时,在 prompt 的 _meta 中传:
{"asterExecutionObservation":1,"promptId":"prompt-20261026-001"}
代理通过 _aster/execution/observe 发扩展通知,含 protocolVersion、sessionId、promptId、coreSessionId、runId、sequence、kind、turn、status。kind 是 run-opened、model-turn-opened、model-turn-closed、run-closed。
promptId 需为 1–128 字节的受支持标识,允许 ASCII 字母、数字和 ._-。元数据不符合要求时不启用这条观测路线。sequence 用于本次 Observer 内排序;它不是所有会话共用的全局序号。
观测只读,不改变执行权限。run-closed 表示 Run 状态,不直接证明所有业务需求通过独立验收。
启用条件见 Binding::from_meta L13 ↗;事件到 kind 的映射见 Observer::event L99 ↗,终态读取见 Observer::closed L113 ↗。
重放和断线
加载会话时,代理通过标准 session/update 重放可显示的历史文本。本版没有独立的类型化转录通知或分页接口;客户端应区分加载阶段与实时 prompt 阶段,不把历史消息渲染成仍在运行的任务。工具卡片的完整结构不属于当前重放保证。
流关闭却没有终态时显示连接或执行异常,不能显示“完成”。重新连接前核对原 Run 与保存状态,不能自动重新发出可能带写入的完整任务。