diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduChatController.java index 2d36bfa7b9..30c86ba6ac 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduChatController.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-13 13:41:56 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-08-24 15:06:43 + * @LastEditTime: 2025-09-24 15:56:05 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -57,7 +57,7 @@ public class SpringAIBaiduChatController { public ResponseEntity> chatSync( @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { - String response = springAIBaiduService.processPromptSync(message, null, ""); + String response = springAIBaiduService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduChatService.java index 1ab97c78bc..3272a48a9f 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduChatService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-28 11:44:03 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-16 10:45:17 + * @LastEditTime: 2025-09-24 15:57:03 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -63,9 +63,7 @@ public class SpringAIBaiduChatService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIBaiduService processPromptWebsocket with full prompt content: {}", fullPromptContent); + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -136,8 +134,7 @@ public class SpringAIBaiduChatService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIBaiduService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -191,8 +188,7 @@ public class SpringAIBaiduChatService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIBaiduService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -265,7 +261,7 @@ public class SpringAIBaiduChatService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.BAIDU, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.BAIDU, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "ernie-bot"); // 记录token使用情况 @@ -523,7 +519,7 @@ public class SpringAIBaiduChatService extends BaseSpringAIService { return false; } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Baidu service is not available"); } catch (Exception e) { log.error("Error checking Baidu service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduService.java index e826eff2a7..b3b4f1f650 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/baidu/SpringAIBaiduService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-28 11:44:03 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-16 10:45:25 + * @LastEditTime: 2025-09-24 15:55:57 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -117,8 +117,7 @@ public class SpringAIBaiduService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIBaiduService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -197,8 +196,7 @@ public class SpringAIBaiduService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIBaiduService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -260,8 +258,7 @@ public class SpringAIBaiduService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIBaiduService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -342,7 +339,7 @@ public class SpringAIBaiduService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.BAIDU, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.BAIDU, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "ernie-bot"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomChatController.java index 698e959ece..66adecfd26 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomChatController.java @@ -58,7 +58,7 @@ public class SpringAICustomChatController { @GetMapping("/chat/sync") public ResponseEntity> chatSync( @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { - String response = springAICustomService.processPromptSync(message, null, ""); + String response = springAICustomService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomChatService.java index 4b5381f656..3d0228b56c 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomChatService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-28 11:44:03 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-08-21 13:37:15 + * @LastEditTime: 2025-09-24 16:02:03 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -72,10 +72,10 @@ public class SpringAICustomChatService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Custom API websocket fullPromptContent: {}", fullPromptContent); + log.info("Custom API websocket "); if (customChatModel == null) { sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -120,8 +120,8 @@ public class SpringAICustomChatService extends BaseSpringAIService { @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("Custom API sync fullPromptContent: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { + log.info("Custom API sync "); try { if (customChatModel == null) { @@ -154,10 +154,10 @@ public class SpringAICustomChatService extends BaseSpringAIService { } @Override - protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Custom API SSE fullPromptContent: {}", fullPromptContent); + log.info("Custom API SSE "); if (customChatModel == null) { handleSseError(new RuntimeException("Custom service not available"), messageProtobufQuery, messageProtobufReply, emitter); @@ -200,7 +200,7 @@ public class SpringAICustomChatService extends BaseSpringAIService { () -> { log.info("Custom API SSE complete"); sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - 0, 0, 0, "", "custom", (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "custom-chat"); + 0, 0, 0, prompt, "custom", (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "custom-chat"); }); } @@ -214,7 +214,7 @@ public class SpringAICustomChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Custom service is not available"); } catch (Exception e) { log.error("Error checking Custom service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomService.java index a2e3458f84..5028285a58 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/custom/SpringAICustomService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-08-21 15:00:00 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-16 10:45:31 + * @LastEditTime: 2025-09-24 16:02:36 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -143,11 +143,11 @@ public class SpringAICustomService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置和提供商信息 RobotLlm llm = robot.getLlm(); String providerName = getProviderType(llm); - log.info("{} API websocket fullPromptContent: {}", providerName, fullPromptContent); + log.info("{} API websocket", providerName); if (llm == null) { sendMessageWebsocket(MessageTypeEnum.ERROR, providerName + I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -231,7 +231,7 @@ public class SpringAICustomService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -239,7 +239,7 @@ public class SpringAICustomService extends BaseSpringAIService { // 从robot中获取llm配置和提供商信息 RobotLlm llm = robot.getLlm(); String providerName = getProviderType(llm); - log.info("{} API sync fullPromptContent: {}", providerName, fullPromptContent); + log.info("{} API sync: {}", providerName); if (llm == null) { return providerName + " service is not available"; @@ -291,11 +291,11 @@ public class SpringAICustomService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置和提供商信息 RobotLlm llm = robot.getLlm(); String providerName = getProviderType(llm); - log.info("{} API SSE fullPromptContent: {}", providerName, fullPromptContent); + log.info("{} API SSE: {}", providerName); if (llm == null) { handleSseError(new RuntimeException(providerName + " service not available"), messageProtobufQuery, @@ -374,7 +374,7 @@ public class SpringAICustomService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, getProviderConstant(llm), + tokenUsage[0].getTotalTokens(), prompt, getProviderConstant(llm), (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "default-model"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeChatController.java index 48581092c6..c4f4bcb86e 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeChatController.java @@ -62,7 +62,7 @@ public class SpringAIDashscopeChatController { */ @GetMapping("/chat/sync") public ResponseEntity> chatSync( - @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIDashscopeService.processPromptSync(message, null, ""); + @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIDashscopeService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeChatService.java index ef901acd52..23c4e3a645 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeChatService.java @@ -69,10 +69,9 @@ public class SpringAIDashscopeChatService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Dashscope API websocket fullPromptContent: {}", fullPromptContent); if (bytedeskDashscopeChatModel == null) { sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -127,13 +126,11 @@ public class SpringAIDashscopeChatService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - - log.info("Dashscope API sync fullPromptContent: {}", fullPromptContent); - + try { if (bytedeskDashscopeChatModel == null) { return "Dashscope service is not available"; @@ -178,10 +175,9 @@ public class SpringAIDashscopeChatService extends BaseSpringAIService { } @Override - protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter) { RobotLlm llm = robot.getLlm(); - log.info("Dashscope API SSE fullPromptContent: {}", fullPromptContent); - + if (bytedeskDashscopeChatModel == null) { handleSseError(new RuntimeException("Dashscope service not available"), messageProtobufQuery, messageProtobufReply, emitter); return; @@ -232,7 +228,7 @@ public class SpringAIDashscopeChatService extends BaseSpringAIService { log.info("Dashscope API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.DASHSCOPE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "qwen-turbo"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.DASHSCOPE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "qwen-turbo"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "qwen-turbo"; @@ -251,7 +247,7 @@ public class SpringAIDashscopeChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Dashscope service is not available"); } catch (Exception e) { log.error("Error checking Dashscope service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeService.java index ab3ddfc604..65f334eb58 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/dashscope/SpringAIDashscopeService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-28 11:44:03 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-23 16:23:28 + * @LastEditTime: 2025-09-24 16:00:48 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -124,10 +124,9 @@ public class SpringAIDashscopeService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Dashscope API websocket fullPromptContent: {}", fullPromptContent); if (llm == null) { log.info("Dashscope API not available"); sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -190,16 +189,16 @@ public class SpringAIDashscopeService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("Dashscope API sync fullPromptContent: {}", fullPromptContent); + log.info("Dashscope API sync "); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Dashscope API websocket fullPromptContent: {}", fullPromptContent); + log.info("Dashscope API websocket "); if (llm == null) { log.info("Dashscope API not available"); @@ -251,14 +250,14 @@ public class SpringAIDashscopeService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Dashscope API SSE fullPromptContent: {}", fullPromptContent); + log.info("Dashscope API SSE "); if (llm == null) { log.info("Dashscope API not available"); - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.DASHSCOPE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "qwen-turbo"); return; @@ -270,7 +269,7 @@ public class SpringAIDashscopeService extends BaseSpringAIService { if (chatModel == null) { log.error("Failed to create Dashscope chat model and no default chat model available"); // 使用sendStreamEndMessage方法替代重复的代码 - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.DASHSCOPE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "qwen-turbo"); return; @@ -316,7 +315,7 @@ public class SpringAIDashscopeService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.DASHSCOPE, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.DASHSCOPE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "qwen-turbo"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekChatController.java index 38b369725e..e180d1fa30 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekChatController.java @@ -60,7 +60,7 @@ public class SpringAIDeepseekChatController { */ @GetMapping("/chat/sync") public ResponseEntity> chatSync( - @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIDeepseekService.processPromptSync(message, null, ""); + @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIDeepseekService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekChatService.java index dc4238ad53..b806f3a737 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekChatService.java @@ -67,10 +67,10 @@ public class SpringAIDeepseekChatService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Deepseek API websocket fullPromptContent: {}", fullPromptContent); + log.info("Deepseek API websocket "); if (bytedeskDeepseekChatModel == null) { sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -121,12 +121,12 @@ public class SpringAIDeepseekChatService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("Deepseek API sync fullPromptContent: {}", fullPromptContent); + log.info("Deepseek API sync "); try { if (bytedeskDeepseekChatModel == null) { @@ -172,9 +172,9 @@ public class SpringAIDeepseekChatService extends BaseSpringAIService { } @Override - protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter) { RobotLlm llm = robot.getLlm(); - log.info("Deepseek API SSE fullPromptContent: {}", fullPromptContent); + log.info("Deepseek API SSE "); if (bytedeskDeepseekChatModel == null) { handleSseError(new RuntimeException("Deepseek service not available"), messageProtobufQuery, messageProtobufReply, emitter); @@ -226,7 +226,7 @@ public class SpringAIDeepseekChatService extends BaseSpringAIService { log.info("Deepseek API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.DEEPSEEK, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "deepseek-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.DEEPSEEK, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "deepseek-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "deepseek-chat"; @@ -245,7 +245,7 @@ public class SpringAIDeepseekChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Deepseek service is not available"); } catch (Exception e) { log.error("Error checking Deepseek service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekService.java index 1ebaaf30e7..f1e1c5060e 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/deepseek/SpringAIDeepseekService.java @@ -124,10 +124,10 @@ public class SpringAIDeepseekService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Deepseek API websocket fullPromptContent: {}", fullPromptContent); + log.info("Deepseek API websocket "); if (llm == null) { log.info("Deepseek API not available"); sendMessageWebsocket(MessageTypeEnum.ERROR, "Deepseek service is not available", messageProtobufReply); @@ -190,16 +190,16 @@ public class SpringAIDeepseekService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("Deepseek API sync fullPromptContent: {}", fullPromptContent); + log.info("Deepseek API sync "); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Deepseek API websocket fullPromptContent: {}", fullPromptContent); + log.info("Deepseek API websocket "); if (llm == null) { log.info("Deepseek API not available"); @@ -251,14 +251,14 @@ public class SpringAIDeepseekService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Deepseek API SSE fullPromptContent: {}", fullPromptContent); + log.info("Deepseek API SSE "); if (llm == null) { log.info("Deepseek API not available"); - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.DEEPSEEK, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "deepseek-chat"); return; @@ -270,7 +270,7 @@ public class SpringAIDeepseekService extends BaseSpringAIService { if (chatModel == null) { log.error("Failed to create Deepseek chat model and no default chat model available"); // 使用sendStreamEndMessage方法替代重复的代码 - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.DEEPSEEK, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "deepseek-chat"); return; @@ -316,7 +316,7 @@ public class SpringAIDeepseekService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.DEEPSEEK, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.DEEPSEEK, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "deepseek-chat"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeChatController.java index b100c35f22..543523c610 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeChatController.java @@ -55,7 +55,7 @@ public class SpringAIGiteeChatController { */ @GetMapping("/chat/sync") public ResponseEntity> chatSync( - @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIGiteeService.processPromptSync(message, null, ""); + @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIGiteeService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeChatService.java index 5e65d4af71..f705fc1cfd 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeChatService.java @@ -67,8 +67,8 @@ public class SpringAIGiteeChatService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIGiteeService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { + log.info("SpringAIGiteeService processPromptWebsocket with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -121,8 +121,8 @@ public class SpringAIGiteeChatService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIGiteeService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { + log.info("SpringAIGiteeService processPromptSync with full prompt content"); long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -172,8 +172,8 @@ public class SpringAIGiteeChatService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIGiteeService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { + log.info("SpringAIGiteeService processPromptSse with full prompt content"); // 直接实现SSE逻辑,而不是调用不支持fullPromptContent的版本 RobotLlm llm = robot.getLlm(); @@ -229,7 +229,7 @@ public class SpringAIGiteeChatService extends BaseSpringAIService { log.info("Gitee API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.GITEE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gitee-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.GITEE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gitee-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gitee-chat"; @@ -250,7 +250,7 @@ public class SpringAIGiteeChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Gitee service is not available"); } catch (Exception e) { log.error("Error checking Gitee service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeService.java index 8410e806e4..73c1e320ee 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/gitee/SpringAIGiteeService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-28 11:44:03 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-16 10:45:51 + * @LastEditTime: 2025-09-24 16:01:10 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -114,8 +114,8 @@ public class SpringAIGiteeService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIGiteeService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { + log.info("SpringAIGiteeService processPromptWebsocket with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -175,8 +175,8 @@ public class SpringAIGiteeService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIGiteeService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { + log.info("SpringAIGiteeService processPromptSync with full prompt content"); long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -234,8 +234,8 @@ public class SpringAIGiteeService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIGiteeService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { + log.info("SpringAIGiteeService processPromptSse with full prompt content"); // 直接实现SSE逻辑,而不是调用不支持fullPromptContent的版本 RobotLlm llm = robot.getLlm(); @@ -299,7 +299,7 @@ public class SpringAIGiteeService extends BaseSpringAIService { log.info("Gitee API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.GITEE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gitee-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.GITEE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gitee-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gitee-chat"; diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxChatController.java index e590dc48af..5c3f870314 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxChatController.java @@ -60,7 +60,7 @@ public class SpringAIMinimaxChatController { */ @GetMapping("/chat/sync") public ResponseEntity> chatSync( - @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIMinimaxService.processPromptSync(message, null, ""); + @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIMinimaxService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxChatService.java index 05540a63d0..c0bc074c34 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxChatService.java @@ -70,8 +70,8 @@ public class SpringAIMinimaxChatService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIMinimaxService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { + log.info("SpringAIMinimaxService processPromptWebsocket with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -124,8 +124,8 @@ public class SpringAIMinimaxChatService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIMinimaxService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { + log.info("SpringAIMinimaxService processPromptSync with full prompt content"); long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -175,8 +175,8 @@ public class SpringAIMinimaxChatService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIMinimaxService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { + log.info("SpringAIMinimaxService processPromptSse with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -231,7 +231,7 @@ public class SpringAIMinimaxChatService extends BaseSpringAIService { log.info("Minimax API SSE complete"); // 发送流结束消息,包含token使用情况 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.DEEPSEEK, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : LlmProviderConstants.DEEPSEEK); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.DEEPSEEK, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : LlmProviderConstants.DEEPSEEK); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : LlmProviderConstants.DEEPSEEK; @@ -295,7 +295,7 @@ public class SpringAIMinimaxChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Minimax service is not available"); } catch (Exception e) { log.error("Error checking Minimax service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxService.java index 1b828d6f7a..c507d33fd8 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/minimax/SpringAIMinimaxService.java @@ -119,8 +119,8 @@ public class SpringAIMinimaxService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIMinimaxService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { + log.info("SpringAIMinimaxService processPromptWebsocket with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -175,8 +175,8 @@ public class SpringAIMinimaxService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIMinimaxService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { + log.info("SpringAIMinimaxService processPromptSync with full prompt content"); long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -228,8 +228,8 @@ public class SpringAIMinimaxService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIMinimaxService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { + log.info("SpringAIMinimaxService processPromptSse with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -286,7 +286,7 @@ public class SpringAIMinimaxService extends BaseSpringAIService { log.info("Minimax API SSE complete"); // 发送流结束消息,包含token使用情况 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.MINIMAX, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "minimax-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.MINIMAX, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "minimax-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "minimax-chat"; diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/ollama/SpringAIOllamaChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/ollama/SpringAIOllamaChatService.java index c5f6e2bf81..accaf8ef79 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/ollama/SpringAIOllamaChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/ollama/SpringAIOllamaChatService.java @@ -104,10 +104,10 @@ public class SpringAIOllamaChatService extends BaseSpringAIService { } protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Ollama API websocket fullPromptContent: {}", fullPromptContent); + log.info("Ollama API websocket "); if (llm == null) { log.info("Ollama API not available"); sendMessageWebsocket(MessageTypeEnum.ERROR, "Ollama service is not available", messageProtobufReply); @@ -171,16 +171,16 @@ public class SpringAIOllamaChatService extends BaseSpringAIService { } } - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("Ollama API sync fullPromptContent: {}", fullPromptContent); + log.info("Ollama API sync "); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Ollama API websocket fullPromptContent: {}", fullPromptContent); + log.info("Ollama API websocket "); if (llm == null) { log.info("Ollama API not available"); @@ -233,15 +233,15 @@ public class SpringAIOllamaChatService extends BaseSpringAIService { } protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { Assert.notNull(emitter, "SseEmitter must not be null"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Ollama API SSE fullPromptContent: {}", fullPromptContent); + log.info("Ollama API SSE "); if (llm == null) { log.info("Ollama API not available"); - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.OLLAMA, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "llama2"); return; @@ -253,7 +253,7 @@ public class SpringAIOllamaChatService extends BaseSpringAIService { if (chatModel == null) { log.info("Ollama API not available"); // 使用sendStreamEndMessage方法替代重复的代码 - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.OLLAMA, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "llama2"); return; @@ -299,7 +299,7 @@ public class SpringAIOllamaChatService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.OLLAMA, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.OLLAMA, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "llama2"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/ollama/SpringAIOllamaService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/ollama/SpringAIOllamaService.java index 71956c4c8d..34795f59e9 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/ollama/SpringAIOllamaService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/ollama/SpringAIOllamaService.java @@ -114,10 +114,10 @@ public class SpringAIOllamaService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Ollama API websocket fullPromptContent: {}", fullPromptContent); + log.info("Ollama API websocket "); if (llm == null) { log.info("Ollama API not available"); sendMessageWebsocket(MessageTypeEnum.ERROR, "Ollama service is not available", messageProtobufReply); @@ -182,16 +182,16 @@ public class SpringAIOllamaService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("Ollama API sync fullPromptContent: {}", fullPromptContent); + log.info("Ollama API sync "); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Ollama API websocket fullPromptContent: {}", fullPromptContent); + log.info("Ollama API websocket "); if (llm == null) { log.info("Ollama API not available"); @@ -245,15 +245,15 @@ public class SpringAIOllamaService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { Assert.notNull(emitter, "SseEmitter must not be null"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Ollama API SSE fullPromptContent: {}", fullPromptContent); + log.info("Ollama API SSE "); if (llm == null) { log.info("Ollama API not available"); - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.OLLAMA, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "llama2"); return; @@ -265,7 +265,7 @@ public class SpringAIOllamaService extends BaseSpringAIService { if (chatModel == null) { log.info("Ollama API not available"); // 使用sendStreamEndMessage方法替代重复的代码 - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.OLLAMA, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "llama2"); return; @@ -311,7 +311,7 @@ public class SpringAIOllamaService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.OLLAMA, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.OLLAMA, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "llama2"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiChatController.java index 24b29cfe7a..9f945a4bd9 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiChatController.java @@ -57,7 +57,7 @@ public class SpringAIOpenaiChatController { public ResponseEntity> chatSync( @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { - String response = springAIOpenaiService.processPromptSync(message, null, ""); + String response = springAIOpenaiService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiChatService.java index f43b8095b3..890424e87d 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiChatService.java @@ -65,10 +65,10 @@ public class SpringAIOpenaiChatService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("OpenAI API websocket fullPromptContent: {}", fullPromptContent); + log.info("OpenAI API websocket "); if (openaiChatModel == null) { sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -119,12 +119,12 @@ public class SpringAIOpenaiChatService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("OpenAI API sync fullPromptContent: {}", fullPromptContent); + log.info("OpenAI API sync "); try { if (openaiChatModel == null) { @@ -170,9 +170,9 @@ public class SpringAIOpenaiChatService extends BaseSpringAIService { } @Override - protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter) { RobotLlm llm = robot.getLlm(); - log.info("OpenAI API SSE fullPromptContent: {}", fullPromptContent); + log.info("OpenAI API SSE "); if (openaiChatModel == null) { handleSseError(new RuntimeException("OpenAI service not available"), messageProtobufQuery, messageProtobufReply, emitter); @@ -224,7 +224,7 @@ public class SpringAIOpenaiChatService extends BaseSpringAIService { log.info("Openai API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.OPENAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gpt-3.5-turbo"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.OPENAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gpt-3.5-turbo"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gpt-3.5-turbo"; @@ -243,7 +243,7 @@ public class SpringAIOpenaiChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Openai service is not available"); } catch (Exception e) { log.error("Error checking OpenAI service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiService.java index 2a4ee3ccda..380fda5d26 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openai/SpringAIOpenaiService.java @@ -123,10 +123,10 @@ public class SpringAIOpenaiService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("OpenAI API websocket fullPromptContent: {}", fullPromptContent); + log.info("OpenAI API websocket "); if (llm == null) { log.info("OpenAI API not available"); sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -189,16 +189,16 @@ public class SpringAIOpenaiService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("OpenAI API sync fullPromptContent: {}", fullPromptContent); + log.info("OpenAI API sync "); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("OpenAI API websocket fullPromptContent: {}", fullPromptContent); + log.info("OpenAI API websocket "); if (llm == null) { log.info("OpenAI API not available"); @@ -249,14 +249,14 @@ public class SpringAIOpenaiService extends BaseSpringAIService { } @Override - protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("OpenAI API SSE fullPromptContent: {}", fullPromptContent); + log.info("OpenAI API SSE "); if (llm == null) { log.info("OpenAI API not available"); - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.OPENAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gpt-3.5-turbo"); return; @@ -268,7 +268,7 @@ public class SpringAIOpenaiService extends BaseSpringAIService { if (chatModel == null) { log.error("Failed to create OpenAI chat model and no default chat model available"); // 使用sendStreamEndMessage方法替代重复的代码 - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.OPENAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gpt-3.5-turbo"); return; @@ -314,7 +314,7 @@ public class SpringAIOpenaiService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.OPENAI, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.OPENAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "gpt-3.5-turbo"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterChatController.java index 3874b6bccf..47c64f6825 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterChatController.java @@ -54,7 +54,7 @@ public class SpringAIOpenrouterChatController { */ @GetMapping("/chat/sync") public ResponseEntity> chatSync( - @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIOpenrouterService.processPromptSync(message, null, ""); + @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAIOpenrouterService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterChatService.java index f55d9368a7..514a61c929 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterChatService.java @@ -66,8 +66,8 @@ public class SpringAIOpenrouterChatService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIOpenrouterService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { + log.info("SpringAIOpenrouterService processPromptWebsocket with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -120,8 +120,8 @@ public class SpringAIOpenrouterChatService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIOpenrouterService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { + log.info("SpringAIOpenrouterService processPromptSync with full prompt content"); long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -165,8 +165,8 @@ public class SpringAIOpenrouterChatService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIOpenrouterService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { + log.info("SpringAIOpenrouterService processPromptSse with full prompt content"); // 直接实现SSE逻辑,而不是调用不支持fullPromptContent的版本 RobotLlm llm = robot.getLlm(); @@ -220,7 +220,7 @@ public class SpringAIOpenrouterChatService extends BaseSpringAIService { log.info("OpenRouter API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.OPENROUTER, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "openrouter-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.OPENROUTER, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "openrouter-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "openrouter-chat"; @@ -250,7 +250,7 @@ public class SpringAIOpenrouterChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Openrouter service is not available"); } catch (Exception e) { log.error("Error checking OpenAI service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterService.java index 02df8fa2ca..70c151ce76 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/openrouter/SpringAIOpenrouterService.java @@ -114,8 +114,8 @@ public class SpringAIOpenrouterService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIOpenrouterService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { + log.info("SpringAIOpenrouterService processPromptWebsocket with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -170,8 +170,8 @@ public class SpringAIOpenrouterService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIOpenrouterService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { + log.info("SpringAIOpenrouterService processPromptSync with full prompt content"); long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -217,8 +217,8 @@ public class SpringAIOpenrouterService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIOpenrouterService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { + log.info("SpringAIOpenrouterService processPromptSse with full prompt content"); // 直接实现SSE逻辑,而不是调用不支持fullPromptContent的版本 RobotLlm llm = robot.getLlm(); @@ -274,7 +274,7 @@ public class SpringAIOpenrouterService extends BaseSpringAIService { log.info("OpenRouter API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.OPENROUTER, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "openrouter-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.OPENROUTER, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "openrouter-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "openrouter-chat"; diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowChatController.java index 7d4bc7e143..739b2a839f 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowChatController.java @@ -57,7 +57,7 @@ public class SpringAISiliconFlowChatController { */ @GetMapping("/chat/sync") public ResponseEntity> chatSync( - @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAISiliconFlowService.processPromptSync(message, null, ""); + @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {String response = springAISiliconFlowService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowChatService.java index 34c8fa588f..bbaf11d874 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowChatService.java @@ -68,10 +68,10 @@ public class SpringAISiliconFlowChatService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("SiliconFlow API websocket fullPromptContent: {}", fullPromptContent); + log.info("SiliconFlow API websocket "); if (!siliconFlowChatModel.isPresent()) { sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -125,12 +125,12 @@ public class SpringAISiliconFlowChatService extends BaseSpringAIService { // } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("SiliconFlow API sync fullPromptContent: {}", fullPromptContent); + log.info("SiliconFlow API sync "); try { if (!siliconFlowChatModel.isPresent()) { @@ -177,10 +177,10 @@ public class SpringAISiliconFlowChatService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("SiliconFlow API SSE fullPromptContent: {}", fullPromptContent); + log.info("SiliconFlow API SSE "); if (!siliconFlowChatModel.isPresent()) { handleSseError(new RuntimeException("SiliconFlow service not available"), messageProtobufQuery, @@ -234,7 +234,7 @@ public class SpringAISiliconFlowChatService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 // String promptText = extractTextFromPrompt(prompt); sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.SILICONFLOW, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "siliconflow-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.SILICONFLOW, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "siliconflow-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : LlmProviderConstants.SILICONFLOW; @@ -252,7 +252,7 @@ public class SpringAISiliconFlowChatService extends BaseSpringAIService { try { // 发送一个简单的测试请求来检测服务是否响应 - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("siliconFlow service is not available"); } catch (Exception e) { log.error("Error checking SiliconFlow service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowService.java index b532ccda66..9ea953e496 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/siliconflow/SpringAISiliconFlowService.java @@ -114,10 +114,10 @@ public class SpringAISiliconFlowService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("SiliconFlow API websocket fullPromptContent: {}", fullPromptContent); + log.info("SiliconFlow API websocket "); // 创建动态chatModel OpenAiChatModel chatModel = createSiliconFlowChatModel(llm); @@ -173,12 +173,12 @@ public class SpringAISiliconFlowService extends BaseSpringAIService { // } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("SiliconFlow API sync fullPromptContent: {}", fullPromptContent); + log.info("SiliconFlow API sync "); try { // 创建动态chatModel @@ -227,10 +227,10 @@ public class SpringAISiliconFlowService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("SiliconFlow API SSE fullPromptContent: {}", fullPromptContent); + log.info("SiliconFlow API SSE "); // 创建动态chatModel OpenAiChatModel chatModel = createSiliconFlowChatModel(llm); @@ -286,7 +286,7 @@ public class SpringAISiliconFlowService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 // String promptText = extractTextFromPrompt(prompt); sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.SILICONFLOW, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "siliconflow-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.SILICONFLOW, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "siliconflow-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : LlmProviderConstants.SILICONFLOW; diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentChatController.java index 3143b8bd03..e5ce545ebd 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentChatController.java @@ -58,7 +58,7 @@ public class SpringAITencentChatController { public ResponseEntity> chatSync( @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { - String response = springAITencentService.processPromptSync(message, null, ""); + String response = springAITencentService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentChatService.java index 1422ff0eb3..0118e3dab3 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentChatService.java @@ -66,10 +66,10 @@ public class SpringAITencentChatService extends BaseSpringAIService { } @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Tencent API websocket fullPromptContent: {}", fullPromptContent); + log.info("Tencent API websocket "); if (tencentChatModel == null) { sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -122,12 +122,12 @@ public class SpringAITencentChatService extends BaseSpringAIService { @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("Tencent API sync fullPromptContent: {}", fullPromptContent); + log.info("Tencent API sync "); try { if (tencentChatModel == null) { @@ -173,10 +173,10 @@ public class SpringAITencentChatService extends BaseSpringAIService { } @Override - protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Tencent API SSE fullPromptContent: {}", fullPromptContent); + log.info("Tencent API SSE "); if (tencentChatModel == null) { handleSseError(new RuntimeException("Tencent service not available"), messageProtobufQuery, messageProtobufReply, emitter); @@ -228,7 +228,7 @@ public class SpringAITencentChatService extends BaseSpringAIService { log.info("Tencent API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.TENCENT, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "hunyuan-pro"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.TENCENT, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "hunyuan-pro"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "hunyuan-pro"; @@ -247,7 +247,7 @@ public class SpringAITencentChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Tencent service is not available"); } catch (Exception e) { log.error("Error checking Tencent service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentService.java index 45ffefc3b6..d2ae8f97bf 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/tencent/SpringAITencentService.java @@ -113,10 +113,10 @@ public class SpringAITencentService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Tencent API websocket fullPromptContent: {}", fullPromptContent); + log.info("Tencent API websocket "); // 创建动态chatModel OpenAiChatModel chatModel = createTencentChatModel(llm); @@ -171,12 +171,12 @@ public class SpringAITencentService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("Tencent API sync fullPromptContent: {}", fullPromptContent); + log.info("Tencent API sync "); try { // 创建动态chatModel @@ -227,10 +227,10 @@ public class SpringAITencentService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Tencent API SSE fullPromptContent: {}", fullPromptContent); + log.info("Tencent API SSE "); // 创建动态chatModel OpenAiChatModel chatModel = createTencentChatModel(llm); @@ -286,7 +286,7 @@ public class SpringAITencentService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.TENCENT, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.TENCENT, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "hunyuan-pro"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineChatController.java index d7102970d3..1fb83859ab 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineChatController.java @@ -59,7 +59,7 @@ public class SpringAIVolcengineChatController { public ResponseEntity> chatSync( @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { - String response = springAIVolcengineService.processPromptSync(message, null, ""); + String response = springAIVolcengineService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineChatService.java index 3d6abe794d..f8f504659f 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineChatService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-28 11:44:03 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-02 14:57:42 + * @LastEditTime: 2025-09-24 15:59:43 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -65,8 +65,7 @@ public class SpringAIVolcengineChatService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIVolcengineService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -119,8 +118,7 @@ public class SpringAIVolcengineChatService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIVolcengineService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -170,8 +168,7 @@ public class SpringAIVolcengineChatService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIVolcengineService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 直接实现SSE逻辑,而不是调用不支持fullPromptContent的版本 // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -227,7 +224,7 @@ public class SpringAIVolcengineChatService extends BaseSpringAIService { log.info("Volcengine API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.VOLCENGINE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "volcengine-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.VOLCENGINE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "volcengine-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "volcengine-chat"; @@ -247,7 +244,7 @@ public class SpringAIVolcengineChatService extends BaseSpringAIService { } try { - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用") && !response.equals("Volcengine service is not available"); } catch (Exception e) { log.error("Error checking Volcengine service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineService.java index 10e4305dbd..5ff862822d 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/volcengine/SpringAIVolcengineService.java @@ -109,8 +109,8 @@ public class SpringAIVolcengineService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { - log.info("SpringAIVolcengineService processPromptWebsocket with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply) { + log.info("SpringAIVolcengineService processPromptWebsocket with full prompt content"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -165,8 +165,8 @@ public class SpringAIVolcengineService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { - log.info("SpringAIVolcengineService processPromptSync with full prompt content: {}", fullPromptContent); + protected String processPromptSync(String message, RobotProtobuf robot) { + log.info("SpringAIVolcengineService processPromptSync with full prompt content"); long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -218,8 +218,8 @@ public class SpringAIVolcengineService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { - log.info("SpringAIVolcengineService processPromptSse with full prompt content: {}", fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter) { + log.info("SpringAIVolcengineService processPromptSse with full prompt content"); // 直接实现SSE逻辑,而不是调用不支持fullPromptContent的版本 // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); @@ -277,7 +277,7 @@ public class SpringAIVolcengineService extends BaseSpringAIService { log.info("Volcengine API SSE complete"); // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.VOLCENGINE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "volcengine-chat"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.VOLCENGINE, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "volcengine-chat"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "volcengine-chat"; diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiChatController.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiChatController.java index 3294d3bd03..5952ae61dd 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiChatController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiChatController.java @@ -72,7 +72,7 @@ public class SpringAIZhipuaiChatController { public ResponseEntity> chatSync( @RequestParam(value = "message", defaultValue = "Tell me a joke") String message) { - String response = springAIZhipuaiService.processPromptSync(message, null, ""); + String response = springAIZhipuaiService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(response)); } diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiChatService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiChatService.java index 3402f53f75..b256655ce7 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiChatService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiChatService.java @@ -108,10 +108,9 @@ public class SpringAIZhipuaiChatService extends BaseSpringAIService { */ @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Zhipuai API websocket fullPromptContent: {}", fullPromptContent); // 获取适当的模型实例 ZhiPuAiChatModel chatModel = (llm != null) ? createDynamicChatModel(llm) : bytedeskZhipuaiChatModel; @@ -158,13 +157,11 @@ public class SpringAIZhipuaiChatService extends BaseSpringAIService { * 方式2:同步调用(带prompt参数) */ @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - - log.info("Zhipuai API sync fullPromptContent: {}", fullPromptContent); - + try { if (bytedeskZhipuaiChatModel == null) { return "Zhipuai service is not available"; @@ -251,11 +248,9 @@ public class SpringAIZhipuaiChatService extends BaseSpringAIService { */ @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Zhipuai API SSE fullPromptContent: {}", fullPromptContent); - // 获取适当的模型实例 ZhiPuAiChatModel chatModel = (llm != null) ? createDynamicChatModel(llm) : bytedeskZhipuaiChatModel; @@ -324,7 +319,7 @@ public class SpringAIZhipuaiChatService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.ZHIPUAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "glm-3-turbo"); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.ZHIPUAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "glm-3-turbo"); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "glm-3-turbo"; @@ -668,7 +663,7 @@ public class SpringAIZhipuaiChatService extends BaseSpringAIService { public Boolean isServiceHealthy() { try { // 发送一个简单的测试请求来检测服务是否响应 - String response = processPromptSync("test", null, ""); + String response = processPromptSync("test", null); return !response.contains("不可用"); } catch (Exception e) { log.error("Error checking Zhipuai service health", e); diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiService.java index 766cb45a9f..c7896dc959 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/providers/zhipuai/SpringAIZhipuaiService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-26 16:58:56 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-02 14:58:23 + * @LastEditTime: 2025-09-24 15:58:58 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -99,10 +99,9 @@ public class SpringAIZhipuaiService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Zhipuai API websocket fullPromptContent: {}", fullPromptContent); if (llm == null) { log.info("Zhipuai API not available"); sendMessageWebsocket(MessageTypeEnum.ERROR, I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, messageProtobufReply); @@ -165,16 +164,14 @@ public class SpringAIZhipuaiService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); - log.info("Zhipuai API sync fullPromptContent: {}", fullPromptContent); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Zhipuai API websocket fullPromptContent: {}", fullPromptContent); if (llm == null) { log.info("Zhipuai API not available"); @@ -226,14 +223,13 @@ public class SpringAIZhipuaiService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - log.info("Zhipuai API SSE fullPromptContent: {}", fullPromptContent); if (llm == null) { log.info("Zhipuai API not available"); - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.ZHIPUAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "glm-4"); return; @@ -245,7 +241,7 @@ public class SpringAIZhipuaiService extends BaseSpringAIService { if (chatModel == null) { log.info("Zhipuai API not available"); // 使用sendStreamEndMessage方法替代重复的代码 - sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, fullPromptContent, + sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, 0, 0, 0, prompt, LlmProviderConstants.ZHIPUAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "glm-4"); return; @@ -291,7 +287,7 @@ public class SpringAIZhipuaiService extends BaseSpringAIService { // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), - tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.ZHIPUAI, + tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.ZHIPUAI, (llm != null && StringUtils.hasText(llm.getTextModel())) ? llm.getTextModel() : "glm-4"); // 记录token使用情况 diff --git a/modules/ai/src/main/java/com/bytedesk/ai/springai/service/BaseSpringAIService.java b/modules/ai/src/main/java/com/bytedesk/ai/springai/service/BaseSpringAIService.java index 12eeaee7a6..4f72dbf2a5 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/springai/service/BaseSpringAIService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/springai/service/BaseSpringAIService.java @@ -365,7 +365,7 @@ public abstract class BaseSpringAIService implements SpringAIService { ? robot.getLlm().getTextModel() : ""; persistMessage(messageProtobufQuery, messageProtobufReply, false, 0, 0, 0, - promptResult.getFullPromptContent(), "", modelType); + promptResult.getPrompt(), "", modelType); // 发送消息 messageSendService.sendProtobufMessage(messageProtobufReply); @@ -380,17 +380,13 @@ public abstract class BaseSpringAIService implements SpringAIService { if (searchResultList.isEmpty()) { // 未找到相关知识,使用默认回复 String answer = robot.getLlm().getDefaultReply(); - messageProtobufReply.setContent(answer); messageProtobufReply.setType(MessageTypeEnum.TEXT); log.info("BaseSpringAIService sendSyncMessage messageProtobufReply 2 {}", messageProtobufReply); - // 保存错误消息(标记为未回答成功) persistMessage(messageProtobufQuery, messageProtobufReply, true); - // 发送消息 messageSendService.sendProtobufMessage(messageProtobufReply); - return answer; } else { // 获取搜索结果作为上下文 @@ -398,8 +394,7 @@ public abstract class BaseSpringAIService implements SpringAIService { log.info("BaseSpringAIService sendSyncMessage context {}", context); // 使用通用方法处理同步消息 - PromptResult promptResult = createAndProcessPromptSyncWithPrompt(query, context, robot, - messageProtobufQuery, messageProtobufReply); + PromptResult promptResult = createAndProcessPromptSyncWithPrompt(query, context, robot, messageProtobufQuery, messageProtobufReply); log.info("BaseSpringAIService sendSyncMessage response {}", promptResult.getResponse()); // 设置回复内容和类型 @@ -412,7 +407,7 @@ public abstract class BaseSpringAIService implements SpringAIService { ? robot.getLlm().getTextModel() : ""; persistMessage(messageProtobufQuery, messageProtobufReply, false, 0, 0, 0, - promptResult.getFullPromptContent(), "", modelType); + promptResult.getPrompt(), "", modelType); // 发送消息 messageSendService.sendProtobufMessage(messageProtobufReply); @@ -481,7 +476,7 @@ public abstract class BaseSpringAIService implements SpringAIService { Boolean isUnanswered) { // 调用重载方法,传入默认的token使用情况(0)和空prompt persistMessage(messageProtobufQuery, messageProtobufReply, isUnanswered, 0, 0, - 0, "", "", ""); + 0, null, "", ""); } /** @@ -498,10 +493,17 @@ public abstract class BaseSpringAIService implements SpringAIService { * @param aiModel 大模型名称 */ public void persistMessage(MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, - Boolean isUnanswered, long promptTokens, long completionTokens, long totalTokens, String prompt, + Boolean isUnanswered, long promptTokens, long completionTokens, long totalTokens, Prompt prompt, String aiProvider, String aiModel) { Assert.notNull(messageProtobufQuery, "MessageProtobufQuery must not be null"); Assert.notNull(messageProtobufReply, "MessageProtobufReply must not be null"); + + // 提取prompt中的完整内容 + String fullPromptContent = null; + if (prompt != null) { + fullPromptContent = extractFullPromptContent(prompt.getInstructions()); + } + log.info( "BaseSpringAIService persistMessage messageProtobufQuery {}, messageProtobufReply {}, promptTokens {}, completionTokens {}, totalTokens {}, prompt {}, aiProvider {}, aiModel {}", messageProtobufQuery.getContent(), messageProtobufReply.getContent(), @@ -531,7 +533,7 @@ public abstract class BaseSpringAIService implements SpringAIService { .completionTokens((int) completionTokens) .totalTokens((int) totalTokens) // 添加完整prompt内容 - .prompt(prompt) + .prompt(fullPromptContent) // 添加AI模型信息 .aiProvider(aiProvider) .aiModel(aiModel) @@ -581,13 +583,9 @@ public abstract class BaseSpringAIService implements SpringAIService { // 添加用户查询 aiPrompt.append(I18Consts.I18N_QUESTION_LABEL).append(query); - // 获取完整的prompt内容用于存储 - String fullPromptContent = aiPrompt.toString(); - log.info("processDirectLlmRequest fullPromptContent: {}", fullPromptContent); - // 调用子类实现的处理方法 try { - String response = processPromptSync(aiPrompt.toString(), robot, fullPromptContent); + String response = processPromptSync(aiPrompt.toString(), robot); log.info("processDirectLlmRequest response {}", response); if (response != null && response.contains("")) { log.debug("processDirectLlmRequest 替换前的内容: {}", response); @@ -905,6 +903,8 @@ public abstract class BaseSpringAIService implements SpringAIService { SearchResultWithSources searchResult = rerankMergeTopK(searchKnowledgeBaseWithSources(query, robot), robot); List searchResultList = searchResult.getSearchResults(); List sourceReferences = searchResult.getSourceReferences(); + log.info("BaseSpringAIService processLlmResponseWithSources searchResultList {}, sourceReferences {}", + searchResultList.size(), sourceReferences.size()); if (searchResultList.isEmpty()) { // 未找到相关内容,使用默认回复 @@ -912,21 +912,19 @@ public abstract class BaseSpringAIService implements SpringAIService { String robotStreamContent = createRobotStreamContentAnswer(query, answer, new ArrayList<>(), robot); processAnswerMessage(robotStreamContent, MessageTypeEnum.ROBOT_STREAM, robot, messageProtobufQuery, messageProtobufReply, true, emitter); - return; - } - - // 构建上下文用于LLM - StringBuilder contextBuilder = new StringBuilder(); - for (FaqProtobuf faq : searchResultList) { - if (faq.getAnswer() != null) { - contextBuilder.append(faq.getAnswer()).append("\n\n"); + } else { + // 构建上下文用于LLM + StringBuilder contextBuilder = new StringBuilder(); + for (FaqProtobuf faq : searchResultList) { + if (faq != null) { + contextBuilder.append(faq.toJson()).append("\n\n"); + } } + String context = contextBuilder.toString(); + // 使用LLM处理 + createAndProcessPromptWithSources(query, context, sourceReferences, robot, messageProtobufQuery, + messageProtobufReply, emitter); } - String context = contextBuilder.toString(); - - // 使用LLM处理 - createAndProcessPromptWithSources(query, context, sourceReferences, robot, messageProtobufQuery, - messageProtobufReply, emitter); } /** @@ -966,6 +964,7 @@ public abstract class BaseSpringAIService implements SpringAIService { log.debug("替换后的内容: {}", content); } + // 根据消息类型添加不同的消息对象 if (MessageTypeEnum.TEXT.name().equals(messageEntity.getType()) || MessageTypeEnum.IMAGE.name().equals(messageEntity.getType()) || MessageTypeEnum.FILE.name().equals(messageEntity.getType()) || @@ -973,21 +972,11 @@ public abstract class BaseSpringAIService implements SpringAIService { MessageTypeEnum.AUDIO.name().equals(messageEntity.getType())) { // 用户消息:文本或多媒体均直接传递标准 JSON/文本内容,由下游解析 messages.add(new UserMessage(content)); - } else if (MessageTypeEnum.TEXT.name().equals(messageEntity.getType()) || - // MessageTypeEnum.ROBOT_STREAM.name().equals(messageEntity.getType()) || - MessageTypeEnum.ROBOT_STREAM.name().equals(messageEntity.getType())) { - // 对于机器人回复,提取实际的回答文本 - if (MessageTypeEnum.ROBOT_STREAM.name().equals(messageEntity.getType())) { - try { - StreamContent robotContent = StreamContent.fromJson(content, - StreamContent.class); - if (robotContent != null && robotContent.getAnswer() != null) { - content = robotContent.getAnswer(); - } - } catch (Exception e) { - log.debug("解析RobotStreamContent失败,使用原始内容: {}", e.getMessage()); - } - } + } else if (MessageTypeEnum.SYSTEM.name().equals(messageEntity.getType())) { + // 系统消息:直接作为系统消息传递 + messages.add(new SystemMessage(content)); + } else if (MessageTypeEnum.ROBOT_STREAM.name().equals(messageEntity.getType())) { + // 对于机器人回复,直接添加为助手消息 messages.add(new AssistantMessage(content)); } } @@ -1008,38 +997,13 @@ public abstract class BaseSpringAIService implements SpringAIService { // 创建并处理提示 Prompt aiPrompt = new Prompt(messages); - // 提取完整的prompt内容用于存储 - String fullPromptContent = extractFullPromptContent(messages); - log.info("BaseSpringAIService createAndProcessPromptWithSources fullPromptContent: {}", fullPromptContent); - // 直接调用抽象的流式处理方法;在此处统一做错误兜底,避免额外的 WithSources 封装 try { - processPromptSse(aiPrompt, robot, messageProtobufQuery, messageProtobufReply, emitter, fullPromptContent); + processPromptSse(aiPrompt, robot, messageProtobufQuery, messageProtobufReply, emitter); } catch (Exception e) { log.error("createAndProcessPromptWithSources 调用 processPromptSse 失败", e); // 出错时发送包含来源的错误消息,保持客户端结构稳定 - String errorMessage = "处理请求时发生错误,请稍后重试"; - String robotStreamContent = createRobotStreamContentAnswer( - messageProtobufQuery.getContent(), - errorMessage, - sourceReferences, - robot); - - messageProtobufReply.setType(MessageTypeEnum.ROBOT_STREAM); - messageProtobufReply.setContent(robotStreamContent); - messageProtobufReply.setChannel(ChannelEnum.SYSTEM); - - try { - if (!isEmitterCompleted(emitter)) { - emitter.send(SseEmitter.event() - .data(messageProtobufReply.toJson()) - .id(messageProtobufReply.getUid()) - .name("message")); - emitter.complete(); - } - } catch (Exception sseException) { - log.error("发送错误消息失败", sseException); - } + handleSseError(new Exception(I18Consts.I18N_ROBOT_PROCESSING_ERROR), messageProtobufQuery, messageProtobufReply, emitter); } } @@ -1082,10 +1046,8 @@ public abstract class BaseSpringAIService implements SpringAIService { Prompt aiPrompt = new Prompt(messages); // 提取完整的prompt内容用于存储 - String fullPromptContent = extractFullPromptContent(messages); - log.info("BaseSpringAIService processLlmResponseWebsocket fullPromptContent: {}", fullPromptContent); - - processPromptWebsocket(aiPrompt, robot, messageProtobufQuery, messageProtobufReply, fullPromptContent); + // String fullPromptContent = extractFullPromptContent(messages); + processPromptWebsocket(aiPrompt, robot, messageProtobufQuery, messageProtobufReply); } private void createAndProcessPrompt(String query, String context, RobotProtobuf robot, @@ -1148,11 +1110,7 @@ public abstract class BaseSpringAIService implements SpringAIService { // 创建并处理提示 Prompt aiPrompt = new Prompt(messages); - // 提取完整的prompt内容用于存储 - String fullPromptContent = extractFullPromptContent(messages); - log.info("BaseSpringAIService createAndProcessPrompt fullPromptContent: {}", fullPromptContent); - - processPromptSse(aiPrompt, robot, messageProtobufQuery, messageProtobufReply, emitter, fullPromptContent); + processPromptSse(aiPrompt, robot, messageProtobufQuery, messageProtobufReply, emitter); } private PromptResult createAndProcessPromptSyncWithPrompt(String query, String context, RobotProtobuf robot, @@ -1205,19 +1163,15 @@ public abstract class BaseSpringAIService implements SpringAIService { // 4. 最后添加当前用户查询 messages.add(new UserMessage(query)); - // 记录消息,用于调试 log.info("BaseSpringAIService createAndProcessPromptSync messages {}", messages); // 创建提示并处理 Prompt aiPrompt = new Prompt(messages); + // + String response = processPromptSync(aiPrompt.toString(), robot); - // 提取完整的prompt内容用于存储 - String fullPromptContent = extractFullPromptContent(messages); - log.info("BaseSpringAIService createAndProcessPromptSync fullPromptContent: {}", fullPromptContent); - - String response = processPromptSync(aiPrompt.toString(), robot, fullPromptContent); - return new PromptResult(response, fullPromptContent); + return new PromptResult(response, aiPrompt); } // 不再构造自定义 BD_MEDIA 前缀;媒体消息直接使用标准 JSON(BaseContent.toJson)在下游解析 @@ -1229,7 +1183,7 @@ public abstract class BaseSpringAIService implements SpringAIService { // if (searchContentList.isEmpty()) { // 直接返回未找到相关问题答案 - String answer = robot.getLlm().getDefaultReply(); // RobotConsts.ROBOT_UNMATCHED; + String answer = robot.getLlm().getDefaultReply(); processAnswerMessage(answer, MessageTypeEnum.TEXT, robot, messageProtobufQuery, messageProtobufReply, true, emitter); @@ -1406,7 +1360,7 @@ public abstract class BaseSpringAIService implements SpringAIService { * @param aiModel 大模型名称 */ protected void sendStreamEndMessage(MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, - SseEmitter emitter, long promptTokens, long completionTokens, long totalTokens, String prompt, + SseEmitter emitter, long promptTokens, long completionTokens, long totalTokens, Prompt prompt, String aiProvider, String aiModel) { log.info( "BaseSpringAIService sendStreamEndMessage messageProtobufQuery {}, messageProtobufReply {}, promptTokens {}, completionTokens {}, totalTokens {}, prompt {}, aiProvider {}, aiModel {}", @@ -1889,30 +1843,30 @@ public abstract class BaseSpringAIService implements SpringAIService { */ protected static class PromptResult { private final String response; - private final String fullPromptContent; + private final Prompt prompt; - public PromptResult(String response, String fullPromptContent) { + public PromptResult(String response, Prompt prompt) { this.response = response; - this.fullPromptContent = fullPromptContent; + this.prompt = prompt; } public String getResponse() { return response; } - public String getFullPromptContent() { - return fullPromptContent; + public Prompt getPrompt() { + return prompt; } } // 带prompt参数的抽象方法重载 protected abstract void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent); + MessageProtobuf messageProtobufReply); // 带prompt参数的抽象方法重载 - protected abstract String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent); + protected abstract String processPromptSync(String message, RobotProtobuf robot); protected abstract void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent); + MessageProtobuf messageProtobufReply, SseEmitter emitter); } \ No newline at end of file diff --git a/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuMultiModelService.java b/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuMultiModelService.java index 655a2df2e5..7147abf6ee 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuMultiModelService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuMultiModelService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-09-23 13:34:37 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-23 15:41:51 + * @LastEditTime: 2025-09-24 16:05:14 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -424,7 +424,7 @@ public class ZhipuMultiModelService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + MessageProtobuf messageProtobufReply) { try { String model = getModel(robot); List zaiMessages = buildZaiMessagesFromPrompt(prompt); @@ -471,7 +471,7 @@ public class ZhipuMultiModelService extends BaseSpringAIService { // 发送 websocket 文本 sendMessageWebsocket(MessageTypeEnum.TEXT, text, messageProtobufReply); // 记录用量事件(粗略估算) - long promptTokens = estimateTokens(fullPromptContent); + long promptTokens = estimateTokens(prompt.getContents()); long completionTokens = estimateTokens(text); recordAiTokenUsage(robot, LlmProviderConstants.ZHIPUAI, model, promptTokens, completionTokens, success, System.currentTimeMillis() - start); @@ -483,7 +483,7 @@ public class ZhipuMultiModelService extends BaseSpringAIService { } @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { try { String model = getModel(robot); // 将文本包装为 Prompt -> zai 消息 @@ -513,8 +513,7 @@ public class ZhipuMultiModelService extends BaseSpringAIService { text = ""; text = stripThinkTags(text); // 记录用量事件(粗略估算) - long promptTokens = estimateTokens( - fullPromptContent != null && !fullPromptContent.isEmpty() ? fullPromptContent : message); + long promptTokens = estimateTokens(message); long completionTokens = estimateTokens(text); recordAiTokenUsage(robot, LlmProviderConstants.ZHIPUAI, model, promptTokens, completionTokens, success, System.currentTimeMillis() - start); @@ -527,7 +526,7 @@ public class ZhipuMultiModelService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { if (robot == null || robot.getLlm() == null) { handleSseError(new IllegalArgumentException("robot or llm is null"), messageProtobufQuery, messageProtobufReply, emitter); @@ -623,11 +622,11 @@ public class ZhipuMultiModelService extends BaseSpringAIService { }, () -> { String answer = stripThinkTags(finalAnswer.toString()); - long promptTokens = estimateTokens(fullPromptContent); + long promptTokens = estimateTokens(prompt.getContents()); long completionTokens = estimateTokens(answer); // 结束并持久化 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, promptTokens, - completionTokens, promptTokens + completionTokens, fullPromptContent, + completionTokens, promptTokens + completionTokens, prompt, LlmProviderConstants.ZHIPUAI, model); // 发布用量事件 recordAiTokenUsage(robot, LlmProviderConstants.ZHIPUAI, model, promptTokens, diff --git a/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuaiController.java b/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuaiController.java index edbd74079c..d19ee7cd35 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuaiController.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuaiController.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-19 09:39:15 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-23 15:28:39 + * @LastEditTime: 2025-09-24 16:03:38 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -81,7 +81,7 @@ public class ZhipuaiController { } try { - String result = zhipuaiService.processPromptSync(message, null, ""); + String result = zhipuaiService.processPromptSync(message, null); return ResponseEntity.ok(JsonResult.success(result)); } catch (Exception e) { log.error("Error in chat sync", e); @@ -120,7 +120,7 @@ public class ZhipuaiController { // 创建简单的消息对象用于测试 // 这里需要创建MessageProtobuf对象,但为了简化,我们直接调用服务 // 在实际使用中,应该通过SpringAIServiceRegistry调用 - String result = zhipuaiService.processPromptSync(message, null, ""); + String result = zhipuaiService.processPromptSync(message, null); emitter.send("data: " + result + "\n\n"); emitter.complete(); } catch (Exception e) { diff --git a/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuaiService.java b/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuaiService.java index ed09f3c7a8..89cabede65 100644 --- a/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuaiService.java +++ b/modules/ai/src/main/java/com/bytedesk/ai/zhipuai/ZhipuaiService.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2025-02-19 09:39:15 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-16 10:46:36 + * @LastEditTime: 2025-09-24 15:28:59 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -190,12 +190,10 @@ public class ZhipuaiService extends BaseSpringAIService { * 方式1:异步流式调用 - 实现BaseSpringAIService的抽象方法(带prompt参数) */ @Override - protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, String fullPromptContent) { + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); log.info("Zhipuai API websocket prompt: {}", prompt); - log.info("Zhipuai API websocket fullPromptContent: {}", fullPromptContent); long startTime = System.currentTimeMillis(); final boolean[] success = {false}; @@ -328,16 +326,14 @@ public class ZhipuaiService extends BaseSpringAIService { * 方式2:同步调用 - 实现BaseSpringAIService的抽象方法(带prompt参数) */ @Override - protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + protected String processPromptSync(String message, RobotProtobuf robot) { if (robot == null || robot.getLlm() == null || robot.getLlm().getTextModel() == null) { log.error("Robot or RobotLlm is null, cannot process prompt sync"); return "Error: Robot or RobotLlm is not configured"; } // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); - // 添加请求日志 - log.info("Zhipuai API sync fullPromptContent: {}", fullPromptContent); - + // long startTime = System.currentTimeMillis(); boolean success = false; ChatTokenUsage tokenUsage = new ChatTokenUsage(0, 0, 0); @@ -388,17 +384,15 @@ public class ZhipuaiService extends BaseSpringAIService { */ @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, - MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + MessageProtobuf messageProtobufReply, SseEmitter emitter) { if (robot == null || robot.getLlm() == null || robot.getLlm().getTextModel() == null) { log.error("Robot or RobotLlm is null, cannot process prompt SSE"); sendSseMessage(I18Consts.I18N_SERVICE_TEMPORARILY_UNAVAILABLE, robot, messageProtobufQuery, messageProtobufReply, emitter); return; } - // if (robot) // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); log.info("Zhipuai API SSE prompt: {}", prompt); - log.info("Zhipuai API SSE fullPromptContent: {}", fullPromptContent); // 发送起始消息 sendStreamStartMessage(messageProtobufReply, emitter, I18Consts.I18N_THINKING); @@ -504,7 +498,7 @@ public class ZhipuaiService extends BaseSpringAIService { } sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent, LlmProviderConstants.ZHIPUAI, modelType); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), prompt, LlmProviderConstants.ZHIPUAI, modelType); } catch (Exception e) { log.error("Zhipuai API SSE error completing stream: ", e); } diff --git a/modules/core/src/main/java/com/bytedesk/core/constant/I18Consts.java b/modules/core/src/main/java/com/bytedesk/core/constant/I18Consts.java index 619ab56597..8099d754cd 100644 --- a/modules/core/src/main/java/com/bytedesk/core/constant/I18Consts.java +++ b/modules/core/src/main/java/com/bytedesk/core/constant/I18Consts.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2024-04-26 22:25:47 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2025-09-24 11:02:22 + * @LastEditTime: 2025-09-24 15:10:17 * @Description: bytedesk.com https://github.com/Bytedesk/bytedesk * Please be aware of the BSL license restrictions before installing Bytedesk IM – * selling, reselling, or hosting Bytedesk IM as a service is a breach of the terms and automatically terminates your rights under the license. @@ -381,4 +381,8 @@ public class I18Consts { // "不支持的发送类型" public static final String I18N_CAPTCHA_UNSUPPORTED_TYPE = "不支持的发送类型"; // 不支持的发送类型 + + // "处理请求时发生错误,请稍后重试" + public static final String I18N_ROBOT_PROCESSING_ERROR = "处理请求时发生错误,请稍后重试"; // 处理请求时发生错误,请稍后重试 + }