diff --git a/auto-configurations/vector-stores/spring-ai-autoconfigure-vector-store-chroma/src/test/java/org/springframework/ai/vectorstore/chroma/autoconfigure/ChromaVectorStoreAutoConfigurationIT.java b/auto-configurations/vector-stores/spring-ai-autoconfigure-vector-store-chroma/src/test/java/org/springframework/ai/vectorstore/chroma/autoconfigure/ChromaVectorStoreAutoConfigurationIT.java index a96073bfbdf..4a3a9ec6ebd 100644 --- a/auto-configurations/vector-stores/spring-ai-autoconfigure-vector-store-chroma/src/test/java/org/springframework/ai/vectorstore/chroma/autoconfigure/ChromaVectorStoreAutoConfigurationIT.java +++ b/auto-configurations/vector-stores/spring-ai-autoconfigure-vector-store-chroma/src/test/java/org/springframework/ai/vectorstore/chroma/autoconfigure/ChromaVectorStoreAutoConfigurationIT.java @@ -1,5 +1,5 @@ /* - * Copyright 2023-2024 the original author or authors. + * Copyright 2023-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -60,6 +60,7 @@ * @author EddĂș MelĂ©ndez * @author Soby Chacko * @author Thomas Vitale + * @author Jonghoon Park */ @Testcontainers public class ChromaVectorStoreAutoConfigurationIT { @@ -182,7 +183,7 @@ public void throwExceptionOnMissingCollectionAndDisabledInitializedSchema() { .hasCauseInstanceOf(BeanCreationException.class) .hasRootCauseExactlyInstanceOf(RuntimeException.class) .hasRootCauseMessage( - "Collection TestCollection doesn't exist and won't be created as the initializeSchema is set to false.")); + "Collection TestCollection with the tenant: SpringAiTenant and the database: SpringAiDatabase doesn't exist and won't be created as the initializeSchema is set to false.")); } @Test diff --git a/memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java b/memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java index 9f7c71666db..3e4afd17bed 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-cassandra/src/main/java/org/springframework/ai/chat/memory/repository/cassandra/CassandraChatMemoryRepository.java @@ -45,6 +45,7 @@ * An implementation of {@link ChatMemoryRepository} for Apache Cassandra. * * @author Mick Semb Wever + * @author Xiaotong Fan * @since 1.0.0 */ public final class CassandraChatMemoryRepository implements ChatMemoryRepository { @@ -165,6 +166,14 @@ public void deleteByConversationId(String conversationId) { saveAll(conversationId, List.of()); } + @Override + public void deleteConversationIds() { + List conversationIds = findConversationIds(); + for (String conversationId : conversationIds) { + deleteByConversationId(conversationId); + } + } + private PreparedStatement prepareAddStmt() { RegularInsert stmt = null; InsertInto stmtStart = QueryBuilder.insertInto(this.conf.schema.keyspace(), this.conf.schema.table()); diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/HsqldbChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/HsqldbChatMemoryRepositoryDialect.java index c833e3fff4b..2f7d046bda3 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/HsqldbChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/HsqldbChatMemoryRepositoryDialect.java @@ -36,6 +36,11 @@ public String getDeleteMessagesSql() { return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; } + @Override + public String getDeleteAllMessageSql() { + return "DELETE FROM SPRING_AI_CHAT_MEMORY"; + } + @Override public String getSelectConversationIdsSql() { return "SELECT DISTINCT conversation_id FROM SPRING_AI_CHAT_MEMORY"; diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepository.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepository.java index 1f666e202ab..46cf15c371e 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepository.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepository.java @@ -53,6 +53,7 @@ * @author Linar Abzaltdinov * @author Mark Pollack * @author Yanming Zhou + * @author Xiaotong Fan * @since 1.0.0 */ public final class JdbcChatMemoryRepository implements ChatMemoryRepository { @@ -106,6 +107,12 @@ public void deleteByConversationId(String conversationId) { this.jdbcTemplate.update(this.dialect.getDeleteMessagesSql(), conversationId); } + @Override + public void deleteConversationIds() { + this.jdbcTemplate.update(this.dialect.getDeleteAllMessageSql()); + } + + public static Builder builder() { return new Builder(); } diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java index 526c0908c77..c2e649d92c2 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/JdbcChatMemoryRepositoryDialect.java @@ -45,6 +45,11 @@ public interface JdbcChatMemoryRepositoryDialect { */ String getDeleteMessagesSql(); + /** + * Returns the SQL to delete all conversation IDs. + */ + String getDeleteAllMessageSql(); + /** * Optionally, dialect can provide more advanced SQL as needed. */ diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/MysqlChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/MysqlChatMemoryRepositoryDialect.java index 045bb1f5ed2..03061ddb26a 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/MysqlChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/MysqlChatMemoryRepositoryDialect.java @@ -43,5 +43,9 @@ public String getSelectConversationIdsSql() { public String getDeleteMessagesSql() { return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; } + @Override + public String getDeleteAllMessageSql() { + return "DELETE FROM SPRING_AI_CHAT_MEMORY"; + } } diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/PostgresChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/PostgresChatMemoryRepositoryDialect.java index b22d298be6f..0b4bf37b97a 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/PostgresChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/PostgresChatMemoryRepositoryDialect.java @@ -44,4 +44,9 @@ public String getDeleteMessagesSql() { return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; } + @Override + public String getDeleteAllMessageSql() { + return "DELETE FROM SPRING_AI_CHAT_MEMORY"; + } + } diff --git a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/SqlServerChatMemoryRepositoryDialect.java b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/SqlServerChatMemoryRepositoryDialect.java index dcc477fb078..3c5954e295c 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/SqlServerChatMemoryRepositoryDialect.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-jdbc/src/main/java/org/springframework/ai/chat/memory/repository/jdbc/SqlServerChatMemoryRepositoryDialect.java @@ -44,4 +44,9 @@ public String getDeleteMessagesSql() { return "DELETE FROM SPRING_AI_CHAT_MEMORY WHERE conversation_id = ?"; } + @Override + public String getDeleteAllMessageSql() { + return "DELETE FROM SPRING_AI_CHAT_MEMORY"; + } + } diff --git a/memory/repository/spring-ai-model-chat-memory-repository-neo4j/src/main/java/org/springframework/ai/chat/memory/repository/neo4j/Neo4jChatMemoryRepository.java b/memory/repository/spring-ai-model-chat-memory-repository-neo4j/src/main/java/org/springframework/ai/chat/memory/repository/neo4j/Neo4jChatMemoryRepository.java index 21cdd80a54e..30b28d590c5 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-neo4j/src/main/java/org/springframework/ai/chat/memory/repository/neo4j/Neo4jChatMemoryRepository.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-neo4j/src/main/java/org/springframework/ai/chat/memory/repository/neo4j/Neo4jChatMemoryRepository.java @@ -45,6 +45,7 @@ * * @author Enrico Rampazzo * @author Michael J. Simons + * @author Xiaotong Fan * @since 1.0.0 */ @@ -166,6 +167,14 @@ OPTIONAL MATCH (m)-[:HAS_TOOL_CALL]->(tc:%s) } } + @Override + public void deleteConversationIds() { + List conversationIds = findConversationIds(); + for (String conversationId : conversationIds) { + deleteByConversationId(conversationId); + } + } + public Neo4jChatMemoryRepositoryConfig getConfig() { return this.config; } diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/audio/OpenAiAudioTranscriptionResponseMetadata.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/audio/OpenAiAudioTranscriptionResponseMetadata.java index 106c9d7264e..005bbb5c422 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/audio/OpenAiAudioTranscriptionResponseMetadata.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/metadata/audio/OpenAiAudioTranscriptionResponseMetadata.java @@ -38,7 +38,7 @@ public class OpenAiAudioTranscriptionResponseMetadata extends AudioTranscription }; - protected static final String AI_METADATA_STRING = "{ @type: %1$s, rateLimit: %4$s }"; + protected static final String AI_METADATA_STRING = "{ @type: %1$s, rateLimit: %2$s }"; @Nullable private RateLimit rateLimit; 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..08b8fe168a0 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 Xiaotong Fan * @since 1.0.0 */ public interface ChatMemory { @@ -61,4 +62,9 @@ default void add(String conversationId, Message message) { */ void clear(String conversationId); + /** + Clear all the chat memory. + */ + void clear(); + } diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemoryRepository.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemoryRepository.java index 350b1ebbcf7..d495b29cec2 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemoryRepository.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/ChatMemoryRepository.java @@ -24,6 +24,7 @@ * A repository for storing and retrieving chat messages. * * @author Thomas Vitale + * @author Xiaotong Fan * @since 1.0.0 */ public interface ChatMemoryRepository { @@ -40,4 +41,8 @@ public interface ChatMemoryRepository { void deleteByConversationId(String conversationId); + /** + * Deletes all the conversation IDs. + */ + void deleteConversationIds(); } diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepository.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepository.java index 0843af8ffa2..eea32aac990 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepository.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/memory/InMemoryChatMemoryRepository.java @@ -28,6 +28,7 @@ * An in-memory implementation of {@link ChatMemoryRepository}. * * @author Thomas Vitale + * @author Xiaotong Fan * @since 1.0.0 */ public final class InMemoryChatMemoryRepository implements ChatMemoryRepository { @@ -60,4 +61,9 @@ public void deleteByConversationId(String conversationId) { this.chatMemoryStore.remove(conversationId); } + @Override + public void deleteConversationIds() { + this.chatMemoryStore.clear(); + } + } 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..d12e85a3ce6 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 Xiaotong Fan * @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 void clear() { + this.chatMemoryRepository.deleteConversationIds(); + } + private List process(List memoryMessages, List newMessages) { List processedMessages = new ArrayList<>();