1+ package io .github .timemachinelab .core .session .application ;
2+
3+ import io .github .timemachinelab .core .session .domain .entity .ConversationSession ;
4+ import io .github .timemachinelab .core .session .infrastructure .web .dto .MessageResponse ;
5+ import io .github .timemachinelab .core .session .infrastructure .ai .ConversationOperation ;
6+ import io .github .timemachinelab .sfchain .core .AIService ;
7+ import lombok .RequiredArgsConstructor ;
8+ import lombok .extern .slf4j .Slf4j ;
9+ import org .springframework .stereotype .Service ;
10+
11+ import java .util .concurrent .ConcurrentHashMap ;
12+ import java .util .Map ;
13+ import java .util .List ;
14+ import java .util .ArrayList ;
15+ import java .util .function .Consumer ;
16+
17+ @ Service
18+ @ RequiredArgsConstructor
19+ @ Slf4j
20+ public class ConversationService {
21+
22+ private final AIService aiService ;
23+
24+ private final Map <String , ConversationSession > sessions = new ConcurrentHashMap <>();
25+
26+ public ConversationSession createSession (String userId ) {
27+ ConversationSession session = new ConversationSession (userId );
28+ sessions .put (session .getSessionId (), session );
29+ return session ;
30+ }
31+
32+ public ConversationSession getSession (String sessionId ) {
33+ return sessions .get (sessionId );
34+ }
35+
36+ public void processUserMessage (String sessionId , String userMessage , Consumer <MessageResponse > sseCallback ) {
37+ ConversationSession session = sessions .get (sessionId );
38+ if (session == null ) {
39+ log .warn ("会话不存在: {}" , sessionId );
40+ return ;
41+ }
42+
43+ // 1. 添加用户消息到会话历史
44+ session .addMessage (userMessage , "user" );
45+
46+ // 2. 发送用户消息确认
47+ sseCallback .accept (MessageResponse .userAnswer ("user_" + System .currentTimeMillis (), userMessage ));
48+
49+ // 3. 调用AI服务获取回复
50+ processAIResponse (session , userMessage , sseCallback );
51+ }
52+
53+ private void processAIResponse (ConversationSession session , String userMessage , Consumer <MessageResponse > sseCallback ) {
54+ try {
55+ // 构建对话历史
56+ List <ConversationOperation .ConversationHistory > history = buildConversationHistory (session );
57+
58+ // 创建AI请求
59+ ConversationOperation .ConversationRequest request = new ConversationOperation .ConversationRequest (
60+ session .getSessionId (),
61+ "current" ,
62+ userMessage
63+ );
64+ request .setConversationHistory (history );
65+
66+ // 调用AI服务
67+ ConversationOperation .ConversationResponse aiResponse = aiService .execute ("CONVERSATION_OP" , request );
68+ log .info ("AI服务调用成功: {}" , aiResponse );
69+
70+ // 添加AI回复到会话历史
71+ session .addMessage (aiResponse .getAnswer (), "assistant" );
72+
73+ // 根据响应类型处理AI回复
74+ String nodeId = "ai_" + System .currentTimeMillis ();
75+ sseCallback .accept (MessageResponse .aiAnswer ("ai_" + System .currentTimeMillis (), aiResponse .getAnswer ()));
76+ // if (aiResponse.getResponseType() == ConversationOperation.ResponseType.SELECTION) {
77+ // // 选择题类型
78+ // sseCallback.accept(MessageResponse.aiSelectionQuestion(nodeId, aiResponse.getAnswer(), aiResponse.getOptions()));
79+ // } else {
80+ // // 普通文本回复
81+ // sseCallback.accept(MessageResponse.aiQuestion(nodeId, aiResponse.getAnswer()));
82+ // }
83+
84+ } catch (Exception e ) {
85+ log .error ("AI服务调用失败: {}" , e .getMessage (), e );
86+ // 降级处理
87+ String fallbackResponse = "抱歉,我暂时无法处理您的请求,请稍后再试。" ;
88+ session .addMessage (fallbackResponse , "assistant" );
89+ String nodeId = "ai_" + System .currentTimeMillis ();
90+ sseCallback .accept (MessageResponse .aiQuestion (nodeId , fallbackResponse ));
91+ }
92+ }
93+
94+ private List <ConversationOperation .ConversationHistory > buildConversationHistory (ConversationSession session ) {
95+ List <ConversationOperation .ConversationHistory > history = new ArrayList <>();
96+
97+ // 从会话消息构建对话历史
98+ for (ConversationSession .ConversationMessage message : session .getMessages ()) {
99+ ConversationOperation .ConversationHistory historyItem = new ConversationOperation .ConversationHistory (
100+ message .getRole (),
101+ message .getContent (),
102+ message .getRole () + "_" + message .getTimestamp ().toString ()
103+ );
104+ history .add (historyItem );
105+ }
106+
107+ return history ;
108+ }
109+
110+
111+ }
0 commit comments