1. 目标
让 Codex Desktop App 不再走 ChatGPT/Codex 云端额度,而是使用本地 Ollama 模型,例如:

gpt-oss-codex:20b
最终效果:
codex app
打开 Desktop App 后,默认模型走本地:
Ollama Local → gpt-oss-codex:20b
而不是云端默认模型,因此不会触发:
You've hit your usage limit. Upgrade to Pro...
2. 背景问题
之前我们已经跑通了 CLI 本地模型:
codex --profile ollama-local
它能真正执行 shell:
• Ran pwd && ls -la
说明本地链路已经成功:
Codex CLI
↓
~/.codex/ollama-local.config.toml
↓
Ollama /v1/responses
↓
gpt-oss-codex:20b
但是启动 Desktop App:
codex app
仍然提示:
You've hit your usage limit. Upgrade to Pro...
这说明 Desktop App 没有使用 ollama-local profile,而是走了默认云端模型。
3. 根因
3.1 CLI 和 Desktop App 的启动方式不同
CLI 跑通时使用的是:
codex --profile ollama-local
这个命令会显式读取:
~/.codex/ollama-local.config.toml
但 Desktop App 启动时是:
codex app
它没有携带:
--profile ollama-local
所以 App 会读取默认配置:
~/.codex/config.toml
如果主配置中没有指定:
model = "gpt-oss-codex:20b"
model_provider = "ollama-local"
App 就会使用默认云端模型,从而触发云端额度限制。
4. 方案选择
方案 A:只让 CLI 使用 Ollama
适合:
只在终端里用本地 Codex,不关心 Desktop App
配置方式:
codex --profile ollama-local
优点:
安全,不影响全局默认模型
缺点:
codex app 仍然可能走云端模型
方案 B:让 CLI 和 Desktop App 都默认使用 Ollama
适合你的目标。
方式:
把 Ollama 本地模型配置写入 ~/.codex/config.toml 主配置
这样启动:
codex app
也会默认使用本地模型。
这是当前推荐方案。
5. 前置条件
确保你已经有本地大上下文模型:
ollama list | grep gpt-oss-codex
应该能看到类似:
gpt-oss-codex:20b
如果没有,先创建:
cat > /tmp/Modelfile.gpt-oss-codex <<'EOF'
FROM gpt-oss:20b
PARAMETER num_ctx 8192
EOF
ollama create gpt-oss-codex:20b -f /tmp/Modelfile.gpt-oss-codex
为什么需要派生模型?
因为原始 gpt-oss:20b 默认上下文是 4096,而 Codex 的真实 agent prompt 约 5664 tokens,之前日志里已经出现:
truncating input prompt limit=4096 prompt=5664
所以必须把上下文提升到至少 8192。
6. 最终推荐配置
6.1 备份原配置
cp ~/.codex/config.toml ~/.codex/config.toml.bak.$(date +%Y%m%d-%H%M%S)
6.2 写入 Desktop App 可用的全局本地模型配置
编辑:
nano ~/.codex/config.toml
写入:
model = "gpt-oss-codex:20b"
model_provider = "ollama-local"
model_context_window = 8192
model_max_output_tokens = 2048
approval_policy = "on-request"
sandbox_mode = "workspace-write"
oss_provider = "ollama"
[model_providers.ollama-local]
name = "Ollama Local"
base_url = "http://localhost:11434/v1"
wire_api = "responses"
requires_openai_auth = false
[tui.model_availability_nux]
"gpt-5.5" = 1
如果你想信任某个项目目录,可以额外加:
[projects."/Users/an/Documents/daily"]
trust_level = "trusted"
不要把下面这个写进主配置:
[profiles.ollama-launch]
否则新版 Codex 会报 legacy profile 错误。
7. 可选:保留 CLI profile
即使主配置已经默认走 Ollama,也可以保留:
~/.codex/ollama-local.config.toml
内容:
model = "gpt-oss-codex:20b"
model_provider = "ollama-local"
model_context_window = 8192
model_max_output_tokens = 2048
[model_providers.ollama-local]
name = "Ollama Local"
base_url = "http://localhost:11434/v1"
wire_api = "responses"
requires_openai_auth = false
这样你仍然可以用:
codex --profile ollama-local
但如果主配置已经写了本地模型,普通:
codex
和:
codex app
也会默认走本地模型。
8. 启动方式
8.1 从项目目录启动 Desktop App
不要在 ~/.codex 里启动,应该进入真实项目目录:
cd ~/Documents/daily
codex app
或者直接指定 workspace:
codex app ~/Documents/daily
如果你不知道项目在哪,先查:
ls -la ~/Documents
ls -la ~/Documents/Project
8.2 启动前确认 Ollama 正常
ollama list
curl http://localhost:11434/v1/models
如果失败,启动 Ollama:
brew services start ollama
或者:
ollama serve
9. 验证是否真的走本地模型
打开 Desktop App 后,输入:
执行 pwd,然后执行 ls -la。不要修改文件。
成功标志应该是类似:
Ran pwd && ls -la
而不是:
You've hit your usage limit
如果仍然出现 usage limit,说明 App 仍在走云端模型。
10. 如果仍然走云端额度,怎么排查
10.1 确认主配置里有默认模型
cat ~/.codex/config.toml
必须有:
model = "gpt-oss-codex:20b"
model_provider = "ollama-local"
以及:
[model_providers.ollama-local]
base_url = "http://localhost:11434/v1"
wire_api = "responses"
requires_openai_auth = false
10.2 确认没有旧 profile 污染
grep -R "profiles.ollama-launch\|profile = \"ollama-launch\"" ~/.codex
如果看到:
[profiles.ollama-launch]
从 ~/.codex/config.toml 中删除。
10.3 彻底关闭 Desktop App 后重启
pkill -f Codex
codex app
如果你是从项目启动:
cd ~/Documents/daily
codex app
10.4 查看 Ollama 是否收到请求
如果 App 真的走本地模型,Ollama 日志应该有请求。
你当前 Homebrew 安装的 Ollama 日志位置是:
/opt/homebrew/var/log/ollama.log
查看实时日志:
tail -f /opt/homebrew/var/log/ollama.log
然后在 Desktop App 里发送:
执行 pwd,然后执行 ls -la。不要修改文件。
如果日志里出现:
POST "/v1/responses"
说明 Desktop App 正在打到本地 Ollama。
如果日志完全没有变化,说明 Desktop App 仍没有使用本地 provider。
11. 不要使用 ollama launch codex
当前不建议使用:
ollama launch codex
原因是它会自动写入旧格式:
[profiles.ollama-launch]
而 Codex 0.135.0 会报错:
legacy profile selector/table
所以统一使用:
codex app
并让 ~/.codex/config.toml 指定默认本地模型。
12. 常见问题
12.1 出现 Model metadata not found
例如:
Model metadata for `gpt-oss-codex:20b` not found.
可以先忽略。
原因是 gpt-oss-codex:20b 是你自己通过 ollama create 创建的派生模型,Codex 没有内置 metadata。
12.2 出现 Skill descriptions were shortened
例如:
Skill descriptions were shortened to fit the 2% skills context budget.
不是错误。
说明 Codex 压缩了 skill 描述,以适配上下文预算。
12.3 出现 502 Bad Gateway
查看日志:
tail -80 /opt/homebrew/var/log/ollama.log
如果看到:
truncating input prompt limit=8192 prompt=xxxxx
说明 8192 仍不够,可以考虑升级到 16384。
创建 16384 版本:
cat > /tmp/Modelfile.gpt-oss-codex <<'EOF'
FROM gpt-oss:20b
PARAMETER num_ctx 16384
EOF
ollama create gpt-oss-codex:20b -f /tmp/Modelfile.gpt-oss-codex
然后修改:
model_context_window = 16384
但你的机器是 24GB 内存,建议先用 8192,确认稳定后再考虑 16384。
12.4 出现 API key login is required
检查配置里是否有:
forced_login_method = "api"
如果有,删除。
本地 Ollama provider 应该使用:
requires_openai_auth = false
12.5 出现 wire_api = "chat" is no longer supported
新版 Codex 不支持:
wire_api = "chat"
必须使用:
wire_api = "responses"
13. 推荐 alias
CLI 继续使用本地模型:
echo "alias codex-local='codex --profile ollama-local'" >> ~/.zshrc
source ~/.zshrc
Desktop App 启动:
echo "alias codex-app-local='codex app'" >> ~/.zshrc
source ~/.zshrc
如果你固定用某个项目:
echo "alias codex-daily-app='codex app ~/Documents/daily'" >> ~/.zshrc
source ~/.zshrc
14. 最终结论
要让 Codex Desktop App 走 Ollama 本地模型,不能只配置:
codex --profile ollama-local
因为这只影响 CLI profile。
必须把本地模型写成全局默认配置:
model = "gpt-oss-codex:20b"
model_provider = "ollama-local"
并在主配置中定义:
[model_providers.ollama-local]
base_url = "http://localhost:11434/v1"
wire_api = "responses"
requires_openai_auth = false
最终推荐启动:
cd ~/Documents/daily
codex app
验证成功标志:
Ran pwd && ls -la
如果不再出现 usage limit,并且 Ollama 日志出现 /v1/responses 请求,就说明 Desktop App 已经走本地 Ollama 模型。