diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatClient.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatClient.java index 2e8a6b3a8..9ea161741 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatClient.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatClient.java @@ -33,6 +33,7 @@ import org.springframework.ai.metadata.RateLimit; import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.ai.openai.api.OpenAiApi.ChatCompletion; import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionMessage; +import org.springframework.ai.openai.api.OpenAiApi.OpenAiApiClientErrorException; import org.springframework.ai.openai.api.OpenAiApi.OpenAiApiException; import org.springframework.ai.openai.metadata.OpenAiGenerationMetadata; import org.springframework.ai.openai.metadata.support.OpenAiResponseHeaderExtractor; diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java index 2a4861a69..a31c02887 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java @@ -94,6 +94,10 @@ public class OpenAiApi { @Override public void handleError(ClientHttpResponse response) throws IOException { if (response.getStatusCode().isError()) { + if (response.getStatusCode().is4xxClientError()) { + throw new OpenAiApiClientErrorException(String.format("%s - %s", response.getStatusCode().value(), + new ObjectMapper().readValue(response.getBody(), ResponseError.class))); + } throw new OpenAiApiException(String.format("%s - %s", response.getStatusCode().value(), new ObjectMapper().readValue(response.getBody(), ResponseError.class))); } @@ -124,6 +128,23 @@ public class OpenAiApi { } } + /** + * Thrown on 4xx client errors, such as 401 - Incorrect API key provided, + * 401 - You must be a member of an organization to use the API, + * 429 - Rate limit reached for requests, 429 - You exceeded your current quota + * , please check your plan and billing details. + */ + public static class OpenAiApiClientErrorException extends RuntimeException { + + public OpenAiApiClientErrorException(String message) { + super(message); + } + + public OpenAiApiClientErrorException(String message, Throwable cause) { + super(message, cause); + } + } + /** * API error response. * @param error Error details.