diff --git a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/pom.xml b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/pom.xml
index aeeb345a742..d6ad7ff7090 100644
--- a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/pom.xml
+++ b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/pom.xml
@@ -11,8 +11,8 @@
spring-ai-autoconfigure-model-chat-memory-cassandra
jar
- Spring AI Cassandra Chat Memory Auto Configuration
- Spring AI Cassandra Chat Memory Auto Configuration
+ Spring AI Apache Cassandra Chat Memory Auto Configuration
+ Spring AI Apache Cassandra Chat Memory Auto Configuration
https://github.com/spring-projects/spring-ai
diff --git a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/src/main/java/org/springframework/ai/model/chat/memory/cassandra/autoconfigure/CassandraChatMemoryAutoConfiguration.java b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/src/main/java/org/springframework/ai/model/chat/memory/cassandra/autoconfigure/CassandraChatMemoryAutoConfiguration.java
index 58f63d08d0d..ed36a61e2f4 100644
--- a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/src/main/java/org/springframework/ai/model/chat/memory/cassandra/autoconfigure/CassandraChatMemoryAutoConfiguration.java
+++ b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/src/main/java/org/springframework/ai/model/chat/memory/cassandra/autoconfigure/CassandraChatMemoryAutoConfiguration.java
@@ -18,8 +18,8 @@
import com.datastax.oss.driver.api.core.CqlSession;
-import org.springframework.ai.chat.memory.cassandra.CassandraChatMemory;
import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryConfig;
+import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryRepository;
import org.springframework.ai.model.chat.memory.autoconfigure.ChatMemoryAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
@@ -36,13 +36,13 @@
* @since 1.0.0
*/
@AutoConfiguration(after = CassandraAutoConfiguration.class, before = ChatMemoryAutoConfiguration.class)
-@ConditionalOnClass({ CassandraChatMemory.class, CqlSession.class })
+@ConditionalOnClass({ CassandraChatMemoryRepository.class, CqlSession.class })
@EnableConfigurationProperties(CassandraChatMemoryProperties.class)
public class CassandraChatMemoryAutoConfiguration {
@Bean
@ConditionalOnMissingBean
- public CassandraChatMemory chatMemory(CassandraChatMemoryProperties properties, CqlSession cqlSession) {
+ public CassandraChatMemoryRepository chatMemory(CassandraChatMemoryProperties properties, CqlSession cqlSession) {
var builder = CassandraChatMemoryConfig.builder().withCqlSession(cqlSession);
@@ -58,7 +58,7 @@ public CassandraChatMemory chatMemory(CassandraChatMemoryProperties properties,
builder = builder.withTimeToLive(properties.getTimeToLive());
}
- return CassandraChatMemory.create(builder.build());
+ return CassandraChatMemoryRepository.create(builder.build());
}
}
diff --git a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/src/test/java/org/springframework/ai/model/chat/memory/cassandra/autoconfigure/CassandraChatMemoryAutoConfigurationIT.java b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/src/test/java/org/springframework/ai/model/chat/memory/cassandra/autoconfigure/CassandraChatMemoryAutoConfigurationIT.java
index 8bd97965349..5139cb12d67 100644
--- a/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/src/test/java/org/springframework/ai/model/chat/memory/cassandra/autoconfigure/CassandraChatMemoryAutoConfigurationIT.java
+++ b/auto-configurations/models/chat/memory/spring-ai-autoconfigure-model-chat-memory-cassandra/src/test/java/org/springframework/ai/model/chat/memory/cassandra/autoconfigure/CassandraChatMemoryAutoConfigurationIT.java
@@ -26,7 +26,7 @@
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
-import org.springframework.ai.chat.memory.cassandra.CassandraChatMemory;
+import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryRepository;
import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.MessageType;
import org.springframework.ai.chat.messages.UserMessage;
@@ -61,30 +61,29 @@ void addAndGet() {
.withPropertyValues("spring.cassandra.localDatacenter=" + cassandraContainer.getLocalDatacenter())
.withPropertyValues("spring.ai.chat.memory.cassandra.time-to-live=" + getTimeToLive())
.run(context -> {
- CassandraChatMemory memory = context.getBean(CassandraChatMemory.class);
+ CassandraChatMemoryRepository memory = context.getBean(CassandraChatMemoryRepository.class);
String sessionId = UUIDs.timeBased().toString();
- assertThat(memory.get(sessionId, Integer.MAX_VALUE)).isEmpty();
+ assertThat(memory.findByConversationId(sessionId)).isEmpty();
- memory.add(sessionId, new UserMessage("test question"));
+ memory.saveAll(sessionId, List.of(new UserMessage("test question")));
- assertThat(memory.get(sessionId, Integer.MAX_VALUE)).hasSize(1);
- assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getMessageType())
- .isEqualTo(MessageType.USER);
- assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getText()).isEqualTo("test question");
+ assertThat(memory.findByConversationId(sessionId)).hasSize(1);
+ assertThat(memory.findByConversationId(sessionId).get(0).getMessageType()).isEqualTo(MessageType.USER);
+ assertThat(memory.findByConversationId(sessionId).get(0).getText()).isEqualTo("test question");
- memory.clear(sessionId);
- assertThat(memory.get(sessionId, Integer.MAX_VALUE)).isEmpty();
+ memory.deleteByConversationId(sessionId);
+ assertThat(memory.findByConversationId(sessionId)).isEmpty();
- memory.add(sessionId, List.of(new UserMessage("test question"), new AssistantMessage("test answer")));
+ memory.saveAll(sessionId,
+ List.of(new UserMessage("test question"), new AssistantMessage("test answer")));
- assertThat(memory.get(sessionId, Integer.MAX_VALUE)).hasSize(2);
- assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(1).getMessageType())
+ assertThat(memory.findByConversationId(sessionId)).hasSize(2);
+ assertThat(memory.findByConversationId(sessionId).get(1).getMessageType())
.isEqualTo(MessageType.ASSISTANT);
- assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(1).getText()).isEqualTo("test answer");
- assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getMessageType())
- .isEqualTo(MessageType.USER);
- assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getText()).isEqualTo("test question");
+ assertThat(memory.findByConversationId(sessionId).get(1).getText()).isEqualTo("test answer");
+ assertThat(memory.findByConversationId(sessionId).get(0).getMessageType()).isEqualTo(MessageType.USER);
+ assertThat(memory.findByConversationId(sessionId).get(0).getText()).isEqualTo("test question");
CassandraChatMemoryProperties properties = context.getBean(CassandraChatMemoryProperties.class);
assertThat(properties.getTimeToLive()).isEqualTo(getTimeToLive());
diff --git a/auto-configurations/vector-stores/spring-ai-autoconfigure-vector-store-cassandra/pom.xml b/auto-configurations/vector-stores/spring-ai-autoconfigure-vector-store-cassandra/pom.xml
index 0c5e02a0324..e86c65d1f85 100644
--- a/auto-configurations/vector-stores/spring-ai-autoconfigure-vector-store-cassandra/pom.xml
+++ b/auto-configurations/vector-stores/spring-ai-autoconfigure-vector-store-cassandra/pom.xml
@@ -27,8 +27,8 @@
spring-ai-autoconfigure-vector-store-cassandra
jar
- Spring AI Auto Configuration for Cassandra vector store
- Spring AI Auto Configuration for Cassandra vector store
+ Spring AI Auto Configuration for Apache Cassandra vector store
+ Spring AI Auto Configuration for Apache Cassandra vector store
https://github.com/spring-projects/spring-ai
diff --git a/memory/spring-ai-model-chat-memory-cassandra/pom.xml b/memory/spring-ai-model-chat-memory-cassandra/pom.xml
index 717edc5be5c..fc6c500b6c8 100644
--- a/memory/spring-ai-model-chat-memory-cassandra/pom.xml
+++ b/memory/spring-ai-model-chat-memory-cassandra/pom.xml
@@ -27,8 +27,8 @@
spring-ai-model-chat-memory-cassandra
- Spring AI Cassandra Chat Memory
- Spring AI Cassandra Chat Memory implementation
+ Spring AI Apache Cassandra Chat Memory
+ Spring AI Apache Cassandra Chat Memory implementation
https://github.com/spring-projects/spring-ai
diff --git a/memory/spring-ai-model-chat-memory-cassandra/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemory.java b/memory/spring-ai-model-chat-memory-cassandra/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemory.java
index 2b405f65327..05aaf819d51 100644
--- a/memory/spring-ai-model-chat-memory-cassandra/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemory.java
+++ b/memory/spring-ai-model-chat-memory-cassandra/src/main/java/org/springframework/ai/chat/memory/cassandra/CassandraChatMemory.java
@@ -16,60 +16,32 @@
package org.springframework.ai.chat.memory.cassandra;
-import java.time.Instant;
-import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
-import java.util.concurrent.atomic.AtomicLong;
-
-import com.datastax.oss.driver.api.core.cql.BoundStatementBuilder;
-import com.datastax.oss.driver.api.core.cql.PreparedStatement;
-import com.datastax.oss.driver.api.core.cql.Row;
-import com.datastax.oss.driver.api.querybuilder.QueryBuilder;
-import com.datastax.oss.driver.api.querybuilder.delete.Delete;
-import com.datastax.oss.driver.api.querybuilder.delete.DeleteSelection;
-import com.datastax.oss.driver.api.querybuilder.insert.InsertInto;
-import com.datastax.oss.driver.api.querybuilder.insert.RegularInsert;
-import com.datastax.oss.driver.api.querybuilder.select.Select;
-import com.datastax.oss.driver.shaded.guava.common.base.Preconditions;
import org.springframework.ai.chat.memory.ChatMemory;
-import org.springframework.ai.chat.memory.cassandra.CassandraChatMemoryConfig.SchemaColumn;
-import org.springframework.ai.chat.messages.AssistantMessage;
import org.springframework.ai.chat.messages.Message;
-import org.springframework.ai.chat.messages.UserMessage;
/**
+ * @deprecated Use CassandraChatMemoryRepository
+ *
* Create a CassandraChatMemory like
CassandraChatMemory.create(CassandraChatMemoryConfig.builder().withTimeToLive(Duration.ofDays(1)).build());
*
* For example @see org.springframework.ai.chat.memory.cassandra.CassandraChatMemory
- *
* @author Mick Semb Wever
* @since 1.0.0
*/
+@Deprecated
public final class CassandraChatMemory implements ChatMemory {
- public static final String CONVERSATION_TS = CassandraChatMemory.class.getSimpleName() + "_message_timestamp";
-
final CassandraChatMemoryConfig conf;
- private final PreparedStatement addUserStmt;
-
- private final PreparedStatement addAssistantStmt;
-
- private final PreparedStatement getStmt;
-
- private final PreparedStatement deleteStmt;
+ final CassandraChatMemoryRepository repo;
public CassandraChatMemory(CassandraChatMemoryConfig config) {
this.conf = config;
- this.conf.ensureSchemaExists();
- this.addUserStmt = prepareAddStmt(this.conf.userColumn);
- this.addAssistantStmt = prepareAddStmt(this.conf.assistantColumn);
- this.getStmt = prepareGetStatement();
- this.deleteStmt = prepareDeleteStmt();
+ repo = CassandraChatMemoryRepository.create(conf);
}
public static CassandraChatMemory create(CassandraChatMemoryConfig conf) {
@@ -78,128 +50,22 @@ public static CassandraChatMemory create(CassandraChatMemoryConfig conf) {
@Override
public void add(String conversationId, List messages) {
- final AtomicLong instantSeq = new AtomicLong(Instant.now().toEpochMilli());
- messages.forEach(msg -> {
- if (msg.getMetadata().containsKey(CONVERSATION_TS)) {
- msg.getMetadata().put(CONVERSATION_TS, Instant.ofEpochMilli(instantSeq.getAndIncrement()));
- }
- add(conversationId, msg);
- });
+ repo.saveAll(conversationId, messages);
}
@Override
public void add(String sessionId, Message msg) {
-
- Preconditions.checkArgument(
- !msg.getMetadata().containsKey(CONVERSATION_TS)
- || msg.getMetadata().get(CONVERSATION_TS) instanceof Instant,
- "messages only accept metadata '%s' entries of type Instant", CONVERSATION_TS);
-
- msg.getMetadata().putIfAbsent(CONVERSATION_TS, Instant.now());
-
- PreparedStatement stmt = getStatement(msg);
-
- List