From a3c2a2779db80e0dc92be4ab47a82f20cef9b255 Mon Sep 17 00:00:00 2001 From: Sun Yuhan Date: Wed, 20 Aug 2025 10:48:41 +0800 Subject: [PATCH] fix: GH-4170 Fixed the issue where `SystemMessage` was not being saved to the chat memory. Signed-off-by: Sun Yuhan --- .../client/advisor/MessageChatMemoryAdvisor.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java index 1b8bbea84e9..c7ee8620b93 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/MessageChatMemoryAdvisor.java @@ -19,6 +19,8 @@ import java.util.ArrayList; import java.util.List; +import org.springframework.ai.chat.messages.SystemMessage; +import org.springframework.util.CollectionUtils; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; @@ -91,9 +93,17 @@ public ChatClientRequest before(ChatClientRequest chatClientRequest, AdvisorChai .prompt(chatClientRequest.prompt().mutate().messages(processedMessages).build()) .build(); - // 4. Add the new user message to the conversation memory. + // 4. Add user message and system message to the conversation memory: if the + // current conversation is the first round, or if the `systemMessage` has been + // updated, add both to the conversation memory. + SystemMessage systemMessage = chatClientRequest.prompt().getSystemMessage(); UserMessage userMessage = processedChatClientRequest.prompt().getUserMessage(); - this.chatMemory.add(conversationId, userMessage); + if (CollectionUtils.isEmpty(memoryMessages) || !memoryMessages.contains(systemMessage)) { + this.chatMemory.add(conversationId, List.of(systemMessage, userMessage)); + } + else { + this.chatMemory.add(conversationId, userMessage); + } return processedChatClientRequest; }