...
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import reactor.core.publisher.Mono;
import java.io.*;
@RestController
public class GPTController {
private static final String GPT_API_URL = "https://api.openai.com/v1/chat/completions";
private static final String GPT_API_KEY = "API key";
@PostMapping("/requestGPT")
public SseEmitter requestGPT(@RequestBody String json) throws IOException {
SseEmitter emitter = new SseEmitter((long)(5*60*1000));
WebClient client = WebClient.create(GPT_API_URL);
client.post()
.header("Content-Type", "application/json")
.header("Authorization", String.format("Bearer %s", GPT_API_KEY)) // OpenAI
// .header("Api-Key", GPT_API_KEY) // Azure OpenAI
.body(BodyInserters.fromValue(json))
.exchangeToFlux(response -> {
if(response.statusCode().equals(HttpStatus.OK)){
return response.bodyToFlux(String.class);
} else {
return response.createException().flatMapMany(Mono::error);
}
})
.doOnNext(line -> {
try {
emitter.send(SseEmitter.event().data(line));
} catch (IOException e) {
throw new RuntimeException(e);
}
})
.doOnError(emitter::completeWithError)
.doOnComplete(emitter::complete)
.subscribe();
return emitter;
}
}
|
...