Commit 2a2462fd authored by youxiaoji's avatar youxiaoji

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

parent 02e20c33
......@@ -17,6 +17,7 @@ import pangea.hiagent.model.Agent;
import pangea.hiagent.model.UserToken;
import pangea.hiagent.tool.AgentToolManager;
import pangea.hiagent.common.utils.UserUtils;
import pangea.hiagent.web.service.ChatService;
import pangea.hiagent.web.service.UserTokenService;
import java.util.List;
......@@ -32,6 +33,7 @@ import java.util.function.Consumer;
public class DefaultReactExecutor implements ReactExecutor {
private final UserSseService userSseService;
private final ChatService chatService;
@Value("${hiagent.react.system-prompt}")
private String defaultSystemPrompt;
......@@ -46,16 +48,15 @@ public class DefaultReactExecutor implements ReactExecutor {
private final AgentToolManager agentToolManager;
private final UserTokenService userTokenService;
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.agentToolManager = agentToolManager;
this.memoryService = memoryService;
this.errorHandlerService = errorHandlerService;
this.userSseService = userSseService;
this.userTokenService = userTokenService;
this.chatService = chatService;
}
@Override
......@@ -79,7 +80,7 @@ public class DefaultReactExecutor implements ReactExecutor {
List<Object> agentTools = getAgentTools(agent);
try {
Prompt prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, userId);
Prompt prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, userId, false);
ChatResponse response = chatClient.prompt(prompt)
.tools(agentTools.toArray())
......@@ -120,7 +121,7 @@ public class DefaultReactExecutor implements ReactExecutor {
* @param userId 用户ID(可选,如果为null则自动获取)
* @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<>();
messages.add(new SystemMessage(systemPrompt));
......@@ -137,8 +138,9 @@ public class DefaultReactExecutor implements ReactExecutor {
List<org.springframework.ai.chat.messages.Message> historyMessages =
memoryService.getHistoryMessages(sessionId, historyLength);
// messages.addAll(historyMessages);
if (!newChat) {
messages.addAll(historyMessages);
}
memoryService.addUserMessageToMemory(sessionId, userInput);
} catch (Exception e) {
......@@ -147,8 +149,8 @@ public class DefaultReactExecutor implements ReactExecutor {
}
messages.add(new UserMessage(userInput));
for(Message message : messages) {
log.info("message is {}",message);
for (Message message : messages) {
log.info("message is {}", message);
}
return new Prompt(messages);
}
......@@ -169,15 +171,21 @@ public class DefaultReactExecutor implements ReactExecutor {
StringBuilder fullResponse = new StringBuilder();
try {
Prompt prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, userId);
log.info("agent id {}", agent.getId());
log.info("agentTools {}", agentTools);
SseTokenEmitter sseTokenEmitter = (SseTokenEmitter) tokenConsumer;
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 (!chatService.chatExists(tmpUserId, agent.getId())) {
log.info("new chat for {} {} ", userId, agent.getId());
prompt = buildPromptWithHistory(defaultSystemPrompt, userInput, agent, tmpUserId, true);
}
chatClient.prompt(prompt)
.tools(agentTools.toArray())
.toolContext(Map.of("emitterId", emitterId, "userId", sseTokenEmitter.getUserId()))
.toolContext(Map.of("emitterId", emitterId, "userId", sseTokenEmitter.getUserId(),"agentId",agent.getId()))
.stream()
.chatResponse()
.subscribe(
......
......@@ -23,6 +23,7 @@ import pangea.hiagent.common.utils.InputCodeGenerator;
import pangea.hiagent.model.Agent;
import pangea.hiagent.model.UserToken;
import pangea.hiagent.web.service.AgentService;
import pangea.hiagent.web.service.ChatService;
import pangea.hiagent.web.service.InfoCollectorService;
import pangea.hiagent.web.service.UserTokenService;
......@@ -67,18 +68,20 @@ public class VisitorAppointmentTool {
private InfoCollectorService infoCollectorService;
private UserSseService userSseService;
private UserTokenService userTokenService;
private ChatService chatService;
// 登录状态有效期(毫秒),设置为30分钟
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.infoCollectorService = infoCollectorService;
this.ssoToken = "33f667865c395f164d29487c15fe74bf76b463f2941ef6af55d14a35a11d60b1";
this.ldapToken = "AAECAzY5NDRBNTQ1Njk0NTRFMDV5b3V4aWFvamlaLv+jUGNEEORN24GLIC3OlqcCdw==";
this.userSseService = userSseService;
this.userTokenService = userTokenService;
this.chatService = chatService;
}
@PostConstruct
......@@ -273,6 +276,9 @@ public class VisitorAppointmentTool {
}
infoCollectorService.clearValue();
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()
// .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