package com.company.agentfoundation.api; import com.company.agentfoundation.config.FoundationProperties; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; import reactor.util.retry.Retry; import java.time.Duration; @Component public class DeepseekClient { private final FoundationProperties properties; private final WebClient webClient; public DeepseekClient(FoundationProperties properties, WebClient.Builder builder) { this.properties = properties; this.webClient = builder.baseUrl(properties.getDeepseek().getBaseUrl()).defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build(); } public DeepseekChatResponse chat(DeepseekChatRequest request) { if (properties.getDeepseek().getApiKey() == null || properties.getDeepseek().getApiKey().isBlank()) throw new IllegalStateException("DEEPSEEK_API_KEY is missing"); return webClient.post() .uri(properties.getDeepseek().getChatPath()) .header(HttpHeaders.AUTHORIZATION, "Bearer " + properties.getDeepseek().getApiKey()) .bodyValue(request) .retrieve() .bodyToMono(DeepseekChatResponse.class) .retryWhen(Retry.backoff(properties.getDeepseek().getMaxRetries(), Duration.ofMillis(300))) .block(Duration.ofMillis(properties.getDeepseek().getReadTimeoutMs())); } }