44import com .fasterxml .jackson .databind .ObjectMapper ;
55import com .mbtips .clova .client .ClovaApiFeignClient ;
66import com .mbtips .clova .dto .ChatRequest ;
7- import com .mbtips .clova .dto .ClovaApiResponse ;
8- import com .mbtips .common .mbtiinfo .MbtiTraits ;
9- import com .mbtips .common .mbtiinfo .MbtiType ;
107import com .mbtips .common .provider .ClovaApiKeyProvider ;
8+ import com .mbtips .common .provider .GptApiKeyProvider ;
119import com .mbtips .conversation .interfaces .ConversationRepository ;
1210import com .mbtips .domain .conversation .service .ConversationService ;
1311import com .mbtips .domain .converstation .Conversation ;
1614import com .mbtips .domain .message .dto .response .GetMessageResponseDto ;
1715import com .mbtips .domain .user .User ;
1816import com .mbtips .domain .virtualfriend .VirtualFriend ;
17+ import com .mbtips .gpt .client .GptApiFeignClient ;
18+ import com .mbtips .gpt .dto .GptChatRequest ;
19+ import com .mbtips .gpt .dto .GptResponse ;
1920import com .mbtips .message .application .service .MessageService ;
2021import lombok .RequiredArgsConstructor ;
2122import lombok .extern .slf4j .Slf4j ;
2223import org .springframework .stereotype .Service ;
2324import org .springframework .transaction .annotation .Transactional ;
2425
25- import java .util .*;
26+ import java .util .Arrays ;
27+ import java .util .Collections ;
28+ import java .util .List ;
29+ import java .util .Map ;
2630
2731@ Service
2832@ RequiredArgsConstructor
@@ -36,56 +40,60 @@ public class MessageManager {
3640 private final ClovaApiKeyProvider clovaApiKeyProvider ;
3741 private final ConversationRepository conversationRepository ;
3842 private final ObjectMapper objectMapper ;
43+ private final GptApiFeignClient gptApiFeignClient ;
44+ private final GptApiKeyProvider gptApiKeyProvider ;
3945
4046 @ Transactional
41- public String sendMessage (User user , CreateMessageRequestDto createMessageRequestDto ) {
42- Conversation conversation = conversationService .findById (createMessageRequestDto .conversationId ());
43- List <GetMessageResponseDto > messages = messageService .getRecentMessagesOfConversationId (conversation .getConversationId ());
44- Collections .reverse (messages );
45- //log.debug("<<<service start >>> userInfo : {}", user);
46- Message requestMessage = Message .builder ()
47- .user (user )
48- .conversation (conversation )
49- // .virtualFriend(conversation.getVirtualFriend())
50- .messageContent (createMessageRequestDto .messageContent ())
51- .build ();
52- log .debug ("message : {}" , requestMessage .toString ());
53- messageService .saveMessage (requestMessage );
54-
47+ public String sendMessage (User user , CreateMessageRequestDto dto ) {
48+ Conversation conversation = conversationService .findById (dto .conversationId ());
49+ List <GetMessageResponseDto > recentMessages = messageService .getRecentMessagesOfConversationId (conversation .getConversationId ());
5550
56- String prompt = makePrompt (createMessageRequestDto .conversationId ());
51+ // 사용자 메시지 저장
52+ Message userMessage = Message .createMessage (user , conversation , dto .messageContent ());
53+ messageService .saveMessage (userMessage );
5754
58- String recentMessagesPrompt = makeRecentMessageString (messages );
59- prompt += recentMessagesPrompt ;
60- prompt = prompt + " 이제 대화를 시작해보자!" ;
61- log .debug ("prompt : {} " , prompt );
55+ // 프롬프트 생성
56+ String prompt = buildFullPrompt (conversation , recentMessages , dto .messageContent ());
57+ log .debug ("Final Prompt: {}" , prompt );
6258
63- String responseContent = messageRequest (prompt + " " + createMessageRequestDto .messageContent ());
64- log .debug ("responseMessage : {} " , responseContent );
59+ // 메시지 응답 요청
60+ String responseContent = messageRequest (prompt );
61+ log .debug ("Response Message: {}" , responseContent );
6562
6663
67- Message responseMessage = Message .builder ()
68- .conversation (conversation )
69- .virtualFriend (conversation .getVirtualFriend ())
70- .messageContent (responseContent )
71- .build ();
72-
64+ Message responseMessage = Message .createMessage (conversation , responseContent );
7365 messageService .saveMessage (responseMessage );
66+
7467 return responseContent ;
7568 }
7669
70+ private String buildFullPrompt (Conversation conversation , List <GetMessageResponseDto > recentMessages , String userMessage ) {
71+ String basePrompt = makePrompt (conversation .getConversationId ());
72+ String recentMessageSummary = makeRecentMessageString (recentMessages );
73+
74+ log .debug ("Base Prompt: {}" , basePrompt );
75+ log .debug ("Recent Messages: {}" , recentMessageSummary );
76+
77+ String mbtiStyle = conversation .getVirtualFriend ().getMbti ();
78+ String suffix = " 이제 대화를 시작해보자!" ;
79+ String instruction = "이제 들어온 톡은 아래와 같은데 " + mbtiStyle + "스타일 친구 같이 무례하지 않은 반말로 대답해봐" ;
80+
81+ return basePrompt + recentMessageSummary + suffix + " " + instruction + " " + userMessage ;
82+ }
83+
7784 private String makeRecentMessageString (List <GetMessageResponseDto > messages ) {
85+ Collections .reverse (messages );
7886 StringBuilder messageBuilder = new StringBuilder ();
79- messageBuilder .append (" 지금까지의 대화내용은 다음과 같아. B가 지금까지 너의 대답이야. " );
87+ messageBuilder .append (" 지금까지 너와 상대방은 이런 대화를 해왔어 " );
8088 int idx = messages .size () - 6 ;
8189 if (idx < 0 ) idx = 0 ;
8290 for (int i = idx ; i < messages .size (); i ++){
8391 if (messages .get (i ).userId () != null ) {
84- messageBuilder .append ("A : " );
92+ messageBuilder .append (" 상대방 : " );
8593 messageBuilder .append (messages .get (i ).messageContent ());
8694 }
8795 if (messages .get (i ).virtualFriendId () != null ) {
88- messageBuilder .append ("B : " );
96+ messageBuilder .append (" 너 : " );
8997 messageBuilder .append (messages .get (i ).messageContent ());
9098 }
9199 if (i != messages .size () -1 ) messageBuilder .append (", " );
@@ -102,14 +110,13 @@ private String makePrompt(Long conversationId) {
102110 String mbti = virtualFriend .getMbti ();
103111// MbtiType mbtiType = MbtiType.valueOf(mbti);
104112// String result = MbtiTraits.getTrait(mbtiType);
105- String result = "너는 이제부터 MBTI중 " + mbti + "에 해당하는 사람이야. 답변은 10~30자 내외로 대답해줘." ;
106- // 너는 이제부터 MBTI 중 ENFP에 해당하는 사람이야. 답변은 10~30자 내외로 대답해줘.
113+ String result = "지금부터 너는 " + mbti + "스타일의 친구야. 너의 페르소나에 몰입해서 상대방과 대화해야 해." ;
107114
108115 StringBuilder temp = new StringBuilder ();
109- if (virtualFriend .getName () != null ) temp .append (" 너의 이름은 " + virtualFriend .getName () +"이야. 명심해! " );
110- if (virtualFriend .getAge () != 0 ) temp .append (" 너의 나이는 " + virtualFriend .getAge () + "이야. " );
111- if (virtualFriend .getGender () != null ) temp .append (" 너의 성별은 " + virtualFriend .getGender () + "이야. " );
112- if (virtualFriend .getRelationship () != null ) temp .append ("너와 나의 관계는 " + virtualFriend .getRelationship () + "이야" );
116+ if (virtualFriend .getName () != null ) temp .append (" 너의 이름은 " + virtualFriend .getName () +"야. " );
117+ if (virtualFriend .getAge () != 0 ) temp .append (" 너의 나잇대는 " + virtualFriend .getAge () + "야. " );
118+ if (virtualFriend .getGender () != null ) temp .append (" 너의 성별은 " + virtualFriend .getGender () + "이야." );
119+ // if(virtualFriend.getRelationship() != null) temp.append(" 너와 나의 관계는 " + virtualFriend.getRelationship() + "이야");
113120
114121 result += temp .toString ();
115122 return result ;
@@ -119,21 +126,48 @@ private String makePrompt(Long conversationId) {
119126 public String messageRequest (String content ){
120127 com .mbtips .clova .dto .Message message = new com .mbtips .clova .dto .Message ("user" , content );
121128 ChatRequest chatRequest = new ChatRequest (Arrays .asList (message ), MAX_TOKEN_VALUE );
122- String apiResult = clovaApiFeignClient .getResponse (
123- "Bearer " + clovaApiKeyProvider .apiKey (),
124- UUID .randomUUID ().toString (),
125- chatRequest
129+ // String apiResult = clovaApiFeignClient.getResponse(
130+ // "Bearer " + clovaApiKeyProvider.apiKey(),
131+ // UUID.randomUUID().toString(),
132+ // chatRequest
133+ // );
134+ // List<com.mbtips.clova.dto.Message> messages = List.of(
135+ // new com.mbtips.clova.dto.Message("user", "Write a poem about coffee.")
136+ // );
137+ List <com .mbtips .clova .dto .Message > messages = List .of (
138+ new com .mbtips .clova .dto .Message ("user" , content )
139+ );
140+ String response = gptApiFeignClient .getResponse (
141+ "Bearer " + gptApiKeyProvider .apiKey (),
142+ GptChatRequest .builder ()
143+ .model ("gpt-4o-mini" )
144+ .messages (messages )
145+ .temperature (0.7 )
146+ .max_tokens (100 )
147+ .build ()
126148 );
127149
128- log .debug ("clovaResponse : {}" , apiResult );
129150 String resultResponse = "" ;
130151 try {
131- ClovaApiResponse clovaApiResponse = objectMapper .readValue (apiResult , ClovaApiResponse .class );
132- resultResponse = clovaApiResponse .getResult ().getMessage ().getContent ();
152+ ObjectMapper objectMapper = new ObjectMapper ();
153+ GptResponse gptResponse = objectMapper .readValue (response , GptResponse .class );
154+ resultResponse = gptResponse .choices .get (0 ).message .content ;
133155 } catch (JsonProcessingException e ) {
134- throw new RuntimeException (e );
156+ throw new RuntimeException ("Failed to parse GPT response" , e );
135157 }
158+ log .debug ("gptResposne : {}" , resultResponse );
136159 return resultResponse ;
137160 }
138161
162+ public List <Map <String , Object >> modelList () {
163+ log .debug ("[+] 모델 리스트를 조회합니다." );
164+ List <Map <String , Object >> resultList = null ;
165+
166+ String response = gptApiFeignClient .getModelList (
167+ "Bearer " + gptApiKeyProvider .apiKey ()
168+ );
169+ System .out .println (resultList );
170+ return resultList ;
171+ }
172+
139173}
0 commit comments