【免费下载链接】interview-coder-cn
AI 截屏解题助手,考试助手,在「面试」或「在线考试」时,借助AI实时提供解题思路和答案。
Interview Coder CN 是一个 AI 截屏解题助手 / 考试助手,可以在面试或在线考试时借助 AI 实时提供解题思路。它有一个很实用的开关——「关闭思考」:让 AI 跳过答题前那段看不见的思考过程,出字更快。但 OpenAI 的 chat 接口并没有标准的"关闭思考"字段,每家平台的拼写还都不一样。本文带你看看它是如何用一个 fetch 包装器把这些差异全部兜住,做到"只慢一次、绝不失败"。
为什么"关闭思考"值得单独做一个开关
带思考能力的大模型(DeepSeek、GLM 等)在给出答案前,会先输出一段 reasoning。应用里这段思考虽然会流式显示,但答案本身要等思考走完才能开始。作者在源码注释中实测:用一张简单题目的截图,把思考关掉后,DeepSeek V4.1 Flash 和 GLM-4.5V 出第一个字的时间从4–28 秒缩短到 1–2 秒;本来就不思考的模型则不受影响。
这正是「对话模式」最需要它的地方——面试官话音刚落就要出提示,快比什么都重要。所以在设置里,「关闭思考」是一个按 AI 配置保存的独立开关(AiModelsSection.tsx),提示文案写得很直白:
跳过答题前看不见的思考过程,出字更快,难题可能不如开着准;模型不支持时自动忽略。
对应到数据结构上,每个 AI 配置(profile)里就一个布尔字段disableThinking,默认关闭(api-profile.ts)。
难点:各家平台的"关闭思考"拼写完全不同
问题在于,请求体里没有统一的标准字段,只能按平台"方言"来写。整理一下 thinking.ts 中的字段表:
| 平台 / 模型 | 注入的请求字段 | 说明 |
|---|---|---|
| OpenRouter | reasoning: { enabled: false } | 它会把这个字段翻译给路由到的任意模型 |
OpenAI(api.openai.com,或模型名以gpt-/o数字开头) | reasoning_effort: 'none' | OpenAI 会拒绝一切它不认识的字段,所以只发它自己的写法 |
| DeepSeek、智谱、豆包 | thinking: { type: 'disabled' } | 这类平台读thinking字段 |
| 通义 Qwen | enable_thinking: false | 这类平台读enable_thinking |
| 其他未知平台 | 两个字段一起发 | thinking和enable_thinking互不认识对方的,一起带上总有一个生效 |
判断"当前是哪个平台"的依据是API Base URL 的主机名(thinking.ts 中的hostOf+onHosts),且子域名也算匹配——比如xxx.api.deepseek.com同样被识别为 DeepSeek。Base URL 留空则按 OpenAI 官方处理,这与全应用"空 URL 即 OpenAI"的约定一致(api-profile.ts)。
核心实现:用 fetch 包装器把字段"偷渡"进请求
应用只通过@ai-sdk/openai-compatible发 OpenAI 兼容的 chat 请求,SDK 本身不认识任何"关闭思考"字段。解法很朴素:在 HTTP 层包一层 fetch。
createThinkingOffFetch(thinking.ts)返回一个和fetch同签名的异步函数,工作流程是:
- 📦解开请求体:尝试把
init.body解析成 JSON,解析失败就直接放行,绝不干扰正常请求; - 🏷️查字段表:从 body 里取出
model,结合 Base URL 算出该发的字段; - 🔀合并后重发:把字段展开合并进原请求体,重新
JSON.stringify后发出——对上层 SDK 完全透明。
这个包装器在哪里被装上?在createProvider(ai.ts)里:只有当当前配置的disableThinking为true时,才把包装后的 fetch 传给createOpenAICompatible;没开开关时就是普通请求——"每一个平台都接受的,就是一个不带任何额外字段的请求"。
被拒绝时的兜底:只慢一次,绝不失败
再巧妙的字段表也覆盖不了所有情况,两种典型拒绝:
- 只会思考的模型(thinking-only):它不接受"别思考"的指令;
- 严格校验的平台(如 OpenAI):收到未知字段直接报 400。
包装器的应对策略分三步(thinking.ts):
- 收到400 / 422响应时,克隆响应读取错误详情;
- 用正则
/thinking|reasoning/i匹配错误文案——各家拒绝理由措辞不同(OpenAI 的Unknown parameter、硅基流动的does not support parameter、OpenRouter 的Reasoning is mandatory),但只要提到 thinking/reasoning 就算数; - 确认是"字段被拒"后,把这个Base URL + 模型的组合记进会话级的
refused集合,去掉字段原样重发一次,并通知渲染端。
之后同一组合的所有请求直接跳过注入(第 2 步查refused就放行),不再浪费往返。渲染端收到通知后弹一次轻提示:"当前模型不支持关闭思考,已按默认方式请求"(use-mode-page.ts)。
这个设计的保证非常明确:开关最坏只会让一次请求多花一个往返,永远不会让请求失败。
实际使用:三步开启
- 打开「设置 → AI 模型」,选中要编辑的配置;
- 打开「关闭思考」开关(建议给对话模式单独配一个关了思考的快模型);
- 正常使用即可——不支持的模型会收到一次轻提示,然后自动按默认方式请求,无需任何处理。
相关文件导读
| 文件 | 职责 |
|---|---|
| src/main/thinking.ts | 字段表thinkingOffFields+ fetch 包装器createThinkingOffFetch+ 拒绝回退 |
| src/main/ai.ts | 按配置决定是否装上包装器 |
| src/shared/api-profile.ts | disableThinking字段定义 |
| src/renderer/src/settings/sections/AiModelsSection.tsx | 设置页里的开关 UI |
| src/renderer/src/lib/providers.ts | 已知平台与模型名对照表 |
小结
"关闭思考"看似只是一个布尔开关,背后却是一整套方言翻译 + 优雅降级的设计:按主机名识别平台、按平台拼写字段、按"平台 + 模型"记住拒绝、被拒后静默回退。对一个要在面试高压环境下稳定出答案的工具来说,这种"宁可慢一次、绝不报错"的兜底哲学,和它的隐身窗口一样,都是体验的关键。
【免费下载链接】interview-coder-cn
AI 截屏解题助手,考试助手,在「面试」或「在线考试」时,借助AI实时提供解题思路和答案。
相关推荐
MiniCPM-V-4.7-35B-A3B-AWQ是如何思考的?深度解析思考模式开关与6个关键采样参数
MiniCPM V 4.7 35B A3B AWQ是如何思考的?深度解析思考模式开关与6个关键采样参数 MiniCPM V 4.7 35B A3B AWQ 是
大模型多模态计算机视觉NLP模型量化本地部署Soulter/AstrBot项目中关闭AI推理思考过程的技术解析
Soulter/AstrBot项目中关闭AI推理思考过程的技术解析 引言:AI推理思考过程的显示与隐藏 在现代AI聊天机器人应用中,大语言模型(LLM)的推理思
人工智能大模型AI 应用AI Agent工具调用RAG即时通讯插件系统后端从第一性原理思考软件开发工作:self-consistent-coder项目启示
从第一性原理思考软件开发工作:self consistent coder项目启示 引言:重新思考程序员的工作本质 在软件开发领域,我们常常陷入技术细节和日常工作
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考