<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>箐のblog</title><description>君の指先を舞ってる電光は、私の一生変わらない信仰であり、このレールガンだけが永遠に生きてる！</description><link>https://blog.youzhiqing.com/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.16.3</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年8月22日 21:36:22</lastBuildDate><item><title>CC Switch 修复 Codex 桌面端：问题排查与解决手册</title><link>https://blog.youzhiqing.com/posts/cc-switch-codex-troubleshooting/</link><guid isPermaLink="true">https://blog.youzhiqing.com/posts/cc-switch-codex-troubleshooting/</guid><description>CC Switch 修复 Codex 桌面端桌面端切换第三方/国产模型时的常见问题排查手册，涵盖路由断裂、显示异常、认证冲突等场景。</description><pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;〇、先建立两个基本认知&lt;a href=&quot;#〇先建立两个基本认知&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;0.1 Codex 的两个核心配置文件&lt;a href=&quot;#01-codex-的两个核心配置文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;th&gt;典型位置&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;config.toml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;用什么模型、走哪个 provider、接口协议&lt;/td&gt;&lt;td&gt;&lt;code&gt;C:\Users\&amp;lt;用户名&amp;gt;\.codex\config.toml&lt;/code&gt;（Windows）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;auth.json&lt;/code&gt;&lt;/td&gt;&lt;td&gt;认证方式（ChatGPT 官方登录 or API Key）&lt;/td&gt;&lt;td&gt;同上目录&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;CC Switch 切换时&lt;strong&gt;需要同时改这两个文件&lt;/strong&gt;，它有时只改了其中一个——这是至少一半”切换不生效”问题的根源。&lt;/p&gt;&lt;p&gt;如果你安装时改过 Codex 的数据目录（例如 &lt;code&gt;D:\codex-home&lt;/code&gt;），电脑上可能存在两份 &lt;code&gt;config.toml&lt;/code&gt;。CC Switch 可能改了 C 盘那份，而 Codex 实际读取的是 D 盘那份。排查时先确认 Codex 真正在读哪个文件。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;0.2 路由 vs 显示：两类问题必须分开&lt;a href=&quot;#02-路由-vs-显示两类问题必须分开&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路由断了&lt;/strong&gt;：请求根本送不出去（401/404/400/model-not-found）。这是配置或模型本身的问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路由通了但桌面版不显示&lt;/strong&gt;：CLI 里 &lt;code&gt;/model&lt;/code&gt; 能看到模型、请求也正常，只是桌面版选择器看不见。这是显示问题（客户端过滤缺陷），有专门的绕行方案。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;一条命令区分两者&lt;/strong&gt;：在同一个文件夹打开终端运行 &lt;code&gt;codex&lt;/code&gt;（CLI），输入 &lt;code&gt;/model&lt;/code&gt;。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;CLI 也失败 → 路由问题，看第三章。&lt;/li&gt;
&lt;li&gt;CLI 成功、只有桌面版看不见 → 显示问题，看第二章。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;一、30 秒快速诊断表&lt;a href=&quot;#一30-秒快速诊断表&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;





































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;你看到的现象&lt;/th&gt;&lt;th&gt;实际的问题&lt;/th&gt;&lt;th&gt;跳转&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;切完模型重启 Codex，还是显示 GPT-5.5&lt;/td&gt;&lt;td&gt;&lt;code&gt;config.toml&lt;/code&gt; 与 &lt;code&gt;auth.json&lt;/code&gt; 没同步，或改错了路径的那份&lt;/td&gt;&lt;td&gt;问题 1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;选择器只显示 “Custom”，没有模型名&lt;/td&gt;&lt;td&gt;模型内联设置、缺少目录元数据（正常现象，能用）&lt;/td&gt;&lt;td&gt;问题 5&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;模型名称位置显示空白&lt;/td&gt;&lt;td&gt;&lt;code&gt;[model_providers.xxx]&lt;/code&gt; 下缺 &lt;code&gt;name&lt;/code&gt; 字段&lt;/td&gt;&lt;td&gt;问题 6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CLI 的 &lt;code&gt;/model&lt;/code&gt; 能列出，桌面版没有&lt;/td&gt;&lt;td&gt;桌面版客户端过滤缺陷（issue #19694）&lt;/td&gt;&lt;td&gt;问题 7&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;选择器下拉列表整个是空的&lt;/td&gt;&lt;td&gt;目录缺失或格式错误（旧版 CC Switch）&lt;/td&gt;&lt;td&gt;问题 8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;发图片直接报错，之后纯文字也报错&lt;/td&gt;&lt;td&gt;DeepSeek API 不支持图片输入，污染了会话历史&lt;/td&gt;&lt;td&gt;问题 2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Key 明明正确却报 401&lt;/td&gt;&lt;td&gt;Key 夹带空格/不可见字符/乱码&lt;/td&gt;&lt;td&gt;问题 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;每个请求都 404&lt;/td&gt;&lt;td&gt;&lt;code&gt;wire_api = &quot;chat&quot;&lt;/code&gt; 已废弃，或网关无 &lt;code&gt;/responses&lt;/code&gt; 端点&lt;/td&gt;&lt;td&gt;问题 9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;切回 GPT-5.5 后依然显示国产模型&lt;/td&gt;&lt;td&gt;&lt;code&gt;auth.json&lt;/code&gt; 残留 api-key 模式 / &lt;code&gt;config.toml&lt;/code&gt; 残留 provider&lt;/td&gt;&lt;td&gt;问题 4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;切换后会话记录消失、插件变灰&lt;/td&gt;&lt;td&gt;认证体系切换导致（非数据丢失，新版已改善）&lt;/td&gt;&lt;td&gt;问题 10&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;启动时打印 provider 被忽略的警告&lt;/td&gt;&lt;td&gt;provider 写在了项目级 &lt;code&gt;.codex/config.toml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;问题 11&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;配置全对但列表还是旧的/空的&lt;/td&gt;&lt;td&gt;&lt;code&gt;models_cache.json&lt;/code&gt; 缓存过期&lt;/td&gt;&lt;td&gt;问题 12&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、切换类问题（改了不生效 / 改不回来）&lt;a href=&quot;#二切换类问题改了不生效--改不回来&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;问题 1：切完模型重启 Codex，还是显示 GPT-5.5&lt;a href=&quot;#问题-1切完模型重启-codex还是显示-gpt-55&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;典型报错&lt;/strong&gt;（CLI 中）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&quot;type&quot;:&quot;error&quot;,&quot;status&quot;:400,&quot;error&quot;:{&quot;type&quot;:&quot;invalid_request_error&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;message&quot;:&quot;The &apos;deepseek-v4-flash&apos; model is not supported when using Codex with a ChatGPT account.&quot;}}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：CC Switch 只改了 &lt;code&gt;config.toml&lt;/code&gt; 和 &lt;code&gt;auth.json&lt;/code&gt; 中的一个；或者改的是另一路径下的副本。于是 Codex 检测到”ChatGPT 账号登录态 + 第三方模型名”对不上，直接拒绝。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;排查步骤&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;确认 Codex 实际读取的配置目录（默认 &lt;code&gt;~/.codex/&lt;/code&gt;，改过安装路径的去找对应目录）。&lt;/li&gt;
&lt;li&gt;打开该目录的 &lt;code&gt;config.toml&lt;/code&gt;，检查是否包含 &lt;code&gt;model = &quot;deepseek-v4-flash&quot;&lt;/code&gt; 之类的模型行和 &lt;code&gt;[model_providers.custom]&lt;/code&gt; 配置块。&lt;/li&gt;
&lt;li&gt;打开同目录的 &lt;code&gt;auth.json&lt;/code&gt;，检查 &lt;code&gt;auth_mode&lt;/code&gt; 是否已从 &lt;code&gt;chatgpt&lt;/code&gt; 变为 api-key 模式。&lt;/li&gt;
&lt;li&gt;两处只改了一处 → 把没改的那份补齐，或从备份恢复后重新操作。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;修复（推荐用备份恢复）&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;CC Switch 每次改配置前会自动备份，文件名带时间戳，如 &lt;code&gt;config.toml.bak.20260602121223&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;找到切换前的正确备份，&lt;strong&gt;两个文件一起&lt;/strong&gt;覆盖回去，再在 CC Switch 里重新操作一遍。&lt;/li&gt;
&lt;li&gt;有 Claude Code / opencode 等本地 agent 的话，直接把两个文件路径丢给它，让它对比差异并修复，效率远高于手动翻。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 4：切回 GPT-5.5 后依然显示国产模型&lt;a href=&quot;#问题-4切回-gpt-55-后依然显示国产模型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：与问题 1 同源。禁用了 DeepSeek，但 &lt;code&gt;auth.json&lt;/code&gt; 仍停留在 api-key 模式，或 &lt;code&gt;config.toml&lt;/code&gt; 里残留 &lt;code&gt;[model_providers.custom]&lt;/code&gt; 配置。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;用 CC Switch 的备份（或你自己手动备份的）把 &lt;code&gt;config.toml&lt;/code&gt; 和 &lt;code&gt;auth.json&lt;/code&gt; &lt;strong&gt;同时&lt;/strong&gt;恢复到切换之前的状态。&lt;/li&gt;
&lt;li&gt;重启 Codex，重新登录 ChatGPT 账号。&lt;/li&gt;
&lt;li&gt;恢复后插件、历史会话会一起回来。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 10：切换模型后会话记录全没了、插件变灰&lt;a href=&quot;#问题-10切换模型后会话记录全没了插件变灰&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;这不是 bug，也不是数据丢失。&lt;/strong&gt; 切换模型等于换了一套认证体系，Codex 把你当成了新用户，所以旧会话和插件暂时不可见。&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;CC Switch 升级到 &lt;strong&gt;v3.16.1+&lt;/strong&gt; 后，切回原模型的流程已修复：切回 GPT-5.5 且配置恢复正确，会话记录、插件全部原样回来。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实操建议&lt;/strong&gt;：切到国产模型前，重要会话内容先复制出来存一份；用完切回即可，不用慌。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、请求类问题（路由断了）&lt;a href=&quot;#三请求类问题路由断了&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;问题 2：能用了，但一发图片就报错&lt;a href=&quot;#问题-2能用了但一发图片就报错&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;典型报错&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CC Switch local proxy failed while handling Codex endpoint /responses.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Provider: DeepSeek; model: deepseek-v4-flash; upstream_status: HTTP 400;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cause: Failed to deserialize the JSON body into the target type:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;messages[6]: unknown variant `image_url`, expected `text`&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：&lt;strong&gt;部分模型不支持图片输入&lt;/strong&gt;，与 CC Switch 和你的配置都无关。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;最坑的一点&lt;/strong&gt;：一旦某会话里发过图片报错，该会话后续&lt;strong&gt;纯文字也会持续报错&lt;/strong&gt;——因为 Codex 每次都会把含图片的历史消息一起发给 API。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 3：API Key 明明正确，却报 401&lt;a href=&quot;#问题-3api-key-明明正确却报-401&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;典型报错&lt;/strong&gt;：&lt;code&gt;unexpected status 401 Unauthorized: Incorrect API key provided: sk-bb527*****0175&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：CC Switch 输入框的玄学问题——复制粘贴进去的 Key 可能夹带首尾空格、不可见字符，甚至保存时出现乱码。肉眼看不出来。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;（注意顺序）：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先关掉 Codex&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;在 CC Switch 里删除该供应商的 API Key。&lt;/li&gt;
&lt;li&gt;重新去服务商后台&lt;strong&gt;重新复制一次&lt;/strong&gt; Key，粘贴保存。&lt;/li&gt;
&lt;li&gt;再打开 Codex。&lt;/li&gt;
&lt;li&gt;还不行就&lt;strong&gt;手动输入&lt;/strong&gt; Key（反人类但能彻底排除剪贴板问题）。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 9：启动报错，或每个请求都 404&lt;a href=&quot;#问题-9启动报错或每个请求都-404&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：&lt;code&gt;wire_api = &quot;chat&quot;&lt;/code&gt;。Codex 在 2026 年 2 月移除了旧的 chat/completions 路径，&lt;code&gt;responses&lt;/code&gt; 现在是唯一合法取值（也是默认值）。或者你的网关根本没有 &lt;code&gt;/responses&lt;/code&gt; 端点。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[model_providers.custom]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wire_api = &quot;responses&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;base_url = &quot;https://你的网关地址/v1&quot;   # 以 /v1 结尾，末尾不带斜杠&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;网关必须在 &lt;code&gt;{base_url}/responses&lt;/code&gt; 暴露 OpenAI 兼容的 Responses 端点。只支持 &lt;code&gt;/chat/completions&lt;/code&gt; 的网关会让每个请求 404——看起来像模型问题，实际是协议不匹配。&lt;/li&gt;
&lt;li&gt;顺带检查：&lt;code&gt;base_url&lt;/code&gt; 末尾多一个斜杠或路径写错，会导致连接时不时被重置。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;附：其他伪装成显示问题的路由错误&lt;a href=&quot;#附其他伪装成显示问题的路由错误&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;
























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;症状&lt;/th&gt;&lt;th&gt;真正原因&lt;/th&gt;&lt;th&gt;修复&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;每个请求 401（手写配置场景）&lt;/td&gt;&lt;td&gt;配了 &lt;code&gt;env_key&lt;/code&gt; 但环境变量从未导出&lt;/td&gt;&lt;td&gt;在 shell 配置里 &lt;code&gt;export XXX_API_KEY=sk-...&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;模型能跑但返回错误的输出&lt;/td&gt;&lt;td&gt;目录里的 &lt;code&gt;slug&lt;/code&gt; 与 provider 实际模型 ID 不一致&lt;/td&gt;&lt;td&gt;&lt;code&gt;slug&lt;/code&gt; 改成与发送给 provider 的字符串&lt;strong&gt;逐字符一致&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;curl 网关返回 model-not-found&lt;/td&gt;&lt;td&gt;模型字符串写错&lt;/td&gt;&lt;td&gt;核对服务商后台的模型 ID，别猜&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、显示类问题（路由通了，桌面版看不见）&lt;a href=&quot;#四显示类问题路由通了桌面版看不见&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;问题 5：选择器只显示 “Custom”，没有模型名&lt;a href=&quot;#问题-5选择器只显示-custom没有模型名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：你只在 &lt;code&gt;config.toml&lt;/code&gt; 里内联写了 &lt;code&gt;model = &quot;xxx&quot;&lt;/code&gt;，没有模型目录，选择器没有可展示的元数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结论：这是正常现象，不用修。&lt;/strong&gt; 请求会正常发往你的模型。如果不在乎下拉列表好不好看，到这里就可以停了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 6：模型名称位置显示空白&lt;a href=&quot;#问题-6模型名称位置显示空白&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：&lt;code&gt;[model_providers.custom]&lt;/code&gt; 配置块下缺少 &lt;code&gt;name&lt;/code&gt; 字段（Windows 上 CC Switch 偶尔写入不完整）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：手动补上，重启 Codex：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[model_providers.custom]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;name = &quot;deepseek&quot;        # ← 就是这个字段控制界面显示名称&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;base_url = &quot;https://api.deepseek.com&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wire_api = &quot;responses&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;name&lt;/code&gt; 的值随意，写你能认出来的名字即可（“deepseek”、“qwen” 都行）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 7：CLI 的 /model 能列出模型，桌面版选择器没有&lt;a href=&quot;#问题-7cli-的-model-能列出模型桌面版选择器没有&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：Codex 桌面版的&lt;strong&gt;客户端过滤缺陷&lt;/strong&gt;（openai/codex issue #19694，2026-04-26 提交，截至目前未关闭）。app-server 的 &lt;code&gt;model/list&lt;/code&gt; 端点正常返回了你的模型，但桌面版渲染层在到达下拉列表前把本地配置的条目丢掉了。&lt;strong&gt;后端知道你的模型，前端拒绝显示。改配置修不好。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复（按顺序）&lt;/strong&gt;：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复 A——内联模型绕行（永远管用，最先做）&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# ~/.codex/config.toml（用户级，不是项目文件夹里）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;model = &quot;moonshotai/kimi-k2.7-code&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;model_provider = &quot;custom&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[model_providers.custom]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;name = &quot;myprovider&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;base_url = &quot;https://你的网关/v1&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;env_key = &quot;MY_API_KEY&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;wire_api = &quot;responses&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;彻底退出 Codex 桌面版再重开。选择器显示 “Custom” 无妨，请求都会发往正确模型。换模型只需改 &lt;code&gt;model&lt;/code&gt; 那一行字符串。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复 B——加模型目录，让选择器显示真名&lt;/strong&gt;：在 &lt;code&gt;config.toml&lt;/code&gt; 顶部加 &lt;code&gt;model_catalog_json&lt;/code&gt; 指向一个 JSON 文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;model_catalog_json = &quot;C:/Users/你/.codex/my-models.json&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;最小目录条目：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;models&quot;: [&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;slug&quot;: &quot;moonshotai/kimi-k2.7-code&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;display_name&quot;: &quot;Kimi K2.7 Code&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;description&quot;: &quot;Coding model via gateway&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;context_window&quot;: 262000,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;max_context_window&quot;: 262000,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;supported_in_api&quot;: true,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;visibility&quot;: &quot;list&quot;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;priority&quot;: 1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;slug&lt;/code&gt; 必须等于发给 provider 的模型字符串。目录只在&lt;strong&gt;启动时&lt;/strong&gt;读取一次，改动后必须重启桌面版。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 8：选择器下拉列表整个是空的&lt;a href=&quot;#问题-8选择器下拉列表整个是空的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：早于 &lt;strong&gt;v3.16.5&lt;/strong&gt; 的 CC Switch 生成的目录格式与 Codex 选择器期望的对不上（cc-switch issue #3668），路由正常但 &lt;code&gt;/model&lt;/code&gt; 返回空。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;升级 CC Switch 到 v3.16.5 或更高版本&lt;/strong&gt;——该版本会为使用原生 Responses 端点（&lt;code&gt;apiFormat: &quot;openai_responses&quot;&lt;/code&gt;）的供应商生成 &lt;code&gt;~/.codex/cc-switch-model-catalog.json&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;升级后必须把每个原生 provider 重新保存一次&lt;/strong&gt;——目录只在保存时重新生成，旧 provider 不会自动迁移。&lt;/li&gt;
&lt;li&gt;验证目录已生成：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Windows PowerShell 里用 findstr 代替 grep&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat ~/.codex/cc-switch-model-catalog.json | grep -o &apos;&quot;slug&quot;:[^,]*&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 如果为空，回 CC Switch 重新保存该 provider 后再查&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;v3.16.5 的两个注意点&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;目录生成与”本地路由”开关已解耦：无论本地路由是否开启，原生 Responses 供应商都会生成目录；Chat 格式供应商仍走代理转换。&lt;/li&gt;
&lt;li&gt;少数国产模型（MiMo、LongCat、MiniMax、Qwen3-Coder）的网关不支持 OpenAI 内置 &lt;code&gt;web_search&lt;/code&gt;，v3.16.5 默认对它们关闭该工具以避免 400 报错——预期这些模型的网络搜索不可用，不是故障。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 11：启动时打印 provider 被忽略的警告&lt;a href=&quot;#问题-11启动时打印-provider-被忽略的警告&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：&lt;code&gt;model_provider&lt;/code&gt; / &lt;code&gt;model_providers&lt;/code&gt; 写在了项目级 &lt;code&gt;.codex/config.toml&lt;/code&gt;（某个仓库目录里）。provider 定义&lt;strong&gt;只在用户级 &lt;code&gt;~/.codex/config.toml&lt;/code&gt; 生效&lt;/strong&gt;，项目级的会被忽略并打印警告。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 检查 provider 到底写在哪个文件&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;grep -rn &quot;model_providers&quot; ~/.codex/config.toml ./.codex/config.toml 2&amp;gt;/dev/null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;把 &lt;code&gt;[model_providers.*]&lt;/code&gt; 配置块和 &lt;code&gt;model_provider = &quot;...&quot;&lt;/code&gt; 挪到 &lt;code&gt;~/.codex/config.toml&lt;/code&gt;，项目级配置只留仓库专属内容（如指令文件）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;问题 12：配置全对，但列表还是旧的/空的&lt;a href=&quot;#问题-12配置全对但列表还是旧的空的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;根因&lt;/strong&gt;：&lt;code&gt;~/.codex/models_cache.json&lt;/code&gt; 缓存过期。切换 provider 或编辑目录后它不总会重新同步。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修复&lt;/strong&gt;：&lt;strong&gt;删掉 &lt;code&gt;models_cache.json&lt;/code&gt;&lt;/strong&gt;，下次启动会强制重建。在断定目录本身出错之前，先试这一招。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、通用排查流程（一张图记住）&lt;a href=&quot;#五通用排查流程一张图记住&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;桌面版看不到模型 / 切换不生效&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;终端运行 codex（CLI），输入 /model&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;┌────┴────┐&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;CLI 也失败   CLI 正常、只有桌面版不行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│              │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼              ▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;路由问题        显示问题（#19694 过滤）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;检查：          处理：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;· config/auth   · 修复 A：内联 model 绕行&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;两文件是否     · 修复 B：补 model_catalog_json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;同步且路径对   · CC Switch 升 v3.16.5+&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;· wire_api=     并逐个重新保存 provider&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;responses&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;· Key 无空格    仍不行：&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;乱码          · 删 models_cache.json&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;· base_url      · 检查 name 字段&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;以 /v1 结尾&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;验证模型真正加载的可靠方法&lt;/strong&gt;：不要相信选择器（坏的就是它），在更下层验证——&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;CLI 里 &lt;code&gt;/model&lt;/code&gt; 能列出 → 目录和 provider 都正确；&lt;/li&gt;
&lt;li&gt;用密钥对网关直接 &lt;code&gt;curl {base_url}/responses&lt;/code&gt; → 确认路由本身能解析；&lt;/li&gt;
&lt;li&gt;用网关的话，在网关的请求日志面板确认模型路由命中了预期后端。&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、操作规范与预防（比修复更重要）&lt;a href=&quot;#六操作规范与预防比修复更重要&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;任何切换前先手动备份&lt;/strong&gt; &lt;code&gt;config.toml&lt;/code&gt; 和 &lt;code&gt;auth.json&lt;/code&gt;。CC Switch 虽会自动备份（&lt;code&gt;.bak.时间戳&lt;/code&gt;），但自己再存一份双保险。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;操作顺序铁律：先关 Codex → 改配置 → 再开 Codex&lt;/strong&gt;。顺序反了，很多”不生效”就是这么来的。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CC Switch 保持最新版&lt;/strong&gt;。v3.16.1 修复了切换后会话丢失，v3.16.5 修复了目录格式。很多坑在新版本已经不存在。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;切换三种场景速查&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;官方 → 国产：关 Codex → CC Switch 加供应商填 Key → 设置里开路由总开关+Codex 路由 → 启用供应商 → 开 Codex。&lt;/li&gt;
&lt;li&gt;国产 → 官方：关 Codex → 禁用供应商 → 关路由 → 开 Codex 重新登录（配置乱了就用备份恢复）。&lt;/li&gt;
&lt;li&gt;国产 A → 国产 B：关 Codex → 直接启用新供应商（旧的自动禁用）→ 开 Codex，路由不用动。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;善用本地 agent 排查&lt;/strong&gt;：把 &lt;code&gt;config.toml&lt;/code&gt;、&lt;code&gt;auth.json&lt;/code&gt; 和备份文件丢给 Claude Code / opencode，让它对比差异并修复，比手动翻文件高效得多。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;</content:encoded></item><item><title>Hello World</title><link>https://blog.youzhiqing.com/posts/hello-world/</link><guid isPermaLink="true">https://blog.youzhiqing.com/posts/hello-world/</guid><description>每个人的博客都有第一篇帖子，这就是我的。记录生活，分享技术，持续成长。</description><pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello World&lt;/p&gt;
&lt;p&gt;每个人的博客，大概都是从这一篇开始的。我的也一样，就当是个开场白。
为什么会想写博客？
说白了，这么多年在网上找答案，没少蹭过前辈们认真写下的博客文章。很所以现在我也想自己留点东西——学到的、想到的、踩过的坑，都记一记。
这个博客是用 Firefly 搭的，基于 Astro，算是 Fuwari 的一个分支主题。挑它没别的原因，好看。
以后大概会写点什么：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;技术学习笔记&lt;/li&gt;
&lt;li&gt;做项目时的那些经验和教训&lt;/li&gt;
&lt;li&gt;读过的书，顺手写两句&lt;/li&gt;
&lt;li&gt;生活里零零碎碎的碎碎念&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;顺便交代一下我自己：平时喜欢看动漫《某科学的超电磁炮》，闲了就随便听听歌？（浅影阿），&lt;/p&gt;
&lt;p&gt;第一篇就先写到这里，算是正式开张。&lt;/p&gt;
&lt;p&gt;希望这儿能变成一个安安静静的小角落，把我成长路上的每一步都留个底。有空常来坐坐 ✨&lt;/p&gt;
&lt;p&gt;— 莜之箐&lt;/p&gt;</content:encoded></item><item><title>npm 全局安装的 CLI 工具报&quot;不支持的 16 位应用程序 / 不是有效应用程序&quot;——通用修复笔记</title><link>https://blog.youzhiqing.com/posts/npm-cli-windows-binary-fix/</link><guid isPermaLink="true">https://blog.youzhiqing.com/posts/npm-cli-windows-binary-fix/</guid><description>Windows 上通过 npm 全局安装的 CLI 工具运行时报&quot;不支持的 16 位应用程序&quot;的通用修复方案，适用于 Claude Code、OpenCode 等 npm 包装器 + 原生 exe 结构的工具。</description><pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;适用范围：Windows 10 / 11 64 位，通过 &lt;code&gt;npm install -g&lt;/code&gt; 安装、但运行时报”原生二进制不兼容”的一类 CLI 工具。
典型受害者：Claude Code（&lt;code&gt;claude&lt;/code&gt;）、OpenCode（&lt;code&gt;opencode&lt;/code&gt;），以及其它”npm 包装器 + 原生 exe”结构的工具。
本文使用 &lt;code&gt;$env:APPDATA&lt;/code&gt; 等环境变量占位，&lt;strong&gt;命令在任意机器通用&lt;/strong&gt;，无需关心用户名、盘符、版本号。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;一、问题现象&lt;a href=&quot;#一问题现象&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过 &lt;code&gt;npm install -g&lt;/code&gt; 安装后，在终端输入工具名（如 &lt;code&gt;claude&lt;/code&gt;、&lt;code&gt;opencode&lt;/code&gt;）或运行其 &lt;code&gt;.exe&lt;/code&gt; 时失败。&lt;/p&gt;&lt;p&gt;典型报错（任选其一，本质相同）：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;弹窗：&lt;strong&gt;不支持的 16 位应用程序&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;弹窗：&lt;strong&gt;由于与 64 位版本的 Windows 不兼容，此程序或功能无法启动或运行&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;PowerShell：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Program &apos;claude.exe&apos; failed to run: ... The specified executable is not a valid application for this OS platform.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;部分用户还会看到：&lt;strong&gt;claude.exe 与你运行的 Windows 版本不兼容&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;共同特征&lt;/strong&gt;：报错路径永远指向
&lt;code&gt;...\node_modules\&amp;lt;包名&amp;gt;\bin\&amp;lt;工具名&amp;gt;.exe&lt;/code&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、根本原因&lt;a href=&quot;#二根本原因&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这类工具在 npm 上的”主包”只是一个&lt;strong&gt;启动器（wrapper）&lt;/strong&gt;，本身不含真正可执行的原生二进制；真正的 &lt;code&gt;.exe&lt;/code&gt; 来自独立的&lt;strong&gt;平台原生包&lt;/strong&gt;（命名形如 &lt;code&gt;*-win32-x64&lt;/code&gt;、&lt;code&gt;*-windows-x64&lt;/code&gt;）。&lt;/p&gt;&lt;p&gt;安装时，主包的 &lt;code&gt;postinstall&lt;/code&gt; 脚本应把原生二进制复制/链接到 &lt;code&gt;bin/&amp;lt;工具名&amp;gt;.exe&lt;/code&gt;。当该步骤因以下原因失败时：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;国内网络被墙，无法从 GitHub / 官网下载原生二进制；&lt;/li&gt;
&lt;li&gt;安全软件 / 杀毒拦截了写入；&lt;/li&gt;
&lt;li&gt;旧版本残留污染了 PATH 或目录；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;~/.npmrc&lt;/code&gt; 里设了 &lt;code&gt;ignore-scripts=true&lt;/code&gt;&lt;/strong&gt;：这会全局禁止 npm 执行安装脚本（含 postinstall），原生二进制因此&lt;strong&gt;完全不会被放置&lt;/strong&gt;，最终 &lt;code&gt;bin/&amp;lt;工具名&amp;gt;.exe&lt;/code&gt; 必然是 stub。装完会直接报错 &lt;code&gt;claude native binary not installed. Either postinstall did not run (--ignore-scripts...)&lt;/code&gt;。&lt;strong&gt;该情况必须靠「手动复制真实二进制覆盖 stub」修复，npm 自身不会帮你放好。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;~/.npmrc&lt;/code&gt; 里设了 &lt;code&gt;min-release-age=N&lt;/code&gt;&lt;/strong&gt;：会忽略发布不到 N 天的新版本，等效于给 npm 加了 &lt;code&gt;before = 今天-N天&lt;/code&gt; 的日期过滤器。升级到较新版本（如 &lt;code&gt;npm install -g &amp;lt;包&amp;gt;@&amp;lt;新版&amp;gt;&lt;/code&gt;）时会直接报 &lt;code&gt;ETARGET ... No matching version found ... with a date before &amp;lt;某日期&amp;gt;&lt;/code&gt;。注意：&lt;code&gt;npm view &amp;lt;包&amp;gt;@&amp;lt;新版&amp;gt;&lt;/code&gt; 能查到（它不过滤日期），但 &lt;code&gt;npm install&lt;/code&gt; 会装不了。&lt;strong&gt;修复：删掉该限制&lt;/strong&gt;（&lt;code&gt;npm config delete min-release-age&lt;/code&gt;，恢复后可 &lt;code&gt;npm config set min-release-age=N&lt;/code&gt; 重新加回），再安装。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;bin/&amp;lt;工具名&amp;gt;.exe&lt;/code&gt; 会残留为一个&lt;strong&gt;无效的占位 stub&lt;/strong&gt;（几百字节到几 KB）。Windows 无法将其识别为合法的 64 位 PE 文件，于是报上述错误。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：文件并未真的损坏，本质是&lt;strong&gt;原生二进制没有落位到正确路径&lt;/strong&gt;。修复方式 = 找到真实二进制，覆盖占位文件。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、前置说明：该用哪个终端、怎么复制命令&lt;a href=&quot;#三前置说明该用哪个终端怎么复制命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;全程使用 &lt;strong&gt;PowerShell（建议”以管理员身份运行”）&lt;/strong&gt;，可避免全局目录写权限问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要&lt;/strong&gt;把 Markdown 代码块的行首 ``` 和语言标识（如 &lt;code&gt;powershell&lt;/code&gt;、&lt;code&gt;bash&lt;/code&gt;）一起复制——它们不是命令，复制进去会报”无法识别的术语”。&lt;/li&gt;
&lt;li&gt;本笔记所有命令均为 PowerShell 语法；若只用 Git Bash，核心 &lt;code&gt;npm&lt;/code&gt; 命令一致，但 &lt;code&gt;Remove-Item&lt;/code&gt; / &lt;code&gt;Copy-Item&lt;/code&gt; / &lt;code&gt;$env:APPDATA&lt;/code&gt; 需改写为 Bash 等价写法，故统一给 PowerShell。&lt;/li&gt;
&lt;li&gt;国内用户必须走 &lt;strong&gt;npmmirror 国内镜像&lt;/strong&gt;（步骤 3），不要从官方源 &lt;code&gt;registry.npmjs.org&lt;/code&gt; 装，否则会超时。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、分步解决方案&lt;a href=&quot;#四分步解决方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;步骤 1：彻底清理旧的无效残留（必须）&lt;a href=&quot;#步骤-1彻底清理旧的无效残留必须&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;以管理员身份打开 PowerShell，逐行执行（只复制命令本身，不含 ``` 等格式符）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm uninstall -g @anthropic-ai/claude-code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm uninstall -g @anthropic-ai/claude-code-win32-x64&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm uninstall -g opencode-ai&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remove-Item -Force -Recurse &quot;$env:APPDATA\npm\claude.cmd&quot; -ErrorAction SilentlyContinue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remove-Item -Force -Recurse &quot;$env:APPDATA\npm\claude.ps1&quot; -ErrorAction SilentlyContinue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remove-Item -Force -Recurse &quot;$env:APPDATA\npm\claude&quot; -ErrorAction SilentlyContinue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remove-Item -Force -Recurse &quot;$env:APPDATA\npm\opencode.cmd&quot; -ErrorAction SilentlyContinue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remove-Item -Force -Recurse &quot;$env:APPDATA\npm\opencode.ps1&quot; -ErrorAction SilentlyContinue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remove-Item -Force -Recurse &quot;$env:APPDATA\npm\opencode&quot; -ErrorAction SilentlyContinue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remove-Item -Force -Recurse &quot;$env:APPDATA\npm\node_modules\@anthropic-ai&quot; -ErrorAction SilentlyContinue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remove-Item -Force -Recurse &quot;$env:APPDATA\npm\node_modules\opencode-ai&quot; -ErrorAction SilentlyContinue&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm cache clean --force&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;只装了其中一个工具？把对应的行删掉即可，其余照跑无妨。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤 2：确认清理干净&lt;a href=&quot;#步骤-2确认清理干净&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;where.exe claude&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;where.exe opencode&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;两条都&lt;strong&gt;没有任何输出&lt;/strong&gt;（直接回到提示符）即为成功。若仍有路径输出，手动删除对应文件后重试本步骤。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤 3：设置国内镜像（国内用户必做，一次性）&lt;a href=&quot;#步骤-3设置国内镜像国内用户必做一次性&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm config set registry https://registry.npmmirror.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm config get registry&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;第二条应返回 &lt;code&gt;https://registry.npmmirror.com&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤 4：重新安装主包 + 平台原生包&lt;a href=&quot;#步骤-4重新安装主包--平台原生包&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;把 &lt;code&gt;&amp;lt;版本号&amp;gt;&lt;/code&gt; 替换为你需要的版本（Claude Code 社区验证可用的稳定版本如 &lt;code&gt;2.1.112&lt;/code&gt;；OpenCode 用 &lt;code&gt;latest&lt;/code&gt; 即可）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Claude Code：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install -g @anthropic-ai/claude-code@&amp;lt;版本号&amp;gt; --registry=https://registry.npmmirror.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install -g @anthropic-ai/claude-code-win32-x64@&amp;lt;版本号&amp;gt; --registry=https://registry.npmmirror.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;OpenCode：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm install -g opencode-ai --registry=https://registry.npmmirror.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;OpenCode 的 Windows 原生包会在安装 &lt;code&gt;opencode-ai&lt;/code&gt; 时作为依赖自动拉取（位于 &lt;code&gt;opencode-ai\node_modules\opencode-windows-x64...&lt;/code&gt;），但 postinstall 可能因网络无法把它链接进 &lt;code&gt;bin/&lt;/code&gt;。这正是下一步”手动定位并复制”要补齐的。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤 5（关键·通用）：定位真实的原生二进制&lt;a href=&quot;#步骤-5关键通用定位真实的原生二进制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这一步&lt;strong&gt;不依赖固定路径&lt;/strong&gt;，直接在整个 npm 全局目录里搜索同名 exe，由你根据输出确认哪个是”真货”。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Claude Code：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Get-ChildItem &quot;$env:APPDATA\npm\node_modules&quot; -Recurse -Filter &quot;claude.exe&quot; -ErrorAction SilentlyContinue | ForEach-Object { &quot;{0}   大小:{1}字节&quot; -f $_.FullName, $_.Length }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;OpenCode：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Get-ChildItem &quot;$env:APPDATA\npm\node_modules&quot; -Recurse -Filter &quot;opencode.exe&quot; -ErrorAction SilentlyContinue | ForEach-Object { &quot;{0}   大小:{1}字节&quot; -f $_.FullName, $_.Length }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;解读输出（重点）：&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;路径形如 &lt;code&gt;...\node_modules\@anthropic-ai\claude-code\bin\claude.exe&lt;/code&gt;（或 &lt;code&gt;...\opencode-ai\bin\opencode.exe&lt;/code&gt;），且&lt;strong&gt;大小只有几百字节到几 KB&lt;/strong&gt; 的 = &lt;strong&gt;占位 stub&lt;/strong&gt;（报错指向的那个，待覆盖）。&lt;/li&gt;
&lt;li&gt;路径里包含 &lt;code&gt;win32-x64&lt;/code&gt; / &lt;code&gt;windows-x64&lt;/code&gt; 等字样（如 &lt;code&gt;...\node_modules\opencode-ai\node_modules\opencode-windows-x64\bin\opencode.exe&lt;/code&gt; 或 &lt;code&gt;...\node_modules\@anthropic-ai\claude-code-win32-x64\bin\claude.exe&lt;/code&gt;），且&lt;strong&gt;大小为几 MB 到几十 MB&lt;/strong&gt; 的 = &lt;strong&gt;真实原生二进制&lt;/strong&gt;（复制来源）。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;把这两个路径记下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;占位 stub 路径&lt;/code&gt;（待覆盖）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;真实二进制路径&lt;/code&gt;（来源）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤 6：复制真实二进制覆盖占位文件&lt;a href=&quot;#步骤-6复制真实二进制覆盖占位文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;把上一步记下的两个路径，分别替换到下面命令的 &lt;code&gt;&amp;lt;真实二进制完整路径&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;占位stub完整路径&amp;gt;&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item -Force &quot;&amp;lt;真实二进制完整路径&amp;gt;&quot; &quot;&amp;lt;占位stub完整路径&amp;gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;示例（以 OpenCode 为例，路径以你机器实际输出为准）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item -Force &quot;C:\Users\21186\AppData\Roaming\npm\node_modules\opencode-ai\node_modules\opencode-windows-x64\bin\opencode.exe&quot; &quot;C:\Users\21186\AppData\Roaming\npm\node_modules\opencode-ai\bin\opencode.exe&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;为稳妥，可顺手再覆盖一层全局 &lt;code&gt;npm/&amp;lt;工具名&amp;gt;.exe&lt;/code&gt;，确保 &lt;code&gt;where&lt;/code&gt; 解析到的也是真货：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item -Force &quot;&amp;lt;真实二进制完整路径&amp;gt;&quot; &quot;$env:APPDATA\npm\&amp;lt;工具名&amp;gt;.exe&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;若真实二进制有多个候选（如同时出现 &lt;code&gt;opencode-windows-x64&lt;/code&gt; 与 &lt;code&gt;opencode-windows-x64-baseline&lt;/code&gt;），优先用&lt;strong&gt;不带 &lt;code&gt;-baseline&lt;/code&gt;&lt;/strong&gt; 的那个；若仍报错，再换 &lt;code&gt;-baseline&lt;/code&gt; 版本重试。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;OpenCode 升级后”检测到多处安装 / 默认无法运行”的必做项：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;OpenCode 自身的安装自检会扫描多个标准位置，并把 &lt;code&gt;C:\Users\&amp;lt;用户&amp;gt;\AppData\Roaming\npm\opencode.exe&lt;/code&gt;（顶层）标记为”默认”入口。它的 npm postinstall 在升级时会把&lt;strong&gt;顶层 &lt;code&gt;npm\opencode.exe&lt;/code&gt; 也写成一个坏壳&lt;/strong&gt;，而你运行 &lt;code&gt;opencode&lt;/code&gt; 时命令行实际就走这个”默认”位置。因此 OpenCode 必须&lt;strong&gt;同时覆盖两处&lt;/strong&gt;才算彻底修好：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$real = &quot;&amp;lt;真实二进制完整路径，取自步骤 5 输出中较大的那个&amp;gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item -Force $real &quot;$env:APPDATA\npm\node_modules\opencode-ai\bin\opencode.exe&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item -Force $real &quot;$env:APPDATA\npm\opencode.exe&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opencode --version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;只覆盖 &lt;code&gt;bin/&lt;/code&gt; 下的 stub 而漏掉顶层 &lt;code&gt;npm\opencode.exe&lt;/code&gt;，就是”升级一次就复发”的根因。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;步骤 7：验证&lt;a href=&quot;#步骤-7验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;claude --version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;opencode --version&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;预期：正常输出版本号，且&lt;strong&gt;不弹出&lt;/strong&gt;”16 位应用程序 / 不兼容”窗口。到此两个工具均修复完成。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、常见疑问&lt;a href=&quot;#五常见疑问&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：为什么不能只装主包就完事？&lt;/strong&gt;
A：主包不含原生 exe，必须依赖平台包；而 npm 在国内的 postinstall 链接步骤常因下载被墙失败，原生二进制没进 &lt;code&gt;bin/&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：WinGet / 官方安装脚本为什么不算正解？&lt;/strong&gt;
A：两者最终都从 &lt;code&gt;downloads.claude.ai&lt;/code&gt; / &lt;code&gt;claude.ai&lt;/code&gt; 下载，国内直连不通，会卡在下载阶段。本方案走 npm 国内镜像，可落地。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：会不会每次更新都复发？&lt;/strong&gt;
A：有可能。若 &lt;code&gt;npm update -g&lt;/code&gt; 后再次出现相同报错，直接重做「步骤 5 ～ 步骤 6」（定位真实二进制并复制）即可，无需重新安装。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：运行 &lt;code&gt;opencode&lt;/code&gt; 提示”检测到多处安装”，并标记 &lt;code&gt;AppData\Roaming\npm\opencode.exe&lt;/code&gt; 为”默认”且无法运行，怎么办？&lt;/strong&gt;
A：这是 OpenCode 自身的安装自检，说明顶层 &lt;code&gt;npm\opencode.exe&lt;/code&gt; 这个”默认”入口是坏的。npm postinstall 在升级时会把它写成坏壳。必须按上面的 OpenCode 必做项，&lt;strong&gt;同时&lt;/strong&gt;把真实二进制复制覆盖到 &lt;code&gt;node_modules\opencode-ai\bin\opencode.exe&lt;/code&gt; 与顶层 &lt;code&gt;npm\opencode.exe&lt;/code&gt; 两处，再验证。仅覆盖一处仍会复发。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：怎么避免以后再复发？&lt;/strong&gt;
A：根因是 npm 每次 &lt;code&gt;install&lt;/code&gt; / &lt;code&gt;update&lt;/code&gt; 都会重跑 postinstall、把 stub 重置回坏壳。已修好后，尽量不要执行 &lt;code&gt;npm update -g opencode-ai&lt;/code&gt;；若确实需要升级版本，升级完成后重做一次「步骤 5 ～ 步骤 6」的复制即可。对追求一劳永逸的用户，可改用 Scoop（&lt;code&gt;scoop install opencode&lt;/code&gt;，二进制直接落 &lt;code&gt;~/scoop/apps/opencode/current/opencode.exe&lt;/code&gt;）或手动从 GitHub Releases（走国内可达镜像）下载原生二进制放入 PATH，彻底绕开 npm 包装器。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：其它同类工具（也是 npm 包装器 + 原生 exe）能用同样方法吗？&lt;/strong&gt;
A：能。把全文的 &lt;code&gt;claude&lt;/code&gt; / &lt;code&gt;opencode&lt;/code&gt; 换成对应工具名，按步骤 5 搜索其 &lt;code&gt;.exe&lt;/code&gt;，找到 &lt;code&gt;*-win32-x64&lt;/code&gt; / &lt;code&gt;*-windows-x64&lt;/code&gt; 下的真实二进制，覆盖 &lt;code&gt;bin/&lt;/code&gt; 下的占位文件即可。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：运行 &lt;code&gt;opencode&lt;/code&gt; 时它提示”当前 1.18.11，最新 1.18.15，可升级”，是不是我又装错了？&lt;/strong&gt;
A：不是装错。这里出现两个版本号是&lt;strong&gt;两个不同来源&lt;/strong&gt;：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;当前版本 1.18.11&lt;/code&gt;：来自你通过 npm 安装的 &lt;code&gt;opencode-ai&lt;/code&gt; 主包版本（npm 源上当前最新的就是 1.18.11）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;最新版本 1.18.15&lt;/code&gt;：来自 OpenCode 运行时联网去 &lt;strong&gt;GitHub Releases&lt;/strong&gt; 检测到的版本（GitHub 上已发 1.18.15）。
两者版本号不同步是常态。你手动复制的真实原生二进制配套的也是 1.18.11，所以当前能用。&lt;strong&gt;只要能正常运行，这行提示可以忽略，不必理会。&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Q：想升级到 1.18.15（或其它新版）该怎么安全地升？&lt;/strong&gt;
A：&lt;strong&gt;千万不要在 &lt;code&gt;opencode&lt;/code&gt; 交互界面里点”升级”&lt;/strong&gt;，那会去 GitHub 下载并重置 stub，大概率又回到坏壳状态（国内还常被墙）。正确做法二选一：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;方案甲（仍走 npm，前提是 npm 源已发布该版本）：先 &lt;code&gt;npm install -g opencode-ai@&amp;lt;目标版本&amp;gt; --registry=https://registry.npmmirror.com&lt;/code&gt;，装完&lt;strong&gt;重做「步骤 5～6」&lt;/strong&gt;（定位新版本的真实原生二进制并复制到两处）。若 &lt;code&gt;npm install&lt;/code&gt; 报 &lt;code&gt;No matching version&lt;/code&gt;，说明 npm 源还没发该版，改用方案乙。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;方案乙（手动落二进制，一劳永逸，推荐）：从 GitHub Releases 下载对应版本的 &lt;code&gt;opencode-windows-x64.zip&lt;/code&gt;，解压出 &lt;code&gt;opencode.exe&lt;/code&gt;，手动覆盖到顶层 &lt;code&gt;npm\opencode.exe&lt;/code&gt;、&lt;code&gt;node_modules\opencode-ai\bin\opencode.exe&lt;/code&gt;、以及平台包 &lt;code&gt;node_modules\opencode-ai\node_modules\opencode-windows-x64\bin\opencode.exe&lt;/code&gt; 三处（覆盖平台包可避免自检报”多处安装”），再 &lt;code&gt;opencode --version&lt;/code&gt; 验证。PowerShell 具体步骤（把 &lt;code&gt;v&amp;lt;VERSION&amp;gt;&lt;/code&gt; 换成目标版本，如 &lt;code&gt;v1.18.15&lt;/code&gt;；国内若 &lt;code&gt;ghproxy.com&lt;/code&gt; 不通，换成 &lt;code&gt;ghproxy.net&lt;/code&gt; 或删掉该前缀直连 &lt;code&gt;github.com&lt;/code&gt;）：&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$url&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;https://ghproxy.com/https://github.com/anomalyco/opencode/releases/download/v&amp;lt;VERSION&amp;gt;/opencode-windows-x64.zip&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Invoke-WebRequest&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Uri &lt;/span&gt;&lt;/span&gt;&lt;span&gt;$url&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;OutFile &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:TEMP&lt;/span&gt;&lt;span&gt;\opencode-new.zip&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Expand-Archive&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Path &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:TEMP&lt;/span&gt;&lt;span&gt;\opencode-new.zip&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;DestinationPath &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:TEMP&lt;/span&gt;&lt;span&gt;\opencode-new&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$real&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Get-ChildItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:TEMP&lt;/span&gt;&lt;span&gt;\opencode-new&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Recurse &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Filter &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;opencode.exe&quot;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;Select-Object&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;First &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;).FullName&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force &lt;/span&gt;&lt;/span&gt;&lt;span&gt;$real&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:APPDATA&lt;/span&gt;&lt;span&gt;\npm\node_modules\opencode-ai\bin\opencode.exe&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force &lt;/span&gt;&lt;/span&gt;&lt;span&gt;$real&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:APPDATA&lt;/span&gt;&lt;span&gt;\npm\opencode.exe&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force &lt;/span&gt;&lt;/span&gt;&lt;span&gt;$real&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:APPDATA&lt;/span&gt;&lt;span&gt;\npm\node_modules\opencode-ai\node_modules\opencode-windows-x64\bin\opencode.exe&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;opencode &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;若不确定目标版本在 npm / GitHub 是否发布，先用 &lt;code&gt;npm view opencode-ai versions&lt;/code&gt; 查 npm 已发版本，再决定走甲还是乙。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：Claude Code 怎么升级（比如 2.1.112 → 2.1.226）？它和 opencode 机制一样吗？&lt;/strong&gt;
A：&lt;strong&gt;机制不同，不要套用 opencode 的 GitHub 下载法。&lt;/strong&gt; Claude Code 的正确升级渠道就是 npm 平台包，原生二进制在 npm 镜像上有同步，且主包 postinstall 会自动把平台包里的真二进制链接到 &lt;code&gt;bin/&lt;/code&gt;，不必手动从 GitHub 拉。步骤：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1) 升级主包 + 平台包（两行顺序执行，均走国内镜像）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;npm install &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;g &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@anthropic&lt;/span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;ai&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;claude&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;code@&amp;lt;目标版本&amp;gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;https:&lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span&gt;registry.npmmirror.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;npm install &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;g &lt;/span&gt;&lt;/span&gt;&lt;span&gt;@anthropic&lt;/span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;ai&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;claude&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;win32&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;x64@&amp;lt;目标版本&amp;gt; &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;registry&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;https:&lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span&gt;registry.npmmirror.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2) 验证&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;claude &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;两个包缺一不可：只装主包会得到坏 stub；平台包 &lt;code&gt;@anthropic-ai/claude-code-win32-x64&lt;/code&gt; 必须与主包&lt;strong&gt;同版本&lt;/strong&gt;。执行前可用 &lt;code&gt;npm view @anthropic-ai/claude-code-win32-x64@&amp;lt;版本&amp;gt; version --registry=https://registry.npmmirror.com&lt;/code&gt; 先确认该版本平台包已发布。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;安全网（仅当 &lt;code&gt;claude --version&lt;/code&gt; 仍报”不兼容/无效应用程序”时跑）&lt;/strong&gt;：手动定位平台包里的真二进制并覆盖到主包 &lt;code&gt;bin/&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;$real&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Get-ChildItem&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:APPDATA&lt;/span&gt;&lt;span&gt;\npm\node_modules\@anthropic-ai\claude-code-win32-x64&quot;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Recurse &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Filter &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;claude.exe&quot;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;Select-Object&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;First &lt;/span&gt;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;).FullName&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Copy-Item&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Force &lt;/span&gt;&lt;/span&gt;&lt;span&gt;$real&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;/span&gt;&lt;span&gt;env:APPDATA&lt;/span&gt;&lt;span&gt;\npm\node_modules\@anthropic-ai\claude-code\bin\claude.exe&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;claude &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、总结&lt;a href=&quot;#六总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;报错本质是 &lt;strong&gt;npm 包装器的 &lt;code&gt;bin/&amp;lt;工具名&amp;gt;.exe&lt;/code&gt; 是未落位的占位 stub&lt;/strong&gt;；通用解法 = 国内镜像重装主包与平台原生包 → &lt;strong&gt;搜索定位真实原生二进制&lt;/strong&gt; → 复制覆盖占位文件 → 验证版本号。&lt;/p&gt;&lt;/section&gt;</content:encoded></item></channel></rss>