报
404 model_not_found、The model gpt-4o does not exist or you do not have access to it,先别急着怀疑模型挂了。九成是两件事:模型名写进了一个不生效的配置 key,被静默忽略、回退到默认 gpt-4o;或者你的 key 根本没权限访问这个模型。
Issue & Env(案发现场与环境)
- 业务场景:Spring AI 接 OpenAI,调
ChatClient生成文本,调用时抛 404。 - 环境:Spring AI 1.x(内置默认模型是 gpt-4o),Spring Boot 3.x,JDK 17+,OpenAI 官方 API。
StackTrace(堆栈日志)
报错原文是 OpenAI 返回的 404 JSON 响应:
{
"error": {
"message": "The model `gpt-4o` does not exist or you do not have access to it.",
"type": "invalid_request_error",
"param": null,
"code": "model_not_found"
}
}
Spring AI 拿到这个 404 后,会把它包成不可重试异常重新抛出。完整堆栈如下:
org.springframework.ai.retry.NonTransientAiException: 404 - {
"error": {
"message": "The model `gpt-4o` does not exist or you do not have access to it.",
"type": "invalid_request_error",
"param": null,
"code": "model_not_found"
}
}
at org.springframework.ai.retry.RetryUtils.defaultTransientCallback(RetryUtils.java:67)
at org.springframework.ai.openai.OpenAiChatModel.call(OpenAiChatModel.java:664)
at org.springframework.ai.chat.client.DefaultChatClient$DefaultChatClientRequestSpec.call(DefaultChatClient.java:377)
at com.example.service.ChatService.ask(ChatService.java:31)
at com.example.controller.ChatController.chat(ChatController.java:45)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
Reproduce(复现代码)
最常见的踩法:你想用 gpt-3.5-turbo,却把模型名写进了一个不生效的 key:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
model: gpt-3.5-turbo # 这个 key 不生效
然后照常调用:
String answer = chatClient.prompt()
.user("hello")
.call()
.content();
报错里出现的却是 gpt-4o,而不是你配的 gpt-3.5-turbo。
Root Cause(根因分析)
坑 1:模型配置 key 写错,被静默忽略
Spring AI 里模型名的正确路径是 spring.ai.openai.chat.options.model,不是顶层的 spring.ai.openai.model。后者框架根本不读,等于白写。配置设了没生效,就回退到内置默认模型,而 Spring AI 1.x 的默认值是 gpt-4o,于是请求打到了 gpt-4o 上。
如果你的账户还没开通 gpt-4o,或者 key 没有这个模型的权限,就直接 404。报错里冒出个你从没配过的模型名,基本都是这条线:配置没进对 key,回退默认值。这也和 issue #3857 一致——model_not_found 被归类为不可重试错误(NonTransientAiException),框架知道这不是临时故障,重试没用。
坑 2:账户确实没有该模型的访问权限
文案是「does not exist or you do not have access to it」,两个状态被故意合并成一句。OpenAI 借此掩盖「模型不存在」和「你没权限」,防止别人拿报错去探测模型目录。所以即便模型名写对了,账户 tier 不够、或项目里没给这个 key 开该模型权限,同样是这句 404。
The Fix(解决方案)
先把模型名配进正确的 key:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-4o-mini
chat.options.model 才是有效路径。再排查权限:
-
用同一个 key 调
/v1/models,看它能列到哪些模型:curl https://api.openai.com/v1/models \ -H "Authorization: Bearer $OPENAI_API_KEY" -
想用 gpt-4o 但列表里没有,多半是 billing tier 不够。去 OpenAI 后台提升 tier,或在项目里给这个 key 加模型权限。
-
开发期用
gpt-4o-mini,它便宜且默认有权限,别一上来就 gpt-4o。
