Codex Desktop 接入 PackyCode / PackyAPI 后 401 报错排查:Key、Base URL 和模型名怎么对应
摘要
在 Codex Desktop 中使用 PackyCode 或 PackyAPI 时,常见报错包括 401 Unauthorized、Invalid API key、Model is not available、stream 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 包月接口。
更多推荐



所有评论(0)