diff --git a/app/src/main/resources/sql/mysql/create_all_tables_ddl_v1.mysql.sql b/app/src/main/resources/sql/mysql/create_all_tables_ddl_v1.mysql.sql index a4d5333f..80dfe976 100644 --- a/app/src/main/resources/sql/mysql/create_all_tables_ddl_v1.mysql.sql +++ b/app/src/main/resources/sql/mysql/create_all_tables_ddl_v1.mysql.sql @@ -343,7 +343,7 @@ create table `t_page` `last_updated_by` varchar(60) not null comment '最后修改人', `last_updated_time` timestamp not null default current_timestamp comment '更新时间', primary key (`id`) using btree, - unique index `u_idx_page` (`app_id`, `name`) using btree + unique index `u_idx_page` (`app_id`,`parent_id`,`route`,`is_page`,`tenant_id`, `name`) using btree ) engine = innodb comment = '页面表'; drop table if exists `t_page_history`; diff --git a/base/src/main/java/com/tinyengine/it/common/enums/Enums.java b/base/src/main/java/com/tinyengine/it/common/enums/Enums.java index 953a54c4..3a2f538f 100644 --- a/base/src/main/java/com/tinyengine/it/common/enums/Enums.java +++ b/base/src/main/java/com/tinyengine/it/common/enums/Enums.java @@ -788,7 +788,7 @@ public enum FoundationModel { * Ernie bot turbo e foundation model. */ // 文心一言 - ERNIBOT_TURBO("ERNIE-Bot-turbo"); + ERNIBOT_TURBO("ERNIE-4.0-8K"); private final String value; FoundationModel(String value) { diff --git a/base/src/main/java/com/tinyengine/it/service/app/impl/AiChatServiceImpl.java b/base/src/main/java/com/tinyengine/it/service/app/impl/AiChatServiceImpl.java index 407f1dd3..eb887956 100644 --- a/base/src/main/java/com/tinyengine/it/service/app/impl/AiChatServiceImpl.java +++ b/base/src/main/java/com/tinyengine/it/service/app/impl/AiChatServiceImpl.java @@ -89,14 +89,52 @@ public Result> getAnswerFromAi(AiParam aiParam) { } List> choices = (List>) data.get("choices"); Map message = (Map) choices.get(0).get("message"); - String answerContent = message.get("content"); + boolean isFinish = false; + String answerContent = ""; + isFinish = choices.get(0).get("finish_reason") != null || isFinish; + if (!"length".equals(isFinish)) { + answerContent = message.get("content"); + } + + // 若内容被截断,继续请求AI + while (isFinish) { + String prefix = message.get("content"); + answerContent = answerContent + prefix; + + // 将此部分内容加入消息列表 + Map partialMessage = new HashMap<>(); + AiMessages aiMessages = new AiMessages(); + List messagesList = aiParam.getMessages(); + aiMessages.setRole("assistant"); + aiMessages.setName("AI"); + aiMessages.setContent(prefix); + messagesList.add(aiMessages); + aiParam.setMessages(messagesList); + + // 再次请求AI + try { + data = requestAnswerFromAi(aiParam.getMessages(), model).getData(); + } catch (Exception e) { + e.printStackTrace(); + } + choices = (List>) data.get("choices"); + message = (Map) choices.get(0).get("message"); + answerContent += message.get("content"); + isFinish = (boolean) choices.get(0).get("finish_reason"); + } + + String replyWithoutCode = removeCode(answerContent); // 通过二方包将页面转成schema String codes = extractCode(answerContent); Map schema = new HashMap<>(); Map result = new HashMap<>(); - result.put("originalResponse", data); + AiMessages aiMessagesresult = new AiMessages(); + aiMessagesresult.setContent(answerContent); + aiMessagesresult.setRole(message.get("role")); + aiMessagesresult.setName(message.get("name")); + result.put("originalResponse", aiMessagesresult); result.put("replyWithoutCode", replyWithoutCode); result.put("schema", schema); @@ -132,41 +170,25 @@ private Result> requestAnswerFromAi(List message * @return result 返回结果 */ private Result> modelResultConvet(Map response) { - // 进行转换 - Object data = response.get("data"); - if (data instanceof Map) { // 确保数据是 Map 类型 - Map responseData = (Map) data; - - Map openAiResponse = new HashMap<>(); - openAiResponse.put("id", responseData.get("id")); - openAiResponse.put("object", "text_completion"); - openAiResponse.put("created", System.currentTimeMillis() / 1000); // 设置创建时间戳 - openAiResponse.put("model", responseData.get("model")); - - List> chatgptChoices = new ArrayList<>(); - Object choices = responseData.get("choices"); - if (choices instanceof List) { // 确保 choices 是 List 类型 - List> originalChoices = (List>) choices; - if (!originalChoices.isEmpty()) { - Map originalChoice = originalChoices.get(0); - Map chatgptChoice = new HashMap<>(); - chatgptChoice.put("text", originalChoice.get("text")); - chatgptChoice.put("index", originalChoice.get("index")); - chatgptChoice.put("message", originalChoice.get("message")); - chatgptChoices.add(chatgptChoice); - } - } - openAiResponse.put("choices", chatgptChoices); - - Map chatgptUsage = new HashMap<>(); - chatgptUsage.put("prompt_tokens", responseData.get("input_tokens")); - chatgptUsage.put("completion_tokens", responseData.get("output_tokens")); - chatgptUsage.put("total_tokens", responseData.get("total_tokens")); - openAiResponse.put("usage", chatgptUsage); - return Result.success(openAiResponse); - } else { - return Result.failed("Invalid response format: 'data' is not a Map."); - } + + // 构建返回的 Map 结构 + Map resData = new HashMap<>(response); // Copy original data + + // 构建 choices 数组 + List> choices = new ArrayList<>(); + Map choice = new HashMap<>(); + Map message = new HashMap<>(); + message.put("role", "assistant"); + message.put("content", (String) response.get("result")); + message.put("name", "AI"); + choice.put("message", message); + choices.add(choice); + + // 将 choices 添加到响应中 + resData.put("choices", choices); + + return Result.success(resData); + } /** @@ -219,20 +241,20 @@ private List formatMessage(List messages) { + "5. 不要加任何注释\n" + "6. el-table标签内不得出现el-table-column\n" + "###"); - + defaultWords.setName(messages.get(0).getName()); String role = messages.get(0).getRole(); String content = messages.get(0).getContent(); List aiMessages = new ArrayList<>(); - if (!"user".equals(role)) { - aiMessages.add(0, defaultWords); - } if (!PATTERN_MESSAGE.matcher(content).matches()) { - AiMessages aiMessagesResult = new AiMessages(); + AiMessages aiMessagesResult = messages.get(0); aiMessagesResult.setContent(defaultWords.getContent() + "\n" + content); - aiMessages.add(aiMessagesResult); } - return aiMessages; + if (!"user".equals(role)) { + aiMessages.add(0, defaultWords); + } + + return messages; } }