From 57a06ae0b8fbff45f04631f9ad1cad652fffcef2 Mon Sep 17 00:00:00 2001 From: zjc <1569294420@qq.com> Date: Thu, 16 Jan 2025 00:51:03 -0800 Subject: [PATCH 1/2] fix:fix AppV1ServiceImplTest and blockMapper --- .../java/com/tinyengine/it/mapper/BlockMapper.java | 2 +- .../it/service/app/impl/v1/AppV1ServiceImplTest.java | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/base/src/main/java/com/tinyengine/it/mapper/BlockMapper.java b/base/src/main/java/com/tinyengine/it/mapper/BlockMapper.java index b2b7a27f..f05eb524 100644 --- a/base/src/main/java/com/tinyengine/it/mapper/BlockMapper.java +++ b/base/src/main/java/com/tinyengine/it/mapper/BlockMapper.java @@ -137,7 +137,7 @@ public interface BlockMapper extends BaseMapper { @Result(column = "occupier_by", property = "occupier", one = @One(select = "com.tinyengine.it.mapper.UserMapper.queryUserById")) }) - @Select("select b.*,bcbcb.block_id as block_categories_blocks_id,bsh.block_id as block_histories_block_id " + @Select("select b.*,bh.ref_id as block_id " + "from t_block b " + "left join t_block_history bh on b.latest_history_id = bh.id " + "where b.id = #{blockId} " diff --git a/base/src/test/java/com/tinyengine/it/service/app/impl/v1/AppV1ServiceImplTest.java b/base/src/test/java/com/tinyengine/it/service/app/impl/v1/AppV1ServiceImplTest.java index 0a7aa221..3351f0ba 100644 --- a/base/src/test/java/com/tinyengine/it/service/app/impl/v1/AppV1ServiceImplTest.java +++ b/base/src/test/java/com/tinyengine/it/service/app/impl/v1/AppV1ServiceImplTest.java @@ -17,6 +17,8 @@ import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.when; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import com.tinyengine.it.mapper.AppExtensionMapper; import com.tinyengine.it.mapper.AppMapper; import com.tinyengine.it.mapper.BlockGroupMapper; @@ -102,12 +104,18 @@ void setUp() { } @Test - void testAppSchema() { + void testAppSchema() throws JsonProcessingException { App app = new App(); int appId = 2; app.setId(appId); app.setHomePage(1); app.setPlatformId(1); + + String json = "{\"dataHandler\":{\"type\":\"JSFunction\",\"value\":\"function dataHanlder(res){\\n return res;\\n}\"}}"; + ObjectMapper objectMapper = new ObjectMapper(); + Map dataSourceGlobal = objectMapper.readValue(json, Map.class); + app.setDataSourceGlobal(dataSourceGlobal); + when(appMapper.queryAppById(anyInt())).thenReturn(app); Page page = new Page(); page.setIsPage(true); From b70dd207dc8279716f63e207e4bf6f65ac3d1911 Mon Sep 17 00:00:00 2001 From: zjc <1569294420@qq.com> Date: Thu, 23 Jan 2025 00:12:35 -0800 Subject: [PATCH 2/2] fix:modify AI function --- .../mysql/create_all_tables_ddl_v1.mysql.sql | 2 +- .../com/tinyengine/it/common/enums/Enums.java | 2 +- .../service/app/impl/AiChatServiceImpl.java | 110 +++++++++++------- 3 files changed, 68 insertions(+), 46 deletions(-) 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; } }