OpenAI API 404 model not found 怎么办?
简答:OpenAI API 返回 404 model not found,最常见原因不是网络,而是 model 字段填错、模型对当前项目不可用、Base URL 或接口路径拼接错误。最快的处理顺序是:记录最终 URL → 用同一个 Key 请求 /v1/models → 从返回结果复制精确 id → 再用最小请求验证。若使用 Azure OpenAI,model 通常应填写部署名称,而不是模型展示名称。
定义:404 model not found 是服务端找不到当前请求所引用的模型或模型资源,实际还需要结合响应 JSON、请求地址、项目权限和供应商类型判断具体原因。
先做这一步:确认 404 到底是哪一种
先不要立即更换模型或反复重试。把客户端最终发出的请求地址、HTTP 方法、响应状态码和响应正文保存下来,并确认请求是否真的发往预期的服务商。OpenAI 官方对 404 的通用解释是请求的资源不存在;如果错误类型包含 model_not_found,还应检查模型、项目以及资源是否已被删除或当前请求不可用。可参考OpenAI 官方错误与恢复说明。
| 现象 | 优先怀疑 | 先做什么 |
|---|---|---|
JSON 中出现 model_not_found | 模型 ID、项目或模型可用性 | 用同一个 Key 查询 GET /v1/models |
| 返回 404,但正文是 HTML | Base URL、路由或反向代理 | 检查是否缺少或重复拼接 /v1 |
访问 /v1/models 也返回 404 | 服务商地址或兼容网关路径错误 | 核对该服务商的 API 文档和最终 URL |
| 模型列表能看到,但调用仍失败 | 项目权限、接口类型或模型能力不匹配 | 确认 Key、Organization、Project 与调用接口一致 |
| 使用 Azure OpenAI | 把模型名误当成部署名 | 改用实际创建的 deployment name |
三步修复流程:URL、模型列表、最小请求
- 记录最终请求地址。约定
BASE_URL要么写成https://api.openai.com,要么写成https://api.openai.com/v1,不要在代码中无条件再次追加/v1。直连 OpenAI 的模型列表地址通常是https://api.openai.com/v1/models;官方模型列表接口会返回当前可用模型及其id,不要只根据控制台展示名称或旧教程填写模型。详见OpenAI 官方 List models 接口。 - 使用完全相同的 API Key 查询模型。如果客户端使用了项目级 Key,就不要用另一个账户或另一个项目的 Key 查询。模型列表中复制完整的
id,注意大小写、连字符、版本后缀、前后空格和换行。 - 使用同一模型发最小请求。先去掉工具调用、图片、流式输出、长上下文和自定义参数,只保留认证、
model与一段文本。成功判定应是 HTTP 200,并且响应中出现正常的输出字段,而不是只看客户端没有抛出异常。
如果你使用的是 OpenAI Responses API,请请求 /v1/responses 并发送 input;如果使用 Chat Completions,请请求 /v1/chat/completions 并发送 messages。两个接口的路径和请求体不能混用。官方文档分别列出了Responses API与Chat Completions API的请求格式。
可复制的最小测试:Bash、PowerShell、CMD、Python 与 JavaScript
Bash 或 macOS/Linux
以下示例假设 BASE_URL 不包含末尾的 /v1,因此路径由命令统一补上。先替换为你通过模型列表接口确认过的精确 ID。
export OPENAI_API_KEY='替换为你的Key'
export BASE_URL='https://api.openai.com'
export MODEL_ID='从/v1/models复制的id'
curl --fail-with-body "$BASE_URL/v1/responses" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"model\":\"$MODEL_ID\",\"input\":\"Reply with OK\"}"
PowerShell
$env:OPENAI_API_KEY = "替换为你的Key"
$env:BASE_URL = "https://api.openai.com"
$env:MODEL_ID = "从/v1/models复制的id"
$headers = @{ Authorization = "Bearer $env:OPENAI_API_KEY" }
$body = @{ model = $env:MODEL_ID; input = "Reply with OK" } | ConvertTo-Json
Invoke-RestMethod -Method Post -Uri "$env:BASE_URL/v1/responses" -Headers $headers -ContentType "application/json" -Body $body
Windows CMD
set OPENAI_API_KEY=替换为你的Key
set BASE_URL=https://api.openai.com
set MODEL_ID=从/v1/models复制的id
curl --fail-with-body "%BASE_URL%/v1/responses" -H "Authorization: Bearer %OPENAI_API_KEY%" -H "Content-Type: application/json" -d "{\"model\":\"%MODEL_ID%\",\"input\":\"Reply with OK\"}"
Python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["OPENAI_API_KEY"],
base_url=os.environ.get("BASE_URL", "https://api.openai.com/v1"),
)
response = client.responses.create(
model=os.environ["MODEL_ID"],
input="Reply with OK",
)
print(response.output_text)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.OPENAI_API_KEY,
baseURL: process.env.BASE_URL || "https://api.openai.com/v1",
});
const response = await client.responses.create({
model: process.env.MODEL_ID,
input: "Reply with OK",
});
console.log(response.output_text);
执行前请确认 SDK 版本支持你使用的接口,并且不要把真实 Key 写入代码、提交到 Git 仓库或粘贴到公开工单中。若你把 BASE_URL 设置为已经包含 /v1 的地址,就必须把代码中的路径改为 SDK 所需的相对路径,避免产生 /v1/v1。不同 SDK 对 base_url 的拼接方式可能不同,最终仍应以网络日志中的实际请求 URL 为准。
模型列表能看到,为什么调用仍然 404?
- Key 或项目不一致:模型列表必须尽量使用发起推理请求的同一个 API Key。不同 Project、Organization 或权限范围下,能列出或调用的资源可能不同;不要把个人账户、团队项目和应用运行环境混用。
- 模型 ID 不是展示名称:模型卡片上的产品名称、简称、旧别名或自定义标签不一定等于 API 要求的
id。直接复制模型列表接口返回的精确字段,通常比手动输入更可靠。 - 接口类型不匹配:Responses 使用
input,Chat Completions 使用messages;模型是否支持某个接口和参数,应以对应模型及接口文档为准。不要因为模型存在,就假设它支持所有端点、工具或输入类型。 - Base URL 不是 OpenAI 直连地址:如果使用兼容网关,
/v1/models返回的模型 ID 是网关暴露的映射名称,不一定等于上游服务商的模型名。此时应以该网关的接口文档、返回结果和请求日志为准,不要把直连 OpenAI 的路径规则强行套用。 - 返回的是路径 404:如果响应没有模型错误字段,或者正文是网页、代理服务器错误页,优先修复 URL、路由、反向代理和版本前缀,而不是更换模型。
OpenAI 官方模型接口说明,模型的 id 是可以在 API 端点中引用的模型标识;因此排查时应优先采用服务端实际返回的 ID,而不是依据旧文章中的固定模型名。参考OpenAI 官方模型文档。
Azure OpenAI 与兼容接口要单独判断
Azure OpenAI 的调用逻辑不能简单等同于 OpenAI 直连。Microsoft 官方说明:Azure OpenAI 使用部署概念,调用时 model 应填写你创建的 deployment name;即使底层部署的是某个模型,部署名称也可能是自定义字符串。可核对Microsoft 官方端点切换说明。
如果使用 Azure 的 OpenAI v1 路径,官方文档给出的形式是资源地址加上 /openai/v1/,并在 model 字段中传部署名称;如果使用旧式部署路径,则还需要按照 Azure 当前文档处理部署路径和 API 版本,不能把两种写法混拼。若 Responses API 返回模型不支持,应先确认该部署是否支持该接口,再考虑改用 Chat Completions;相关限制可见Microsoft Foundry 官方端点说明。
第三方 OpenAI 兼容服务的情况则取决于其路由和模型映射:先向该服务商的 Base URL 请求模型列表,确认返回格式和模型 ID,再按其文档选择 /v1/responses、/v1/chat/completions 或其他路径。查不到明确文档时,不要把“兼容 OpenAI”理解为所有端点、字段和模型都完全相同。
排查完成后的自查清单
- 是否保存了原始 HTTP 状态码、响应 JSON 或 HTML 正文?
- 最终请求域名是否是预期服务商,而不是旧环境变量、代理或默认 SDK 地址?
BASE_URL与/v1是否只拼接了一次?- 是否用同一个 API Key 请求了模型列表?
model是否直接复制自当前返回的精确id?- Organization、Project、Key 和运行环境是否属于同一套配置?
- Responses 的
input与 Chat Completions 的messages是否没有混用? - 使用 Azure 时,填写的是 deployment name,而不是仅凭模型名称猜出的字符串?
- 最小请求是否成功后,才逐项恢复工具、图片、流式和其他参数?
如果仍然失败,向服务商提交脱敏后的模型名、错误类型、请求时间和最终 URL;不要提交完整 API Key、Authorization 请求头或包含敏感数据的请求体。OpenAI 官方错误文档也建议持久性错误提供模型、错误信息、请求数据和时间等诊断信息,但敏感凭据应先移除。
常见问题
OpenAI API 404 model not found 是模型下线了吗?
不一定。它也可能由模型 ID 拼写错误、当前 Project 不可用、Key 不一致、Base URL 错误或接口类型不匹配造成。先用同一个 Key 请求模型列表,再根据响应中的精确 id 做最小请求。模型是否仍可用应以当前 API 返回和官方文档为准。
为什么 /v1/models 能返回模型,但调用还是 404?
模型列表和推理请求可能使用了不同的 Key、Project、Organization 或 Base URL;也可能是模型支持的接口与当前请求不匹配。请检查最终请求地址,确认 Responses 与 Chat Completions 的路径和请求体没有混用,并逐项核对项目权限。
Base URL 应该写到 /v1 还是不要写?
没有一个适用于所有 SDK 的统一写法。本文 curl 示例把 Base URL 写成不含 /v1 的根地址,再在命令中拼接完整路径;Python 和 JavaScript 示例使用 SDK 常见的含 /v1 的 Base URL。关键是确认 SDK 会如何拼接,并在日志中检查最终 URL,避免 /v1/v1 或缺少 /v1。
Azure OpenAI 的 model 为什么不是公开模型名?
Azure 使用部署名称路由请求。Microsoft 官方说明,Azure OpenAI 调用中的 model 应填写你创建的 deployment name;部署名称可以与底层模型名相同,也可以是自定义名称。因此应到 Azure 的部署列表复制实际名称。
能不能直接换一个网上看到的模型名?
不建议。模型 ID、接口支持、项目权限和可用性可能变化,旧文章中的名称未必适用于当前 Key。更稳妥的做法是先请求模型列表,从当前响应复制精确 id,再用最小请求验证。
相关阅读
- 继续查看 API 403/404 的分层排查方法
- 如果同时出现 401,先检查 Key 与项目归属
- 在 Codex 中配置 Base URL 时检查端点拼接
- 在 Cursor 中核对自定义 OpenAI 接口配置
- 在 Dify 中添加模型并验证兼容接口