Skip to content

Commit 909ff5a

Browse files
author
qing
committed
Merge remote-tracking branch 'origin/main'
2 parents 0251f09 + 0a60357 commit 909ff5a

File tree

89 files changed

+6091
-368
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

89 files changed

+6091
-368
lines changed

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/redis/JedisRedisChatMemoryConnectionAutoConfiguration.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import com.alibaba.cloud.ai.memory.redis.JedisRedisChatMemoryRepository;
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
23+
import org.springframework.beans.factory.ObjectProvider;
2324
import org.springframework.boot.autoconfigure.AutoConfiguration;
2425
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2627
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2728
import org.springframework.boot.context.properties.EnableConfigurationProperties;
29+
import org.springframework.boot.ssl.SslBundles;
2830
import org.springframework.context.annotation.Bean;
2931
import redis.clients.jedis.Jedis;
3032

@@ -44,8 +46,8 @@ public class JedisRedisChatMemoryConnectionAutoConfiguration
4446
private static final Logger logger = LoggerFactory.getLogger(JedisRedisChatMemoryConnectionAutoConfiguration.class);
4547

4648
public JedisRedisChatMemoryConnectionAutoConfiguration(RedisChatMemoryProperties properties,
47-
RedisChatMemoryConnectionDetails connectionDetails) {
48-
super(properties, connectionDetails);
49+
RedisChatMemoryConnectionDetails connectionDetails, ObjectProvider<SslBundles> sslBundles) {
50+
super(properties, connectionDetails, sslBundles);
4951
}
5052

5153
@Override
@@ -65,6 +67,9 @@ protected JedisRedisChatMemoryRepository createStandaloneChatMemoryRepository(
6567
.username(standaloneConfiguration.username())
6668
.password(standaloneConfiguration.password())
6769
.timeout(standaloneConfiguration.timeout())
70+
.sslBundles(standaloneConfiguration.sslBundles())
71+
.useSsl(standaloneConfiguration.ssl().isEnabled())
72+
.bundle(standaloneConfiguration.ssl().getBundle())
6873
.build();
6974
}
7075

@@ -77,6 +82,9 @@ protected JedisRedisChatMemoryRepository createClusterChatMemoryRepository(
7782
.username(clusterConfiguration.username())
7883
.password(clusterConfiguration.password())
7984
.timeout(clusterConfiguration.timeout())
85+
.sslBundles(clusterConfiguration.sslBundles())
86+
.useSsl(clusterConfiguration.ssl().isEnabled())
87+
.bundle(clusterConfiguration.ssl().getBundle())
8088
.build();
8189
}
8290

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/redis/LettuceRedisChatMemoryConnectionAutoConfiguration.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import io.lettuce.core.RedisClient;
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
23+
import org.springframework.beans.factory.ObjectProvider;
2324
import org.springframework.boot.autoconfigure.AutoConfiguration;
2425
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2627
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2728
import org.springframework.boot.context.properties.EnableConfigurationProperties;
29+
import org.springframework.boot.ssl.SslBundles;
2830
import org.springframework.context.annotation.Bean;
2931

3032
/**
@@ -44,8 +46,8 @@ public class LettuceRedisChatMemoryConnectionAutoConfiguration
4446
.getLogger(LettuceRedisChatMemoryConnectionAutoConfiguration.class);
4547

4648
public LettuceRedisChatMemoryConnectionAutoConfiguration(RedisChatMemoryProperties properties,
47-
RedisChatMemoryConnectionDetails connectionDetails) {
48-
super(properties, connectionDetails);
49+
RedisChatMemoryConnectionDetails connectionDetails, ObjectProvider<SslBundles> sslBundles) {
50+
super(properties, connectionDetails, sslBundles);
4951
}
5052

5153
@Override
@@ -65,6 +67,9 @@ protected LettuceRedisChatMemoryRepository createStandaloneChatMemoryRepository(
6567
.username(standaloneConfiguration.username())
6668
.password(standaloneConfiguration.password())
6769
.timeout(standaloneConfiguration.timeout())
70+
.sslBundles(standaloneConfiguration.sslBundles())
71+
.useSsl(standaloneConfiguration.ssl().isEnabled())
72+
.bundle(standaloneConfiguration.ssl().getBundle())
6873
.build();
6974
}
7075

@@ -77,6 +82,9 @@ protected LettuceRedisChatMemoryRepository createClusterChatMemoryRepository(
7782
.username(clusterConfiguration.username())
7883
.password(clusterConfiguration.password())
7984
.timeout(clusterConfiguration.timeout())
85+
.sslBundles(clusterConfiguration.sslBundles())
86+
.useSsl(clusterConfiguration.ssl().isEnabled())
87+
.bundle(clusterConfiguration.ssl().getBundle())
8088
.build();
8189
}
8290

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/redis/RedisChatMemoryClusterConfiguration.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package com.alibaba.cloud.ai.autoconfigure.memory.redis;
1717

18+
import org.springframework.boot.ssl.SslBundles;
19+
1820
import java.util.List;
1921

2022
/**
@@ -24,6 +26,6 @@
2426
* @since 2025/7/30 21:33
2527
*/
2628
public record RedisChatMemoryClusterConfiguration(List<String> nodeAddresses, String username, String password,
27-
int timeout) {
29+
int timeout, RedisChatMemoryProperties.Ssl ssl, SslBundles sslBundles) {
2830

2931
}

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/redis/RedisChatMemoryConnectionAutoConfiguration.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package com.alibaba.cloud.ai.autoconfigure.memory.redis;
1717

