This commit is contained in:
root
2025-12-05 01:03:01 +05:00
parent 886aaca98f
commit 0a37e9a681
3 changed files with 540 additions and 4 deletions
@@ -8,6 +8,7 @@ import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import org.springframework.web.reactive.function.client.ExchangeStrategies;
import reactor.core.publisher.Mono;
import reactor.netty.http.client.HttpClient;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
@@ -58,9 +59,16 @@ public class OpenAIImageGenerationService {
HttpClient httpClient = HttpClient.create()
.responseTimeout(Duration.ofMillis(90000));
// Configure exchange strategies to increase buffer limit for large base64
// responses
ExchangeStrategies strategies = ExchangeStrategies.builder()
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(10 * 1024 * 1024)) // 10 MB
.build();
this.webClient = WebClient.builder()
.baseUrl(DALL_E_API_URL)
.clientConnector(new ReactorClientHttpConnector(httpClient))
.exchangeStrategies(strategies)
.build();
}
@@ -101,7 +109,8 @@ public class OpenAIImageGenerationService {
requestBody.put("quality", imageQuality);
requestBody.put("response_format", "b64_json"); // Получаем изображение в base64
logger.info("Requesting image generation from DALL-E with prompt: {}", prompt.substring(0, Math.min(100, prompt.length())));
logger.info("Requesting image generation from DALL-E with prompt: {}",
prompt.substring(0, Math.min(100, prompt.length())));
Map<String, Object> response = webClient.post()
.header("Authorization", "Bearer " + apiKey)
@@ -109,7 +118,8 @@ public class OpenAIImageGenerationService {
.accept(MediaType.APPLICATION_JSON)
.bodyValue(requestBody)
.retrieve()
.bodyToMono(new ParameterizedTypeReference<Map<String, Object>>() {})
.bodyToMono(new ParameterizedTypeReference<Map<String, Object>>() {
})
.retryWhen(createRetrySpec("generateImage"))
.onErrorResume(err -> {
logger.error("DALL-E API request failed after retries: {} - {}", err.getMessage(),
@@ -117,7 +127,8 @@ public class OpenAIImageGenerationService {
if (err instanceof WebClientResponseException) {
WebClientResponseException wcre = (WebClientResponseException) err;
if (wcre.getStatusCode().value() == 401) {
logger.error("OpenAI API key is invalid or expired. Please check your openai.api.key configuration.");
logger.error(
"OpenAI API key is invalid or expired. Please check your openai.api.key configuration.");
} else if (wcre.getStatusCode().value() == 429) {
logger.error("OpenAI API rate limit exceeded after all retry attempts.");
} else if (wcre.getStatusCode().value() >= 500) {
@@ -210,4 +221,3 @@ public class OpenAIImageGenerationService {
});
}
}