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 45c768b986..abbfd70b9a 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 @@ -63,6 +63,26 @@ public class SpringAIDeepseekService extends BaseSpringAIService { ); } + @Override + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, + MessageProtobuf messageProtobufReply, String fullPromptContent) { + log.info("SpringAIDeepseekService processPromptWebsocket with full prompt content: {}", fullPromptContent); + processPromptWebsocket(prompt, robot, messageProtobufQuery, messageProtobufReply); + } + + @Override + protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + log.info("SpringAIDeepseekService processPromptSync with full prompt content: {}", fullPromptContent); + return processPromptSync(message, robot); + } + + @Override + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, + MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { + log.info("SpringAIDeepseekService processPromptSse with full prompt content: {}", fullPromptContent); + processPromptSse(prompt, robot, messageProtobufQuery, messageProtobufReply, emitter); + } + @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 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 f471c31c5d..e40a5e707d 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 @@ -224,9 +224,16 @@ public class SpringAIOllamaService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter) { + // 调用带prompt参数的重载方法,传入空prompt + processPromptSse(prompt, robot, messageProtobufQuery, messageProtobufReply, emitter, ""); + } + + @Override + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { Assert.notNull(emitter, "SseEmitter must not be null"); // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); + log.info("Ollama API SSE fullPromptContent: {}", fullPromptContent); // 获取适当的模型实例并配置较长的超时时间 OllamaChatModel chatModel = bytedeskOllamaChatModel; @@ -279,9 +286,9 @@ public class SpringAIOllamaService extends BaseSpringAIService { }, () -> { log.info("Ollama API SSE complete"); - // 发送流结束消息,包含token使用情况 + // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens()); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getModel())) ? llm.getModel() : "llama2"; 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 b052eed620..111a11143f 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 @@ -62,6 +62,26 @@ 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); + processPromptWebsocket(prompt, robot, messageProtobufQuery, messageProtobufReply); + } + + @Override + protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + log.info("SpringAIOpenrouterService processPromptSync with full prompt content: {}", fullPromptContent); + return processPromptSync(message, robot); + } + + @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); + processPromptSse(prompt, robot, messageProtobufQuery, messageProtobufReply, emitter); + } + @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 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 77066880f4..151338c92a 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 @@ -67,8 +67,15 @@ public class SpringAISiliconFlowService extends BaseSpringAIService { @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { + // 调用带prompt参数的重载方法,传入空prompt + processPromptWebsocket(prompt, robot, messageProtobufQuery, messageProtobufReply, ""); + } + + @Override + protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, String fullPromptContent) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); + log.info("SiliconFlow API websocket fullPromptContent: {}", fullPromptContent); if (!siliconFlowChatModel.isPresent()) { sendMessageWebsocket(MessageTypeEnum.ERROR, "SiliconFlow服务不可用", messageProtobufReply); @@ -123,10 +130,18 @@ public class SpringAISiliconFlowService extends BaseSpringAIService { @Override protected String processPromptSync(String message, RobotProtobuf robot) { + // 调用带prompt参数的重载方法,传入空prompt + return processPromptSync(message, robot, ""); + } + + @Override + protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { long startTime = System.currentTimeMillis(); boolean success = false; TokenUsage tokenUsage = new TokenUsage(0, 0, 0); + log.info("SiliconFlow API sync fullPromptContent: {}", fullPromptContent); + try { if (!siliconFlowChatModel.isPresent()) { return "siliconFlow service is not available"; @@ -173,8 +188,16 @@ public class SpringAISiliconFlowService extends BaseSpringAIService { @Override protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply, SseEmitter emitter) { + // 调用带prompt参数的重载方法,传入空prompt + processPromptSse(prompt, robot, messageProtobufQuery, messageProtobufReply, emitter, ""); + } + + @Override + protected void processPromptSse(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, + MessageProtobuf messageProtobufReply, SseEmitter emitter, String fullPromptContent) { // 从robot中获取llm配置 RobotLlm llm = robot.getLlm(); + log.info("SiliconFlow API SSE fullPromptContent: {}", fullPromptContent); if (!siliconFlowChatModel.isPresent()) { handleSseError(new RuntimeException("SiliconFlow service not available"), messageProtobufQuery, @@ -225,9 +248,9 @@ public class SpringAISiliconFlowService extends BaseSpringAIService { }, () -> { log.info("SiliconFlow API SSE complete"); - // 发送流结束消息,包含token使用情况 + // 发送流结束消息,包含token使用情况和prompt内容 sendStreamEndMessage(messageProtobufQuery, messageProtobufReply, emitter, - tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens()); + tokenUsage[0].getPromptTokens(), tokenUsage[0].getCompletionTokens(), tokenUsage[0].getTotalTokens(), fullPromptContent); // 记录token使用情况 long responseTime = System.currentTimeMillis() - startTime; String modelType = (llm != null && StringUtils.hasText(llm.getModel())) ? llm.getModel() : LlmConsts.SILICONFLOW; 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 485f736d7b..1739e3df18 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 @@ -61,6 +61,26 @@ 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); + processPromptWebsocket(prompt, robot, messageProtobufQuery, messageProtobufReply); + } + + @Override + protected String processPromptSync(String message, RobotProtobuf robot, String fullPromptContent) { + log.info("SpringAIVolcengineService processPromptSync with full prompt content: {}", fullPromptContent); + return processPromptSync(message, robot); + } + + @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); + processPromptSse(prompt, robot, messageProtobufQuery, messageProtobufReply, emitter); + } + @Override protected void processPromptWebsocket(Prompt prompt, RobotProtobuf robot, MessageProtobuf messageProtobufQuery, MessageProtobuf messageProtobufReply) { // 从robot中获取llm配置 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 1d07ce011d..45340b994b 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-07-16 12:29:38 + * @LastEditTime: 2025-07-16 12:33:19 * @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. diff --git a/modules/core/src/main/java/com/bytedesk/core/group/GroupTypeEnum.java b/modules/core/src/main/java/com/bytedesk/core/group/GroupTypeEnum.java index 558c2a36c3..486a0e19a2 100644 --- a/modules/core/src/main/java/com/bytedesk/core/group/GroupTypeEnum.java +++ b/modules/core/src/main/java/com/bytedesk/core/group/GroupTypeEnum.java @@ -2,7 +2,7 @@ * @Author: jackning 270580156@qq.com * @Date: 2024-06-28 09:37:50 * @LastEditors: jackning 270580156@qq.com - * @LastEditTime: 2024-12-28 11:24:42 + * @LastEditTime: 2025-07-16 12:33: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. @@ -25,6 +25,7 @@ package com.bytedesk.core.group; public enum GroupTypeEnum { NORMAL, // 普通群组 TOPIC, // 话题群组 + CHANNEL, // 频道群组 PROJECT; // 项目群组 // 根据字符串查找对应的枚举常量