1818
import org.springframework.ai.chat.memory.ChatMemoryRepository;
19+
import org.springframework.beans.factory.ObjectProvider;
20+
import org.springframework.boot.ssl.SslBundles;
1921
import org.springframework.util.CollectionUtils;
2022

2123
import java.util.ArrayList;
@@ -33,10 +35,13 @@ public abstract class RedisChatMemoryConnectionAutoConfiguration<T extends ChatM
3335

3436
private final RedisChatMemoryConnectionDetails connectionDetails;
3537

38+
private final SslBundles sslBundles;
39+
3640
public RedisChatMemoryConnectionAutoConfiguration(RedisChatMemoryProperties properties,
37-
RedisChatMemoryConnectionDetails connectionDetails) {
41+
RedisChatMemoryConnectionDetails connectionDetails, ObjectProvider<SslBundles> sslBundles) {
3842
this.properties = properties;
3943
this.connectionDetails = connectionDetails;
44+
this.sslBundles = sslBundles.getIfAvailable();
4045
}
4146

4247
/**
@@ -102,7 +107,8 @@ protected RedisChatMemoryProperties.Mode getRedisChatMemoryMode() {
102107
protected final RedisChatMemoryStandaloneConfiguration getStandaloneConfiguration() {
103108
RedisMemoryConnectionDetails.Standalone standalone = connectionDetails.getStandalone();
104109
return new RedisChatMemoryStandaloneConfiguration(standalone.getHost(), standalone.getPort(),
105-
connectionDetails.getUsername(), connectionDetails.getPassword(), properties.getTimeout());
110+
connectionDetails.getUsername(), connectionDetails.getPassword(), properties.getTimeout(),
111+
properties.getSsl(), sslBundles);
106112
}
107113

108114
/**
@@ -115,7 +121,7 @@ protected final RedisChatMemoryClusterConfiguration getClusterConfiguration() {
115121
}
116122
List<String> nodes = getNodes(connectionDetails.getCluster());
117123
return new RedisChatMemoryClusterConfiguration(nodes, connectionDetails.getUsername(),
118-
connectionDetails.getPassword(), properties.getTimeout());
124+
connectionDetails.getPassword(), properties.getTimeout(), properties.getSsl(), sslBundles);
119125
}
120126

121127
/**

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/redis/RedisChatMemoryProperties.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@ public class RedisChatMemoryProperties {
6969
*/
7070
private Mode mode;
7171

72+
/**
73+
* SSL properties.
74+
*/
75+
private final Ssl ssl = new Ssl();
76+
7277
public String getHost() {
7378
return host;
7479
}
@@ -133,6 +138,10 @@ public void setMode(Mode mode) {
133138
this.mode = mode;
134139
}
135140

141+
public Ssl getSsl() {
142+
return ssl;
143+
}
144+
136145
/**
137146
* Type of Redis client to use.
138147
*/
@@ -193,4 +202,35 @@ public enum Mode {
193202

194203
}
195204

205+
public static class Ssl {
206+
207+
/**
208+
* Whether to enable SSL support. Enabled automatically if "bundle" is provided
209+
* unless specified otherwise.
210+
*/
211+
private Boolean enabled;
212+
213+
/**
214+
* SSL bundle name based on spring.ssl configuration.
215+
*/
216+
private String bundle;
217+
218+
public boolean isEnabled() {
219+
return (this.enabled != null) ? this.enabled : this.bundle != null;
220+
}
221+
222+
public void setEnabled(boolean enabled) {
223+
this.enabled = enabled;
224+
}
225+
226+
public String getBundle() {
227+
return this.bundle;
228+
}
229+
230+
public void setBundle(String bundle) {
231+
this.bundle = bundle;
232+
}
233+
234+
}
235+
196236
}

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/redis/RedisChatMemoryStandaloneConfiguration.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515
*/
1616
package com.alibaba.cloud.ai.autoconfigure.memory.redis;
1717

