摘要

在 Codex Desktop 中使用 PackyCode 或 PackyAPI 时,常见报错包括 401 UnauthorizedInvalid API keyModel is not availablestream disconnected before completion 等。很多问题并不是 Key 真的过期,而是 Key、Base URL、模型名称和 Codex 配置没有对应到同一套服务。本文以 PackyCode / PackyAPI 为例,整理一套可复用的排查流程。


1. 问题现象

在 Codex Desktop 中配置 PackyCode 或 PackyAPI 后,可能会遇到下面几类报错。

1.1 Invalid API key

unexpected status 401 Unauthorized:
Invalid API key provided,
url: https://codex-api.packycode.com/v1/responses

或者:

unexpected status 401 Unauthorized:
无效的令牌,
url: https://www.packyapi.com/v1/responses

这类错误的核心不是只看 Invalid API key,而是要先看后面的 url

如果请求地址是:

https://codex-api.packycode.com/v1/responses

说明当前请求发到了 PackyCode Codex 包月接口。

如果请求地址是:

https://www.packyapi.com/v1/responses

说明当前请求发到了 PackyAPI 接口。

同样是 Packy 相关服务,但不同接口对应的 Key 可能不是同一套。Key 如果发错接口,就会被认为无效。


1.2 模型不可用

Model 'gpt-4o' is not available.
Available models: gpt-5.2, gpt-5.3-codex, gpt-5.4, gpt-5.4-mini, gpt-5.5

这种报错和 Key 无效不是一回事。

它说明接口已经连通,Key 大概率也通过了认证,但配置里的模型名不可用。

例如配置里写了:

model = "gpt-4o"

但平台实际可用模型只有:

gpt-5.2
gpt-5.3-codex
gpt-5.4
gpt-5.4-mini
gpt-5.5

那就应该改成:

model = "gpt-5.5"

或者更偏 Codex 场景的:

model = "gpt-5.3-codex"

1.3 流式连接中断

