From 4e373e6d2c683fd215ef270d02374cf0b21ab159 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Thu, 1 Jan 2026 13:12:42 +0800 Subject: [PATCH] =?UTF-8?q?ai=E8=81=8A=E5=A4=A9input=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/service/impl/AgentChatServiceImpl.java | 61 +++++++++++-------- .../org/xyzh/api/ai/dto/ChatPrepareData.java | 4 ++ 2 files changed, 41 insertions(+), 24 deletions(-) diff --git a/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/service/impl/AgentChatServiceImpl.java b/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/service/impl/AgentChatServiceImpl.java index 2e0e3880..70ca191d 100644 --- a/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/service/impl/AgentChatServiceImpl.java +++ b/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/service/impl/AgentChatServiceImpl.java @@ -256,7 +256,7 @@ public class AgentChatServiceImpl implements AgentChatService { String agentId = prepareData.getAgentId(); String chatId = prepareData.getChatId(); String query = prepareData.getQuery(); - + // 1. 校验智能体 ResultDomain agentResult = agentService.selectAgentById(agentId); if (!agentResult.getSuccess() || agentResult.getData() == null || !agentResult.getData().getIsOuter()) { @@ -269,7 +269,7 @@ public class AgentChatServiceImpl implements AgentChatService { chatFilter.setAgentId(agentId); chatFilter.setUserId(prepareData.getUserId()); chatFilter.setUserType(prepareData.getUserType()); - + LoginDomain loginDomain = LoginUtil.getCurrentLogin(); String userId = loginDomain.getUser().getUserId(); if (userId == null) { @@ -290,7 +290,30 @@ public class AgentChatServiceImpl implements AgentChatService { // 4. 生成临时消息ID(sessionId) String sessionId = IdUtil.getSnowflakeId(); - // 5. 存储会话数据到Redis + // 5. 准备 inputs 参数 + Map inputsMap = prepareData.getInputsMap(); + if (inputsMap == null) { + inputsMap = new HashMap<>(); + } + + // 处理动态知识库 + Boolean isGuest = "guest".equals(loginDomain.getUser().getStatus()); + if (agent.getIsOuter() && NonUtils.isNotEmpty(prepareData.getService())) { + TbKnowledge filter = new TbKnowledge(); + filter.setService(prepareData.getService()); + filter.setCategory(isGuest ? "external" : "internal"); + ResultDomain knowledgeRD = knowledgeService.listKnowledges(filter); + List datasets = new ArrayList<>(); + if (knowledgeRD.getSuccess()) { + datasets = knowledgeRD.getDataList().stream() + .map(TbKnowledge::getDifyDatasetId) + .toList(); + } + inputsMap.put("datasets", JSON.toJSONString(datasets)); + inputsMap.put("dataset_apikey", difyConfig.getKnowledgeApiKey()); + } + + // 6. 存储会话数据到Redis Map sessionData = new HashMap<>(); sessionData.put("agentId", agentId); sessionData.put("chatId", chatId); @@ -300,7 +323,8 @@ public class AgentChatServiceImpl implements AgentChatService { sessionData.put("apiKey", agent.getApiKey()); sessionData.put("outer", agent.getIsOuter()); sessionData.put("service", prepareData.getService()); - sessionData.put("isGuest", "guest".equals(loginDomain.getUser().getStatus())); + sessionData.put("isGuest", isGuest); + sessionData.put("inputsMap", inputsMap); // 存储处理好的 inputs String cacheKey = CHAT_SESSION_PREFIX + sessionId; redisService.set(cacheKey, sessionData, SESSION_TTL, TimeUnit.SECONDS); @@ -334,9 +358,9 @@ public class AgentChatServiceImpl implements AgentChatService { String query = (String) sessionData.get("query"); String userId = (String) sessionData.get("userId"); String apiKey = (String) sessionData.get("apiKey"); - String service = (String) sessionData.get("service"); - Boolean outer = (Boolean) sessionData.get("outer"); - Boolean isGuest = (Boolean) sessionData.get("isGuest"); + + @SuppressWarnings("unchecked") + Map inputsMap = (Map) sessionData.get("inputsMap"); @SuppressWarnings("unchecked") List filesData = (List) sessionData.get("filesData"); @@ -352,7 +376,7 @@ public class AgentChatServiceImpl implements AgentChatService { userMessage.setChatId(chatId); userMessage.setRole("user"); userMessage.setContent(query); - + // 提取系统文件ID列表保存到消息中 if (filesData != null && !filesData.isEmpty()) { List sysFileIds = filesData.stream() @@ -363,7 +387,7 @@ public class AgentChatServiceImpl implements AgentChatService { userMessage.setFiles(sysFileIds); } } - + chatMessageMapper.insertChatMessage(userMessage); // 5. 构建Dify请求 @@ -371,23 +395,12 @@ public class AgentChatServiceImpl implements AgentChatService { chatRequest.setQuery(query); chatRequest.setUser(userId); chatRequest.setResponseMode("streaming"); - Map inputsMap = new HashMap<>(); - chatRequest.setInputs(inputsMap); // Dify API 要求 inputs 必传 - // 处理动态知识库的问题 - if(outer && NonUtils.isNotEmpty(service)){ - TbKnowledge filter = new TbKnowledge(); - filter.setService(service); - filter.setCategory(isGuest?"external":"internal"); - ResultDomain knowledgeRD = knowledgeService.listKnowledges(filter); - List datasets = new ArrayList<>(); - if(knowledgeRD.getSuccess()){ - datasets = knowledgeRD.getDataList().stream().map(TbKnowledge::getDifyDatasetId).toList(); - } - inputsMap.put("datasets", JSON.toJSONString(datasets)); - inputsMap.put("dataset_apikey", difyConfig.getKnowledgeApiKey()); + // 使用从Redis获取的inputsMap,如果为空则创建新的 + if (inputsMap == null) { + inputsMap = new HashMap<>(); } - + chatRequest.setInputs(inputsMap); // Dify API 要求 inputs 必传 if (filesData != null && !filesData.isEmpty()) { chatRequest.setFiles(filesData); diff --git a/urbanLifelineServ/apis/api-ai/src/main/java/org/xyzh/api/ai/dto/ChatPrepareData.java b/urbanLifelineServ/apis/api-ai/src/main/java/org/xyzh/api/ai/dto/ChatPrepareData.java index 3fa26272..08c2562d 100644 --- a/urbanLifelineServ/apis/api-ai/src/main/java/org/xyzh/api/ai/dto/ChatPrepareData.java +++ b/urbanLifelineServ/apis/api-ai/src/main/java/org/xyzh/api/ai/dto/ChatPrepareData.java @@ -2,6 +2,7 @@ package org.xyzh.api.ai.dto; import java.io.Serializable; import java.util.List; +import java.util.Map; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -31,4 +32,7 @@ public class ChatPrepareData implements Serializable { @Schema(description = "服务名称") private String service; + + @Schema(description = "智能体输入参数,不同智能体可能需要不同的输入参数") + private Map inputsMap; }