|
|
@ -6,10 +6,13 @@ import cn.hutool.http.HttpUtil;
|
|
|
|
import cn.hutool.json.JSONArray;
|
|
|
|
import cn.hutool.json.JSONArray;
|
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
|
|
|
|
|
import com.zyx.mpdemo.model.enums.ChatgptReqEnums;
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashMap;
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -22,16 +25,30 @@ public class ChatgptService {
|
|
|
|
@Value("${chatgpt.api-key}")
|
|
|
|
@Value("${chatgpt.api-key}")
|
|
|
|
private String apiKey;
|
|
|
|
private String apiKey;
|
|
|
|
|
|
|
|
|
|
|
|
public String getAnswer(String question) {
|
|
|
|
public String getAnswer(String desc, ChatgptReqEnums reqEnum) {
|
|
|
|
String body = getAnswerBody(question);
|
|
|
|
String body = getAnswerBody(desc, reqEnum);
|
|
|
|
return answerFromBody(body);
|
|
|
|
return targetFromBody(body, reqEnum);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private String getAnswerBody(String question) {
|
|
|
|
private String getAnswerBody(String desc, ChatgptReqEnums reqEnum) {
|
|
|
|
|
|
|
|
String body = "";
|
|
|
|
|
|
|
|
String url = "";
|
|
|
|
|
|
|
|
switch (reqEnum) {
|
|
|
|
|
|
|
|
case TEXT:
|
|
|
|
|
|
|
|
url = getAnswerUrl();
|
|
|
|
|
|
|
|
body = getQuesStr(desc);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case PICTURE:
|
|
|
|
|
|
|
|
url = getPicUrl();
|
|
|
|
|
|
|
|
body = getPicStr(desc);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
return HttpUtil
|
|
|
|
return HttpUtil
|
|
|
|
.createPost(getAnswerUrl())
|
|
|
|
.createPost(url)
|
|
|
|
.addHeaders(getHeaders())
|
|
|
|
.addHeaders(getHeaders())
|
|
|
|
.body(getQuesStr(question), ContentType.JSON.getValue())
|
|
|
|
.body(body, ContentType.JSON.getValue())
|
|
|
|
.setReadTimeout(60 * 30 * 1000)
|
|
|
|
.setReadTimeout(60 * 30 * 1000)
|
|
|
|
.setConnectionTimeout(60 * 30 * 1000)
|
|
|
|
.setConnectionTimeout(60 * 30 * 1000)
|
|
|
|
.setMaxRedirectCount(3)
|
|
|
|
.setMaxRedirectCount(3)
|
|
|
@ -47,6 +64,14 @@ public class ChatgptService {
|
|
|
|
.build();
|
|
|
|
.build();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String getPicUrl() {
|
|
|
|
|
|
|
|
return UrlBuilder.of()
|
|
|
|
|
|
|
|
.setScheme("https")
|
|
|
|
|
|
|
|
.setHost("api.openai.com")
|
|
|
|
|
|
|
|
.addPath("v1/images/generations")
|
|
|
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private Map<String, String> getHeaders() {
|
|
|
|
private Map<String, String> getHeaders() {
|
|
|
|
Map<String, String> headers = new HashMap<>();
|
|
|
|
Map<String, String> headers = new HashMap<>();
|
|
|
|
headers.put("Authorization", "Bearer " + apiKey);
|
|
|
|
headers.put("Authorization", "Bearer " + apiKey);
|
|
|
@ -54,20 +79,44 @@ public class ChatgptService {
|
|
|
|
return headers;
|
|
|
|
return headers;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private String getQuesStr(String question) {
|
|
|
|
private String getQuesStr(String desc) {
|
|
|
|
Map<String, Object> reqMap = new HashMap<>();
|
|
|
|
Map<String, Object> reqMap = new HashMap<>();
|
|
|
|
reqMap.put("model", "text-davinci-003");
|
|
|
|
reqMap.put("model", "text-davinci-003");
|
|
|
|
reqMap.put("prompt", question);
|
|
|
|
reqMap.put("prompt", desc);
|
|
|
|
reqMap.put("temperature", 0);
|
|
|
|
reqMap.put("temperature", 0);
|
|
|
|
reqMap.put("max_tokens", 2048);
|
|
|
|
reqMap.put("max_tokens", 2048);
|
|
|
|
return JSONUtil.toJsonStr(reqMap);
|
|
|
|
return JSONUtil.toJsonStr(reqMap);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private String answerFromBody(String body) {
|
|
|
|
private String getPicStr(String desc) {
|
|
|
|
|
|
|
|
Map<String, Object> reqMap = new HashMap<>();
|
|
|
|
|
|
|
|
reqMap.put("prompt", desc);
|
|
|
|
|
|
|
|
reqMap.put("n", 2);
|
|
|
|
|
|
|
|
reqMap.put("size", "1024x1024");
|
|
|
|
|
|
|
|
return JSONUtil.toJsonStr(reqMap);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private String targetFromBody(String body, ChatgptReqEnums reqEnum) {
|
|
|
|
JSONObject jsonObject = JSONUtil.parseObj(body);
|
|
|
|
JSONObject jsonObject = JSONUtil.parseObj(body);
|
|
|
|
JSONArray choices = jsonObject.getJSONArray("choices");
|
|
|
|
String target = "";
|
|
|
|
JSONObject choice = choices.getJSONObject(0);
|
|
|
|
switch (reqEnum) {
|
|
|
|
return choice.getStr("text");
|
|
|
|
case TEXT:
|
|
|
|
|
|
|
|
JSONArray choices = jsonObject.getJSONArray("choices");
|
|
|
|
|
|
|
|
JSONObject choice = choices.getJSONObject(0);
|
|
|
|
|
|
|
|
target = choice.getStr("text");
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
case PICTURE:
|
|
|
|
|
|
|
|
JSONArray urls = jsonObject.getJSONArray("data");
|
|
|
|
|
|
|
|
List<String> urlList = new ArrayList<>();
|
|
|
|
|
|
|
|
for (JSONObject jsonObj : urls.jsonIter()) {
|
|
|
|
|
|
|
|
urlList.add(jsonObj.getStr("url"));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
target = JSONUtil.toJsonStr(urlList);
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return target;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|