Qwen Code 统一工具输出渲染:从双模式手动切换走向工具类别驱动的智能折叠
Qwen Code 统一工具输出渲染从双模式手动切换走向工具类别驱动的智能折叠【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code导读本文深入解析 Qwen Code开源终端 AI 编程代理TUI 中工具调用结果渲染机制的演进旧版依赖用户在 CompactCtrlO与 Normal 两种模式间手动切换新版则彻底废弃模式切换改为由工具类别自动决定渲染形态——信息收集类工具读文件/搜索/列目录折叠为一行语义摘要变更执行类工具编辑/写文件/命令/子代理始终完整展示。读完本文你将掌握buildToolSummary语义摘要的生成规则、八类工具的划分与动词模板、七条渲染规则的底层逻辑以及CompactToolGroupDisplay、ToolGroupMessage、ToolMessage等核心组件各自的职责边界。背景双模式切换的痛点在统一渲染落地之前TUI 对工具结果有两种互斥的渲染模式Compact 模式CtrlO将已完成工具结果折叠为一行摘要Normal 模式将完整工具结果内联展示但会带来大量纵向噪音文件内容、搜索结果等整屏刷屏。用户必须根据当下需求手动来回切换。而大多数时候已完成工具的结果文件内容、搜索结果等对对话流的推进毫无增量价值——它们只是模型读取过的中间素材不是用户关心的产出。相关背景与用户视角的说明可参考姊妹文档 tool-use-summary 设计文档 与用户文档 Tool-Use Summaries。核心原则一种统一模式由工具类别而非用户开关决定新设计的核心原则只有一条一种统一模式工具渲染形态由工具类别决定而非用户手动切换的模式。信息收集工具read/search/list折叠为摘要变更工具edit/write/command/agent始终逐条渲染完整结果。这条原则在源码层面有直接落点ToolGroupMessage.tsx中通过isCollapsibleTool()对工具批次做类型分区type-based partition取代了旧版的showCompact开关同时mergeCompactToolGroups.ts中compactToggleHasVisualEffect不再对tool_group生效——因为 compact 模式对工具渲染已经没有任何影响了。也就是说紧凑模式CtrlO在统一渲染落地后仅用于展开/收起详情不再改变工具结果的呈现形态。语义摘要buildToolSummary告别ReadFile x 3的机械计数统一渲染不再展示原始的ReadFile x 3这类工具名 × 数量机械文本而是生成人类可读的、基于计数的语义摘要。文档给出的输出形态如下场景输出示例单个工具Read 1 file/Ran 1 command同类多个工具Read 3 files混合类型Ran 1 command, read 3 files, edited 2 files执行中ActiveReading 1 file现在进行时已完成CompletedRead 1 file过去时源码实现比文档表格更精细的分支逻辑buildToolSummary()实现在 packages/cli/src/ui/components/messages/CompactToolGroupDisplay.tsx其实际分支比设计表格更细致单个工具有可用描述Read a.ts—— 动词 具体描述单个工具无可用描述Read 1 file—— 回退到本地化计数短语多工具且 ≤ 3 个全部有描述Read a.ts, b.ts, c.ts—— 全部内联展示多工具且 ≤ 3 个部分无描述Read 3 files—— 计数短语超过 3 个工具Read a.ts, b.ts, ... and 3 more—— 前 2 个描述 and N moreDESCRIPTION_INLINE_LIMIT 3DESCRIPTION_PREVIEW_COUNT 2混合类别按CATEGORY_ORDER顺序拼接如Read 2 files, ran npm test。两个值得注意的实现细节首字母小写处理从第二段开始每段首字母自动小写Read 3 files, edited 2 files以保证混排可读性该逻辑只作用于首字符对中文等无大小写脚本是空操作。safeDescription()清洗执行摘要前会剥离 ANSI 转义序列与 C0 控制字符并拒绝 JSON 形状的错误回退——工具报错时useReactToolScheduler会把JSON.stringify(request.args)写入描述产生{...}形文本此时摘要回退到计数格式避免把参数 blob 当摘要展示见 safeDescription。工具类别划分八类工具、动词模板与折叠资格文档定义了 8 个工具类别每类都有展示名、过去式动词、进行式动词和是否可折叠类别展示名过去式动词进行式动词可折叠readReadFile, Read File(s)ReadReadingYeseditEdit, NotebookEditEditedEditingNowriteWriteFileWroteWritingNosearchGrep, GlobSearchedSearchingYeslistListFiles, Read DirectoryListedListingYescommandShellRanRunningNoagentAgent, Workflow, SendMessageRanRunningNoother其余全部UsedUsingNo源码中的类别映射与模板TOOL_NAME_TO_CATEGORYCompactToolGroupDisplay.tsx将具体工具名映射到类别包含迁移期遗留名SearchFiles/FindFiles→ searchReadFolder→ listTask→ agent 等未命中的工具一律落入other。CATEGORY_TEMPLATES第 153-220 行则为每类提供one/many两套本地化计数短语例如 read 类为Read {{count}} file(s)、search 类为Searched {{count}} pattern(s)、agent 类为Ran {{count}} agent(s)。注意文档表格中的类别被COLLAPSIBLE_CATEGORIES集合第 233-237 行精确对应为read/search/list三类——这正是isCollapsibleTool()判定信息收集 vs 变更执行的依据第 254-256 行。渲染规则七条细则及其源码印证1. 类型分区工具按isCollapsibleTool()拆分为两组可折叠工具read/search/list渲染为CompactToolGroupDisplay摘要行不可折叠工具edit/write/command/agent/other通过ToolMessage逐条渲染。实现在 ToolGroupMessage.tsxcollapsibleTools与nonCollapsibleTools的过滤条件还包括取消状态与内联图片输出——被取消的工具和携带内联图片输出的工具强制逐条渲染。2. 纯内存组专用渲染路径当整批工具全部为内存操作读/写 auto-memory且全部成功!hasErrorTool every status Success时走专用徽章渲染Recalled N memories/Wrote N memories第 436-465 行不进入可折叠/不可折叠分区。注意在fullDetailCtrlO 全文详情或ui.showToolCallArgs开启时该路径被跳过让每条内存操作以完整ToolMessage呈现。3. 结果折叠的严格条件只有Success状态的可折叠工具的文本/ANSI 输出才会被折叠shouldCollapseResult实现在 ToolMessage.tsx!forceShowResult status Success isCollapsibleTool(name)且仅限 string/ansi 两类结果渲染器。MCP 工具、WebFetch 等不可折叠工具永远展示结果——因为它们的输出本身就是答案取消的工具保留部分输出可见。4. 工具名恒为粗体无论状态如何工具名都以粗体渲染保证CompactToolGroupDisplay与ToolMessage两条路径样式一致Text bold见 第 488 行。5. 强制展开条件当组内出现以下任一情况全部工具逐条渲染不做分区且仅对触发工具报错、待确认、终端子代理强制显示结果成功兄弟工具保持正常折叠行为forceExpandAll fullDetail || hasRenderableToolCallArgs || hasConfirmingTool || hasSubagentPendingConfirmation || hasErrorTool || isEmbeddedShellFocused || isUserInitiated || hasTerminalSubagent见 ToolGroupMessage.tsx。每个ToolMessage的forceShowResult也按同样的触发语义逐工具下发第 630-637 行其中终端子代理completed/failed/cancelled强制展示是为了让SubagentScrollbackSummary单行滚动摘要落地格式✔ researcher: investigate import order · 5 tools · 12s · 2.4k tokens。6.tool_use_summary无条件渲染LLM 生成的语义标签tool_use_summary条目与CompactToolGroupDisplay的机械计数各司其职、并行存在——前者提供语义上下文后者提供工具数量。在HistoryItemDisplay.tsx中tool_use_summary渲染为一行暗色● summaryHistoryItemDisplay.tsx不再受summaryAbsorbed门控。7. 内存徽章内存徽章Recalled N memories, Wrote N memories在全可折叠路径和混合路径中都会渲染只要非内存组中存在内存操作第 506-526 行。关键文件改动一览文件改动内容源码位置CompactToolGroupDisplay.tsx新增buildToolSummary()计数格式、isCollapsibleTool()移除边框样式packages/cli/src/ui/components/messages/CompactToolGroupDisplay.tsxToolMessage.tsxshouldCollapseResult以isCollapsibleTool()Success为门槛移除isDimpackages/cli/src/ui/components/messages/ToolMessage.tsxToolGroupMessage.tsx类型分区取代showCompactforceShowResult简化为forceExpandAll高度预算计入可折叠摘要行packages/cli/src/ui/components/messages/ToolGroupMessage.tsxMainContent.tsx移除mergedHistory别名、absorbedCallIds、summaryByCallId与跨组合并相关测试见 MainContent.test.tsxHistoryItemDisplay.tsxtool_use_summary无条件渲染移除summaryAbsorbed门控HistoryItemDisplay.tsxmergeCompactToolGroups.tscompactToggleHasVisualEffect不再对tool_group触发compact 模式对工具渲染无影响相关行为在 ToolGroupMessage.test.tsx 有覆盖高度预算的联动细节统一渲染后摘要行本身也占用纵向空间。ToolGroupMessage在给每个不可折叠工具分配高度预算时会先减去estimateCompactToolGroupHeight()对摘要文本做wrapAnsi换行估算见 第 448-471 行、内存徽章行1 行与ui.showToolCallArgs的 args 行预算剩余高度再按有结果工具数均分第 543-593 行。这保证了混排场景下摘要行不会挤压命令输出的可视高度。备选方案与取舍设计文档明确记录了三个被否决的备选方案理解它们有助于把握统一渲染的设计边界保留双模式并改进摘要——被否决给用户造成不必要的认知负担按工具逐条摘要Gemini CLI 风格——每个工具配一个摘要箭头——被否决面对大批量工具批次仍然过于冗长分阶段灰度——被否决用户偏好一次性完成单一实现。总结Qwen Code 的统一工具输出渲染是一次少即是多的交互收敛用户不再需要理解并切换两种渲染模式渲染器按工具类别自动决策——文件内容、搜索命中这类一次性素材折叠为语义摘要命令、编辑、子代理这类输出即答案的工具始终完整呈现。其设计精髓在于把什么该折叠从用户的临时判断固化为isCollapsibleTool()的类型判定 七条渲染规则的确定性逻辑从而在信息密度与对话流可读性之间取得稳定平衡。若需进一步了解语义标签tool_use_summary从快速模型生成到 UI 落地的完整链路可继续阅读 tool-use-summary-design.md。【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →