共享 UI 的渐进迁移
用事件顺序、渲染 helper 和语义一致性测试替换宿主自建投影。
This page has not been translated into English yet. The original Chinese version is shown below.
官方 v2 迁移指南描述在既有 UI 原语上的增量扩展。升级可以逐项进行;它不要求 native TUI、渠道或 IDE 在同一批变更中全部切换传输和渲染。
建议迁移顺序
- 将 createdAt 排序改为 selectTranscriptBlocksOrderedByEventId。
- 将时间显示改为 formatBlockTimestamp,优先使用服务器时间。
- 按需显示 session、workspace 和 auth 旁路事件,不把它们全部插入聊天正文。
- 采用共享 Markdown、HTML 或纯文本投影,减少宿主之间的语义差异。
- 运行 adapter conformance suite,再增加专用工具卡片或子智能体嵌套。
createdAt 作为 clientReceivedAt 的兼容别名保留;可选新增字段不要求旧消费者立即使用。兼容承诺针对该 UI 层的增量变化,不能代替 daemon 的 capability 检查。
语义一致性测试
import { runAdapterConformanceSuite } from '@qwen-code/sdk/daemon';
const result = runAdapterConformanceSuite({
reduce: (events) => myReducer(events),
renderToText: (state) => myRenderer(state),
});
if (result.failed.length > 0) {
throw new Error('Daemon UI projection differs from the reference corpus');
}myReducer 和 myRenderer 是宿主提供的实现。测试比较 expectedContains 和 expectedAbsent 等语义内容,适用于 ANSI、HTML、Markdown 或 JSX 投影,不要求像素一致。
用例涵盖聊天、工具生命周期、文件编辑、MCP、审批、预算警告、取消、损坏负载处理、认证、命令更新和子智能体嵌套。旧迁移页写有固定用例数量;当前参考入口要求从 DAEMON_UI_CONFORMANCE_FIXTURES.length 读取,不应把旧数字写死在检查中。
新增显示的采用条件
使用 provenance 选择工具图标,用 errorKind 选择错误引导,用 preview.kind 选择工具卡片;尚未识别的类型保留通用回退。
服务器时间、错误分类等字段可能依赖 daemon 端发出,SDK 提供类型并不保证任意旧服务都有值。共享状态层自动处理取消传播,但宿主仍要把正确的完成与取消事件送进 reducer。
升级后复核
检查 SSE 重连后顺序、自己的用户消息是否重复、审批是否消失、取消后工具是否停止转圈、未知事件是否污染聊天,以及重同步是否正确恢复。
这些 UI 检查不验证真实模型质量、权限后端或跨工作区访问边界。传输侧继续遵循DaemonClient和适配器边界的约束。