mirror of
https://github.com/YuWanTingbb/unofficial-gpt4.git
synced 2025-10-13 13:45:06 +00:00
gpt4-copilot-java-native v0.1.0
This commit is contained in:
10
.idea/inspectionProfiles/Project_Default.xml
generated
10
.idea/inspectionProfiles/Project_Default.xml
generated
@@ -3,8 +3,16 @@
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
|
||||
<Languages>
|
||||
<language minSize="58" name="Java" />
|
||||
<language minSize="76" name="Java" />
|
||||
</Languages>
|
||||
</inspection_tool>
|
||||
<inspection_tool class="IncorrectHttpHeaderInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="customHeaders">
|
||||
<set>
|
||||
<option value="Editor-Plugin-Version" />
|
||||
<option value="Editor-Version" />
|
||||
</set>
|
||||
</option>
|
||||
</inspection_tool>
|
||||
</profile>
|
||||
</component>
|
124
.idea/uiDesigner.xml
generated
Normal file
124
.idea/uiDesigner.xml
generated
Normal file
@@ -0,0 +1,124 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Palette2">
|
||||
<group name="Swing">
|
||||
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
|
||||
</item>
|
||||
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
|
||||
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
|
||||
<initial-values>
|
||||
<property name="text" value="Button" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="RadioButton" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="CheckBox" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
|
||||
<initial-values>
|
||||
<property name="text" value="Label" />
|
||||
</initial-values>
|
||||
</item>
|
||||
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
|
||||
<preferred-size width="150" height="-1" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
|
||||
<preferred-size width="150" height="50" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
|
||||
<preferred-size width="200" height="200" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
|
||||
</item>
|
||||
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
|
||||
<preferred-size width="-1" height="20" />
|
||||
</default-constraints>
|
||||
</item>
|
||||
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
|
||||
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
|
||||
</item>
|
||||
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
|
||||
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
|
||||
</item>
|
||||
</group>
|
||||
</component>
|
||||
</project>
|
@@ -8,7 +8,7 @@ LABEL maintainer="Yanyutin753"
|
||||
USER root
|
||||
|
||||
# 复制JAR文件到容器的/app目录下
|
||||
COPY /target/gpt-4-copilot-0.0.7.jar app.jar
|
||||
COPY /target/gpt-4-copilot-0.1.0.jar app.jar
|
||||
|
||||
# 声明服务运行在8081端口
|
||||
EXPOSE 8081
|
||||
|
24
config.json
24
config.json
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"gpt3_sleepTime": 0,
|
||||
"password": "",
|
||||
"get_token_url": "",
|
||||
"copilot_chat_version": "0.14.2024031401",
|
||||
"prefix": "",
|
||||
"one_selfCopilot_limit": 30,
|
||||
"one_copilot_limit": 30,
|
||||
"vscode_version": "vscode\/1.85.2",
|
||||
"serverPort": 8080,
|
||||
"maxPoolSize": 300,
|
||||
"gpt4_sleepTime": 100,
|
||||
"one_coCopilot_limit": 30
|
||||
"gpt3_sleepTime":0,
|
||||
"password":"",
|
||||
"get_token_url":"",
|
||||
"copilot_chat_version":"0.14.2024031401",
|
||||
"prefix":"",
|
||||
"one_selfCopilot_limit":30,
|
||||
"one_copilot_limit":30,
|
||||
"vscode_version":"vscode/1.85.2",
|
||||
"serverPort":8080,
|
||||
"maxPoolSize":300,
|
||||
"gpt4_sleepTime":100,
|
||||
"one_coCopilot_limit":30
|
||||
}
|
24
pom.xml
24
pom.xml
@@ -10,7 +10,7 @@
|
||||
</parent>
|
||||
<groupId>com.gpt4.copilot</groupId>
|
||||
<artifactId>gpt-4-copilot</artifactId>
|
||||
<version>0.0.7</version>
|
||||
<version>0.1.0</version>
|
||||
<name>native</name>
|
||||
<description>Demo project for Spring Boot with GraalVM Native Image</description>
|
||||
<properties>
|
||||
@@ -32,16 +32,6 @@
|
||||
<artifactId>micrometer-registry-prometheus</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.rednoise</groupId>
|
||||
<artifactId>rita</artifactId>
|
||||
<version>2.4.501</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
@@ -58,16 +48,6 @@
|
||||
<groupId>com.squareup.okhttp3</groupId>
|
||||
<artifactId>okhttp</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-lang</groupId>
|
||||
<artifactId>commons-lang</artifactId>
|
||||
<version>2.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.vaadin.external.google</groupId>
|
||||
<artifactId>android-json</artifactId>
|
||||
<version>0.0.20131108.vaadin1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
@@ -82,7 +62,7 @@
|
||||
<configuration>
|
||||
<excludes>
|
||||
<exclude>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<groupId>org.project-lombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
</exclude>
|
||||
</excludes>
|
||||
|
@@ -1,12 +1,13 @@
|
||||
package com.gpt4.copilot;
|
||||
|
||||
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONException;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.gpt4.copilot.controller.ChatController;
|
||||
import com.gpt4.copilot.pojo.SystemSetting;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
@@ -30,7 +31,7 @@ import java.nio.file.Paths;
|
||||
@Slf4j
|
||||
@EnableScheduling
|
||||
@SpringBootApplication
|
||||
public class copilotApplication {
|
||||
public class CopilotApplication {
|
||||
private static final String VS_CODE_API_URL = "https://api.github.com/repos/microsoft/vscode/releases/latest";
|
||||
private static final String VS_CODE_CHAT_URL = "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery";
|
||||
|
||||
@@ -38,7 +39,7 @@ public class copilotApplication {
|
||||
String configFilePath = System.getProperty("user.dir") + File.separator + "config.json";
|
||||
SystemSetting config = loadConfig(configFilePath);
|
||||
setSystemProperties(config);
|
||||
SpringApplication.run(copilotApplication.class, args);
|
||||
SpringApplication.run(CopilotApplication.class, args);
|
||||
printStartupMessage(config);
|
||||
}
|
||||
|
||||
@@ -65,8 +66,8 @@ public class copilotApplication {
|
||||
private static JSONObject readJsonFile(String configFilePath) {
|
||||
try {
|
||||
String jsonContent = new String(Files.readAllBytes(Paths.get(configFilePath)));
|
||||
return new JSONObject(jsonContent);
|
||||
} catch (IOException | JSONException e) {
|
||||
return JSON.parseObject(jsonContent);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
@@ -76,11 +77,9 @@ public class copilotApplication {
|
||||
SystemSetting config = new SystemSetting();
|
||||
config.setServerPort(getIntOrDefault(jsonObject, "serverPort", 8080));
|
||||
config.setPrefix(getStringOrDefault(jsonObject, "prefix", "/"));
|
||||
String updatedJson = jsonObject.toString(2);
|
||||
String updatedJson = com.alibaba.fastjson.JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat);
|
||||
Files.write(Paths.get(configFilePath), updatedJson.getBytes());
|
||||
return config;
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
@@ -88,11 +87,11 @@ public class copilotApplication {
|
||||
|
||||
private static int getIntOrDefault(JSONObject jsonObject, String key, int defaultValue) {
|
||||
try {
|
||||
if (!jsonObject.has(key)) {
|
||||
if (!jsonObject.containsKey(key)) {
|
||||
jsonObject.put(key, defaultValue);
|
||||
log.info("config.json没有新增" + key + "参数,现已增加!");
|
||||
}
|
||||
return jsonObject.getInt(key);
|
||||
return jsonObject.getIntValue(key);
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
@@ -100,7 +99,7 @@ public class copilotApplication {
|
||||
|
||||
private static String getStringOrDefault(JSONObject jsonObject, String key, String defaultValue) {
|
||||
try {
|
||||
if (!jsonObject.has(key)) {
|
||||
if (!jsonObject.containsKey(key)) {
|
||||
jsonObject.put(key, defaultValue);
|
||||
log.info("config.json没有新增" + key + "参数,现已增加!");
|
||||
}
|
||||
@@ -124,21 +123,18 @@ public class copilotApplication {
|
||||
if (conn.getResponseCode() != 200) {
|
||||
throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode());
|
||||
}
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader((conn.getInputStream())));
|
||||
String output;
|
||||
StringBuilder response = new StringBuilder();
|
||||
while ((output = br.readLine()) != null) {
|
||||
response.append(output);
|
||||
try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
|
||||
String output;
|
||||
while ((output = br.readLine()) != null) {
|
||||
response.append(output);
|
||||
}
|
||||
}
|
||||
conn.disconnect();
|
||||
JSONObject jsonObject = new JSONObject(response.toString());
|
||||
com.alibaba.fastjson2.JSONObject jsonObject = JSON.parseObject(response.toString());
|
||||
return jsonObject.getString("tag_name");
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (RuntimeException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -149,9 +145,7 @@ public class copilotApplication {
|
||||
conn.setRequestProperty("Content-Type", "application/json");
|
||||
conn.setRequestProperty("Accept", "application/json;api-version=6.1-preview.1");
|
||||
conn.setDoOutput(true);
|
||||
JSONObject jsonRequest = new JSONObject();
|
||||
jsonRequest.put("filters", new JSONArray().put(new JSONObject().put("criteria", new JSONArray().put(new JSONObject().put("filterType", 7).put("value", publisher + "." + name)))));
|
||||
jsonRequest.put("flags", 870);
|
||||
com.alibaba.fastjson.JSONObject jsonRequest = getJsonObject(publisher, name);
|
||||
OutputStream os = conn.getOutputStream();
|
||||
os.write(jsonRequest.toString().getBytes());
|
||||
os.flush();
|
||||
@@ -162,15 +156,36 @@ public class copilotApplication {
|
||||
response.append(output);
|
||||
}
|
||||
conn.disconnect();
|
||||
JSONObject jsonResponse = new JSONObject(response.toString());
|
||||
com.alibaba.fastjson2.JSONObject jsonResponse = JSON.parseObject(response.toString());
|
||||
return jsonResponse.getJSONArray("results").getJSONObject(0).getJSONArray("extensions").getJSONObject(0).getJSONArray("versions").getJSONObject(0).getString("version");
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static com.alibaba.fastjson.JSONObject getJsonObject(String publisher, String name) {
|
||||
com.alibaba.fastjson.JSONObject jsonRequest = new com.alibaba.fastjson.JSONObject();
|
||||
jsonRequest.put("flags", 870);
|
||||
|
||||
com.alibaba.fastjson.JSONArray filtersArray = new com.alibaba.fastjson.JSONArray();
|
||||
|
||||
com.alibaba.fastjson.JSONObject criteriaObject = new com.alibaba.fastjson.JSONObject();
|
||||
criteriaObject.put("filterType", 7);
|
||||
criteriaObject.put("value", publisher + "." + name);
|
||||
|
||||
com.alibaba.fastjson.JSONArray criteriaArray = new com.alibaba.fastjson.JSONArray();
|
||||
criteriaArray.add(criteriaObject);
|
||||
|
||||
com.alibaba.fastjson.JSONObject filterObject = new com.alibaba.fastjson.JSONObject();
|
||||
filterObject.put("criteria", criteriaArray);
|
||||
|
||||
filtersArray.add(filterObject);
|
||||
|
||||
jsonRequest.put("filters", filtersArray);
|
||||
return jsonRequest;
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 0 3 1/3 * ?")
|
||||
private static void updateLatestVersion() {
|
||||
try {
|
||||
@@ -183,11 +198,10 @@ public class copilotApplication {
|
||||
String parent = ChatController.selectFile();
|
||||
// 读取 JSON 文件内容
|
||||
String jsonContent = new String(Files.readAllBytes(Paths.get(parent)));
|
||||
JSONObject jsonObject = new JSONObject(jsonContent);
|
||||
JSONObject jsonObject = JSON.parseObject(jsonContent);
|
||||
jsonObject.put("vscode_version", latestVersion);
|
||||
jsonObject.put("copilot_chat_version", latestChatVersion);
|
||||
// 将修改后的 JSONObject 转换为格式化的 JSON 字符串
|
||||
String updatedJson = jsonObject.toString(2);
|
||||
String updatedJson = com.alibaba.fastjson.JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat);
|
||||
Files.write(Paths.get(parent), updatedJson.getBytes());
|
||||
System.out.println("===================配置更新说明========================");
|
||||
System.out.println("vscode_version:" + ChatController.getVscode_version());
|
||||
@@ -206,18 +220,19 @@ public class copilotApplication {
|
||||
System.out.println("maxPoolSize:" + ChatController.getMaxPoolSize());
|
||||
System.out.println("gpt3_sleepTime:" + ChatController.getGpt3_sleepTime());
|
||||
System.out.println("gpt4_sleepTime:" + ChatController.getGpt4_sleepTime());
|
||||
System.out.println("vscode_version:" + ChatController.getVscode_version());
|
||||
System.out.println("copilot_chat_version:" + ChatController.getCopilot_chat_version());
|
||||
System.out.println("vscode_version:" + getLatestVSCodeVersion());
|
||||
System.out.println("copilot_chat_version:" + getLatestExtensionVersion("GitHub", "copilot-chat"));
|
||||
System.out.println("get_token_url:" + ChatController.getGet_token_url());
|
||||
System.out.println("one_copilot_limit:" + ChatController.getOne_copilot_limit());
|
||||
System.out.println("one_coCopilot_limit:" + ChatController.getOne_coCopilot_limit());
|
||||
System.out.println("one_selfCopilot_limit:" + ChatController.getOne_selfCopilot_limit());
|
||||
System.out.println("gpt4-copilot-java 初始化接口成功!");
|
||||
System.out.println("======================================================");
|
||||
System.out.println("******原神gpt4-copilot-java-native v0.0.7启动成功******");
|
||||
System.out.println("******原神gpt4-copilot-java-native v0.1.0启动成功******");
|
||||
System.out.println("* 采用graalvm打包,运行内存大幅度减小");
|
||||
System.out.println("* 适配官方requestBody,减小被查询异常");
|
||||
System.out.println("* 使用ConcurrentHashMap,粗略的对于每个密钥按每分钟进行限速");
|
||||
System.out.println("* 修复部分bug,提升稳定性");
|
||||
System.out.println("URL地址:http://0.0.0.0:" + config.getServerPort() + config.getPrefix() + "");
|
||||
System.out.println("======================================================");
|
||||
}
|
@@ -1,8 +1,11 @@
|
||||
package com.gpt4.copilot.controller;
|
||||
|
||||
import com.alibaba.fastjson.serializer.SerializerFeature;
|
||||
import com.alibaba.fastjson2.JSONException;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.gpt4.copilot.copilotApplication;
|
||||
import com.gpt4.copilot.CopilotApplication;
|
||||
import com.gpt4.copilot.pojo.Conversation;
|
||||
import com.gpt4.copilot.pojo.Result;
|
||||
import com.gpt4.copilot.pojo.SystemSetting;
|
||||
@@ -11,9 +14,7 @@ import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.Data;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import okhttp3.*;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.json.JSONException;
|
||||
import org.json.JSONObject;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
@@ -44,18 +45,19 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
@Data
|
||||
@RestController()
|
||||
public class ChatController {
|
||||
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
|
||||
/**
|
||||
* 缓存cocopilotToken
|
||||
*/
|
||||
private static final HashMap<String, String> copilotTokenList;
|
||||
private static final ConcurrentHashMap<String, String> copilotTokenList;
|
||||
/**
|
||||
* 缓存copilotToken
|
||||
*/
|
||||
private static final HashMap<String, String> coCopilotTokenList;
|
||||
private static final ConcurrentHashMap<String, String> coCopilotTokenList;
|
||||
/**
|
||||
* 缓存selfToken
|
||||
*/
|
||||
private static final HashMap<String, String> selfTokenList;
|
||||
private static final ConcurrentHashMap<String, String> selfTokenList;
|
||||
/**
|
||||
* 缓存cocopilotToken_limit
|
||||
*/
|
||||
@@ -124,6 +126,62 @@ public class ChatController {
|
||||
* one copilot_token max requests per minute
|
||||
*/
|
||||
private static Integer one_copilot_limit;
|
||||
/**
|
||||
* one coCopilot_token max requests per minute
|
||||
*/
|
||||
private static Integer one_coCopilot_limit;
|
||||
/**
|
||||
* one selfCopilot_token max requests per minute
|
||||
*/
|
||||
private static Integer one_selfCopilot_limit;
|
||||
/**
|
||||
* 定义okhttp库
|
||||
*/
|
||||
private static OkHttpClient client = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.MINUTES)
|
||||
.readTimeout(6, TimeUnit.MINUTES)
|
||||
.writeTimeout(6, TimeUnit.MINUTES)
|
||||
.build();
|
||||
/**
|
||||
* 定义线程池里的线程名字
|
||||
*/
|
||||
private static ThreadFactory threadFactory = new ThreadFactory() {
|
||||
private final AtomicInteger counter = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, "chatThreadPool-" + counter.getAndIncrement());
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 定义线程池
|
||||
*/
|
||||
private static ExecutorService executor;
|
||||
|
||||
/**
|
||||
* 初始化ChatController类
|
||||
*/
|
||||
static {
|
||||
selfTokenList = new ConcurrentHashMap<>();
|
||||
copilotTokenList = new ConcurrentHashMap<>();
|
||||
coCopilotTokenList = new ConcurrentHashMap<>();
|
||||
selfTokenLimitList = new ConcurrentHashMap<>();
|
||||
copilotTokenLimitList = new ConcurrentHashMap<>();
|
||||
coCopilotTokenLimitList = new ConcurrentHashMap<>();
|
||||
machineId = generateMachineId();
|
||||
SystemSetting systemSetting = selectSetting();
|
||||
setGpt4_sleepTime(systemSetting.getGpt4_sleepTime());
|
||||
setGpt3_sleepTime(systemSetting.getGpt3_sleepTime());
|
||||
setPassword(systemSetting.getPassword());
|
||||
setGet_token_url(systemSetting.getGet_token_url());
|
||||
setVscode_version(systemSetting.getVscode_version());
|
||||
setCopilot_chat_version(systemSetting.getCopilot_chat_version());
|
||||
setMaxPoolSize(systemSetting.getMaxPoolSize());
|
||||
setExecutor(systemSetting.getMaxPoolSize());
|
||||
setOne_copilot_limit(systemSetting.getOne_copilot_limit());
|
||||
setOne_coCopilot_limit(systemSetting.getOne_coCopilot_limit());
|
||||
setOne_selfCopilot_limit(systemSetting.getOne_selfCopilot_limit());
|
||||
|
||||
}
|
||||
|
||||
public static Integer getOne_copilot_limit() {
|
||||
return one_copilot_limit;
|
||||
@@ -149,66 +207,6 @@ public class ChatController {
|
||||
ChatController.one_selfCopilot_limit = one_selfCopilot_limit;
|
||||
}
|
||||
|
||||
/**
|
||||
* one coCopilot_token max requests per minute
|
||||
*/
|
||||
private static Integer one_coCopilot_limit;
|
||||
|
||||
/**
|
||||
* one selfCopilot_token max requests per minute
|
||||
*/
|
||||
private static Integer one_selfCopilot_limit;
|
||||
|
||||
/**
|
||||
* 定义okhttp库
|
||||
*/
|
||||
private static OkHttpClient client = new OkHttpClient.Builder().connectTimeout(3, TimeUnit.MINUTES)
|
||||
.readTimeout(5, TimeUnit.MINUTES)
|
||||
.writeTimeout(5, TimeUnit.MINUTES)
|
||||
.build();
|
||||
/**
|
||||
* 定义线程池里的线程名字
|
||||
*/
|
||||
private static ThreadFactory threadFactory = new ThreadFactory() {
|
||||
private final AtomicInteger counter = new AtomicInteger(0);
|
||||
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
return new Thread(r, "chatThreadPool-" + counter.getAndIncrement());
|
||||
}
|
||||
};
|
||||
/**
|
||||
* 定义线程池
|
||||
*/
|
||||
private static ExecutorService executor;
|
||||
|
||||
|
||||
/**
|
||||
* 初始化ChatController类
|
||||
*/
|
||||
static {
|
||||
selfTokenList = new HashMap<>();
|
||||
copilotTokenList = new HashMap<>();
|
||||
coCopilotTokenList = new HashMap<>();
|
||||
selfTokenLimitList = new ConcurrentHashMap<>();
|
||||
copilotTokenLimitList = new ConcurrentHashMap<>();
|
||||
coCopilotTokenLimitList = new ConcurrentHashMap<>();
|
||||
machineId = generateMachineId();
|
||||
SystemSetting systemSetting = selectSetting();
|
||||
setGpt4_sleepTime(systemSetting.getGpt4_sleepTime());
|
||||
setGpt3_sleepTime(systemSetting.getGpt3_sleepTime());
|
||||
setPassword(systemSetting.getPassword());
|
||||
setGet_token_url(systemSetting.getGet_token_url());
|
||||
setVscode_version(systemSetting.getVscode_version());
|
||||
setCopilot_chat_version(systemSetting.getCopilot_chat_version());
|
||||
setMaxPoolSize(systemSetting.getMaxPoolSize());
|
||||
setExecutor(systemSetting.getMaxPoolSize());
|
||||
setOne_copilot_limit(systemSetting.getOne_copilot_limit());
|
||||
setOne_coCopilot_limit(systemSetting.getOne_coCopilot_limit());
|
||||
setOne_selfCopilot_limit(systemSetting.getOne_selfCopilot_limit());
|
||||
|
||||
}
|
||||
|
||||
public static String getCopilot_chat_version() {
|
||||
return copilot_chat_version;
|
||||
}
|
||||
@@ -269,8 +267,6 @@ public class ChatController {
|
||||
ChatController.get_token_url = get_token_url;
|
||||
}
|
||||
|
||||
public static final MediaType JSON = MediaType.get("application/json; charset=utf-8");
|
||||
|
||||
/**
|
||||
* 初始化获取环境变量
|
||||
*/
|
||||
@@ -307,10 +303,10 @@ public class ChatController {
|
||||
// 读取 JSON 文件内容
|
||||
String jsonContent = new String(Files.readAllBytes(Paths.get(parent)));
|
||||
// 将 JSON 字符串解析为 JSONObject
|
||||
JSONObject jsonObject = new JSONObject(jsonContent);
|
||||
JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(jsonContent);
|
||||
try {
|
||||
jsonObject.getString("password");
|
||||
} catch (JSONException e) {
|
||||
} catch ( JSONException e) {
|
||||
jsonObject.put("password", UUID.randomUUID().toString());
|
||||
log.info("config.json没有新增password参数,现已增加!");
|
||||
exist = false;
|
||||
@@ -323,14 +319,14 @@ public class ChatController {
|
||||
exist = false;
|
||||
}
|
||||
try {
|
||||
jsonObject.getInt("gpt4_sleepTime");
|
||||
jsonObject.getInteger("gpt4_sleepTime");
|
||||
} catch (JSONException e) {
|
||||
jsonObject.put("gpt4_sleepTime", "100");
|
||||
log.info("config.json没有新增gpt4_sleepTime参数,现已增加!");
|
||||
exist = false;
|
||||
}
|
||||
try {
|
||||
jsonObject.getInt("maxPoolSize");
|
||||
jsonObject.getInteger("maxPoolSize");
|
||||
} catch (JSONException e) {
|
||||
jsonObject.put("maxPoolSize", 300);
|
||||
log.info("config.json没有新增maxPoolSize参数,现已增加!");
|
||||
@@ -340,7 +336,7 @@ public class ChatController {
|
||||
try {
|
||||
jsonObject.getString("vscode_version");
|
||||
} catch (JSONException e) {
|
||||
String latestVSCodeVersion = copilotApplication.getLatestVSCodeVersion();
|
||||
String latestVSCodeVersion = CopilotApplication.getLatestVSCodeVersion();
|
||||
if (latestVSCodeVersion != null) {
|
||||
jsonObject.put("vscode_version", latestVSCodeVersion);
|
||||
log.info("config.json没有新增vscode_version参数,现已增加!");
|
||||
@@ -351,7 +347,7 @@ public class ChatController {
|
||||
try {
|
||||
jsonObject.getString("copilot_chat_version");
|
||||
} catch (JSONException e) {
|
||||
String latestChatVersion = copilotApplication.getLatestExtensionVersion("GitHub", "copilot-chat");
|
||||
String latestChatVersion = CopilotApplication.getLatestExtensionVersion("GitHub", "copilot-chat");
|
||||
if (latestChatVersion != null) {
|
||||
jsonObject.put("copilot_chat_version", latestChatVersion);
|
||||
log.info("config.json没有新增copilot_chat_version参数,现已增加!");
|
||||
@@ -392,20 +388,20 @@ public class ChatController {
|
||||
}
|
||||
// 将 JSONObject 转换为 Config 类的实例
|
||||
SystemSetting config = new SystemSetting();
|
||||
config.setPassword(jsonObject.optString("password"));
|
||||
config.setMaxPoolSize(jsonObject.optInt("maxPoolSize"));
|
||||
config.setGpt3_sleepTime(jsonObject.optInt("gpt3_sleepTime"));
|
||||
config.setGpt4_sleepTime(jsonObject.optInt("gpt4_sleepTime"));
|
||||
config.setVscode_version(jsonObject.optString("vscode_version"));
|
||||
config.setCopilot_chat_version(jsonObject.optString("copilot_chat_version"));
|
||||
config.setGet_token_url(jsonObject.optString("get_token_url"));
|
||||
config.setOne_copilot_limit(jsonObject.optInt("one_copilot_limit"));
|
||||
config.setOne_coCopilot_limit(jsonObject.optInt("one_coCopilot_limit"));
|
||||
config.setOne_selfCopilot_limit(jsonObject.optInt("one_selfCopilot_limit"));
|
||||
config.setPassword(jsonObject.getString("password"));
|
||||
config.setMaxPoolSize(jsonObject.getIntValue("maxPoolSize"));
|
||||
config.setGpt3_sleepTime(jsonObject.getIntValue("gpt3_sleepTime"));
|
||||
config.setGpt4_sleepTime(jsonObject.getIntValue("gpt4_sleepTime"));
|
||||
config.setVscode_version(jsonObject.getString("vscode_version"));
|
||||
config.setCopilot_chat_version(jsonObject.getString("copilot_chat_version"));
|
||||
config.setGet_token_url(jsonObject.getString("get_token_url"));
|
||||
config.setOne_copilot_limit(jsonObject.getIntValue("one_copilot_limit"));
|
||||
config.setOne_coCopilot_limit(jsonObject.getIntValue("one_coCopilot_limit"));
|
||||
config.setOne_selfCopilot_limit(jsonObject.getIntValue("one_selfCopilot_limit"));
|
||||
|
||||
if (exist == false) {
|
||||
if (!exist) {
|
||||
// 将修改后的 JSONObject 转换为格式化的 JSON 字符串
|
||||
String updatedJson = jsonObject.toString(2);
|
||||
String updatedJson = com.alibaba.fastjson.JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat);
|
||||
Files.write(Paths.get(parent), updatedJson.getBytes());
|
||||
}
|
||||
return config;
|
||||
@@ -415,15 +411,6 @@ public class ChatController {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 */1 * * * ?")
|
||||
public void resetLimit() {
|
||||
ExecutorService updateExecutor = Executors.newFixedThreadPool(3);
|
||||
updateExecutor.submit(() -> copilotTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0)));
|
||||
updateExecutor.submit(() -> coCopilotTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0)));
|
||||
updateExecutor.submit(() -> selfTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0)));
|
||||
updateExecutor.shutdown();
|
||||
}
|
||||
|
||||
private static String generateMachineId() {
|
||||
try {
|
||||
UUID uuid = UUID.randomUUID();
|
||||
@@ -443,6 +430,15 @@ public class ChatController {
|
||||
}
|
||||
}
|
||||
|
||||
@Scheduled(cron = "0 */1 * * * ?")
|
||||
public void resetLimit() {
|
||||
ExecutorService updateExecutor = Executors.newFixedThreadPool(3);
|
||||
updateExecutor.submit(() -> copilotTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0)));
|
||||
updateExecutor.submit(() -> coCopilotTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0)));
|
||||
updateExecutor.submit(() -> selfTokenLimitList.replaceAll((k, v) -> new AtomicInteger(0)));
|
||||
updateExecutor.shutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改sleep时间
|
||||
*/
|
||||
@@ -456,7 +452,7 @@ public class ChatController {
|
||||
String parent = selectFile();
|
||||
// 读取 JSON 文件内容
|
||||
String jsonContent = new String(Files.readAllBytes(Paths.get(parent)));
|
||||
JSONObject jsonObject = new JSONObject(jsonContent);
|
||||
JSONObject jsonObject = com.alibaba.fastjson2.JSON.parseObject(jsonContent);
|
||||
if (gpt3_sleepTime != null && gpt4_sleepTime >= 0 && gpt4_sleepTime <= 150) {
|
||||
setGpt3_sleepTime(gpt3_sleepTime);
|
||||
jsonObject.put("gpt3_sleepTime", gpt3_sleepTime);
|
||||
@@ -470,7 +466,7 @@ public class ChatController {
|
||||
jsonObject.put("get_token_url", get_token_url);
|
||||
}
|
||||
// 将修改后的 JSONObject 转换为格式化的 JSON 字符串
|
||||
String updatedJson = jsonObject.toString(2);
|
||||
String updatedJson = com.alibaba.fastjson.JSON.toJSONString(jsonObject, SerializerFeature.PrettyFormat);
|
||||
Path path = Paths.get(parent);
|
||||
Files.write(path, updatedJson.getBytes());
|
||||
return Result.success("修改成功!");
|
||||
@@ -495,7 +491,8 @@ public class ChatController {
|
||||
*/
|
||||
@PostMapping(value = "/copilot_internal/v2/token")
|
||||
public ResponseEntity<Object> getV2Token(HttpServletResponse response, HttpServletRequest request) {
|
||||
String authorizationHeader = StringUtils.trimToNull(request.getHeader("Authorization"));
|
||||
String header = request.getHeader("Authorization");
|
||||
String authorizationHeader = (header != null && !header.trim().isEmpty()) ? header.trim() : null;
|
||||
CompletableFuture<ResponseEntity<Object>> future = CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
String apiKey;
|
||||
@@ -562,7 +559,8 @@ public class ChatController {
|
||||
public ResponseEntity<Object> coPilotConversation(HttpServletResponse response,
|
||||
HttpServletRequest request,
|
||||
@org.springframework.web.bind.annotation.RequestBody Conversation conversation) {
|
||||
String authorizationHeader = StringUtils.trimToNull(request.getHeader("Authorization"));
|
||||
String header = request.getHeader("Authorization");
|
||||
String authorizationHeader = (header != null && !header.trim().isEmpty()) ? header.trim() : null;
|
||||
// 异步处理
|
||||
CompletableFuture<ResponseEntity<Object>> future = CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
@@ -583,11 +581,10 @@ public class ChatController {
|
||||
copilotTokenLimitList.putIfAbsent(apiKey, new AtomicInteger(1));
|
||||
copilotTokenList.put(apiKey, token);
|
||||
log.info("Github CopilotToken初始化成功!");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int requestNum = copilotTokenLimitList.get(apiKey).incrementAndGet();
|
||||
if(requestNum > one_copilot_limit){
|
||||
return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
if (requestNum > one_copilot_limit) {
|
||||
return new ResponseEntity<>(Result.error("current requests is " + requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
}
|
||||
}
|
||||
// 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions
|
||||
@@ -624,18 +621,7 @@ public class ChatController {
|
||||
return null;
|
||||
}, executor);
|
||||
|
||||
ResponseEntity<Object> responseEntity;
|
||||
|
||||
try {
|
||||
responseEntity = future.get(6, TimeUnit.MINUTES);
|
||||
} catch (TimeoutException ex) {
|
||||
future.cancel(true);
|
||||
responseEntity = new ResponseEntity<>(Result.error("The task timed out"), HttpStatus.REQUEST_TIMEOUT);
|
||||
} catch (Exception ex) {
|
||||
log.error(ex.getMessage());
|
||||
responseEntity = new ResponseEntity<>(Result.error("An error occurred"), HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
return responseEntity;
|
||||
return getObjectResponseEntity(response, future);
|
||||
}
|
||||
|
||||
|
||||
@@ -656,7 +642,8 @@ public class ChatController {
|
||||
public ResponseEntity<Object> coCoPilotConversation(HttpServletResponse response,
|
||||
HttpServletRequest request,
|
||||
@org.springframework.web.bind.annotation.RequestBody Conversation conversation) {
|
||||
String authorizationHeader = StringUtils.trimToNull(request.getHeader("Authorization"));
|
||||
String header = request.getHeader("Authorization");
|
||||
String authorizationHeader = (header != null && !header.trim().isEmpty()) ? header.trim() : null;
|
||||
// 异步处理
|
||||
CompletableFuture<ResponseEntity<Object>> future = CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
@@ -677,11 +664,10 @@ public class ChatController {
|
||||
coCopilotTokenLimitList.put(apiKey, new AtomicInteger(1));
|
||||
coCopilotTokenList.put(apiKey, token);
|
||||
log.info("coCopilotToken初始化成功!");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int requestNum = coCopilotTokenLimitList.get(apiKey).incrementAndGet();
|
||||
if(requestNum > one_coCopilot_limit){
|
||||
return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
if (requestNum > one_coCopilot_limit) {
|
||||
return new ResponseEntity<>(Result.error("current requests is " + requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
}
|
||||
}
|
||||
// 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions
|
||||
@@ -718,14 +704,32 @@ public class ChatController {
|
||||
return null;
|
||||
}, executor);
|
||||
|
||||
return getObjectResponseEntity(future);
|
||||
return getObjectResponseEntity(response, future);
|
||||
}
|
||||
|
||||
private ResponseEntity<Object> getObjectResponseEntity(HttpServletResponse response, CompletableFuture<ResponseEntity<Object>> future) {
|
||||
ResponseEntity<Object> responseEntity;
|
||||
|
||||
try {
|
||||
responseEntity = future.get(6, TimeUnit.MINUTES);
|
||||
} catch (TimeoutException ex) {
|
||||
response.setContentType("application/json; charset=utf-8");
|
||||
future.cancel(true);
|
||||
responseEntity = new ResponseEntity<>(Result.error("The Chat timed out"), HttpStatus.REQUEST_TIMEOUT);
|
||||
} catch (Exception ex) {
|
||||
response.setContentType("application/json; charset=utf-8");
|
||||
log.error(ex.getMessage());
|
||||
responseEntity = new ResponseEntity<>(Result.error("An error occurred"), HttpStatus.INTERNAL_SERVER_ERROR);
|
||||
}
|
||||
return responseEntity;
|
||||
}
|
||||
|
||||
@PostMapping(value = "/self/v1/chat/completions")
|
||||
public ResponseEntity<Object> selfConversation(HttpServletResponse response,
|
||||
HttpServletRequest request,
|
||||
@org.springframework.web.bind.annotation.RequestBody Conversation conversation) {
|
||||
String authorizationHeader = StringUtils.trimToNull(request.getHeader("Authorization"));
|
||||
String header = request.getHeader("Authorization");
|
||||
String authorizationHeader = (header != null && !header.trim().isEmpty()) ? header.trim() : null;
|
||||
// 异步处理
|
||||
CompletableFuture<ResponseEntity<Object>> future = CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
@@ -744,13 +748,12 @@ public class ChatController {
|
||||
return new ResponseEntity<>(Result.error("自定义self APIKey is wrong"), HttpStatus.UNAUTHORIZED);
|
||||
}
|
||||
selfTokenList.put(apiKey, token);
|
||||
selfTokenLimitList.put(apiKey,new AtomicInteger(1));
|
||||
selfTokenLimitList.put(apiKey, new AtomicInteger(1));
|
||||
log.info("自定义selfToken初始化成功!");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int requestNum = selfTokenLimitList.get(apiKey).incrementAndGet();
|
||||
if(requestNum > one_selfCopilot_limit){
|
||||
return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
if (requestNum > one_selfCopilot_limit) {
|
||||
return new ResponseEntity<>(Result.error("current requests is " + requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
}
|
||||
}
|
||||
// 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions
|
||||
@@ -787,7 +790,7 @@ public class ChatController {
|
||||
return null;
|
||||
}, executor);
|
||||
|
||||
return getObjectResponseEntity(future);
|
||||
return getObjectResponseEntity(response, future);
|
||||
}
|
||||
|
||||
|
||||
@@ -843,7 +846,8 @@ public class ChatController {
|
||||
public ResponseEntity<Object> coPilotEmbeddings(HttpServletResponse response,
|
||||
HttpServletRequest request,
|
||||
@org.springframework.web.bind.annotation.RequestBody Conversation conversation) {
|
||||
String authorizationHeader = StringUtils.trimToNull(request.getHeader("Authorization"));
|
||||
String header = request.getHeader("Authorization");
|
||||
String authorizationHeader = (header != null && !header.trim().isEmpty()) ? header.trim() : null;
|
||||
// 异步处理
|
||||
CompletableFuture<ResponseEntity<Object>> future = CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
@@ -864,11 +868,10 @@ public class ChatController {
|
||||
copilotTokenLimitList.put(apiKey, new AtomicInteger(1));
|
||||
copilotTokenList.put(apiKey, token);
|
||||
log.info("Github CopilotToken初始化成功!");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int requestNum = copilotTokenLimitList.get(apiKey).incrementAndGet();
|
||||
if(requestNum > one_copilot_limit){
|
||||
return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
if (requestNum > one_copilot_limit) {
|
||||
return new ResponseEntity<>(Result.error("current requests is " + requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
}
|
||||
}
|
||||
// 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions
|
||||
@@ -941,7 +944,8 @@ public class ChatController {
|
||||
public ResponseEntity<Object> coCoPilotEmbeddings(HttpServletResponse response,
|
||||
HttpServletRequest request,
|
||||
@org.springframework.web.bind.annotation.RequestBody Conversation conversation) {
|
||||
String authorizationHeader = StringUtils.trimToNull(request.getHeader("Authorization"));
|
||||
String header = request.getHeader("Authorization");
|
||||
String authorizationHeader = (header != null && !header.trim().isEmpty()) ? header.trim() : null;
|
||||
// 异步处理
|
||||
CompletableFuture<ResponseEntity<Object>> future = CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
@@ -962,11 +966,10 @@ public class ChatController {
|
||||
coCopilotTokenLimitList.put(apiKey, new AtomicInteger(1));
|
||||
coCopilotTokenList.put(apiKey, token);
|
||||
log.info("coCopilotToken初始化成功!");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int requestNum = coCopilotTokenLimitList.get(apiKey).incrementAndGet();
|
||||
if(requestNum > one_coCopilot_limit){
|
||||
return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
if (requestNum > one_coCopilot_limit) {
|
||||
return new ResponseEntity<>(Result.error("current requests is " + requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
}
|
||||
}
|
||||
// 创建OkHttpClient请求 请求https://api.githubcopilot.com/chat/completions
|
||||
@@ -1024,7 +1027,8 @@ public class ChatController {
|
||||
public ResponseEntity<Object> selfEmbeddings(HttpServletResponse response,
|
||||
HttpServletRequest request,
|
||||
@org.springframework.web.bind.annotation.RequestBody Conversation conversation) {
|
||||
String authorizationHeader = StringUtils.trimToNull(request.getHeader("Authorization"));
|
||||
String header = request.getHeader("Authorization");
|
||||
String authorizationHeader = (header != null && !header.trim().isEmpty()) ? header.trim() : null;
|
||||
// 异步处理
|
||||
CompletableFuture<ResponseEntity<Object>> future = CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
@@ -1042,14 +1046,13 @@ public class ChatController {
|
||||
if (token == null) {
|
||||
return new ResponseEntity<>(Result.error("自定义APIKey is wrong"), HttpStatus.UNAUTHORIZED);
|
||||
}
|
||||
selfTokenLimitList.put(apiKey,new AtomicInteger(1));
|
||||
selfTokenLimitList.put(apiKey, new AtomicInteger(1));
|
||||
selfTokenList.put(apiKey, token);
|
||||
log.info("自定义selfToken初始化成功!");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
int requestNum = selfTokenLimitList.get(apiKey).incrementAndGet();
|
||||
if(requestNum > one_selfCopilot_limit){
|
||||
return new ResponseEntity<>(Result.error("current requests is "+ requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
if (requestNum > one_selfCopilot_limit) {
|
||||
return new ResponseEntity<>(Result.error("current requests is " + requestNum + " rate limit exceeded"), HttpStatus.TOO_MANY_REQUESTS);
|
||||
}
|
||||
}
|
||||
String chat_token = selfTokenList.get(apiKey);
|
||||
@@ -1127,14 +1130,19 @@ public class ChatController {
|
||||
.addHeader("Editor-Plugin-Version", "copilot-chat/" + copilot_chat_version)
|
||||
.addHeader("User-Agent", "GitHubCopilotChat/" + copilot_chat_version)
|
||||
.addHeader("Accept", "*/*").build();
|
||||
return getToken(request);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String getToken(Request request) throws IOException {
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
log.info(response.toString());
|
||||
if (!response.isSuccessful()) {
|
||||
return null;
|
||||
}
|
||||
String responseBody = response.body().string();
|
||||
JSONObject jsonResponse = new JSONObject(responseBody);
|
||||
return jsonResponse.has("token") ? jsonResponse.get("token").toString() : null;
|
||||
JSONObject jsonResponse = com.alibaba.fastjson2.JSON.parseObject(responseBody);
|
||||
return jsonResponse.getString("token");
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
@@ -1154,17 +1162,7 @@ public class ChatController {
|
||||
.addHeader("Editor-Plugin-Version", "copilot-chat/" + copilot_chat_version)
|
||||
.addHeader("User-Agent", "GitHubCopilotChat/" + copilot_chat_version)
|
||||
.addHeader("Accept", "*/*").build();
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
log.info(response.toString());
|
||||
if (!response.isSuccessful()) {
|
||||
return null;
|
||||
}
|
||||
String responseBody = response.body().string();
|
||||
JSONObject jsonResponse = new JSONObject(responseBody);
|
||||
return jsonResponse.has("token") ? jsonResponse.get("token").toString() : null;
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return getToken(request);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1181,17 +1179,7 @@ public class ChatController {
|
||||
.addHeader("Editor-Plugin-Version", "copilot-chat/" + copilot_chat_version)
|
||||
.addHeader("User-Agent", "GitHubCopilotChat/" + copilot_chat_version)
|
||||
.addHeader("Accept", "*/*").build();
|
||||
try (Response response = client.newCall(request).execute()) {
|
||||
log.info(response.toString());
|
||||
if (!response.isSuccessful()) {
|
||||
return null;
|
||||
}
|
||||
String responseBody = response.body().string();
|
||||
JSONObject jsonResponse = new JSONObject(responseBody);
|
||||
return jsonResponse.has("token") ? jsonResponse.get("token").toString() : null;
|
||||
} catch (JSONException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
return getToken(request);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -25,7 +25,7 @@ public class CustomErrorController implements ErrorController {
|
||||
" <title>Document</title>\n" +
|
||||
"</head>\n" +
|
||||
"<body>\n" +
|
||||
" <p>Thanks you use gpt4-copilot-java-0.0.5</p>\n" +
|
||||
" <p>Thanks you use gpt4-copilot-java-0.1.0</p>\n" +
|
||||
" <p><a href=\"https://apifox.com/apidoc/shared-4301e565-a8df-48a0-85a5-bda2c4c3965a\">详细使用文档</a></p>\n" +
|
||||
" <p><a href=\"https://github.com/Yanyutin753/gpt4-copilot-java-sh\">项目地址</a></p>\n" +
|
||||
"</body>\n" +
|
||||
|
@@ -8,6 +8,9 @@ import lombok.NoArgsConstructor;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author YANGYANG
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
|
@@ -4,6 +4,9 @@ import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author YANGYANG
|
||||
*/
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
target/gpt-4-copilot-0.1.0.jar.original
Normal file
BIN
target/gpt-4-copilot-0.1.0.jar.original
Normal file
Binary file not shown.
@@ -1,3 +1,3 @@
|
||||
artifactId=gpt-4-copilot
|
||||
groupId=com.gpt4.copilot
|
||||
version=0.0.7
|
||||
version=0.1.0
|
||||
|
@@ -7,4 +7,4 @@ com\gpt4\copilot\pojo\Conversation.class
|
||||
com\gpt4\copilot\pojo\SystemSetting.class
|
||||
com\gpt4\copilot\config\CorsConfig.class
|
||||
com\gpt4\copilot\pojo\Result.class
|
||||
com\gpt4\copilot\copilotApplication.class
|
||||
com\gpt4\copilot\CopilotApplication.class
|
||||
|
@@ -5,4 +5,4 @@ F:\vue\fakeApiTool\graalvm-demos\spring-native-image\GPT4-Copilot\src\main\java\
|
||||
F:\vue\fakeApiTool\graalvm-demos\spring-native-image\GPT4-Copilot\src\main\java\com\gpt4\copilot\pojo\SystemSetting.java
|
||||
F:\vue\fakeApiTool\graalvm-demos\spring-native-image\GPT4-Copilot\src\main\java\com\gpt4\copilot\controller\ChatController.java
|
||||
F:\vue\fakeApiTool\graalvm-demos\spring-native-image\GPT4-Copilot\src\main\java\com\gpt4\copilot\config\WebConfig.java
|
||||
F:\vue\fakeApiTool\graalvm-demos\spring-native-image\GPT4-Copilot\src\main\java\com\gpt4\copilot\copilotApplication.java
|
||||
F:\vue\fakeApiTool\graalvm-demos\spring-native-image\GPT4-Copilot\src\main\java\com\gpt4\copilot\CopilotApplication.java
|
||||
|
Reference in New Issue
Block a user