Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 3 Next »

GPTControllerjs
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))
                .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;
    }
}
  • No labels