18+
import org.springframework.boot.ssl.SslBundles;
19+
1820
/**
1921
* Configuration for Redis Memory using Redis Standalone
2022
*
2123
* @author benym
2224
* @since 2025/7/30 21:32
2325
*/
2426
public record RedisChatMemoryStandaloneConfiguration(String hostName, int port, String username, String password,
25-
int timeout) {
27+
int timeout, RedisChatMemoryProperties.Ssl ssl, SslBundles sslBundles) {
2628

2729
}

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/redis/RedissonRedisChatMemoryConnectionAutoConfiguration.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import org.redisson.api.RedissonClient;
2121
import org.slf4j.Logger;
2222
import org.slf4j.LoggerFactory;
23+
import org.springframework.beans.factory.ObjectProvider;
2324
import org.springframework.boot.autoconfigure.AutoConfiguration;
2425
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2526
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2627
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
2728
import org.springframework.boot.context.properties.EnableConfigurationProperties;
29+
import org.springframework.boot.ssl.SslBundles;
2830
import org.springframework.context.annotation.Bean;
2931

3032
/**
@@ -44,8 +46,8 @@ public class RedissonRedisChatMemoryConnectionAutoConfiguration
4446
.getLogger(RedissonRedisChatMemoryConnectionAutoConfiguration.class);
4547

4648
public RedissonRedisChatMemoryConnectionAutoConfiguration(RedisChatMemoryProperties properties,
47-
RedisChatMemoryConnectionDetails connectionDetails) {
48-
super(properties, connectionDetails);
49+
RedisChatMemoryConnectionDetails connectionDetails, ObjectProvider<SslBundles> sslBundles) {
50+
super(properties, connectionDetails, sslBundles);
4951
}
5052

5153
@Override
@@ -65,6 +67,9 @@ protected RedissonRedisChatMemoryRepository createStandaloneChatMemoryRepository
6567
.username(standaloneConfiguration.username())
6668
.password(standaloneConfiguration.password())
6769
.timeout(standaloneConfiguration.timeout())
70+
.sslBundles(standaloneConfiguration.sslBundles())
71+
.useSsl(standaloneConfiguration.ssl().isEnabled())
72+
.bundle(standaloneConfiguration.ssl().getBundle())
6873
.build();
6974
}
7075

@@ -77,6 +82,9 @@ protected RedissonRedisChatMemoryRepository createClusterChatMemoryRepository(
7782
.username(clusterConfiguration.username())
7883
.password(clusterConfiguration.password())
7984
.timeout(clusterConfiguration.timeout())
85+
.sslBundles(clusterConfiguration.sslBundles())
86+
.useSsl(clusterConfiguration.ssl().isEnabled())
87+
.bundle(clusterConfiguration.ssl().getBundle())
8088
.build();
8189
}
8290

community/memories/spring-ai-alibaba-starter-memory-redis/README.md

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,33 @@ spring:
8080
nodes: localhost:6379,localhost:6380,localhost:6381
8181
```
8282

83+
### 配置SSL
84+
```yaml
85+
# 基础spring.ssl配置(可选pem或jks配置),参考spring.ssl原始配置
86+
spring:
87+
ssl:
88+
bundle:
89+
pem:
90+
myPemBundle:
91+
keystore:
92+
certificate: "classpath:cert.pem"
93+
private-key: "classpath:key.pem"
94+
truststore:
95+
certificate: "classpath:cert.pem"
96+
ai:
97+
memory:
98+
redis:
99+
# Supports standalone and cluster
100+
mode: standalone
101+
# Supports jedis, lettuce, and redisson
102+
client-type: lettuce
103+
host: localhost
104+
port: 6379
105+
ssl:
106+
enabled: true
107+
bundle: myPemBundle
108+
```
109+
83110
### 完全配置-单机
84111
```yaml
85112
spring:
@@ -122,8 +149,8 @@ public class CustomJedisRedisChatMemoryAutoConfiguration extends RedisChatMemory
122149
123150
private static final Logger logger = LoggerFactory.getLogger(CustomJedisRedisChatMemoryAutoConfiguration.class);
124151
125-
public CustomJedisRedisChatMemoryAutoConfiguration(RedisChatMemoryProperties properties, RedisChatMemoryConnectionDetails connectionDetails) {
126-
super(properties, connectionDetails);
152+
public CustomJedisRedisChatMemoryAutoConfiguration(RedisChatMemoryProperties properties, RedisChatMemoryConnectionDetails connectionDetails, ObjectProvider<SslBundles> sslBundles) {
153+
super(properties, connectionDetails, sslBundles);
127154
}
128155
129156
@Bean
@@ -140,6 +167,9 @@ public class CustomJedisRedisChatMemoryAutoConfiguration extends RedisChatMemory
140167
.username(standaloneConfiguration.username())
141168
.password(standaloneConfiguration.password())
142169
.timeout(standaloneConfiguration.timeout())
170+
.sslBundles(standaloneConfiguration.sslBundles())
171+
.useSsl(standaloneConfiguration.ssl().isEnabled())
172+
.bundle(standaloneConfiguration.ssl().getBundle())
143173
// using your JedisPoolConfig here
144174
.poolConfig(new JedisPoolConfig())
145175
.build();
@@ -153,6 +183,9 @@ public class CustomJedisRedisChatMemoryAutoConfiguration extends RedisChatMemory
153183
.username(clusterConfiguration.username())
154184
.password(clusterConfiguration.password())
155185
.timeout(clusterConfiguration.timeout())
186+
.sslBundles(clusterConfiguration.sslBundles())
187+
.useSsl(clusterConfiguration.ssl().isEnabled())
188+
.bundle(clusterConfiguration.ssl().getBundle())
156189
// using your JedisPoolConfig here
157190
.poolConfig(new JedisPoolConfig())
158191
.build();
@@ -176,8 +209,8 @@ public class CustomLettuceRedisChatMemoryAutoConfiguration extends RedisChatMemo
176209
177210
private static final Logger logger = LoggerFactory.getLogger(CustomLettuceRedisChatMemoryAutoConfiguration.class);
178211
179-
public CustomLettuceRedisChatMemoryAutoConfiguration(RedisChatMemoryProperties properties, RedisChatMemoryConnectionDetails connectionDetails) {
180-
super(properties, connectionDetails);
212+
public CustomLettuceRedisChatMemoryAutoConfiguration(RedisChatMemoryProperties properties, RedisChatMemoryConnectionDetails connectionDetails, ObjectProvider<SslBundles> sslBundles) {
213+
super(properties, connectionDetails, sslBundles);
181214
}
182215
183216
@Override
@@ -195,6 +228,9 @@ public class CustomLettuceRedisChatMemoryAutoConfiguration extends RedisChatMemo
195228
.username(standaloneConfiguration.username())
196229
.password(standaloneConfiguration.password())
197230
.timeout(standaloneConfiguration.timeout())
231+
.sslBundles(standaloneConfiguration.sslBundles())
232+
.useSsl(standaloneConfiguration.ssl().isEnabled())
233+
.bundle(standaloneConfiguration.ssl().getBundle())
198234
// using your GenericObjectPoolConfig here
199235
.poolConfig(new GenericObjectPoolConfig<>())
200236
.build();
@@ -208,6 +244,9 @@ public class CustomLettuceRedisChatMemoryAutoConfiguration extends RedisChatMemo
208244
.username(clusterConfiguration.username())
209245
.password(clusterConfiguration.password())
210246
.timeout(clusterConfiguration.timeout())
247+
.sslBundles(clusterConfiguration.sslBundles())
248+
.useSsl(clusterConfiguration.ssl().isEnabled())
249+
.bundle(clusterConfiguration.ssl().getBundle())
211250
// using your GenericObjectPoolConfig here
212251
.poolConfig(new GenericObjectPoolConfig<>())
213252
.build();
@@ -231,8 +270,8 @@ public class CustomRedissonRedisChatMemoryAutoConfiguration extends RedisChatMem
231270
232271
private static final Logger logger = LoggerFactory.getLogger(CustomRedissonRedisChatMemoryAutoConfiguration.class);
233272
234-
public CustomRedissonRedisChatMemoryAutoConfiguration(RedisChatMemoryProperties properties, RedisChatMemoryConnectionDetails connectionDetails) {
235-
super(properties, connectionDetails);
273+
public CustomRedissonRedisChatMemoryAutoConfiguration(RedisChatMemoryProperties properties, RedisChatMemoryConnectionDetails connectionDetails, ObjectProvider<SslBundles> sslBundles) {
274+
super(properties, connectionDetails, sslBundles);
236275
}
237276
238277
@Override
@@ -250,6 +289,9 @@ public class CustomRedissonRedisChatMemoryAutoConfiguration extends RedisChatMem
250289
.username(configuration.username())
251290
.password(configuration.password())
252291
.timeout(configuration.timeout())
292+
.sslBundles(configuration.sslBundles())
293+
.useSsl(configuration.ssl().isEnabled())
294+
.bundle(configuration.ssl().getBundle())
253295
// using your Config here
254296
.redissonConfig(new Config())
255297
.build();
@@ -263,6 +305,9 @@ public class CustomRedissonRedisChatMemoryAutoConfiguration extends RedisChatMem
263305
.username(configuration.username())
264306
.password(configuration.password())
265307
.timeout(configuration.timeout())
308+
.sslBundles(configuration.sslBundles())
309+
.useSsl(configuration.ssl().isEnabled())
310+
.bundle(configuration.ssl().getBundle())
266311
// using your Config here
267312
.redissonConfig(new Config())
268313
.build();

0 commit comments

Comments
 (0)