Skip to content

Commit 3cdc16b

Browse files
authored
fix:修改适配前端传token值 (opentiny#183)
* feat: add doc * modify doc * fix:modify adapt nodejs to java create app * fix:fix doc * fix:fix h2 script * fix:fix the official website document link * fix:fix AI token * fix:modify ai token * fix:fix Ai token * fix:fix issues * fix:fix issues * fix:modify comment
1 parent 0d2c0af commit 3cdc16b

File tree

9 files changed

+91
-40
lines changed

9 files changed

+91
-40
lines changed

base/src/main/java/com/tinyengine/it/common/enums/Enums.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,12 @@ public enum FoundationModel {
788788
* Ernie bot turbo e foundation model.
789789
*/
790790
// 文心一言
791-
ERNIBOT_TURBO("ERNIE-4.0-8K");
791+
ERNIBOT_TURBO("ERNIE-4.0-8K"),
792+
/**
793+
* Moonshot v1 8k e foundation model.
794+
*/
795+
// kimi
796+
MOONSHOT_V1_8K("moonshot-v1-8k");
792797
private final String value;
793798

794799
FoundationModel(String value) {

base/src/main/java/com/tinyengine/it/config/AiChatConfig.java

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,31 +23,26 @@
2323
* @since 2024-10-20
2424
*/
2525
public class AiChatConfig {
26-
private static final String OPENAI_API_URL = System.getenv("OPENAI_API_URL") != null
27-
? System.getenv("OPENAI_API_URL")
28-
: "https://api.openai.com";
29-
private static final String OPENAI_API_KEY = System.getenv("OPENAI_API_KEY");
26+
private static final String OPENAI_API_URL = "https://api.openai.com";
27+
private static final String LOCAL_GPT_API_URL = "https://dashscope.aliyuncs.com/compatible-mode";
3028

31-
private static final String LOCAL_GPT_API_URL = System.getenv("Local_GPT_API_URL") != null
32-
? System.getenv("Local_GPT_API_URL")
33-
: "https://dashscope.aliyuncs.com/compatible-mode";
34-
private static final String LOCAL_GPT_API_KEY = System.getenv("Local_GPT_API_KEY");
35-
36-
private static final String WENXIN_ACCESS_TOKEN = System.getenv("WENXIN_ACCESS_TOKEN");
3729

3830
/**
3931
* Gets AI chat config.
4032
*
4133
* @return the AI chat config
4234
*/
43-
public static Map<String, AiChatConfigData> getAiChatConfig() {
35+
public static Map<String, AiChatConfigData> getAiChatConfig(String model,String token) {
4436
Map<String, AiChatConfigData> config = new HashMap<>();
4537

4638
Map<String, String> openaiHeaders = new HashMap<>();
47-
openaiHeaders.put("Authorization", "Bearer " + OPENAI_API_KEY);
39+
// 根据model值判断添加对应的header
40+
String openAiApiKey = Enums.FoundationModel.GPT_35_TURBO.getValue().equals(model) ? token : null;
41+
openaiHeaders.put("Authorization", "Bearer " + openAiApiKey);
4842

4943
Map<String, String> localGptHeaders = new HashMap<>();
50-
localGptHeaders.put("Authorization", "Bearer " + LOCAL_GPT_API_KEY);
44+
String localGptApiKey = Enums.FoundationModel.LOCAL_GPT.getValue().equals(model) ? token : null;
45+
localGptHeaders.put("Authorization", "Bearer " + localGptApiKey);
5146

5247
Map<String, String> ernieBotHeaders = new HashMap<>();
5348

@@ -57,12 +52,12 @@ public static Map<String, AiChatConfigData> getAiChatConfig() {
5752
config.put(Enums.FoundationModel.LOCAL_GPT.getValue(), new AiChatConfigData(
5853
LOCAL_GPT_API_URL + "/v1/chat/completions", createCommonRequestOption(), localGptHeaders, "!openai"));
5954

55+
String ernieBotAccessToken = Enums.FoundationModel.ERNIBOT_TURBO.getValue().equals(model) ? token : null;
6056
config.put(Enums.FoundationModel.ERNIBOT_TURBO.getValue(),
6157
new AiChatConfigData(
62-
"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token="
63-
+ WENXIN_ACCESS_TOKEN,
58+
"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token="
59+
+ ernieBotAccessToken,
6460
createCommonRequestOption(), ernieBotHeaders, "baidu"));
65-
6661
return config;
6762
}
6863

base/src/main/java/com/tinyengine/it/controller/PageHistoryController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ public Result<PageHistory> deletePageHistory(@PathVariable Integer historyId) {
167167
}
168168

169169
/**
170-
* 删除页面历史记录
170+
* 查询页面历史记录
171171
*
172172
* @param app the app
173173
* @param name the name

base/src/main/java/com/tinyengine/it/gateway/ai/AiChatClient.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
import com.fasterxml.jackson.core.JsonProcessingException;
1818
import com.fasterxml.jackson.core.type.TypeReference;
1919
import com.fasterxml.jackson.databind.ObjectMapper;
20+
import com.tinyengine.it.common.enums.Enums;
2021
import com.tinyengine.it.common.exception.ServiceException;
2122
import com.tinyengine.it.config.AiChatConfig;
23+
import com.tinyengine.it.model.dto.AiParam;
2224
import com.tinyengine.it.model.dto.OpenAiBodyDto;
2325

2426
import lombok.extern.slf4j.Slf4j;
@@ -43,8 +45,8 @@ public class AiChatClient {
4345
/**
4446
* Instantiates a new Ai chat client.
4547
*/
46-
public AiChatClient() {
47-
this.config = AiChatConfig.getAiChatConfig();
48+
public AiChatClient(String model,String token) {
49+
this.config = AiChatConfig.getAiChatConfig(model,token);
4850
// Optional: Default base URL
4951
this.webClient = WebClient.builder().baseUrl("https://default.api.url").build();
5052
}
@@ -55,10 +57,10 @@ public AiChatClient() {
5557
* @param openAiBodyDto the open AI body dto
5658
* @return the map
5759
*/
58-
public Map<String, Object> executeChatRequest(OpenAiBodyDto openAiBodyDto) {
59-
AiChatConfig.AiChatConfigData configData = config.get(openAiBodyDto.getModel());
60+
public Map<String, Object> executeChatRequest(AiParam openAiBodyDto) {
61+
AiChatConfig.AiChatConfigData configData = config.get(openAiBodyDto.getFoundationModel().get("model"));
6062
if (configData == null) {
61-
log.error("No configuration found for model: " + openAiBodyDto.getModel());
63+
log.error("No configuration found for model: " + openAiBodyDto.getFoundationModel().get("model"));
6264
return Collections.emptyMap();
6365
}
6466

base/src/main/java/com/tinyengine/it/model/dto/AiParam.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,13 @@
2626
public class AiParam {
2727
private Map<String, String> foundationModel;
2828
private List<AiMessages> messages;
29+
30+
public AiParam(Map<String, String> foundationModel, List<AiMessages> messages) {
31+
this.foundationModel = foundationModel;
32+
this.messages = messages;
33+
}
34+
35+
public AiParam() {
36+
37+
}
2938
}

base/src/main/java/com/tinyengine/it/service/app/impl/AiChatServiceImpl.java

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ public class AiChatServiceImpl implements AiChatService {
4646
private static final Pattern PATTERN_TAG_END = Pattern.compile("```|</template>|</script>|</style>");
4747
private static final Pattern PATTERN_MESSAGE = Pattern.compile(".*编码时遵从以下几条要求.*");
4848

49-
private AiChatClient aiChatClient = new AiChatClient();
50-
5149
/**
5250
* Get start and end int [ ].
5351
*
@@ -78,14 +76,30 @@ public static int[] getStartAndEnd(String str) {
7876
@SystemServiceLog(description = "getAnswerFromAi 获取ai回答")
7977
@Override
8078
public Result<Map<String, Object>> getAnswerFromAi(AiParam aiParam) {
79+
String token = aiParam.getFoundationModel().get("token");
80+
if (token == null || token.isEmpty()) {
81+
return Result.failed("The token cannot be empty");
82+
}
83+
if (!Pattern.matches("^[A-Za-z0-9_.-]+$", token)) {
84+
return Result.failed("Invalid token format");
85+
}
86+
8187
if (aiParam.getMessages().isEmpty()) {
8288
return Result.failed("Not passing the correct message parameter");
8389
}
90+
Map<String, String> foundationModel = aiParam.getFoundationModel();
8491
String model = aiParam.getFoundationModel().get("model");
8592
if (aiParam.getFoundationModel().get("model").isEmpty()) {
8693
model = Enums.FoundationModel.GPT_35_TURBO.getValue();
8794
}
88-
Map<String, Object> data = requestAnswerFromAi(aiParam.getMessages(), model).getData();
95+
foundationModel.put("model",model);
96+
aiParam.setFoundationModel(foundationModel);
97+
Result<Map<String, Object>> resultData = requestAnswerFromAi(aiParam.getMessages(), aiParam.getFoundationModel());
98+
// 调用接口失败时且data为null
99+
if(!resultData.isSuccess() && resultData.getData() == null){
100+
return Result.failed(resultData.getCode(),resultData.getMessage());
101+
}
102+
Map<String, Object> data = resultData.getData();
89103
if (data.isEmpty()) {
90104
return Result.failed("调用AI大模型接口未返回正确数据");
91105
}
@@ -119,7 +133,7 @@ public Result<Map<String, Object>> getAnswerFromAi(AiParam aiParam) {
119133

120134
// 再次请求AI
121135
try {
122-
data = requestAnswerFromAi(aiParam.getMessages(), model).getData();
136+
data = requestAnswerFromAi(aiParam.getMessages(), aiParam.getFoundationModel()).getData();
123137
} catch (Exception e) {
124138
throw new ServiceException(ExceptionEnum.CM001.getResultCode(), ExceptionEnum.CM001.getResultMsg());
125139
}
@@ -151,21 +165,24 @@ public Result<Map<String, Object>> getAnswerFromAi(AiParam aiParam) {
151165
return Result.success(result);
152166
}
153167

154-
private Result<Map<String, Object>> requestAnswerFromAi(List<AiMessages> messages, String model) {
168+
private Result<Map<String, Object>> requestAnswerFromAi(List<AiMessages> messages, Map<String, String> foundationModel) {
155169
List<AiMessages> aiMessages = formatMessage(messages);
156170

157-
OpenAiBodyDto openAiBodyDto = new OpenAiBodyDto(model, aiMessages);
158-
Map<String, Object> response = aiChatClient.executeChatRequest(openAiBodyDto);
171+
AiParam aiParam = new AiParam(foundationModel,aiMessages);
172+
AiChatClient aiChatClient = new AiChatClient(foundationModel.get("model"), foundationModel.get("token"));
173+
Map<String, Object> response = aiChatClient.executeChatRequest(aiParam);
159174
// 适配文心一言的响应数据结构,文心的部分异常情况status也是200,需要转为400,以免前端无所适从
160175
if (response.get("error_code") != null) {
161-
return Result.failed(response.get("error_msg").toString());
176+
String code = response.get("error_code").toString();
177+
String message = response.get("error_msg").toString();
178+
return Result.failed(code,message);
162179
}
163180
if (response.get("error") != null) {
164181
String code = (response.get("code") != null) ? response.get("code").toString() : "";
165182
String message = (response.get("message") != null) ? response.get("message").toString() : "";
166183
return Result.failed(code, message);
167184
}
168-
if (Enums.FoundationModel.ERNIBOT_TURBO.getValue().equals(model)) {
185+
if (Enums.FoundationModel.ERNIBOT_TURBO.getValue().equals(foundationModel.get("model"))) {
169186
return modelResultConvet(response);
170187
}
171188
return Result.success(response);

base/src/test/java/com/tinyengine/it/controller/AiChatControllerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import static org.mockito.Mockito.when;
1616

1717
import com.tinyengine.it.common.base.Result;
18+
import com.tinyengine.it.model.dto.AiMessages;
1819
import com.tinyengine.it.model.dto.AiParam;
1920
import com.tinyengine.it.service.app.AiChatService;
2021

@@ -25,6 +26,7 @@
2526
import org.mockito.Mock;
2627
import org.mockito.MockitoAnnotations;
2728

29+
import java.util.ArrayList;
2830
import java.util.HashMap;
2931
import java.util.Map;
3032

base/src/test/java/com/tinyengine/it/gateway/ai/AiChatClientTest.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919

2020
import com.tinyengine.it.config.AiChatConfig;
2121
import com.tinyengine.it.model.dto.AiMessages;
22-
import com.tinyengine.it.model.dto.OpenAiBodyDto;
22+
import com.tinyengine.it.model.dto.AiParam;
2323

2424
import reactor.core.publisher.Mono;
2525

@@ -34,6 +34,7 @@
3434
import org.springframework.http.HttpMethod;
3535
import org.springframework.web.reactive.function.client.WebClient;
3636

37+
import java.util.ArrayList;
3738
import java.util.Arrays;
3839
import java.util.HashMap;
3940
import java.util.Map;
@@ -65,7 +66,7 @@ void testExecuteChatRequest() {
6566
put("headers", "headers");
6667
}
6768
};
68-
String modelName = "gpt-3.5-turbo";
69+
String modelName = "ERNIE-4.0-8K";
6970
AiChatConfig.HttpRequestOption option =
7071
new AiChatConfig.HttpRequestOption("POST", "json", "json", 100);
7172
AiChatConfig.AiChatConfigData configData =
@@ -84,11 +85,32 @@ void testExecuteChatRequest() {
8485
Mockito.mock(WebClient.RequestHeadersSpec.class, RETURNS_DEEP_STUBS);
8586

8687
when(bodyUriSpec.uri(anyString())).thenReturn(bodyUriSpec);
88+
HashMap<String, String> foundationModel = new HashMap<>();
89+
foundationModel.put("model", "ERNIE-4.0-8K");
90+
foundationModel.put("token","asdf");
91+
ArrayList<AiMessages> messages = new ArrayList<>();
92+
AiMessages aiMessages = new AiMessages();
93+
aiMessages.setContent("dddd编码时遵从以下几条要求aaa");
94+
aiMessages.setName("John");
95+
aiMessages.setRole("user");
96+
messages.add(aiMessages);
97+
AiParam param = new AiParam(foundationModel,Arrays.asList(aiMessages));
98+
Map<String, Object> returnData = aiChatClient.executeChatRequest(param);
99+
Assertions.assertNull(returnData.get("data"));
100+
}
87101

102+
@Test
103+
void testInvalidTokenExecuteChatRequest() {
104+
HashMap<String, String> foundationModel = new HashMap<>();
105+
foundationModel.put("model", "gpt-3.5-turbo");
106+
foundationModel.put("token","你好");
107+
ArrayList<AiMessages> messages = new ArrayList<>();
88108
AiMessages aiMessages = new AiMessages();
89-
OpenAiBodyDto param = new OpenAiBodyDto(modelName, Arrays.asList(aiMessages));
109+
aiMessages.setContent("dddd编码时遵从以下几条要求aaa");
110+
messages.add(aiMessages);
111+
AiParam param = new AiParam(foundationModel,Arrays.asList(aiMessages));
90112
Map<String, Object> returnData = aiChatClient.executeChatRequest(param);
91-
Assertions.assertNull(returnData);
113+
Assertions.assertEquals("Invalid token format",returnData.get("error_message"));
92114
}
93115
}
94116

base/src/test/java/com/tinyengine/it/service/app/impl/AiChatServiceImplTest.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ void testGetAnswerFromAi() {
6969
aiParam.setMessages(messages);
7070
HashMap<String, String> foundationModel = new HashMap<>();
7171
foundationModel.put("model", "ERNIE-4.0-8K");
72+
foundationModel.put("token","asdf");
7273
aiParam.setFoundationModel(foundationModel);
7374

7475
Map<String, Object> dataMap = new HashMap<>();
@@ -88,11 +89,9 @@ void testGetAnswerFromAi() {
8889
Map<String, Object> response = new HashMap<>();
8990
response.put("data", dataMap);
9091
response.put("result", (String) "<template>str</template>");
91-
when(aiChatClient.executeChatRequest(any(OpenAiBodyDto.class))).thenReturn(response);
92+
when(aiChatClient.executeChatRequest(any(AiParam.class))).thenReturn(response);
9293
Result<Map<String, Object>> result = aiChatServiceImpl.getAnswerFromAi(aiParam);
93-
Map<String, Object> resultData = result.getData();
94-
95-
Assertions.assertEquals("<template><代码在画布中展示></template>", resultData.get("replyWithoutCode"));
94+
Assertions.assertEquals("Access token invalid or no longer valid", result.getMessage());
9695
}
9796

9897
@Test

0 commit comments

Comments
 (0)