摘要
在 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/v1PackyAPI 接口
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 包月接口。