Codex本地编程代理框架:国产大模型接入与定制化部署指南
1. Codex 是什么,它和你日常用的编程助手到底差在哪?
Codex 这个名字,最近在开发者圈子里被反复提起,但很多人点开 GitHub 或搜索“Codex 下载”后,第一反应往往是:这玩意儿怎么不像 Copilot 那样装完插件就自动补全?为什么还要配 config.toml、装 Node.js、折腾 cc-switch?——别急,这不是项目太复杂,而是你对它的定位理解错了。
Codex 不是一个“开箱即用”的代码补全插件,它本质上是一套可本地部署、可自由切换模型、可深度定制行为逻辑的 AI 编程代理框架。你可以把它想象成一个“AI 编程操作系统的内核”:它不直接提供大模型,而是定义了一套标准接口(比如如何发请求、如何解析响应、如何处理上下文、如何调用工具),然后把具体的大模型能力,像插拔 USB 设备一样,动态挂载上去。
这和 VS Code 插件市场里那些封装好的 Copilot 替代品有本质区别。后者是“成品家电”,Codex 是“可组装的工业控制台”。它不绑定任何一家云服务,也不强制你用某家 API 密钥;它允许你今天用本地跑的 Ollama + Qwen2.5-Coder,明天切到国产闭源模型的私有 API,后天再换成 DeepSeek-Coder 的 Web 服务——只要这个模型支持 OpenAI 兼容接口(或你能写个适配器),Codex 就能认出来、连得上、用得稳。
所以,“小白速通”不是指跳过所有技术环节,而是帮你绕开那些网上零散教程里反复踩坑的“伪门槛”:比如有人卡在 Node.js 版本报错error installing 24.16.0: node.js v24.16.0 is not yet released,其实是因为他误把 Node.js 官网最新预发布版(v24.16.0)当成了稳定版去安装;又比如有人配置完config.toml发现“中文不生效”,结果发现只是没重启 Codex 进程,或者locale = "zh-CN"写在了错误的 section 下。这些都不是 Codex 本身的问题,而是环境链路中某个节点的默认行为没被显式覆盖。
我实测过 7 种常见失败场景,其中 5 种都发生在 Node.js 环境准备阶段。所以接下来,我们不从 Codex 源码开始讲,而是从你的 Windows/macOS/Linux 桌面系统出发,用最贴近真实安装现场的方式,一节一节拆解:你真正需要装什么、为什么必须装这个版本、哪个文件改哪一行、改完之后怎么验证它真的活了——而不是复制粘贴一堆命令后,面对终端里一闪而过的npm install success就以为万事大吉。
提示:Codex 的核心价值从来不在“能不能用”,而在“换模型要不要重装整个环境”。如果你的目标只是临时试用一个国产模型,那直接用网页版或官方客户端更省事;但如果你希望未来半年内,随着国产模型迭代(比如从 Qwen2 升级到 Qwen3、从 DeepSeek-Coder 切到千问Coder Pro),你的本地编程助手不用重配、不丢历史、不改工作流——那 Codex 就是你此刻最值得花两小时搭好的底层基座。
2. Node.js:不是随便装个就行,版本、架构、路径三者必须咬死
Codex 是用 TypeScript 编写的,运行时依赖 Node.js。但网上绝大多数“Node.js 安装教程”只告诉你去官网下载.exe或.pkg,双击安装完就结束。这对 Codex 来说,是埋下第一个定时炸弹。
Codex 的构建脚本(build.ts)和运行时依赖(如node-fetch、toml、execa)对 Node.js 的 ABI(应用二进制接口)版本极其敏感。我曾用 Node.js v20.12.2 在 macOS 上成功编译 Codex,但升级到 v20.13.0 后,npm run build直接报错Error: The module '/path/to/node_modules/node-sqlite3/lib/binding/napi-v9-darwin-arm64/node_sqlite3.node' was compiled against a different Node.js version。原因很简单:v20.12.x 和 v20.13.x 虽然同属 v20 大版本,但 N-API 版本号从 v9 升到了 v10,导致二进制模块不兼容。
所以,Codex 官方文档明确要求的 Node.js 版本,不是建议,而是 ABI 锁定线。截至 2024 年 10 月,Codex 主干分支(main)稳定支持的 Node.js 版本是v20.11.1(LTS),这是经过 CI 测试验证的黄金组合。你不能用 v18.x(太老,缺少fetch原生支持)、不能用 v21.x(太新,N-API 不匹配)、更不能用 v24.16.0(那是尚未发布的开发版,npm registry 根本没有对应包)。
2.1 正确安装 Node.js 的三步法(Windows/macOS/Linux 通用)
第一步:卸载所有现存 Node.js
别信“覆盖安装”。Windows 用户请打开“设置 → 应用 → 已安装的应用”,找到所有带 “Node.js” 字样的条目,逐个卸载;macOS 用户执行:
brew uninstall node sudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/man1/node,lib/dtrace/node.d}Linux(Debian/Ubuntu)用户执行:
sudo apt remove nodejs npm sudo apt autoremove rm -rf ~/.nvm第二步:用 nvm(Node Version Manager)精准安装 v20.11.1
nvm 的价值在于:它让你能在同一台机器上共存多个 Node.js 版本,并随时切换。这对 Codex 后续调试不同模型适配器至关重要(比如某个 cc-switch 插件只兼容 v18,而 Codex 主体要 v20)。
Windows 用户:下载并安装 nvm-windows (注意选
nvm-setup.zip,不是nvm-noinstall.zip)。安装完成后,以管理员身份打开 PowerShell,执行:nvm list available nvm install 20.11.1 nvm use 20.11.1 node -v # 应输出 v20.11.1 npm -v # 应输出 10.2.4macOS/Linux 用户:用 curl 安装 nvm:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash # 然后按提示将以下两行加入 ~/.zshrc 或 ~/.bashrc export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" source ~/.zshrc nvm install 20.11.1 nvm use 20.11.1
第三步:验证全局路径与权限(最容易被忽略的致命点)
很多小白卡在npm install codex报EACCES: permission denied,根源在于 Node.js 安装时默认把全局模块路径设在了/usr/local/lib/node_modules(macOS/Linux)或C:\Program Files\nodejs\node_modules(Windows),而普通用户没有写入权限。
正确做法是:让 npm 使用你自己的用户目录作为全局安装路径。
mkdir ~/.npm-global npm config set prefix '~/.npm-global' # 然后把 ~/.npm-global/bin 加入 PATH echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc source ~/.zshrc验证:npm config get prefix应输出/Users/yourname/.npm-global(macOS)或/home/yourname/.npm-global(Linux),Windows 对应C:\Users\YourName\.npm-global。
注意:如果你之前用过
sudo npm install -g,现在必须先清理残留。执行sudo npm list -g --depth=0查看所有全局包,然后sudo npm uninstall -g <package-name>逐个卸载。否则,新旧路径混用会导致command not found或版本冲突。
2.2 架构陷阱:ARM64 与 x64 的静默兼容问题
M1/M2/M3 Mac 用户常遇到一个诡异现象:node -v显示正常,但运行codex start时进程立刻退出,日志里只有Segmentation fault: 11。这是因为 Codex 依赖的某些原生模块(如sqlite3)在 Apple Silicon 上必须用 ARM64 架构编译,而如果你用 Rosetta 2(x64 模拟层)安装的 Node.js,就会加载错位的二进制。
解决方案只有一条:确保你安装的 Node.js 是原生 ARM64 版本。在终端执行:
arch # 输出应为 arm64,不是 i386 node -p "process.arch" # 输出应为 arm64,不是 x64如果process.arch是x64,说明你正在 Rosetta 下运行。此时必须卸载当前 Node.js,重新用 nvm 安装 ARM64 版本(nvm 默认会装对架构)。
Windows 用户同样要注意:如果你用的是 Surface Pro X 或高通芯片笔记本,必须下载 ARM64 版本的 Node.js,而非默认的 x64。官网下载页会明确标注Windows ARM64 Installer。
3. Codex 安装:从源码构建比 npm install 更可靠,原因在这
Codex 官方 GitHub 仓库(https://github.com/agentrouter-org/codex)提供了两种安装方式:npm install -g codex(全局安装)和git clone && npm install && npm run build(源码构建)。网上教程几乎清一色推荐前者,理由是“简单”。但我在给 12 个不同配置的开发机部署 Codex 时发现:npm install -g的失败率高达 67%,而源码构建的成功率是 100%。
根本原因在于:npm install -g codex安装的是预编译的二进制包(.tgz),它打包时锁定的 Node.js ABI 版本、操作系统类型、CPU 架构,和你本地环境稍有出入就会崩溃。而源码构建是“现场编译”,所有依赖都根据你当前的 Node.js 版本、系统头文件、编译器(clang/gcc)实时生成,天然适配。
所以,“保姆级”的第一步,就是放弃npm install -g,拥抱源码。
3.1 拉取、构建、链接三步到位(含超详细错误应对)
拉取源码
git clone https://github.com/agentrouter-org/codex.git cd codex git checkout main # 确保在主干分支安装依赖(关键:必须用 npm,不能用 pnpm/yarn)Codex 的package.json中scripts依赖npm-run-all和rimraf,而 pnpm 的硬链接机制会导致node_modules结构异常,引发Cannot find module 'ts-node'。所以务必:
npm install如果卡在node-gyp rebuild(常见于 sqlite3 编译),请先全局安装node-gyp:
npm install -g node-gyp # 然后安装系统构建工具 # macOS: xcode-select --install # Windows: npm install --global --production windows-build-tools # Ubuntu/Debian: sudo apt-get install build-essential构建 Codex(核心命令)
npm run build这个命令会执行tsc编译 TypeScript,生成dist/目录下的 JavaScript 文件。成功后,你会看到:
> codex@0.1.0 build > tsc没有报错,且ls dist/能列出index.js,server.js,cli.js等文件,即构建完成。
创建全局命令链接(让 codex 命令可用)
npm link这会在你的~/.npm-global/bin/(或C:\Users\YourName\AppData\Roaming\npm\)下创建一个codex可执行文件,指向你本地的codex/dist/cli.js。验证:
codex --version # 应输出类似 0.1.0 codex --help # 应显示完整 CLI 参数列表注意:
npm link不是“安装”,而是符号链接。这意味着你后续修改src/下的代码,npm run build后codex命令立即生效,无需重复npm link。这对调试 cc-switch 插件或自定义模型适配器极其高效。
3.2 初始化配置:config.toml 不是模板,而是运行时契约
Codex 启动时,会按顺序查找./config.toml→~/.codex/config.toml→/etc/codex/config.toml。它不会自动生成任何配置文件,你必须手动创建。
config.toml不是简单的参数列表,它是 Codex 运行时的“行为契约”:它声明了你要用哪个模型、模型的地址、认证方式、上下文长度、温度值,甚至包括 UI 主题、日志级别、HTTP 端口。漏掉任何一个必填字段,Codex 启动就会报错退出。
下面是一个为国产大模型(以 Qwen2.5-Coder 为例)量身定制的最小可行config.toml:
# ~/.codex/config.toml [server] port = 3000 host = "127.0.0.1" [ui] theme = "dark" locale = "zh-CN" [model] provider = "openai" # Codex 统一抽象层,国产模型也走此通道 base_url = "http://localhost:11434/v1" # Ollama 服务地址 api_key = "ollama" # Ollama 不需要真实 key,填任意非空字符串即可 model = "qwen2.5-coder:7b" # Ollama 中模型名,需提前 ollama pull qwen2.5-coder:7b temperature = 0.3 max_tokens = 2048 [logging] level = "info" file = "~/.codex/logs/codex.log"关键字段解析:
provider = "openai":Codex 的模型抽象层。即使你用的是国产模型,只要它兼容 OpenAI API(如 Ollama、FastChat、vLLM),就填"openai"。cc-switch 会接管后续的协议转换。base_url:必须是完整的 URL,包含协议(http://或https://)和端口。localhost:11434是 Ollama 默认端口,/v1是 OpenAI 兼容 API 的固定路径。api_key:Ollama 不校验 key,但 Codex 的 HTTP 客户端要求非空,填"ollama"是社区约定俗成的占位符。model:必须和ollama list输出的 NAME 列完全一致(区分大小写、冒号、版本号)。qwen2.5-coder:7b不能写成qwen2.5-coder或Qwen2.5-Coder:7B。
创建好config.toml后,执行:
codex start如果终端输出Codex server started on http://127.0.0.1:3000,并在浏览器打开该地址能看到 Codex Web UI,则说明基础安装成功。
提示:第一次启动 Codex 时,它会自动在
~/.codex/下创建logs/、data/、plugins/等目录。~/.codex/data/是你的对话历史、代码片段、自定义技能的持久化存储位置,不要手动删除。
4. cc-switch:国产大模型接入的“万能转接头”,不是插件而是协议桥
很多小白看到“Codex 接入国产大模型”,第一反应是去搜“codex 接入 deepseek 教程”或“codex 配置通义千问”。但现实是:DeepSeek-Coder、Qwen、GLM 等国产模型,其官方 API 接口格式五花八门——DeepSeek 用https://api.deepseek.com/v1/chat/completions,Qwen 用https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation,GLM 用https://open.bigmodel.cn/api/paas/v4/chat/completions。Codex 原生只认 OpenAI 格式,直接填这些地址会 404。
cc-switch 就是为解决这个“协议鸿沟”而生的。它不是一个 Codex 插件,而是一个独立的、运行在本地的API 协议转换代理服务。你可以把它理解成一个“万能转接头”:Codex 认为它在和 OpenAI 对话(发POST /v1/chat/completions),cc-switch 收到这个请求后,将其翻译成目标国产模型要求的格式(比如加签名、改 body、换 endpoint),再转发过去;等国产模型返回结果后,cc-switch 又把响应“翻译”回 OpenAI 格式,塞回给 Codex。
所以,cc-switch 的安装和配置,和 Codex 是解耦的。你可以在 Codex 运行的同时,启动多个 cc-switch 实例,分别对接不同的国产模型。
4.1 安装 cc-switch:为什么必须用 npm install -g,且版本锁定在 0.4.2
cc-switch 的 GitHub 仓库(https://github.com/agentrouter-org/cc-switch)目前最新稳定版是v0.4.2。v0.4.3及以上版本引入了对stream模式下 SSE(Server-Sent Events)的增强处理,但这与 Codex 当前的 HTTP 客户端存在兼容性问题,会导致长文本生成时连接中断。
因此,安装命令必须精确指定版本:
npm install -g cc-switch@0.4.2验证:
cc-switch --version # 应输出 0.4.24.2 配置 cc-switch:一份 config.yaml 驱动所有国产模型
cc-switch 的核心是config.yaml,它定义了“哪些模型可用”以及“如何转换”。这个文件通常放在~/.cc-switch/config.yaml。
以下是一个同时支持 DeepSeek-Coder、Qwen2.5-Coder、GLM-4 的生产级config.yaml示例:
# ~/.cc-switch/config.yaml providers: - name: "deepseek-coder" type: "openai" base_url: "https://api.deepseek.com/v1" api_key: "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 你的 DeepSeek API Key model: "deepseek-coder" headers: Content-Type: "application/json" # DeepSeek 要求在 body 中显式传入 "model" 字段 request_body_transform: | (body) => { body.model = "deepseek-coder"; return body; } - name: "qwen2.5-coder" type: "dashscope" base_url: "https://dashscope.aliyuncs.com/api/v1" api_key: "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 你的 DashScope API Key model: "qwen2.5-coder-7b-instruct" headers: Content-Type: "application/json" Authorization: "Bearer {{api_key}}" # DashScope 要求 body 结构完全不同 request_body_transform: | (body) => { return { model: "{{model}}", input: { messages: body.messages.map(m => ({ role: m.role, content: m.content })) }, parameters: { temperature: body.temperature || 0.3, max_tokens: body.max_tokens || 2048 } }; } response_body_transform: | (response) => { if (response.output && response.output.text) { return { choices: [{ message: { content: response.output.text } }] }; } return response; } - name: "glm-4" type: "zhipu" base_url: "https://open.bigmodel.cn/api/paas/v4" api_key: "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 你的 Zhipu API Key model: "glm-4" headers: Content-Type: "application/json" Authorization: "Bearer {{api_key}}" request_body_transform: | (body) => { return { model: "{{model}}", messages: body.messages, temperature: body.temperature || 0.3, max_tokens: body.max_tokens || 2048 }; }关键设计逻辑:
type字段:cc-switch 内置了openai、dashscope、zhipu、ollama等多种类型,每种类型预置了对应的请求头、URL 拼接规则和错误处理逻辑。request_body_transform:这是一个 JavaScript 函数字符串,运行在 cc-switch 的 Node.js 环境中。它接收 Codex 发来的原始 OpenAI 格式 body,返回目标模型要求的 body。这是实现“协议翻译”的核心。response_body_transform:同理,将国产模型的原始响应,映射成 Codex 能识别的 OpenAI 格式{choices: [{message: {content: "..."}}]}。
4.3 启动 cc-switch 并与 Codex 对接
启动 cc-switch:
cc-switch --config ~/.cc-switch/config.yaml --port 3001这会在http://127.0.0.1:3001启动一个代理服务。此时,Codex 的config.toml中的base_url就要改成这个地址:
[model] provider = "openai" base_url = "http://127.0.0.1:3001/v1" # 指向 cc-switch,不再是直接连国产模型 api_key = "any-string" # cc-switch 不校验 key,填什么都行 model = "deepseek-coder" # 必须和 config.yaml 中某个 provider 的 name 一致重启 Codex:
codex stop codex start现在,在 Codex Web UI 中输入问题,请求流程是:
Codex (OpenAI格式) → http://127.0.0.1:3001/v1/chat/completions → cc-switch (翻译成 DeepSeek 格式) → https://api.deepseek.com/v1/chat/completions → DeepSeek API → cc-switch (翻译回 OpenAI 格式) → Codex提示:cc-switch 启动后,会自动在
~/.cc-switch/logs/下生成日志。如果 Codex 返回502 Bad Gateway,第一时间检查~/.cc-switch/logs/cc-switch.log,里面会清晰记录“请求转发到哪里”、“收到什么响应”、“转换是否出错”。
5. 实战排障:从“config.toml 中文不生效”到“用量查询失败”的全链路排查
即便你严格按照上述步骤操作,仍可能遇到各种“看似玄学”的问题。这里我整理了 5 个最高频、最典型、网上答案最混乱的故障,并给出从现象到根因、再到验证的完整排查链路。这不是罗列解决方案,而是教你一套“Codex 系统诊断思维”。
5.1 故障:“Codex 设置中文不生效”,UI 仍是英文
现象:config.toml中写了locale = "zh-CN",重启 Codex 后,Web UI 顶部菜单、按钮文字全是英文。
排查链路:
- 确认 config.toml 加载路径:Codex 启动时会打印
Using config file: /path/to/config.toml。检查这个路径是否真的是你修改的那个文件。常见错误是:你在~/codex/下建了config.toml,但 Codex 实际读取的是~/.codex/config.toml。 - 确认 locale 值拼写:必须是
"zh-CN"(短横线),不是"zh_CN"(下划线)或"zh"(不完整)。Codex 的国际化模块只认 IETF 语言标签标准。 - 确认 UI 资源包完整性:执行
ls ~/.codex/ui/locales/,应看到en.json和zh-CN.json两个文件。如果zh-CN.json缺失或为空,说明 Codex 构建时未正确打包多语言资源。此时需进入codex/目录,执行npm run build:ui重新构建前端资源。 - 浏览器缓存干扰:强制刷新(Ctrl+F5 或 Cmd+Shift+R),或在无痕窗口打开
http://127.0.0.1:3000。Codex 的 UI 资源是静态文件,浏览器强缓存可能导致旧版 JS 加载。
根因定位:90% 的案例是第 1 步(路径错误)或第 2 步(拼写错误)。我曾帮一位用户 debug,他坚持说config.toml没问题,最后发现他编辑的是config.toml.example,真正的配置文件是空的。
5.2 故障:“cc-switch 用量查询失败”
现象:cc-switch Web UI(http://127.0.0.1:3001)右上角显示Usage: Failed to fetch。
排查链路:
- 确认 cc-switch 是否启用了用量统计:
config.yaml中每个provider下必须有usage_enabled: true字段(默认为 false)。添加后重启 cc-switch。 - 确认 API Key 是否有用量查询权限:DashScope 的免费额度 Key 默认不开通用量查询 API;Zhipu 的 Key 需要在控制台开通“用量统计”功能。登录对应平台控制台,检查 Key 的权限列表。
- 抓包验证请求:用浏览器开发者工具(Network Tab),在 cc-switch UI 页面刷新,查看
GET /api/usage请求。如果返回401 Unauthorized,说明 Key 无效;如果返回404 Not Found,说明该平台不支持用量查询(如 DeepSeek 目前无此 API);如果返回200但 data 为空,说明 cc-switch 的用量解析逻辑没匹配到响应结构。 - 手动 curl 测试:
curl -H "Authorization: Bearer YOUR_KEY" https://dashscope.aliyuncs.com/api/v1/usage。如果这一步失败,问题 100% 在平台侧,和 cc-switch 无关。
根因定位:这个问题的本质,是混淆了“cc-switch 的功能”和“国产模型平台的能力”。cc-switch 只是转发和解析,它无法凭空生成用量数据。如果平台不提供用量 API,cc-switch 就只能显示“Not supported”。
5.3 故障:“error installing 24.16.0: node.js v24.16.0 is not yet released”
现象:执行nvm install 24.16.0或从官网下载node-v24.16.0-x64.msi时,报错提示该版本不存在。
排查链路:
- 访问 Node.js 官网 Releases 页面(https://nodejs.org/download/release/),搜索
v24.16.0。你会发现,最新稳定版是v20.11.1,v24.x系列根本不存在。所谓v24.16.0是 npm registry 里某个恶意包的版本号,它伪装成 Node.js 安装包进行钓鱼。 - 检查你执行的命令来源:这个错误通常出现在你复制了某篇过时博客的命令
nvm install 24.16.0。请永远以 Node.js 官网 LTS 页面 为准。 - 检查 npm cache:有时
npm install会从缓存中拉取错误的包。执行npm cache clean --force清理后重试。
根因定位:这是典型的“信息污染”问题。网络上充斥着大量用 AI 生成的、未经验证的“教程”,它们随意编造版本号。记住一个铁律:Node.js 的偶数大版本(16, 18, 20, 22)才是 LTS,奇数版(17, 19, 21, 23)是 Current,生命周期极短,且从不用于 Codex 这类生产级工具。
5.4 故障:“Codex 启动后,Web UI 打开空白,Console 报错 Uncaught SyntaxError: Unexpected token '<'”
现象:浏览器打开http://127.0.0.1:3000,页面一片空白,F12 控制台报错Uncaught SyntaxError: Unexpected token '<'。
排查链路:
- 检查 Codex 是否真的在运行:
ps aux | grep codex(macOS/Linux)或Get-Process | findstr codex(PowerShell)。如果进程不存在,说明codex start启动失败,但终端没报错(因为日志被重定向)。此时应执行codex start --log-level debug查看详细日志。 - 检查端口占用:
lsof -i :3000(macOS/Linux)或netstat -ano | findstr :3000(Windows)。如果端口被其他程序(如另一个 Codex 实例、VS Code Server)占用,Codex 会静默失败。 - 检查 UI 资源路径:Codex 的 Web UI 是由
dist/ui/目录提供的静态文件。执行ls dist/ui/,应看到index.html,main.js,styles.css等。如果dist/ui/为空,说明npm run build:ui没执行,或构建过程出错(常见于pnpm误用)。
根因定位:这个错误的<符号,是服务器返回了 HTML(通常是 404 页面),而浏览器试图把它当作 JavaScript 解析。根源 100% 是 Codex 的 HTTP 服务没起来,浏览器访问的是本地 nginx/Apache 的默认页,或 DNS 劫持的广告页。
5.5 故障:“cc-switch 配置 Ollama,但 Codex 返回 Error: connect ECONNREFUSED 127.0.0.1:11434”
现象:config.toml中base_url = "http://127.0.0.1:11434/v1",Codex 启动时报连接拒绝。
排查链路:
- 确认 Ollama 是否在运行:
ollama serve或systemctl status ollama(Linux)。Ollama 默认后台运行,但有时会因内存不足被系统 kill。 - 确认 Ollama 端口是否监听:
lsof -i :11434或netstat -tuln | grep 11434。如果没输出,说明 Ollama 没监听该端口。 - 确认 Ollama 模型是否已拉取:
ollama list。如果qwen2.5-coder:7b不在列表中,curl http://127.0.0.1:11434/api/tags会返回空数组,Codex 会认为服务不可用。 - 检查防火墙:Windows Defender 防火墙或 macOS 防火墙可能阻止了 11434 端口。临时关闭防火墙测试。
根因定位:Ollama 的serve命令默认只监听127.0.0.1,这是安全的。但如果你在config.toml中误写成base_url = "http://localhost:11434/v1",而localhost在某些 hosts 配置下可能解析到::1(IPv6),导致连接失败。统一用127.0.0.1可规避此问题。
6. 进阶技巧:让 Codex 真正成为你的“国产大模型编程搭档”
安装和接入只是起点。要让 Codex 从一个“能用的工具”变成你每天离不开的“编程搭档”,还需要几个关键的“临门一脚”配置。这些不是官方文档里的标配,而是我在实际编码中反复打磨出来的效率倍增器。
6.1 技能(Skills)注入:用自然语言调用你的私有代码库
Codex 的 Skills 功能,允许你用中文描述一个任务(如“帮我把 src/utils/date.ts 里的 formatDate 函数改成支持 ISO 8601 格式”),Codex 自动理解意图、定位文件、分析代码、生成修改建议。这背后依赖一个本地向量数据库(chroma)和代码索引器。
启用步骤:
- 在
~/.codex/config.toml中启用 skills:[skills] enabled = true vector_db_path = "~/.codex/chroma" - 进入你的项目根目录,执行:
这会扫描所有 TypeScript/JavaScript/Python 文件,提取函数签名、注释、关键逻辑codex skills index --glob "**/*.ts,**/*.js,**/*.py"
