Chat Memory :: Spring AI Reference (original) (raw)
Spring AI offers the ChatMemoryRepository
abstraction for storing chat memory. This section describes the built-in repositories provided by Spring AI and how to use them, but you can also implement your own repository if needed.
In-Memory Repository
InMemoryChatMemoryRepository
stores messages in memory using a ConcurrentHashMap
.
By default, if no other repository is already configured, Spring AI auto-configures a ChatMemoryRepository
bean of type InMemoryChatMemoryRepository
that you can use directly in your application.
@Autowired
ChatMemoryRepository chatMemoryRepository;
If you’d rather create the InMemoryChatMemoryRepository
manually, you can do so as follows:
ChatMemoryRepository repository = new InMemoryChatMemoryRepository();
JdbcChatMemoryRepository
JdbcChatMemoryRepository
is a built-in implementation that uses JDBC to store messages in a relational database. It supports multiple databases out-of-the-box and is suitable for applications that require persistent storage of chat memory.
First, add the following dependency to your project:
- Maven
- Gradle
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-chat-memory-repository-jdbc</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-chat-memory-repository-jdbc'
}
Spring AI provides auto-configuration for the JdbcChatMemoryRepository
, that you can use directly in your application.
@Autowired
JdbcChatMemoryRepository chatMemoryRepository;
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(10)
.build();
If you’d rather create the JdbcChatMemoryRepository
manually, you can do so by providing a JdbcTemplate
instance and a JdbcChatMemoryRepositoryDialect
:
ChatMemoryRepository chatMemoryRepository = JdbcChatMemoryRepository.builder()
.jdbcTemplate(jdbcTemplate)
.dialect(new PostgresChatMemoryDialect())
.build();
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(10)
.build();
Supported Databases and Dialect Abstraction
Spring AI supports multiple relational databases via a dialect abstraction. The following databases are supported out-of-the-box:
- PostgreSQL
- MySQL / MariaDB
- SQL Server
- HSQLDB
The correct dialect can be auto-detected from the JDBC URL when using JdbcChatMemoryRepositoryDialect.from(DataSource)
. You can extend support for other databases by implementing the JdbcChatMemoryRepositoryDialect
interface.
Configuration Properties
Property | Description | Default Value |
---|---|---|
spring.ai.chat.memory.repository.jdbc.initialize-schema | Controls when to initialize the schema. Values: embedded (default), always, never. | embedded |
spring.ai.chat.memory.repository.jdbc.schema | Location of the schema script to use for initialization. Supports classpath: URLs and platform placeholders. | classpath:org/springframework/ai/chat/memory/repository/jdbc/schema-@@platform@@.sql |
spring.ai.chat.memory.repository.jdbc.platform | Platform to use in initialization scripts if the @@platform@@ placeholder is used. | auto-detected |
Schema Initialization
The auto-configuration will automatically create the SPRING_AI_CHAT_MEMORY
table on startup, using a vendor-specific SQL script for your database. By default, schema initialization runs only for embedded databases (H2, HSQL, Derby, etc.).
You can control schema initialization using the spring.ai.chat.memory.repository.jdbc.initialize-schema
property:
spring.ai.chat.memory.repository.jdbc.initialize-schema=embedded # Only for embedded DBs (default)
spring.ai.chat.memory.repository.jdbc.initialize-schema=always # Always initialize
spring.ai.chat.memory.repository.jdbc.initialize-schema=never # Never initialize (useful with Flyway/Liquibase)
To override the schema script location, use:
spring.ai.chat.memory.repository.jdbc.schema=classpath:/custom/path/schema-mysql.sql
Extending Dialects
To add support for a new database, implement the JdbcChatMemoryRepositoryDialect
interface and provide SQL for selecting, inserting, and deleting messages. You can then pass your custom dialect to the repository builder.
ChatMemoryRepository chatMemoryRepository = JdbcChatMemoryRepository.builder()
.jdbcTemplate(jdbcTemplate)
.dialect(new MyCustomDbDialect())
.build();
CassandraChatMemoryRepository
CassandraChatMemoryRepository
uses Apache Cassandra to store messages. It is suitable for applications that require persistent storage of chat memory, especially for availability, durability, scale, and when taking advantage of time-to-live (TTL) feature.
CassandraChatMemoryRepository
has a time-series schema, keeping record of all past chat windows, valuable for governance and auditing. Setting time-to-live to some value, for example three years, is recommended.
To use CassandraChatMemoryRepository
first, add the dependency to your project:
- Maven
- Gradle
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-chat-memory-repository-cassandra</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-chat-memory-repository-cassandra'
}
Spring AI provides auto-configuration for the CassandraChatMemoryRepository
that you can use directly in your application.
@Autowired
CassandraChatMemoryRepository chatMemoryRepository;
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(10)
.build();
If you’d rather create the CassandraChatMemoryRepository
manually, you can do so by providing a CassandraChatMemoryRepositoryConfig
instance:
ChatMemoryRepository chatMemoryRepository = CassandraChatMemoryRepository
.create(CassandraChatMemoryConfig.builder().withCqlSession(cqlSession));
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(10)
.build();
Configuration Properties
Property | Description | Default Value |
---|---|---|
spring.cassandra.contactPoints | Host(s) to initiate cluster discovery | 127.0.0.1 |
spring.cassandra.port | Cassandra native protocol port to connect to | 9042 |
spring.cassandra.localDatacenter | Cassandra datacenter to connect to | datacenter1 |
spring.ai.chat.memory.cassandra.time-to-live | Time to live (TTL) for messages written in Cassandra | |
spring.ai.chat.memory.cassandra.keyspace | Cassandra keyspace | springframework |
spring.ai.chat.memory.cassandra.messages-column | Cassandra column name for messages | springframework |
spring.ai.chat.memory.cassandra.table | Cassandra table | ai_chat_memory |
spring.ai.chat.memory.cassandra.initialize-schema | Whether to initialize the schema on startup. | true |
Schema Initialization
The auto-configuration will automatically create the ai_chat_memory
table.
You can disable the schema initialization by setting the property spring.ai.chat.memory.repository.cassandra.initialize-schema
to false
.
Neo4j ChatMemoryRepository
Neo4jChatMemoryRepository
is a built-in implementation that uses Neo4j to store chat messages as nodes and relationships in a property graph database. It is suitable for applications that want to leverage Neo4j’s graph capabilities for chat memory persistence.
First, add the following dependency to your project:
- Maven
- Gradle
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-chat-memory-repository-neo4j</artifactId>
</dependency>
dependencies {
implementation 'org.springframework.ai:spring-ai-starter-model-chat-memory-repository-neo4j'
}
Spring AI provides auto-configuration for the Neo4jChatMemoryRepository
, which you can use directly in your application.
@Autowired
Neo4jChatMemoryRepository chatMemoryRepository;
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(10)
.build();
If you’d rather create the Neo4jChatMemoryRepository
manually, you can do so by providing a Neo4j Driver
instance:
ChatMemoryRepository chatMemoryRepository = Neo4jChatMemoryRepository.builder()
.driver(driver)
.build();
ChatMemory chatMemory = MessageWindowChatMemory.builder()
.chatMemoryRepository(chatMemoryRepository)
.maxMessages(10)
.build();
Configuration Properties
Property | Description | Default Value |
---|---|---|
spring.ai.chat.memory.repository.neo4j.sessionLabel | The label for the nodes that store conversation sessions | Session |
spring.ai.chat.memory.repository.neo4j.messageLabel | The label for the nodes that store messages | Message |
spring.ai.chat.memory.repository.neo4j.toolCallLabel | The label for nodes that store tool calls (e.g. in Assistant Messages) | ToolCall |
spring.ai.chat.memory.repository.neo4j.metadataLabel | The label for nodes that store message metadata | Metadata |
spring.ai.chat.memory.repository.neo4j.toolResponseLabel | The label for the nodes that store tool responses | ToolResponse |
spring.ai.chat.memory.repository.neo4j.mediaLabel | The label for the nodes that store media associated with a message | Media |
Index Initialization
The Neo4j repository will automatically ensure that indexes are created for conversation IDs and message indices to optimize performance. If you use custom labels, indexes will be created for those labels as well. No schema initialization is required, but you should ensure your Neo4j instance is accessible to your application.