diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java index 3f369774..bee728f5 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/controller/AgentMcpAccessPointController.java @@ -28,7 +28,7 @@ public class AgentMcpAccessPointController { /** * 获取智能体的Mcp接入点地址 * - * @param audioId 智能体id + * @param agentId 智能体id * @return 返回错误提醒或者Mcp接入点地址 */ @Operation(summary = "获取智能体的Mcp接入点地址") diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java index 63b820c9..494107a2 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatHistoryServiceImpl.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import cn.hutool.core.collection.ListUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -18,6 +19,7 @@ import xiaozhi.common.constant.Constant; import xiaozhi.common.page.PageData; import xiaozhi.common.utils.ConvertUtils; import xiaozhi.common.utils.JsonUtils; +import xiaozhi.common.utils.ToolUtil; import xiaozhi.modules.agent.Enums.AgentChatHistoryType; import xiaozhi.modules.agent.dao.AiAgentChatHistoryDao; import xiaozhi.modules.agent.dto.AgentChatHistoryDTO; @@ -86,13 +88,12 @@ public class AgentChatHistoryServiceImpl extends ServiceImpl audioIds = baseMapper.getAudioIdsByAgentId(agentId); - if (audioIds != null && !audioIds.isEmpty()) { - int batchSize = 1000; // 每批删除1000条 - for (int i = 0; i < audioIds.size(); i += batchSize) { - int end = Math.min(i + batchSize, audioIds.size()); - List batch = audioIds.subList(i, end); - baseMapper.deleteAudioByIds(batch); - } + if (ToolUtil.isNotEmpty(audioIds)) { + // 每批删除1000条 + List> batch = ListUtil.split(audioIds, 1000); + batch.forEach(dataList->{ + baseMapper.deleteAudioByIds(dataList); + }); } } if (deleteAudio && !deleteText) { diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatSummaryServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatSummaryServiceImpl.java index f367891f..38fef94b 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatSummaryServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentChatSummaryServiceImpl.java @@ -78,11 +78,11 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { // 4. 生成总结(generateSummaryFromMessages方法已包含长度限制逻辑) String summary = generateSummaryFromMessages(meaningfulMessages, agentId); - System.out.println("成功生成会话 " + sessionId + " 的聊天记录总结,长度: " + summary.length() + " 字符"); + log.info("成功生成会话 {} 的聊天记录总结,长度: {} 字符", sessionId, summary.length()); return new AgentChatSummaryDTO(sessionId, agentId, summary); } catch (Exception e) { - System.err.println("生成会话 " + sessionId + " 的聊天记录总结时发生错误: " + e.getMessage()); + log.error("生成会话 {} 的聊天记录总结时发生错误: {}", sessionId, e.getMessage()); return new AgentChatSummaryDTO(sessionId, "生成总结时发生错误: " + e.getMessage()); } } @@ -93,14 +93,14 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { // 1. 生成总结 AgentChatSummaryDTO summaryDTO = generateChatSummary(sessionId); if (!summaryDTO.isSuccess()) { - System.err.println("生成总结失败: " + summaryDTO.getErrorMessage()); + log.info("生成总结失败: {}", summaryDTO.getErrorMessage()); return false; } // 2. 获取设备信息(通过会话关联的设备) DeviceEntity device = getDeviceBySessionId(sessionId); if (device == null) { - System.err.println("未找到与会话 " + sessionId + " 关联的设备"); + log.info("未找到与会话 {} 关联的设备", sessionId); return false; } @@ -116,11 +116,11 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { } }); - System.out.println("成功保存会话 " + sessionId + " 的聊天记录总结到智能体 " + device.getAgentId()); + log.info("成功保存会话 {} 的聊天记录总结到智能体 {}", sessionId, device.getAgentId()); return true; } catch (Exception e) { - System.err.println("保存会话 " + sessionId + " 的聊天记录总结时发生错误: " + e.getMessage()); + log.error("保存会话 {} 的聊天记录总结时发生错误: {}", sessionId, e.getMessage()); return false; } } @@ -138,7 +138,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { } return agentChatHistoryService.getChatHistoryBySessionId(agentId, sessionId); } catch (Exception e) { - System.err.println("获取会话 " + sessionId + " 的聊天记录失败: " + e.getMessage()); + log.error("获取会话 {} 的聊天记录失败: {}", sessionId, e.getMessage()); return null; } } @@ -157,7 +157,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { AgentChatHistoryEntity entity = agentChatHistoryService.getOne(wrapper); return entity != null ? entity.getAgentId() : null; } catch (Exception e) { - System.err.println("根据会话ID " + sessionId + " 查找智能体ID失败: " + e.getMessage()); + log.error("根据会话ID {} 查找智能体ID失败: {}", sessionId, e.getMessage()); return null; } } @@ -272,7 +272,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { return summary; } catch (Exception e) { - System.err.println("调用Java端LLM服务失败: " + e.getMessage()); + log.error("调用Java端LLM服务失败: {}", e.getMessage()); throw new RuntimeException("LLM服务不可用,无法生成聊天总结"); } } @@ -295,7 +295,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { // 返回智能体的当前总结记忆 return agentInfo.getSummaryMemory(); } catch (Exception e) { - System.err.println("获取智能体历史记忆失败,agentId: " + agentId + ", 错误: " + e.getMessage()); + log.error("获取智能体历史记忆失败,agentId: {}, 错误: {}", agentId, e.getMessage()); return null; } } @@ -309,7 +309,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { String modelId = getMemorySummaryModelId(agentId); if (StringUtils.isBlank(modelId)) { - System.out.println("未找到记忆总结的LLM模型配置,使用默认LLM服务"); + log.info("未找到记忆总结的LLM模型配置,使用默认LLM服务"); return llmService.generateSummaryWithHistory(conversation, historyMemory, null, null); } @@ -323,7 +323,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { throw new RuntimeException("Java端LLM服务返回异常: " + summary); } catch (Exception e) { - System.err.println("调用Java端LLM服务异常,agentId: " + agentId + ", 错误: " + e.getMessage()); + log.error("调用Java端LLM服务异常,agentId: {}, 错误: {}", agentId, e.getMessage()); throw e; } } @@ -337,7 +337,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { String modelId = getMemorySummaryModelId(agentId); if (StringUtils.isBlank(modelId)) { - System.out.println("未找到记忆总结的LLM模型配置,使用默认LLM服务"); + log.info("未找到记忆总结的LLM模型配置,使用默认LLM服务"); return llmService.generateSummary(conversation); } @@ -351,7 +351,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { throw new RuntimeException("Java端LLM服务返回异常: " + summary); } catch (Exception e) { - System.err.println("调用Java端LLM服务异常,agentId: " + agentId + ", 错误: " + e.getMessage()); + log.error("调用Java端LLM服务异常,agentId: {}, 错误: {}", agentId, e.getMessage()); throw e; } } @@ -394,7 +394,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { return llmModelId; } catch (Exception e) { - System.err.println("获取记忆总结LLM模型ID失败,agentId: " + agentId + ", 错误: " + e.getMessage()); + log.error("获取记忆总结LLM模型ID失败,agentId: {}, 错误: {}", agentId, e.getMessage()); return null; } } @@ -416,7 +416,7 @@ public class AgentChatSummaryServiceImpl implements AgentChatSummaryService { } return null; } catch (Exception e) { - System.err.println("根据会话ID " + sessionId + " 查找设备信息失败: " + e.getMessage()); + log.error("根据会话ID {} 查找设备信息失败: {}", sessionId, e.getMessage()); return null; } } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java index dac5cbba..3237e22c 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/agent/service/impl/AgentServiceImpl.java @@ -1,11 +1,6 @@ package xiaozhi.modules.agent.service.impl; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -28,6 +23,7 @@ import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.user.UserDetail; import xiaozhi.common.utils.ConvertUtils; import xiaozhi.common.utils.JsonUtils; +import xiaozhi.common.utils.ToolUtil; import xiaozhi.modules.agent.dao.AgentDao; import xiaozhi.modules.agent.dto.AgentCreateDTO; import xiaozhi.modules.agent.dto.AgentDTO; @@ -136,20 +132,14 @@ public class AgentServiceImpl extends BaseServiceImpl imp if (StringUtils.isNotBlank(keyword)) { if ("mac".equals(searchType)) { // 按MAC地址搜索:先搜索设备,再获取对应的智能体 - List devices = deviceService.searchDevicesByMacAddress(keyword, userId); - - if (!devices.isEmpty()) { - // 获取设备对应的智能体ID列表 - List agentIds = devices.stream() - .map(DeviceEntity::getAgentId) - .distinct() - .collect(Collectors.toList()); - - if (!agentIds.isEmpty()) { - queryWrapper.in("id", agentIds); - } else { - return new ArrayList<>(); - } + List devices = Optional.ofNullable(deviceService.searchDevicesByMacAddress(keyword, userId)).orElseGet(ArrayList::new); + // 获取设备对应的智能体ID列表 + List agentIds = devices.stream() + .map(DeviceEntity::getAgentId) + .distinct() + .collect(Collectors.toList()); + if (ToolUtil.isNotEmpty(agentIds)) { + queryWrapper.in("id", agentIds); } else { return new ArrayList<>(); } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java index ead30b70..49885614 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/config/service/impl/ConfigServiceImpl.java @@ -163,11 +163,11 @@ public class ConfigServiceImpl implements ConfigService { } result.put("chat_history_conf", chatHistoryConf); // 如果客户端已实例化模型,则不返回 - String alreadySelectedVadModelId = (String) selectedModule.get("VAD"); + String alreadySelectedVadModelId = selectedModule.get("VAD"); if (alreadySelectedVadModelId != null && alreadySelectedVadModelId.equals(agent.getVadModelId())) { agent.setVadModelId(null); } - String alreadySelectedAsrModelId = (String) selectedModule.get("ASR"); + String alreadySelectedAsrModelId = selectedModule.get("ASR"); if (alreadySelectedAsrModelId != null && alreadySelectedAsrModelId.equals(agent.getAsrModelId())) { agent.setAsrModelId(null); } @@ -302,7 +302,7 @@ public class ConfigServiceImpl implements ConfigService { private void buildVoiceprintConfig(String agentId, Map result) { try { // 获取声纹接口地址 - String voiceprintUrl = sysParamsService.getValue("server.voice_print", true); + String voiceprintUrl = sysParamsService.getValue(Constant.SERVER_VOICE_PRINT, true); if (StringUtils.isBlank(voiceprintUrl) || "null".equals(voiceprintUrl)) { return; } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java index bbe0c66a..128ba195 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/controller/OTAMagController.java @@ -7,7 +7,9 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import org.apache.commons.lang3.StringUtils; @@ -145,15 +147,11 @@ public class OTAMagController { // 检查下载次数 String downloadCountKey = RedisKeys.getOtaDownloadCountKey(uuid); - Integer downloadCount = (Integer) redisUtils.get(downloadCountKey); - if (downloadCount == null) { - downloadCount = 0; - } + Integer downloadCount = (Integer) Optional.ofNullable(redisUtils.get(downloadCountKey)).orElse(0); // 如果下载次数超过3次,返回404 if (downloadCount >= 3) { - redisUtils.delete(downloadCountKey); - redisUtils.delete(RedisKeys.getOtaIdKey(uuid)); + redisUtils.delete(List.of(downloadCountKey, RedisKeys.getOtaIdKey(uuid))); logger.warn("Download limit exceeded for UUID: {}", uuid); return ResponseEntity.notFound().build(); }