尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Qwen Code Tool-Use Summary 深度解析:用快模型为并行工具批次生成 Git 提交式摘要

Qwen Code Tool-Use Summary 深度解析:用快模型为并行工具批次生成 Git 提交式摘要 Qwen Code Tool-Use Summary 深度解析用快模型为并行工具批次生成 Git 提交式摘要【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code本文基于仓库设计文档 docs/design/tool-use-summary/tool-use-summary-design.md 与用户手册 docs/users/features/tool-use-summaries.md并结合packages/core与packages/cli的真实实现展开。当模型一次并行发起多个Read、Grep、Bash调用时Qwen Code 会在批次结束后异步调用配置的快模型返回一条 git-commit-subject 风格的短标签如Read 4 text files、Fixed NPE in UserService用于替代默认的Tool × N头部。读完本文你将掌握该功能的触发链路、三种开关语义、输出清洗规则、Staticappend-only 约束下的渲染设计以及成本与隐私边界。1. 功能概览一条标签解决并行工具看不懂问题Qwen Code 是一个运行在终端里的开源 AI 编程 Agent。当主模型在一个回合内扇出多个并行工具调用例如同时read_file四个文件、再跑一轮grep时用户面对折叠后的Tool × N分组往往需要逐个展开才能知道这批调用到底做了什么。Tool-Use Summary 正是为此设计的 UX 增强每个工具批次完成后Qwen Code 向配置的快模型fastModel发起一次极短的调用返回一条 git-commit-subject 风格的过去式标签例如Searched in auth/Fixed NPE in UserServiceCreated signup endpointRead config.jsonRan failing tests该调用是 fire-and-forget即发即忘的与下一轮主模型的 API 流式输出并行执行约 1 秒的延迟被主模型 5–30 秒的流式响应完全掩盖用户感知不到任何额外等待。设计文档在 Executive Summary 中用一张对比表系统梳理了与 Claude Code 同名能力的差异下表摘录了最关键的几行维度Claude CodeQwen Code触发点query.ts— 工具批次最终化之后use-llm-stream.ts→handleCompletedTools同一生命周期点生成模型HaikuqueryHaiku配置的fastModel经runSideQuery子代理行为!toolUseContext.agentId— 仅主会话隐式排除 — 子代理走agents/runtime/输出形态SDK 流中的ToolUseSummaryMessageUI 历史中的HistoryItemToolUseSummary 导出工厂函数供未来 SDK 使用开关CLAUDE_CODE_EMIT_TOOL_USE_SUMMARIES默认offexperimental.emitToolUseSummaries默认on 环境变量覆盖标签后处理模型原文cleanSummary剥离 Markdown、引号、错误前缀100 字符上限会话持久化仅流式每次会话重新生成仅 UI 历史ChatRecordingService不持久化tool_use_summary该功能的实现并非简单照搬Qwen Code 将默认值设为on、增加了settings.json持久化开关、加入了专门的cleanSummary清洗层并针对 CLI 的渲染模型做了双路径展示设计。以下各节逐一深入。2. Claude Code 参考实现流的边界产物设计文档首先剖析了 Claude Code 的做法因为 Qwen Code 的实现是行为对齐的移植源码注释明确写有Ported from Claude Code (services/toolUseSummary/toolUseSummaryGenerator.ts)。2.1 参考流程tool_batch_complete → fork queryHaiku (fire-and-forget) ↓ next_turn_stream_starts ↓ ← summary Promise resolves during streaming → ↓ await pendingToolUseSummary → yield ToolUseSummaryMessage ↓ continue with next turn关键设计决策包括无论紧凑/详情模式都生成。摘要属于流级产物由 UI 决定是否渲染作为一等消息类型发射。tool_use_summary与user、assistant、tool_result并列通过precedingToolUseIds字段让消费方关联到具体批次排除子代理。子代理的输出在上游聚合单独的批次标签只会产生主界面永远不展示的噪声默认关闭。仅环境变量门控保证下游 SDK 未显式选择时零成本每字段 300 字符截断。覆盖最大的成本风险——单个大工具结果撑爆 prompt——同时保留足够信号。3. Qwen Code 实现从服务到双路径渲染3.1 端到端数据流Qwen Code 挂在相同的生命周期点但渲染覆盖了ui.compactMode的两侧让纯 CLI 用户无需任何 SDK 管道即可受益tool_batch_complete (handleCompletedTools) ↓ config.getEmitToolUseSummaries()? ↓ fork generateToolUseSummary (fire-and-forget) ↓ submitQuery() for next turn (streaming starts) ↓ ← summary Promise resolves during streaming → ↓ addItem({type:tool_use_summary, summary, precedingToolUseIds}) ↓ HistoryItemDisplay renders: compactModefalse → ● label 独立行 compactModetrue → 隐藏MainContent 查找注入 CompactToolGroupDisplay 头部3.2 核心源码地图组件文件关键逻辑服务packages/core/src/services/toolUseSummary.tsgenerateToolUseSummary、truncateJson、cleanSummary、消息工厂配置开关packages/core/src/config/config.ts#L8384-L8389getEmitToolUseSummaries环境变量 → 设置 → 默认 true触发packages/cli/src/ui/hooks/use-llm-stream.ts#L5637-L5683handleCompletedTools内 fire-and-forgetresolve 后addItem全量模式渲染packages/cli/src/ui/components/HistoryItemDisplay.tsx#L551-L558!compactMode时渲染● label行紧凑模式查找packages/cli/src/ui/components/MainContent.tsxsummaryByCallId映射 → 每个 tool_group 的compactLabel紧凑头部packages/cli/src/ui/components/messages/CompactToolGroupDisplay.tsx有标签时用Summary · N tools替换默认Tool × N合并处理packages/cli/src/ui/utils/mergeCompactToolGroups.ts将tool_use_summary视为紧凑模式下隐藏项以保持相邻性UI 类型packages/cli/src/ui/types.ts→HistoryItemToolUseSummary{ type: tool_use_summary, summary, precedingToolUseIds }说明设计文档中记录的旧路径useGeminiStream.ts在当前仓库中已演化为 use-llm-stream.ts触发逻辑位于该文件的handleCompletedTools回调内。阅读源码时以当前路径为准。3.3Staticappend-only 约束为什么标签是独立历史项这是该 PR 的核心架构决策——为什么全量模式下标签是独立的 history item而不是 tool_group 上的装饰。Qwen Code 通过 Ink 的Static渲染转录。Static是append-only的一旦某个条目提交到终端缓冲区Ink 不会重绘该区域除非调用refreshStatic()清空并整体重渲染整个转录。这正是 CLI 依赖的性能模型——静态条目不会在每次按键时重绘。现在考虑快模型调用的时序T0 工具批次完成tool_group 推入历史 T0ε tool_group 经 Static 渲染并提交到缓冲区 T01s 快模型调用返回标签在 T01s 时我们无法把标签追溯塞进已经提交的 tool_group。两条路更新 tool_group 的 props 调用refreshStatic()。可行但每个批次都会触发整个转录重绘——这是应用中最昂贵的 UI 操作之一且肉眼可见闪烁。为一个装饰性标签不可接受。把摘要渲染成自己的新历史项追加在 tool_group 之后。Static原生支持新条目干净地追加无需重绘。该 PR 在全量模式下选择方案 2tool_use_summary是真实的历史条目由HistoryItemDisplay渲染为一行暗色● label。紧凑模式则不同mergeCompactToolGroups合并连续 tool_group 时MainContent本就会调用refreshStatic()——这是既有代码路径重渲染合并组时可以从历史中查到标签。因此紧凑模式以头部替换的方式获得标签。为避免同一标签渲染两次一次作为紧凑头部、一次作为尾部● label行HistoryItemDisplay在compactMode为 true 时隐藏独立行Full mode Compact mode (with merge) ─────────── ───────────────────────── [tool_group] [merged tool_group — header replaced via lookup] ● label (● label line is hidden)3.4 开关语义三层优先级三个层级按优先级解析见 config.ts#L8384-L8389 的getEmitToolUseSummariesQWEN_CODE_EMIT_TOOL_USE_SUMMARIES0|1|true|false—— 环境变量覆盖最高优先级experimental.emitToolUseSummariessettings.json—— 默认true隐式跳过—— 若config.getFastModel()返回undefined无论开关如何都跳过生成。无报错无可见变化。此外在触发端还有一层运行时保护use-llm-stream.ts#L5643-L5667resolve 时会做陈旧摘要检查——只有当前批次对应的 tool_group 仍是历史中最新一个时才addItem。若快模型调用在途期间对话已经推进到更新的批次摘要会被丢弃避免● label行落在后续内容之后全量模式或归属到错误的组紧凑模式。3.5 输出清洗cleanSummary的六道工序cleanSummary对每次模型响应在写入历史前执行清洗完整实现见 toolUseSummary.ts#L264-L302只取第一行——丢弃模型推理前导段落剥离项目符号前缀-、*、•——模型有时会把标签当列表项返回剥离首尾引号/反引号——通过有界{1,10}正则CodeQL 安全真实标签的包裹引号不会超过几个。字符类覆盖 ASCII 及常见 Unicode 引号对\‘’“”「」『』兼容中文指令模型的弯引号与日式角括号输出剥离前缀标签Label:、Summary:、Result:、Output:——部分模型会预置这类词拒绝错误消息形态——API error: ...、Error: ...、I cannot ...、I cant ...、Unable to ...等英文以及我无法、我不能、抱歉、无法等中文拒绝语命中即返回空串不产生历史条目硬性 100 字符上限——移动端 UI 约在 30 字符处截断余量用于覆盖 CJK 短语。3.6 遥测与成本归属生成调用设置promptId: tool_use_summary_generation在runSideQuery中以purpose: tool-use-summary传递其 token 用量在/stats中单独核算。用户可以精确看到该功能带来的增量成本而不会与 prompt suggestions 或主会话的用量混淆。4. 与 Claude Code 的偏差及原因偏差原因在环境变量之外增加设置层Qwen Code 在 CLI 中渲染标签用户需要持久化开关而非每次 shell 导出环境变量默认on而非 off两种显示模式下标签都立即可见配置了fastModel的用户本就在使用快模型特性专门的cleanSummary后处理Qwen Code 支持的 provider 比 CC 更多样部分模型会预置Label:或加引号在边界处归一化以保持 UI 一致存储HistoryItemToolUseSummary而非发射流消息CLI 优先的实现SDK 流路径是后续 PRToolUseSummaryMessage工厂已导出备用尚未接入 prompt caching未单独配置快模型的用户快模型常与主模型相同共享缓存需要经forkedAgent.ts路由作为跟进项双渲染路径全量内联 紧凑头部Qwen Code 默认ui.compactMode: false没有内联全量渲染该功能对大多数用户不可见5. 用户侧配置与使用5.1 配置快模型标签由快模型生成——与 prompt suggestions、投机执行共用同一个fastModel。两种配置方式通过命令/model --fast qwen3-coder-flash通过settings.json{ fastModel: qwen3-coder-flash }未配置fastModel时摘要生成整体跳过——该功能在你配置之前不起任何作用设计文档明确回退到主模型是被刻意禁止的以保证成本曲线有界。5.2 开关设置设置类型默认值说明experimental.emitToolUseSummariesbooleantrue摘要生成总开关。关闭以禁用额外的快模型调用fastModelstring用于摘要生成的快模型与 prompt suggestions 共享。必填为空则无效果环境变量覆盖QWEN_CODE_EMIT_TOOL_USE_SUMMARIES对当前会话覆盖上述设置QWEN_CODE_EMIT_TOOL_USE_SUMMARIES0或false—— 强制关闭QWEN_CODE_EMIT_TOOL_USE_SUMMARIES1或true—— 强制开启未设置 —— 使用experimental.emitToolUseSummaries设置值。完整示例{ fastModel: qwen3-coder-flash, experimental: { emitToolUseSummaries: true } }5.3 出现与不出现的条件摘要生成需要全部满足以下条件experimental.emitToolUseSummaries为true默认已配置fastModelsettings 或/model --fast批次中至少有一个工具完成工具完成前回合未被中止快模型返回了非空、非错误响应。以下情况静默跳过无报错、无 UI 变化未配置快模型快模型调用失败、超时或返回空模型返回了明显错误形态字符串如Error: ...、I cannot ...——由客户端过滤避免展示误导性标签回合在模型完成前被中止CtrlC。所有跳过场景下工具组都按原有方式渲染。5.4 子代理边界触发点位于主会话的回合循环use-llm-stream.ts因此✅ Shell、MCP、文件操作以及Task/子代理工具调用本身以主批次成员出现时会被摘要❌ 子代理内部的工具批次经packages/core/src/agents/runtime/运行不会摘要。包含Task工具的外层批次仍会获得标签但快模型只看到子代理工具调用及其聚合输出——看不到子代理内部的单个工具调用。预期标签形态是Ran research-agent、Delegated file search而不是Searched 14 files。这是有意为之摘要子代理内部会成倍增加快模型成本并制造主界面永不展示的噪声。5.5 生命周期要点三个容易误读的细节每批次只生成一次两种显示模式共享。快模型调用在工具批次最终化时handleCompletedTools恰好发生一次。之后切换CtrlO展开详情不会触发新调用——折叠与展开渲染都读取首次捕获的同一tool_use_summary历史条目切换或恢复会话时不回填。在功能启用或你打开开关之前完成的 tool_group以及在恢复的会话中ChatRecordingService不持久化摘要条目不会获得标签。没有扫描既有历史的通道。会话中途开启该设置只有之后的批次会显示标签仅主 Agent 批次。触发点在主会话的回合循环中。5.6 显示行为主视图已把完成的可折叠批次折叠为单行✓ Read 4 text files——摘要承担了旧版逐工具列表的工作。要看完整逐工具详情按CtrlO切换展开详情模式每个工具单独渲染摘要以尾部● label行出现在组下方╭──────────────────────────────────────────────╮ │ ✓ ReadFile a.txt │ │ ✓ ReadFile b.txt │ │ ✓ ReadFile c.txt │ │ ✓ ReadFile d.txt │ ╰──────────────────────────────────────────────╯ ● Read 4 text files对于小规模同类型批次如Read × 3展开态的● label行可能与可见工具行语义重复若这正是你的常规工作流可经experimental.emitToolUseSummaries: false整体关闭。6. 数据流与隐私边界摘要调用向快模型发送每个成功工具的名称、截断后的args与截断后的结果每字段上限 300 字符外加助手最近文本的前200 字符作为意图前缀。若快模型与主会话模型配置在同一 provider/auth 下数据沿主会话已使用的同一边界流动信任范围不变若快模型来自不同 provider工具输入与输出可能包含read_file读到的文件内容、shell 命令输出、MCP 工具暴露的值会随摘要 prompt 发送到该 provider——这是严格大于主会话的数据共享范围。两个干净的应对选项将fastModel配置为与主会话同 provider 的模型使摘要调用不跨越新的认证/数据边界以experimental.emitToolUseSummaries: false或QWEN_CODE_EMIT_TOOL_USE_SUMMARIES0整体关闭。300 字符/字段上限限制了暴露面但并未消除——截断窗口内工具输出中发现的密钥仍可能被发送。请以对待主模型数据边界的方式对待快模型。7. 成本模型每个达标的工具批次产生一次快模型调用。输入为小型固定系统 prompt 加上截断的工具输入/输出每字段 300 字符上限输出为单行短标签100 字符上限通常不超过 20 个 token。generateToolUseSummary中runSideQuery的采样参数为maxOutputTokens: 60、temperature: 0.3且maxAttempts: 1——标签是尽力而为的装饰品每回合一次瞬时故障时 7 次重试只会徒增流量而毫无收益toolUseSummary.ts#L138-L151。当前仓库已知限制包括无会话持久化。tool_use_summary不写入聊天记录 JSONL。恢复会话会丢失标签工具组回退到通用头部渲染。优先级低继续会话时标签会自然重新生成尚无 SDK 流发射。消息工厂已导出但 CLI 尚未将tool_use_summary接入 SDK bridge无 prompt caching。每个批次都产生一次全新输入 token 成本。绝对值可忽略约 300 token但每回合跑几十个批次时是可测的合并紧凑组的摘要取首个批次的标签。连续 10 个不相似批次紧循环非典型场景时合并头部只显示领头批次的意图。这是接受的权衡合并视图中展开每批次标签比只取首个更嘈杂必须有快模型。未配置fastModel则跳过生成。8. 未来工作设计文档列出了四项后续规划将ToolUseSummaryMessage接入 SDK bridge让已导出的工厂函数在下游真正被使用经forkedAgent.ts路由生成并启用enablePromptCaching让重复的工具名前缀命中 provider 缓存可选将tool_use_summary条目持久化到ChatRecordingService并在会话恢复时重放可选按工具名的标签快捷路径例如单个read_file调用固定为Read filename作为 LLM 前的快速通道。9. 结语与验证入口Tool-Use Summary 是用一次便宜的调用换取整体可读性的典型工程实践fire-and-forget 的调度让 ~1s 延迟隐身于主模型流式输出之后Staticappend-only 约束催生了独立历史项 双路径渲染的优雅解而cleanSummary在异构 provider 环境下保证了 UI 的一致性。希望深入验证的读者可以关注以下测试与实现入口渲染测试packages/cli/src/ui/components/HistoryItemDisplay.test.tsxrenders tool_use_summary as a dim badge line in full mode用例断言●字符合并场景测试packages/cli/src/ui/components/MainContent.test.tsx验证静态模式下tool_use_summary作为独立行保留、合并时不被丢弃触发与陈旧检查packages/cli/src/ui/hooks/use-llm-stream.ts#L5628-L5683开关解析packages/core/src/config/config.ts#L8384-L8389清洗与截断packages/core/src/services/toolUseSummary.ts。相关功能联动可参考用户手册中的 Followup Suggestions共享fastModel的另一快模型 UX 增强以及 Expanded detail modeCtrlO展开详情。【免费下载链接】qwen-codeAn open-source AI coding agent that lives in your terminal.项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表