stream disconnected before completion:
error sending request for url (https://api.packycode.com/v1/responses)

这类错误一般不是典型的 Key 错误,而是流式响应中途断开。

常见原因包括:

Base URL 写错
第三方接口不稳定
网络或代理断流
接口对 Responses API 支持不完整
模型响应时间过长

如果偶发,可以先重试。如果频繁出现,应优先检查 Base URL 是否写成了平台要求的地址。


2. PackyCode 和 PackyAPI 的地址不要混用

接入时最容易混淆的是两个地址。

PackyCode Codex 包月接口

https://codex-api.packycode.com/v1

PackyAPI 接口

https://www.packyapi.com/v1

这两个地址看起来都和 Packy 有关,但不一定使用同一套 Key。

如果手里的 Key 属于 PackyAPI,却配置成:

base_url = "https://codex-api.packycode.com/v1"

就可能出现:

401 Unauthorized: Invalid API key provided

反过来,如果 Key 属于 PackyCode Codex 包月接口,却配置成 PackyAPI 地址,也可能认证失败。

所以排查时不要先怀疑模型,也不要先反复换 Key,先确认:

当前 Key 对应哪个 Base URL?

3. 检查 Codex 当前配置

Windows 下,Codex 配置文件通常在:

C:\Users\用户名\.codex\config.toml

可以用 PowerShell 查看关键配置:

Get-Content "$HOME\.codex\config.toml" |
Select-String -Pattern "model_provider|^model\s*=|base_url|wire_api|requires_openai_auth"

正常会看到类似内容:

base_url = "http://127.0.0.1:15721/v1"
model_provider = "packycode"
model = "gpt-5.5"
[model_providers.packycode]
base_url = "https://www.packyapi.com/v1"
wire_api = "responses"
requires_openai_auth = true

这里有两个 base_url,不要搞混。

第一个:

base_url = "http://127.0.0.1:15721/v1"

是 Codex Desktop 的本地代理地址,通常不用动。

第二个:

[model_providers.packycode]
base_url = "https://www.packyapi.com/v1"

才是真正请求 PackyAPI 的远程地址。


4. PackyAPI 可用配置示例

如果 Key 属于 PackyAPI,可以使用下面这种配置:

base_url = "http://127.0.0.1:15721/v1"
service_tier = "priority"

model_provider = "packycode"
model = "gpt-5.5"
model_reasoning_effort = "high"

[model_providers.packycode]
name = "packycode"
base_url = "https://www.packyapi.com/v1"
wire_api = "responses"
requires_openai_auth = true

其中:

model = "gpt-5.5"

可以根据平台返回的可用模型列表调整。

如果平台提示可用模型包括:

gpt-5.2
gpt-5.3-codex
gpt-5.4
gpt-5.4-mini
gpt-5.5

常用选择可以是:

model = "gpt-5.5"

或者:

model = "gpt-5.3-codex"

5. PackyCode Codex 包月配置示例

如果 Key 明确属于 PackyCode Codex 包月接口,可以使用:

base_url = "http://127.0.0.1:15721/v1"
service_tier = "priority"

model_provider = "packycode"
model = "gpt-5.5"
model_reasoning_effort = "high"

[model_providers.packycode]
name = "packycode"
base_url = "https://codex-api.packycode.com/v1"
wire_api = "responses"
requires_openai_auth = true

如果这个配置返回:

401 Unauthorized: Invalid API key provided
url: https://codex-api.packycode.com/v1/responses

但改成:

base_url = "https://www.packyapi.com/v1"

后可以正常使用,说明当前 Key 更可能是 PackyAPI Key,而不是 PackyCode Codex 包月 Key。


6. 检查 auth.json

第三方 Key 通常写在:

C:\Users\用户名\.codex\auth.json

格式类似:

{
  "OPENAI_API_KEY": "sk-********************************"
}

虽然字段名叫 OPENAI_API_KEY,但在第三方兼容接口场景下,这里可以放 PackyCode 或 PackyAPI 提供的 Key。

不要把完整 Key 发到聊天、截图、文章或代码仓库里。

可以用下面的命令检查格式,不输出完整 Key:

$j = Get-Content "$HOME\.codex\auth.json" -Raw | ConvertFrom-Json
$k = $j.OPENAI_API_KEY

[PSCustomObject]@{
    HasKey = if ($k) { "是" } else { "否" }
    Length = if ($k) { $k.Length } else { 0 }
    StartsWithSk = if ($k -like "sk-*") { "是" } else { "否" }
    ContainsSpace = if ($k -match "\s") { "是" } else { "否" }
    ContainsChinesePunctuation = if ($k -match "[\u3000-\u303F\uFF00-\uFFEF]") { "是" } else { "否" }
}

正常结果应类似:

HasKey                     : 是
StartsWithSk               : 是
ContainsSpace              : 否
ContainsChinesePunctuation : 否

如果出现空格、中文标点、长度明显异常,就要重新复制 Key。


7. 改完配置后必须重启 Codex

修改 config.toml 后,不要直接在旧会话里继续点重试。

建议执行:

Get-Process |
Where-Object { $_.ProcessName -match "Codex" } |
Stop-Process -Force -ErrorAction SilentlyContinue

然后重新打开 Codex,并新建会话测试。

原因很简单:

旧进程可能还在使用启动时读取的配置
旧会话可能还保存着旧模型或旧 provider

例如已经把配置改成:

model = "gpt-5.5"

但旧会话仍然报:

Model 'gpt-4o' is not available

这种情况通常不是配置没改,而是旧会话或旧进程没刷新。


8. 常见报错与处理方法

报错 判断 处理
https://codex-api.packycode.com/v1/responses + 401 Key 不被 PackyCode 包月接口认可 确认 Key 是否属于 PackyCode 包月;不确定时试 PackyAPI 地址
https://www.packyapi.com/v1/responses + 401 PackyAPI 不认可 Key 检查 Key 是否有效、是否复制完整、是否有权限
Model 'gpt-4o' is not available Key 通过了,但模型不可用 改成返回列表中的模型
stream disconnected before completion 流式响应断开 重试,检查 Base URL、网络和平台稳定性
改了模型还报旧模型 旧进程或旧会话没刷新 杀掉 Codex 进程,新建会话
请求发到 api.openai.com 走了 OpenAI 官方接口 第三方 Key 不能用于该地址,需要改第三方 Base URL

9. 推荐排查顺序

以后再遇到类似问题,可以按下面顺序处理。

第一步:看报错 URL

先确认请求到底发到了哪里:

https://codex-api.packycode.com/v1/responses
https://www.packyapi.com/v1/responses
https://api.openai.com/v1/responses

第二步:确认 Key 类型

问清楚 Key 到底属于:

PackyCode Codex 包月
PackyAPI
OpenAI 官方 API
其他第三方平台

第三步:检查 config.toml

Get-Content "$HOME\.codex\config.toml" |
Select-String -Pattern "model_provider|^model\s*=|base_url|wire_api|requires_openai_auth"

第四步:检查 auth.json

确认 Key 存在、没有空格、没有中文标点、没有复制错。

第五步:确认模型名称

如果平台返回可用模型列表,就使用列表里的模型,不要凭经验写 gpt-4o 或其他名称。

第六步:重启 Codex,新建会话

修改配置后必须重启 Codex,最好新建会话验证。


10. 建议保存多套配置

如果经常在 ChatGPT 账号、PackyAPI、PackyCode 包月之间切换,建议保存多份配置文件。

例如:

config.toml.chatgpt
config.toml.packyapi
config.toml.packycode

保存当前 PackyAPI 配置:

Copy-Item "$HOME\.codex\config.toml" "$HOME\.codex\config.toml.packyapi"

以后切换回 PackyAPI:

Copy-Item "$HOME\.codex\config.toml.packyapi" "$HOME\.codex\config.toml" -Force

切换后重启 Codex:

Get-Process |
Where-Object { $_.ProcessName -match "Codex" } |
Stop-Process -Force -ErrorAction SilentlyContinue

总结

Codex Desktop 接入 PackyCode 或 PackyAPI 时,401 报错不一定代表 Key 过期。更常见的问题是:

Key、Base URL、model_provider、model 没有对齐

排查时记住一条原则:

PackyAPI Key 就配 PackyAPI Base URL;
PackyCode 包月 Key 就配 PackyCode 包月 Base URL;
模型名必须使用平台实际支持的名称;
改完配置必须重启 Codex 并新建会话。

如果 codex-api.packycode.com 返回 401,而 www.packyapi.com/v1 可以正常使用,基本可以判断当前 Key 属于 PackyAPI,而不是 PackyCode Codex 包月接口。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