Roo Code 3.7.5 版本解析:Thinking 模型配置更新与输入输出成本修正实践
发布时间:2026/9/13 16:15:31来源:尧图网络
Roo Code 3.7.5 版本解析Thinking 模型配置更新与输入输出成本修正实践【免费下载链接】Roo-CodeRoo Code gives you a whole dev team of AI agents in your code editor.项目地址: https://gitcode.com/GitHub_Trending/ro/Roo-Code本篇技术指南以 Roo Code 3.7.5 的官方更新说明apps/docs/docs/update-notes/v3.7.5.md为核心脉络聚焦该版本引入的独立:thinking模型版本机制、thinking budget思考预算配置、上下文窗口计算与输入/输出成本解析修复以及按住 Shift 拖拽文件实现 -mention的新交互并结合仓库源码还原其底层实现原理。读完本文你将掌握如何在 Provider 设置中正确选择 thinking 模型版本并调整思考预算滑块、理解上下文窗口与 max_tokens 的约束关系、看懂模型成本计算的修正逻辑以及熟练使用文件 -mention 的拖拽操作。版本概览Roo Code 3.7.5 于 2025-02-26 发布是一次聚焦推理/思考模型thinking models配置体验的更新。官方 release notes 将其要点概括为三部分模型配置更新为 Anthropic 与 OpenRouter 的 Sonnet 3.7 模型引入独立的:thinking版本以支持可配置的思考预算thinking budget之前使用思考功能的用户需要在 Provider 设置中选择这些新模型版本并按需调整思考预算滑块。Bug 修复修复上下文窗口计算错误input length and max_tokens exceed context limit、模型选择器 UI 的多个问题、以及模型输入/输出成本解析问题后两项由社区成员 System233 贡献。功能亮点新增在 File Explorer 中按住 Shift 拖拽文件到聊天输入框、实现 -mention 文件的能力。下文将逐一展开并在每个环节给出对应源码证据方便读者按图索骥深入阅读。一、Thinking 模型配置更新独立:thinking模型版本1.1 为什么要引入:thinking后缀版本Claude 3.7 Sonnet 是 Anthropic 首款混合推理Hybrid Reasoning模型它既能像常规模型一样快速应答也能开启扩展思考extended thinking模式在给出最终答案前进行逐步推理。思考模式消耗的 token 由思考预算thinking budget即budget_tokens控制。在 3.7.5 之前Roo Code 无法针对同一模型区分是否开启思考以及思考预算多少。为此3.7.5 在模型注册表中引入了带:thinking后缀的虚拟模型 ID用于显式声明这是一个必须开启推理预算的混合推理模型从而把开启思考与思考预算可配置变成模型级的能力。在仓库中可以看到该虚拟模型的具体定义packages/types/src/providers/anthropic.tsclaude-3-7-sonnet-20250219:thinking: { maxTokens: 128_000, // 需向 API 传入 beta 标志解锁否则为 64k contextWindow: 200_000, supportsImages: true, supportsPromptCache: true, inputPrice: 3.0, // 每百万输入 token 3 美元 outputPrice: 15.0, // 每百万输出 token 15 美元 cacheWritesPrice: 3.75, cacheReadsPrice: 0.3, supportsReasoningBudget: true, requiredReasoningBudget: true, // 关键强制要求启用推理预算 },对照不带后缀的普通版本claude-3-7-sonnet-20250219packages/types/src/providers/anthropic.tsclaude-3-7-sonnet-20250219: { maxTokens: 8192, // 已提供 :thinking 虚拟模型故不再设置 supportsReasoningBudget contextWindow: 200_000, supportsImages: true, supportsPromptCache: true, inputPrice: 3.0, outputPrice: 15.0, cacheWritesPrice: 3.75, cacheReadsPrice: 0.3, },两者的差异一目了然配置项普通版本:thinking版本maxTokens8192128,000需 beta 标志解锁否则 64ksupportsReasoningBudget不设置truerequiredReasoningBudget不设置true用途快速应答显式开启扩展思考、支持思考预算调整1.2 API 层的后缀剥离与 beta 标志注入:thinking只是 Roo Code 内部的虚拟模型 IDAnthropic API 实际识别的模型 ID 并不带该后缀。因此 Provider 层在构造请求时必须做拆壳处理。见 src/api/providers/anthropic.ts// :thinking 后缀表示这是一个 Hybrid混合推理模型 // 且必须启用推理reasoning。Anthropic API 实际识别的模型 ID 不含此后缀。 return { id: id claude-3-7-sonnet-20250219:thinking ? claude-3-7-sonnet-20250219 : id, info, betas: id claude-3-7-sonnet-20250219:thinking ? [output-128k-2025-02-19] : undefined, ...params, }这段代码做了两件事将claude-3-7-sonnet-20250219:thinking还原为 API 识别的claude-3-7-sonnet-20250219当选择了:thinking版本时自动附加 beta 标志output-128k-2025-02-19这正是该虚拟模型maxTokens: 128_000能被解锁的原因否则上限为 64k。1.3 OpenRouter 侧的:thinking模型OpenRouter 同样以:thinking后缀暴露这类混合推理模型。在 packages/types/src/providers/openrouter.ts 中Roo Code 维护了一个必须启用推理预算的模型集合// 带有 :thinking 后缀的虚拟模型 ID 总是要求启用推理预算 // 为保证向后兼容这些模型仍然必须开启预算。 // 注意不应再向此集合添加新模型。 export const OPEN_ROUTER_REQUIRED_REASONING_BUDGET_MODELS new Set([ anthropic/claude-3.7-sonnet:thinking, google/gemini-2.5-pro, google/gemini-2.5-flash-preview-05-20:thinking, ])同时OPEN_ROUTER_REASONING_BUDGET_MODELSpackages/types/src/providers/openrouter.ts则维护了支持但可开关推理预算的模型列表并刻意将anthropic/claude-3.7-sonnet:thinking等必需模型一并纳入因为必需集合的优先级更高。OpenRouter 场景下思考预算通过max_tokens参数透传详见下文 2.3 节。1.4 升级注意事项针对既有 thinking 用户按 release notes 的说明3.7.5 之后必须重新选择模型此前使用思考功能的用户需要在 Provider 设置中手动切换到带:thinking后缀的新模型版本例如从claude-3-7-sonnet切到claude-3-7-sonnet:thinking调整思考预算滑块切换后按任务复杂度重新设置 thinking budget 滑块普通模型行为不变不带后缀的普通版本维持原有快速应答行为不会因本次更新而强制开启思考。二、思考预算Thinking Budget的底层计算规则2.1 触发条件shouldUseReasoningBudget是否启用 thinking budget由shouldUseReasoningBudget统一裁决src/shared/api.tsexport const shouldUseReasoningBudget ({ model, settings, }: { model: ModelInfo settings?: ProviderSettings }): boolean !!model.requiredReasoningBudget || (!!model.supportsReasoningBudget !!settings?.enableReasoningEffort)即满足下列任一条件即启用模型声明了requiredReasoningBudget如claude-3-7-sonnet-20250219:thinking强制开启与用户设置无关模型支持思考预算supportsReasoningBudget且用户在设置中开启了enableReasoningEffort。2.2 预算的默认值与钳制规则预算数值的计算集中在 src/api/transform/model-params.ts其规则可以概括为先取默认、再按上下限钳制// 若未显式指定 customMaxThinkingTokens则使用默认值。 // Gemini 2.5 Pro 默认 128其他模型默认 8192 const defaultThinkingTokens isGemini25Pro ? GEMINI_25_PRO_MIN_THINKING_TOKENS : DEFAULT_HYBRID_REASONING_MODEL_THINKING_TOKENS reasoningBudget customMaxThinkingTokens ?? defaultThinkingTokens // 推理预算不得超过 maxTokens 的 80% if (maxTokens reasoningBudget Math.floor(maxTokens * 0.8)) { reasoningBudget Math.floor(maxTokens * 0.8) } // 推理预算不得低于最小 token 数 // Gemini 2.5 Pro 最小为 128其他模型最小为 1024 const minThinkingTokens isGemini25Pro ? GEMINI_25_PRO_MIN_THINKING_TOKENS : 1024 if (reasoningBudget minThinkingTokens) { reasoningBudget minThinkingTokens } // 混合推理模型要求 temperature 固定为 1.0 temperature 1.0默认值常量定义于 src/shared/api.tsexport const DEFAULT_HYBRID_REASONING_MODEL_MAX_TOKENS 16_384 export const DEFAULT_HYBRID_REASONING_MODEL_THINKING_TOKENS 8_192 export const GEMINI_25_PRO_MIN_THINKING_TOKENS 128可归纳为一张实用速查表场景思考预算取值未手动设置思考预算默认 8192 tokenGemini 2.5 Pro 为 128预算超过 maxTokens 的 80%钳制为 maxTokens × 0.8向下取整预算低于最小值抬升到 1024Gemini 2.5 Pro 为 128混合推理模型 temperature强制 1.0对应测试用例可参考 src/api/transform/tests/reasoning.spec.ts其中覆盖了budget_tokens正常透传、0 值、超大值等边界情况。2.3 预算如何下发到各家 API最终构造出的 reasoning 参数因厂商而异全部集中在 src/api/transform/reasoning.tsAnthropicreasoning.ts#L107-L112export const getAnthropicReasoning ({ model, reasoningBudget, settings, }: GetModelReasoningOptions): AnthropicReasoningParams | undefined shouldUseReasoningBudget({ model, settings }) ? { type: enabled, budget_tokens: reasoningBudget! } : undefined即生成 Anthropic 原生thinking: { type: enabled, budget_tokens }参数测试断言见 src/api/providers/tests/anthropic.spec.ts 附近实际样例为thinking: { type: enabled, budget_tokens: 4096 }。OpenRouterreasoning.ts#L44-L56通过max_tokens字段携带预算{ max_tokens: reasoningBudget }OpenAI 系 / GeminiOpenAI 系走reasoning_effortGemini 走thinkingConfigthinkingLevel属于另一套 effort 机制见 reasoning.ts#L114-L130不在 3.7.5 的思考预算范围内此处不展开。2.4 会话历史中的 reasoning 块过滤开启思考后流式响应中会包含thinking/thinking_delta内容Provider 层将其转换为{ type: reasoning }块见 src/api/providers/anthropic.ts 对thinking与thinking_delta分支的处理。而内部推理内容不会被回传给模型在 src/api/providers/tests/anthropic.spec.ts#L339-L410 的 reasoning block filtering 测试组中验证了发送到 API 的消息会过滤掉历史对话中的reasoning块且当过滤后消息为空时整条消息会被丢弃。这解释了为什么切换 thinking 模型后历史会话依然能安全复用不会把推理痕迹泄露回上下文。三、Bug 修复一上下文窗口计算错误release notes 中修复的 input length and max_tokens exceed context limit 报错根因在于 max_tokens 与上下文窗口context window之间的约束关系处理不当。修复后Roo Code 对输出 token 上限的判定遵循更严谨的规则核心逻辑位于 src/shared/api.ts 的getModelMaxOutputTokensexport const getModelMaxOutputTokens ({ modelId, model, settings, format, }: { modelId: string model: ModelInfo settings?: ProviderSettings format?: anthropic | openai | gemini | openrouter }): number | undefined { if (shouldUseReasoningBudget({ model, settings })) { return settings?.modelMaxTokens || DEFAULT_HYBRID_REASONING_MODEL_MAX_TOKENS } const isAnthropicContext modelId.includes(claude) || format anthropic || (format openrouter modelId.startsWith(anthropic/)) // 对于 Hybrid 推理模型在 Anthropic 场景下丢弃其模型自带 maxTokens if (model.supportsReasoningBudget isAnthropicContext) { return ANTHROPIC_DEFAULT_MAX_TOKENS } ... }关键规则包括启用思考预算时使用用户配置的modelMaxTokens缺省回退到DEFAULT_HYBRID_REASONING_MODEL_MAX_TOKENS 16_384Anthropic 上下文中的混合推理模型即使模型注册表写了 128k 的 maxTokens也统一回退到ANTHROPIC_DEFAULT_MAX_TOKENS 8192避免 128k 输出上限与 200k 上下文窗口叠加时触发超限错误其余场景下max_tokens 取模型声明值与上下文窗口的合理比例。getModelMaxOutputTokens的行为在 src/shared/tests/api.spec.ts 中有大量参数化测试例如当 maxTokens 超过上下文窗口 20% 时会被钳制api.spec.ts#L101-L127以及恰好等于 20% 阈值时不做钳制api.spec.ts#L142-L159等边界场景。对读者而言的实操含义若在聊天中遇到 input length and max_tokens exceed context limit升级到 3.7.5 后应首先检查两处——当前模型的 max output tokens 设置是否过大以及是否误选了带超大 maxTokens 的 thinking 模型修复逻辑会自动将混合推理模型的输出上限钳制到合理区间。四、Bug 修复二模型输入/输出成本解析成本计算依赖模型注册表中的inputPrice/outputPrice/cacheWritesPrice/cacheReadsPrice单位均为每百万 token 的美元价格。3.7.5 修复了这部分价格解析的偏差尤其是 thinking 模型——它额外消费推理 token若价格字段解析错误费用统计会严重失真。成本计算核心在 src/shared/cost.tsinputPrice: modelInfo.inputPrice ! undefined pricing.inputPriceMultiplier ! undefined ? modelInfo.inputPrice * pricing.inputPriceMultiplier : modelInfo.inputPrice, outputPrice: modelInfo.outputPrice ! undefined pricing.outputPriceMultiplier ! undefined ? modelInfo.outputPrice * pricing.outputPriceMultiplier : modelInfo.outputPrice,以及const baseInputCost ((modelInfo.inputPrice || 0) / 1_000_000) * inputTokens const outputCost ((modelInfo.outputPrice || 0) / 1_000_000) * outputTokens修复点体现在支持价格倍率multiplier可通过倍率调整实际计费价格未配置倍率时回退到注册表原值统一的百万 token 归一化所有价格统一按每百万 token换算避免量级不一致导致的偏差。在模型注册表中以:thinking虚拟模型为例packages/types/src/providers/anthropic.ts#L132-L137其输入/输出价格与普通版本anthropic.ts#L144-L147一致$3/$15 每百万 token但思考过程产生的推理 token 会计入输出侧的实际用量。OpenRouter 侧还维护了支持提示缓存的模型白名单packages/types/src/providers/openrouter.ts#L21-L56其中就包含anthropic/claude-3.7-sonnet:thinking确保启用 prompt caching 的 thinking 模型在成本统计时能正确计 cache 读写费用。实操含义升级后任务历史中的 token 消耗与费用估算会恢复准确若你手动在 Provider 配置中调整过价格请确认与 3.7.5 的倍率逻辑不冲突。五、Bug 修复三模型选择器Model PickerUI3.7.5 还修复了模型选择器的多处 UI 问题由 System233 贡献。模型选择器实现在 webview-ui/src/components/settings/ModelPicker.tsx它是一个支持搜索、自定义模型输入与自动拉取模型的弹层组件支持按关键字过滤模型列表searchPlaceholder/noMatchFoundModelPicker.tsx#L231-L248未匹配时允许直接以自定义 model id 使用useCustomModelModelPicker.tsx#L275针对支持列表自动拉取的 Provider 显示简化说明文案ModelPicker.tsx#L291-L308。结合 3.7.5 新增的:thinking模型此修复的实际意义在于claude-3-7-sonnet-20250219:thinking这类虚拟模型现在能正确显示在可选列表中并且选择/切换后 UI 状态与设置面板保持一致。模型选择器只在通用模型选择场景启用判断逻辑见 webview-ui/src/components/settings/ApiOptions.tsx#L706-L708 中的shouldUseGenericModelPicker。六、功能亮点Shift 拖拽实现文件 -mention3.7.5 新增在文件资源管理器File Explorer中按住 Shift 键拖拽文件到聊天输入框即可将文件以 -mention 形式插入输入内容。这在长对话中尤其有用——不用手动输入路径也不会误触发普通文件/图片拖拽。6.1 交互判定按住 Shift 才允许拖放拖拽区事件处理位于 webview-ui/src/components/chat/ChatTextArea.tsx#L954-L980onDrop{handleDrop} onDragOver{(e) { // 只有在按下 Shift 键时才允许放置文件/图片。 if (!e.shiftKey) { setIsDraggingOver(false) return } e.preventDefault() setIsDraggingOver(true) e.dataTransfer.dropEffect copy }}即dragOver阶段就拦截未按 Shift 时直接取消拖放高亮并阻止 drop按下 Shift 才preventDefault()并显示可放置状态。6.2 落盘处理路径转 -mentionhandleDropChatTextArea.tsx#L809-L912的核心流程优先读取拖拽携带的文本数据text/plain或 VS Code 的资源列表application/vnd.code.uri-list同时兼容从编辑器标签页拖出的场景按换行切分得到多文件路径列表逐行调用convertToMentionPath(line, cwd)转换为 mention 格式并以空格分隔插入光标位置若无文本型路径数据则回退到dataTransfer.files处理图片仅接受png/jpeg/webp通过FileReader转成 Data URL 后经vscode.postMessage({ type: draggedImages, dataUrls })发送给扩展侧ChatTextArea.tsx#L855-L899。多语言文案也已同步更新例如中文为Shift拖拽文件/图片、日文为ファイルをドラッグするにはShiftキーを押したまま见 webview-ui/src/i18n/locales/zh-CN/chat.json#L118-L119 与 webview-ui/src/i18n/locales/ja/chat.json#L118-L119输入框占位符中也会按shouldDisableImages动态提示支持的文件类型ChatTextArea.tsx#L926。6.3 使用步骤在 VS Code 的 File Explorer 中选中一个或多个文件按住 Shift 键将文件拖入 Roo Code 聊天输入框松开后路径会自动转换为/path/to/file形式的 mention 并插入光标处可继续编辑后发送若拖入的是 png/jpeg/webp 图片且模型支持图片输入则会作为图片附件发送。七、总结Roo Code 3.7.5 虽是小版本却完成了思考模型配置体系的定型模型层以:thinking后缀虚拟模型承载必须开启推理的语义Anthropic API 侧自动剥离后缀并注入 beta 标志src/api/providers/anthropic.ts#L344-L353OpenRouter 侧通过必需/可选两个集合管理推理预算packages/types/src/providers/openrouter.ts#L65-L90参数层shouldUseReasoningBudget决定是否启用model-params.ts完成默认值与 80%/1024 上下限钳制reasoning.ts按厂商生成budget_tokens/max_tokens等最终参数可靠性上下文窗口计算修正解决了 input length and max_tokens exceed context limit 报错成本解析修复保证费用统计准确交互层Shift 拖拽让文件 -mention 与图片拖拽各归其位互不干扰。对于仍在思考模型与快速模型之间切换的用户记住一条主线即可要扩展思考就选带:thinking后缀的版本并调节思考预算滑块要快速应答就留在普通版本其余细节预算钳制、beta 解锁、成本统计均由 3.7.5 的修复逻辑自动兜底。相关文件索引更新说明原文apps/docs/docs/update-notes/v3.7.5.mdAnthropic 模型注册表含:thinking虚拟模型packages/types/src/providers/anthropic.tsOpenRouter 推理预算模型集合packages/types/src/providers/openrouter.ts预算裁决与输出上限计算src/shared/api.ts预算钳制与参数组装src/api/transform/model-params.ts各厂商 reasoning 参数生成src/api/transform/reasoning.tsAnthropic Provider后缀剥离与 beta 注入src/api/providers/anthropic.ts成本计算src/shared/cost.ts模型选择器 UIwebview-ui/src/components/settings/ModelPicker.tsxShift拖拽 -mention 实现webview-ui/src/components/chat/ChatTextArea.tsx【免费下载链接】Roo-CodeRoo Code gives you a whole dev team of AI agents in your code editor.项目地址: https://gitcode.com/GitHub_Trending/ro/Roo-Code创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网