From 0f9d7878e206f9451f7176c951e56839adc101bd Mon Sep 17 00:00:00 2001 From: Sun Yuhan Date: Wed, 24 Sep 2025 17:21:39 +0800 Subject: [PATCH] feat: GH-4433 Add a method to `ChatMemory` for retrieving all conversation IDs, and add corresponding unit tests. Signed-off-by: Sun Yuhan --- .../ai/chat/memory/ChatMemory.java | 7 +++ .../chat/memory/MessageWindowChatMemory.java | 6 +++ .../memory/MessageWindowChatMemoryTests.java | 46 +++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemory.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemory.java index f13a971e56f..7e533a29a2e 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemory.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemory.java @@ -26,6 +26,7 @@ * * @author Christian Tzolov * @author Thomas Vitale + * @author Sun Yuhan * @since 1.0.0 */ public interface ChatMemory { @@ -61,4 +62,10 @@ default void add(String conversationId, Message message) { */ void clear(String conversationId); + /** + * Get all conversation IDs + * @return All conversation IDs + */ + List getConversations(); + } diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/MessageWindowChatMemory.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/MessageWindowChatMemory.java index 9c56c9d50bf..4b978bdcdfb 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/MessageWindowChatMemory.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/MessageWindowChatMemory.java @@ -37,6 +37,7 @@ * * @author Thomas Vitale * @author Ilayaperumal Gopinathan + * @author Sun Yuhan * @since 1.0.0 */ public final class MessageWindowChatMemory implements ChatMemory { @@ -77,6 +78,11 @@ public void clear(String conversationId) { this.chatMemoryRepository.deleteByConversationId(conversationId); } + @Override + public List getConversations() { + return this.chatMemoryRepository.findConversationIds(); + } + private List process(List memoryMessages, List newMessages) { List processedMessages = new ArrayList<>(); diff --git a/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/MessageWindowChatMemoryTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/MessageWindowChatMemoryTests.java index caca4fca63b..41dea50747b 100644 --- a/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/MessageWindowChatMemoryTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/memory/MessageWindowChatMemoryTests.java @@ -292,4 +292,50 @@ void mixedMessagesWithLimitEqualToSystemMessageCount() { new SystemMessage("System instruction 2")); } + @Test + void getConversationsReturnsAllConversationIds() { + MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder().build(); + + String conversationId1 = UUID.randomUUID().toString(); + String conversationId2 = UUID.randomUUID().toString(); + String conversationId3 = UUID.randomUUID().toString(); + + chatMemory.add(conversationId1, new UserMessage("Hello from conversation 1")); + chatMemory.add(conversationId2, new UserMessage("Hello from conversation 2")); + chatMemory.add(conversationId3, new UserMessage("Hello from conversation 3")); + + List conversations = chatMemory.getConversations(); + + assertThat(conversations).contains(conversationId1, conversationId2, conversationId3); + assertThat(conversations).hasSize(3); + } + + @Test + void getConversationsWithCustomRepository() { + InMemoryChatMemoryRepository customRepository = new InMemoryChatMemoryRepository(); + MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder() + .chatMemoryRepository(customRepository) + .build(); + + String conversationId1 = UUID.randomUUID().toString(); + String conversationId2 = UUID.randomUUID().toString(); + + chatMemory.add(conversationId1, new UserMessage("Message in conversation 1")); + chatMemory.add(conversationId2, new UserMessage("Message in conversation 2")); + + List conversations = chatMemory.getConversations(); + + assertThat(conversations).contains(conversationId1, conversationId2); + assertThat(conversations).hasSize(2); + } + + @Test + void getConversationsReturnsEmptyListWhenNoConversations() { + MessageWindowChatMemory chatMemory = MessageWindowChatMemory.builder().build(); + + List conversations = chatMemory.getConversations(); + + assertThat(conversations).isEmpty(); + } + }