
DeepSeek Harness TUI 助手消息时序改进标签置顶、计时置底的渲染决策解析【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness导读本文基于 DeepSeek Harness 仓库中的 Agent Note 2026-07-27-assistant-timing-header-trailing.mdStatus: implemented2026-08-04 归档解析 TUI终端用户界面中助手消息计时行位置这一交互渲染问题的完整决策过程为什么把步骤计时从消息顶部移到消息末尾、AssistantMessageComponent与StreamingAssistantComponent的职责如何拆分、两个备选方案被否决的原因以及快照测试套件如何固定新布局。读完本文你将掌握这类元数据行放置位置设计问题的分析方法以及用快照测试 独立断言来锁定 TUI 渲染布局的工程做法。问题背景计时行放在消息顶部带来了什么TUI 的助手消息此前以一行表头开头把Assistant标签和步骤计时串拼在一起Assistant · Model wait 0.0s · Completed …这种把说话人标签与耗时数据混排在同一行的设计存在两个问题计时远离它描述的对象耗时数据出现在正文之前而它度量的其实是随后才展开的回答reasoning 与正文。读者在阅读回答时计时行已经滑出视线。完成的回答首行被元数据行压住一旦该步骤结束settled计时行追加· Completed …后缀整条回复的第一行变成了一个读者会略过的元数据行正文反而往下被挤。决策标签与计时拆分计时作为末行渲染决策的核心一句话是把标签与计时拆开计时作为消息的末行渲染Split the label from the timing; render the timing as the messages trailing line。具体实现上见英文原文 Agent Note 的 Decision 一节AssistantMessageComponent位于packages/ui/tui/src/index.ts现在把加粗的Assistant标签作为首行渲染暗色dim的计时串仍由StreamingAssistantComponent.rebuild()组装为header——settled 时包含· Completed …后缀——但改为作为最后一个子节点追加在 reasoning 与正文之后。需要强调的行为不变量计时的内容、零值桶的隐藏逻辑bucket-hiding以及完成时间的行为均保持不变变动的只有位置——从消息顶部移到底部。这一只动位置、不动语义的约束使该改动成为一次低风险的渲染层重构计时数据的计算链路各阶段耗时分桶、零值桶隐藏完全复用只是最终的落点不同。改造后每条助手消息的阅读顺序为Assistant ← 加粗标签首行标识说话人 reasoning … ← 推理内容若有 回答正文 … ← 回答正文 Model wait 0.0s · Completed… ← 暗色计时行末行备选方案及否决理由Agent Note 记录了两个被否决的备选方案其推理对处理类似的元数据行放哪问题很有参考价值备选 1把整行表头含标签都移到末尾。否决理由——Assistant标签的作用是告诉读者是谁在说话与You标签一样应当置顶起到方向定位orientation作用只有计时这类纯元数据才受益于置底。标签与计时是两类不同性质的信息不应被同一行的排版绑定。备选 2计时仍内联但作为标签下方的第二行置顶。否决理由——这仍然把耗时数据与已完成的回答分离并且在提示prompt与回复之间保留了两行元数据没有解决首行被元数据压住的原始痛点。两条否决理由共同指向一个设计原则说话人标识服务于谁在说应靠近对话起始耗时元数据服务于这段回答花了多久应紧贴被度量的回答本体。测试验证快照套件与独立断言这次改动的验证策略包含两个层面对应 Agent Note 的 Consequences 一节无密钥keylessTUI 快照套件整体刷新在每个 fixture 中固定pin新的布局。由于该改动是纯渲染层的位置调整所有既有 fixture 的视觉输出都会变化因此采用快照刷新snapshot refresh而非逐个改写期望值新布局在所有 fixture 中被统一固定。tui.spec.ts中四处断言改写原先匹配旧内联串Assistant · Model wait …的四处断言因标签与计时不再连续渲染现改为分别断言标签与计时两个部分。这是该测试改动的本质——旧断言依赖的是两者相邻这一已被打破的渲染前提因此必须拆成独立断言而不能简单替换字符串。值得注意的是这套无密钥快照能力意味着渲染布局可以被离线回归验证不需要真实模型凭据即可固定 TUI 的视觉输出——这正是 DeepSeek Harness 中大量 TUI 相关改动见下文关联修复能够快速验证的基础。关联上下文计时行位置问题的两步演进本决策并非孤立存在。同日2026-07-27仓库中还归档了一条 bug-fix 笔记 2026-07-27-tui-step-timing-trails-tool-cards.md它把计时行的位置问题往前推了一步在计时作为助手消息末行本文决策落地后当某一步触发 tool call 时tool card工具卡片会在助手消息之后追加到聊天区导致计时行被搁在 tool card 上方——即落在该步骤真正的最后一条输出之前位置仍然错误该 bug-fix 的解决方案是把计时摘要从AssistantMessageComponent的子节点中彻底移出成为独立的StepTimingComponent由StreamingAssistantComponent持有并以timing暴露渲染器将其作为紧随助手消息之后的同级节点挂到聊天区每当步骤内追加一张 tool cardtrailStreamingTiming()就把该页脚移回聊天区末尾使其始终跟在该步骤的最后一条消息之后并在step/end时就地定稿该修复依赖一个精确的事件顺序步骤内循环先追加tool/call与tool/result再追加step/end因此页脚是在streaming仍被设置时重新定位、随后在步骤结束时冻结的。从两条笔记的演进可以看出清晰的迭代轨迹先解决计时与回答分离位置从顶部移到底部再解决计时与后续 tool 输出分离从消息子节点升级为聊天区同级节点并动态追迹末尾。两者共同确立了计时摘要永远收束一个步骤、紧贴该步骤最后一条输出的不变量。适用前提与局限本文描述的实现位于 TUI 客户端的packages/ui/tui/src/index.ts即AssistantMessageComponent/StreamingAssistantComponentAgent Note 状态为implemented并已于 2026-08-04 归档。从当前仓库结构看TUI 相关实现代码已不在上述路径可见相关记录以.agents/notes/archived/下的 Agent Note 为准引用时建议以英文原文 2026-07-27-assistant-timing-header-trailing.md 为事实依据。该决策只改变渲染位置不改变计时语义计时内容、零值桶隐藏与完成时间行为在两个阶段均未变化因此不涉及任何配置项或 API 变更。阅读顺序标签 → reasoning → 回答 → 计时是本次改动固定下来的最终阅读契约tui.spec.ts中的四处独立断言与无密钥快照套件是后续维护该契约的主要回归手段。小结这条 Agent Note 展示了一个小而完整的交互工程决策样本以信息与其描述对象的空间邻近性为准则把说话人标签Assistant与耗时元数据Model wait … · Completed …解耦——标签置顶保持对话方向感计时置底紧贴被度量的回答测试上则用整体快照刷新加四处独立断言的改写把新布局在所有 fixture 中固定下来。配合同日的 timing 跟随 tool card 修复形成了 TUI 计时行位置的完整演进记录。【免费下载链接】deepseek-harnessDeepSeek Harness: Everything is a Plugin.项目地址: https://gitcode.com/gh_mirrors/de/deepseek-harness创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考