Commit 2a2462fd authored by youxiaoji's avatar youxiaoji

+ [针对访客预约智能体增加会话记录,任务完成后,会话删除;这个应该是一个针对所有智能体的功能,目前DEMO阶段只针对单个智能体]

parent 02e20c33
...@@ -17,6 +17,7 @@ import pangea.hiagent.model.Agent; ...@@ -17,6 +17,7 @@ import pangea.hiagent.model.Agent;
import pangea.hiagent.model.UserToken; import pangea.hiagent.model.UserToken;
import pangea.hiagent.tool.AgentToolManager; import pangea.hiagent.tool.AgentToolManager;
import pangea.hiagent.common.utils.UserUtils; import pangea.hiagent.common.utils.UserUtils;
import pangea.hiagent.web.service.ChatService;
import pangea.hiagent.web.service.UserTokenService; import pangea.hiagent.web.service.UserTokenService;
import java.util.List; import java.util.List;
...@@ -32,6 +33,7 @@ import java.util.function.Consumer; ...@@ -32,6 +33,7 @@ import java.util.function.Consumer;
public class DefaultReactExecutor implements ReactExecutor { public class DefaultReactExecutor implements ReactExecutor {
private final UserSseService userSseService; private final UserSseService userSseService;
private final ChatService chatService;
@Value("${hiagent.react.system-prompt}") @Value("${hiagent.react.system-prompt}")
private String defaultSystemPrompt; private String defaultSystemPrompt;
...@@ -46,16 +48,15 @@ public class DefaultReactExecutor implements ReactExecutor { ...@@ -46,16 +48,15 @@ public class DefaultReactExecutor implements ReactExecutor {
private final AgentToolManager agentToolManager; private final AgentToolManager agentToolManager;
private final UserTokenService userTokenService;
public DefaultReactExecutor(EventSplitter eventSplitter, AgentToolManager agentToolManager, public DefaultReactExecutor(EventSplitter eventSplitter, AgentToolManager agentToolManager,
MemoryService memoryService, ErrorHandlerService errorHandlerService, UserSseService userSseService, UserTokenService userTokenService) { MemoryService memoryService, ErrorHandlerService errorHandlerService, UserSseService userSseService, ChatService chatService) {
this.eventSplitter = eventSplitter; this.eventSplitter = eventSplitter;
this.agentToolManager = agentToolManager; this.agentToolManager = agentToolManager;
this.memoryService = memoryService; this.memoryService = memoryService;
this.errorHandlerService = errorHandlerService; this.errorHandlerService = errorHandlerService;
this.userSseService = userSseService; this.userSseService = userSseService;
this.userTokenService = userTokenService; this.chatService = chatService;
} }
@Override @Override
...@@ -79,7 +80,7 @@ public class DefaultReactExecutor implements ReactExecutor { ...@@ -79,7 +80,7 @@ public class DefaultReactExecutor implements ReactExecutor {
List<Object> agentTools = getAgentTools(agent); List<Object> agentTools = getAgentTools(agent);
try { try {
Prompt prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, userId); Prompt prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, userId, false);
ChatResponse response = chatClient.prompt(prompt) ChatResponse response = chatClient.prompt(prompt)
.tools(agentTools.toArray()) .tools(agentTools.toArray())
...@@ -120,7 +121,7 @@ public class DefaultReactExecutor implements ReactExecutor { ...@@ -120,7 +121,7 @@ public class DefaultReactExecutor implements ReactExecutor {
* @param userId 用户ID(可选,如果为null则自动获取) * @param userId 用户ID(可选,如果为null则自动获取)
* @return 构建好的提示词对象 * @return 构建好的提示词对象
*/ */
private Prompt buildPromptWithHistory(String systemPrompt, String userInput, Agent agent, String userId) { private Prompt buildPromptWithHistory(String systemPrompt, String userInput, Agent agent, String userId, boolean newChat) {
List<org.springframework.ai.chat.messages.Message> messages = new ArrayList<>(); List<org.springframework.ai.chat.messages.Message> messages = new ArrayList<>();
messages.add(new SystemMessage(systemPrompt)); messages.add(new SystemMessage(systemPrompt));
...@@ -137,8 +138,9 @@ public class DefaultReactExecutor implements ReactExecutor { ...@@ -137,8 +138,9 @@ public class DefaultReactExecutor implements ReactExecutor {
List<org.springframework.ai.chat.messages.Message> historyMessages = List<org.springframework.ai.chat.messages.Message> historyMessages =
memoryService.getHistoryMessages(sessionId, historyLength); memoryService.getHistoryMessages(sessionId, historyLength);
if (!newChat) {
// messages.addAll(historyMessages); messages.addAll(historyMessages);
}
memoryService.addUserMessageToMemory(sessionId, userInput); memoryService.addUserMessageToMemory(sessionId, userInput);
} catch (Exception e) { } catch (Exception e) {
...@@ -147,8 +149,8 @@ public class DefaultReactExecutor implements ReactExecutor { ...@@ -147,8 +149,8 @@ public class DefaultReactExecutor implements ReactExecutor {
} }
messages.add(new UserMessage(userInput)); messages.add(new UserMessage(userInput));
for(Message message : messages) { for (Message message : messages) {
log.info("message is {}",message); log.info("message is {}", message);
} }
return new Prompt(messages); return new Prompt(messages);
} }
...@@ -169,15 +171,21 @@ public class DefaultReactExecutor implements ReactExecutor { ...@@ -169,15 +171,21 @@ public class DefaultReactExecutor implements ReactExecutor {
StringBuilder fullResponse = new StringBuilder(); StringBuilder fullResponse = new StringBuilder();
try { try {
Prompt prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, userId);
log.info("agent id {}", agent.getId());
log.info("agentTools {}", agentTools);
SseTokenEmitter sseTokenEmitter = (SseTokenEmitter) tokenConsumer; SseTokenEmitter sseTokenEmitter = (SseTokenEmitter) tokenConsumer;
String emitterId = sseTokenEmitter.getEmitterId(); String emitterId = sseTokenEmitter.getEmitterId();
String tmpUserId = sseTokenEmitter.getUserId();
Prompt prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, tmpUserId, false);
log.info("agent id {}", agent.getId());
log.info("agentTools {}", agentTools);
if (agent.getId().compareToIgnoreCase("agent-8") == 0) { if (agent.getId().compareToIgnoreCase("agent-8") == 0) {
if (!chatService.chatExists(tmpUserId, agent.getId())) {
log.info("new chat for {} {} ", userId, agent.getId());
prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, tmpUserId, true);
}
chatClient.prompt(prompt) chatClient.prompt(prompt)
.tools(agentTools.toArray()) .tools(agentTools.toArray())
.toolContext(Map.of("emitterId", emitterId, "userId", sseTokenEmitter.getUserId())) .toolContext(Map.of("emitterId", emitterId, "userId", sseTokenEmitter.getUserId(),"agentId",agent.getId()))
.stream() .stream()
.chatResponse() .chatResponse()
.subscribe( .subscribe(
......
...@@ -23,6 +23,7 @@ import pangea.hiagent.common.utils.InputCodeGenerator; ...@@ -23,6 +23,7 @@ import pangea.hiagent.common.utils.InputCodeGenerator;
import pangea.hiagent.model.Agent; import pangea.hiagent.model.Agent;
import pangea.hiagent.model.UserToken; import pangea.hiagent.model.UserToken;
import pangea.hiagent.web.service.AgentService; import pangea.hiagent.web.service.AgentService;
import pangea.hiagent.web.service.ChatService;
import pangea.hiagent.web.service.InfoCollectorService; import pangea.hiagent.web.service.InfoCollectorService;
import pangea.hiagent.web.service.UserTokenService; import pangea.hiagent.web.service.UserTokenService;
...@@ -67,18 +68,20 @@ public class VisitorAppointmentTool { ...@@ -67,18 +68,20 @@ public class VisitorAppointmentTool {
private InfoCollectorService infoCollectorService; private InfoCollectorService infoCollectorService;
private UserSseService userSseService; private UserSseService userSseService;
private UserTokenService userTokenService; private UserTokenService userTokenService;
private ChatService chatService;
// 登录状态有效期(毫秒),设置为30分钟 // 登录状态有效期(毫秒),设置为30分钟
private static final long LOGIN_VALIDITY_PERIOD = 30 * 60 * 1000; private static final long LOGIN_VALIDITY_PERIOD = 30 * 60 * 1000;
public VisitorAppointmentTool(UserTokenService userTokenService,AgentService agentService, InfoCollectorService infoCollectorService, UserSseService userSseService) { public VisitorAppointmentTool(UserTokenService userTokenService,AgentService agentService, InfoCollectorService infoCollectorService, UserSseService userSseService,ChatService chatService) {
this.agentService = agentService; this.agentService = agentService;
this.infoCollectorService = infoCollectorService; this.infoCollectorService = infoCollectorService;
this.ssoToken = "33f667865c395f164d29487c15fe74bf76b463f2941ef6af55d14a35a11d60b1"; this.ssoToken = "33f667865c395f164d29487c15fe74bf76b463f2941ef6af55d14a35a11d60b1";
this.ldapToken = "AAECAzY5NDRBNTQ1Njk0NTRFMDV5b3V4aWFvamlaLv+jUGNEEORN24GLIC3OlqcCdw=="; this.ldapToken = "AAECAzY5NDRBNTQ1Njk0NTRFMDV5b3V4aWFvamlaLv+jUGNEEORN24GLIC3OlqcCdw==";
this.userSseService = userSseService; this.userSseService = userSseService;
this.userTokenService = userTokenService; this.userTokenService = userTokenService;
this.chatService = chatService;
} }
@PostConstruct @PostConstruct
...@@ -273,6 +276,9 @@ public class VisitorAppointmentTool { ...@@ -273,6 +276,9 @@ public class VisitorAppointmentTool {
} }
infoCollectorService.clearValue(); infoCollectorService.clearValue();
infoCollectorService.clearInfo(pageId); infoCollectorService.clearInfo(pageId);
String userId = toolContext.getContext().get("userId").toString();
String agentId = toolContext.getContext().get("agentId").toString();
chatService.removeChat(userId, agentId);
// sharedContext.tracing().stop(new Tracing.StopOptions() // sharedContext.tracing().stop(new Tracing.StopOptions()
// .setPath(Paths.get("trace1.zip"))); // .setPath(Paths.get("trace1.zip")));
} }
......
package pangea.hiagent.web.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@Slf4j
@Service
public class ChatService {
private final ConcurrentMap<String,String> chatList = new ConcurrentHashMap<>(1024);
public boolean chatExists(String userId,String agentId) {
String chatId = buildChatId(userId,agentId);
boolean exists = chatList.containsKey(chatId);
if(!exists){
log.info("put chatId:{}",chatId);
chatList.put(chatId,"exists");
}
return exists;
}
public void removeChat(String userId,String agentId) {
String chatId = buildChatId(userId,agentId);
log.info("remove chatId:{}",chatId);
chatList.remove(chatId);
}
private String buildChatId(String userId,String agentId) {
return userId+"-"+agentId;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment