最近使用 AI 的频率大大提升了,Copilot 每次在月中额度就用完了,Gemini Cli 每天更是把 Pro 额度全部用完。用完后发现自己离开了 AI 变得巨菜。开始考虑给自己配一个三公主,所以选择了 Codex,但是副副手又不舍得花 20 刀开会员,最后选择了智谱 20 一个月的 Coding 会员(这是真便宜...),虽然说 Codex 是支持自定义 provider 的,但是还是存在一些坑,网上资料也不多,简单记录一下。
安装#
安装非常简单,基本上一个指令就能完成。
npm i -g @openai/codex 或
brew install codex 或
nix-shell -p codex
config.json 配置#
codex 的默认配置文件夹在~/.codex/ 中,根据操作系统不同,家目录也会有所不同(可能就 windows 不太一样吧), 这个文件夹中包含 config.json 文件,用于 codex 配置。
首先在 0.1.2504 这个版本,很多教程配置 config.toml 无法生效,只能使用 json 或是 yaml,yaml 给出的官方示例不多,所以最好还是用 json,
以下是官方给出的 json 示例
{
"model": "o4-mini",
"provider": "openai",
"providers": {
"openai": {
"name": "OpenAI",
"baseURL": "https://api.openai.com/v1",
"envKey": "OPENAI_API_KEY"
},
"azure": {
"name": "AzureOpenAI",
"baseURL": "https://YOUR_PROJECT_NAME.openai.azure.com/openai",
"envKey": "AZURE_OPENAI_API_KEY"
},
"openrouter": {
"name": "OpenRouter",
"baseURL": "https://openrouter.ai/api/v1",
"envKey": "OPENROUTER_API_KEY"
},
"gemini": {
"name": "Gemini",
"baseURL": "https://generativelanguage.googleapis.com/v1beta/openai",
"envKey": "GEMINI_API_KEY"
},
"ollama": {
"name": "Ollama",
"baseURL": "http://localhost:11434/v1",
"envKey": "OLLAMA_API_KEY"
},
"mistral": {
"name": "Mistral",
"baseURL": "https://api.mistral.ai/v1",
"envKey": "MISTRAL_API_KEY"
},
"deepseek": {
"name": "DeepSeek",
"baseURL": "https://api.deepseek.com",
"envKey": "DEEPSEEK_API_KEY"
},
"xai": {
"name": "xAI",
"baseURL": "https://api.x.ai/v1",
"envKey": "XAI_API_KEY"
},
"groq": {
"name": "Groq",
"baseURL": "https://api.groq.com/openai/v1",
"envKey": "GROQ_API_KEY"
},
"arceeai": {
"name": "ArceeAI",
"baseURL": "https://conductor.arcee.ai/v1",
"envKey": "ARCEEAI_API_KEY"
}
},
"history": {
"maxSize": 1000,
"saveHistory": true,
"sensitivePatterns": []
}
}
其中没有我们所需要的智谱 provider,我们可以移除原有的 provirder,或者直接新增一个 provider。最后的 config.json 文件如下。
{
"model": "glm-4.5",
"approvalMode": "suggest",
"fullAutoErrorMode": "ask-user",
"notify": true,
"provider": "zhipuai",
"providers": {
"zhipuai": {
"name": "zhipuai",
"baseURL": "https://open.bigmodel.cn/api/coding/paas/v4",
"envKey": "OPENAI_API_KEY"
}
},
"history": {
"maxSize": 1000,
"saveHistory": true,
"sensitivePatterns": []
}
}
其中需要注意,provider 中不能使用 openai,要严格使用 zhipuai,name 也是严格使用 zhipuai,否则会出现 404 或是 401。其中的envKey的意思是,读取环境什么环境变量的名称。并不是在这真的要求你输入 API。如果你配置了 ZHIPUAI_API_KEY,则会在环境变量中读取 ZHIPUAI_API_KEY 作为该 provider 的 api,这种设计是为了切换不同供应商的不同模型。我们只使用智谱的模型,所以保持 OPENAI_API_KEY 也可以。
项目中使用#
由于 codex 启动时读取的是环境变量,所以只要使用 echo $OPENAI_API_KEY 时能正确输出密钥就能正确使用,codex 也会读取.env 中的变量,所以配置的方式有很多。以下介绍主流的方法。
1. 当前会话 (Current Session)#
这种方法只在当前的命令行会话中生效,当你关闭终端或开启新的终端会话时,这个变量就会失效。
如何操作
在 Linux 或 macOS 系统中,你可以使用 export
命令:
export OPENAI_API_KEY='你的密钥'
在 Windows 系统中,你可以使用 set
命令:
set OPENAI_API_KEY='你的密钥'
适用范围
- 临时测试和调试:当你只想在当前终端会话中快速测试一个脚本或命令,不希望永久保存密钥时,这种方法最方便。
- 安全性考虑:如果你的设备是公用的,或者你不希望密钥被长期保存在文件中,这种方式可以避免密钥泄露。
2. .bashrc
或 .zshrc
#
.bashrc
是 Bash shell 的配置文件,.zshrc
是 Zsh shell 的配置文件。这些文件在每次打开新的终端会话时都会被自动执行。将密钥添加到这些文件中,可以确保每次启动终端都能自动加载这个环境变量。
如何操作
用文本编辑器(如 nano
或 vim
)打开 .bashrc
或 .zshrc
文件,然后在文件末尾添加一行:
export OPENAI_API_KEY='你的密钥'
保存并退出后,运行 source ~/.bashrc
或 source ~/.zshrc
来立即生效,或者直接关闭并重新打开终端。
适用范围
- 个人开发环境:如果你是唯一的设备使用者,并且希望在所有终端会话中都能使用这个密钥,那么这种方式非常方便。
- 长期使用:当你需要频繁使用依赖此密钥的工具时,设置一次就可以永久生效,省去了每次手动输入的麻烦。
3. .env
文件#
.env
文件是一种通用格式,用于存储项目的环境变量。许多工具和框架(包括 Codex)都支持从 .env
文件中自动加载环境变量。这种方式通常与项目目录绑定。
如何操作
在你的项目根目录下创建一个名为 .env
的文件,然后添加以下内容:
OPENAI_API_KEY='你的密钥'
请注意,=
两边通常没有空格。
适用范围
- 项目特定配置:当你的密钥只用于特定项目时,将
.env
文件放在项目目录中,可以保持配置的独立性,避免与其他项目或全局环境变量冲突。 - 团队协作:
.env
文件可以作为模板,方便团队成员配置自己的密钥。为了安全,通常会把.env
文件添加到.gitignore
中,防止密钥被上传到 Git 仓库。 - 框架和库支持:许多现代开发框架和库(如 Next.js、React、Python 的
dotenv
库)都原生支持读取.env
文件。
最佳实践:
- 如果你只是想快速测试一下,用当前会话的方式最简单。
- 如果你经常在个人电脑上使用 Codex,并且不想每次都设置,那么将密钥添加到
.bashrc
最合适。 - 如果你正在进行一个具体的项目开发,并且希望配置与项目绑定,推荐使用
.env
文件,这是一种更安全、更通用的做法。