@@ -126,6 +126,8 @@ store.putItem(userItem);
126126// 创建获取用户信息的工具
127127BiFunction<GetMemoryRequest, ToolContext, MemoryResponse> getUserInfoFunction =
128128 (request, context) -> {
129+ RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
130+ Store store = runnableConfig.store();
129131 Optional<StoreItem > itemOpt = store.getItem(request.namespace(), request.key());
130132 if (itemOpt.isPresent()) {
131133 Map<String, Object> value = itemOpt.get().getValue();
@@ -147,10 +149,21 @@ ReactAgent agent = ReactAgent.builder()
147149 .saver(new MemorySaver())
148150 .build();
149151
152+ // 创建内存存储
153+ MemoryStore store = new MemoryStore();
154+ // 向存储中写入示例数据
155+ Map<String, Object> userData = new HashMap<>();
156+ userData.put("name", "张三");
157+ userData.put("language", "中文");
158+
159+ StoreItem userItem = StoreItem.of(List.of("users"), "user_123", userData);
160+ store.putItem(userItem);
161+
150162// 运行Agent
151163RunnableConfig config = RunnableConfig.builder()
152164 .threadId("session_001")
153165 .addMetadata("user_id", "user_123")
166+ .store(store)
154167 .build();
155168
156169agent.invoke("查询用户信息,namespace=[ 'users'] , key='user_123'", config);`}
@@ -187,6 +200,8 @@ MemoryStore store = new MemoryStore();
187200// 创建保存用户信息的工具
188201BiFunction<SaveMemoryRequest, ToolContext, MemoryResponse> saveUserInfoFunction =
189202 (request, context) -> {
203+ RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
204+ Store store = runnableConfig.store();
190205 StoreItem item = StoreItem.of(request.namespace(), request.key(), request.value());
191206 store.putItem(item);
192207 return new MemoryResponse("成功保存用户信息", request.value());
@@ -205,20 +220,25 @@ ReactAgent agent = ReactAgent.builder()
205220 .saver(new MemorySaver())
206221 .build();
207222
208- // 运行Agent
223+ // 创建内存存储
224+ MemoryStore store = new MemoryStore();
209225RunnableConfig config = RunnableConfig.builder()
210226 .threadId("session_001")
211227 .addMetadata("user_id", "user_123")
228+ .store(store)
212229 .build();
213230
231+ // 运行Agent
214232agent.invoke(
215233 "我叫张三,请保存我的信息。使用 saveUserInfo 工具,namespace=[ 'users'] , key='user_123', value={'name': '张三'}",
216234 config
217235);
218236
219237// 可以直接访问存储获取值
220238Optional<StoreItem > savedItem = store.getItem(List.of("users"), "user_123");
221- Map<String, Object> savedValue = savedItem.get().getValue();`}
239+ if (savedItem.isPresent()) {
240+ Map<String, Object> savedValue = savedItem.get().getValue();
241+ }`}
222242</Code >
223243
224244## 使用 ModelHook 管理长期记忆
@@ -244,19 +264,6 @@ import org.springframework.ai.chat.messages.SystemMessage;
244264import java.util.* ;
245265import java.util.concurrent.CompletableFuture;
246266
247- // 创建内存存储
248- MemoryStore memoryStore = new MemoryStore();
249-
250- // 预先填充用户画像
251- Map<String, Object> profileData = new HashMap<>();
252- profileData.put("name", "王小明");
253- profileData.put("age", 28);
254- profileData.put("email", "wang@example.com ");
255- profileData.put("preferences", List.of("喜欢咖啡", "喜欢阅读"));
256-
257- StoreItem profileItem = StoreItem.of(List.of("user_profiles"), "user_001", profileData);
258- memoryStore.putItem(profileItem);
259-
260267// 创建记忆拦截器
261268ModelHook memoryInterceptor = new ModelHook() {
262269 @Override
@@ -278,18 +285,19 @@ ModelHook memoryInterceptor = new ModelHook() {
278285 return CompletableFuture.completedFuture(Map.of());
279286 }
280287
288+ Store store = config.store();
281289 // 从记忆存储中加载用户画像
282- Optional<StoreItem> itemOpt = memoryStore .getItem(List.of("user_profiles"), userId);
290+ Optional<StoreItem> itemOpt = store .getItem(List.of("user_profiles"), userId);
283291 if (itemOpt.isPresent()) {
284- Map<String, Object> profileData = itemOpt.get().getValue();
292+ Map<String, Object> profile = itemOpt.get().getValue();
285293
286294 // 将用户上下文注入系统消息
287295 String userContext = String.format(
288296 "用户信息:姓名=%s, 年龄=%s, 邮箱=%s, 偏好=%s",
289- profileData .get("name"),
290- profileData .get("age"),
291- profileData .get("email"),
292- profileData .get("preferences")
297+ profile .get("name"),
298+ profile .get("age"),
299+ profile .get("email"),
300+ profile .get("preferences")
293301 );
294302
295303 // 获取消息列表
@@ -357,9 +365,23 @@ ReactAgent agent = ReactAgent.builder()
357365 .saver(new MemorySaver())
358366 .build();
359367
368+ // 创建内存存储
369+ MemoryStore memoryStore = new MemoryStore();
370+
371+ // 模拟数据,预先填充用户画像
372+ Map<String, Object> profileData = new HashMap<>();
373+ profileData.put("name", "王小明");
374+ profileData.put("age", 28);
375+ profileData.put("email", "wang@example.com ");
376+ profileData.put("preferences", List.of("喜欢咖啡", "喜欢阅读"));
377+
378+ StoreItem profileItem = StoreItem.of(List.of("user_profiles"), "user_001", profileData);
379+ memoryStore.putItem(profileItem);
380+
360381RunnableConfig config = RunnableConfig.builder()
361382 .threadId("session_001")
362383 .addMetadata("user_id", "user_001")
384+ .store(memoryStore)
363385 .build();
364386
365387// Agent会自动加载用户画像信息
@@ -380,6 +402,7 @@ import com.alibaba.cloud.ai.graph.agent.hook.HookPosition;
380402import com.alibaba.cloud.ai.graph.OverAllState;
381403import com.alibaba.cloud.ai.graph.RunnableConfig;
382404import com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;
405+ import com.alibaba.cloud.ai.graph.store.Store;
383406import com.alibaba.cloud.ai.graph.store.stores.MemoryStore;
384407import com.alibaba.cloud.ai.graph.store.StoreItem;
385408import org.springframework.ai.chat.messages.Message;
@@ -388,17 +411,6 @@ import org.springframework.ai.chat.messages.SystemMessage;
388411import java.util.* ;
389412import java.util.concurrent.CompletableFuture;
390413
391- // 创建记忆存储
392- MemoryStore memoryStore = new MemoryStore();
393-
394- // 设置长期记忆
395- Map<String, Object> userProfile = new HashMap<>();
396- userProfile.put("name", "李工程师");
397- userProfile.put("occupation", "软件工程师");
398-
399- StoreItem profileItem = StoreItem.of(List.of("profiles"), "user_002", userProfile);
400- memoryStore.putItem(profileItem);
401-
402414// 创建组合记忆Hook
403415ModelHook combinedMemoryHook = new ModelHook() {
404416 @Override
@@ -420,6 +432,7 @@ ModelHook combinedMemoryHook = new ModelHook() {
420432 }
421433 String userId = (String) userIdOpt.get();
422434
435+ Store memoryStore = config.store();
423436 // 从长期记忆加载
424437 Optional<StoreItem> profileOpt = memoryStore.getItem(List.of("profiles"), userId);
425438 if (profileOpt.isEmpty()) {
@@ -486,9 +499,20 @@ ReactAgent agent = ReactAgent.builder()
486499 .saver(new MemorySaver()) // 短期记忆
487500 .build();
488501
502+ // 创建记忆存储
503+ MemoryStore memoryStore = new MemoryStore();
504+ // 设置长期记忆
505+ Map<String, Object> userProfile = new HashMap<>();
506+ userProfile.put("name", "李工程师");
507+ userProfile.put("occupation", "软件工程师");
508+
509+ StoreItem profileItem = StoreItem.of(List.of("profiles"), "user_002", userProfile);
510+ memoryStore.putItem(profileItem);
511+
489512RunnableConfig config = RunnableConfig.builder()
490513 .threadId("combined_thread")
491514 .addMetadata("user_id", "user_002")
515+ .store(memoryStore)
492516 .build();
493517
494518// 短期记忆:在对话中记住
@@ -510,29 +534,41 @@ agent.invoke("根据我的职业和今天的工作,给我一些建议。", con
510534 {`import com.alibaba.cloud.ai.graph.agent.ReactAgent;
511535import com.alibaba.cloud.ai.graph.RunnableConfig;
512536import com.alibaba.cloud.ai.graph.checkpoint.savers.MemorySaver;
537+ import com.alibaba.cloud.ai.graph.store.Store;
513538import com.alibaba.cloud.ai.graph.store.stores.MemoryStore;
514539import com.alibaba.cloud.ai.graph.store.StoreItem;
540+ import org.springframework.ai.chat.model.ToolContext;
515541import org.springframework.ai.tool.ToolCallback;
516542import org.springframework.ai.tool.function.FunctionToolCallback;
517543
518544import java.util.* ;
545+ import java.util.function.BiFunction;
546+
547+ // 定义请求和响应记录
548+ record SaveMemoryRequest(List<String > namespace, String key, Map<String, Object> value) {}
549+ record GetMemoryRequest(List<String > namespace, String key) {}
550+ record MemoryResponse(String message, Map<String, Object> value) {}
519551
520552// 创建记忆存储和工具
521553MemoryStore memoryStore = new MemoryStore();
522554
523555ToolCallback saveMemoryTool = FunctionToolCallback.builder("saveMemory",
524- (SaveMemoryRequest request, context) -> {
556+ (BiFunction< SaveMemoryRequest, ToolContext, MemoryResponse>) ( request, context) -> {
525557 StoreItem item = StoreItem.of(request.namespace(), request.key(), request.value());
526- memoryStore.putItem(item);
558+ RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
559+ Store store = runnableConfig.store();
560+ store.putItem(item);
527561 return new MemoryResponse("已保存", request.value());
528562 })
529563 .description("保存到长期记忆")
530564 .inputType(SaveMemoryRequest.class)
531565 .build();
532566
533567ToolCallback getMemoryTool = FunctionToolCallback.builder("getMemory",
534- (GetMemoryRequest request, context) -> {
535- Optional<StoreItem > itemOpt = memoryStore.getItem(request.namespace(), request.key());
568+ (BiFunction<GetMemoryRequest, ToolContext, MemoryResponse>) (request, context) -> {
569+ RunnableConfig runnableConfig = (RunnableConfig) context.getContext().get("config");
570+ Store store = runnableConfig.store();
571+ Optional<StoreItem > itemOpt = store.getItem(request.namespace(), request.key());
536572 return new MemoryResponse(
537573 itemOpt.isPresent() ? "找到" : "未找到",
538574 itemOpt.map(StoreItem::getValue).orElse(Map.of())
@@ -553,6 +589,7 @@ ReactAgent agent = ReactAgent.builder()
553589RunnableConfig session1 = RunnableConfig.builder()
554590 .threadId("session_morning")
555591 .addMetadata("user_id", "user_003")
592+ .store(memoryStore)
556593 .build();
557594
558595agent.invoke(
@@ -564,6 +601,7 @@ agent.invoke(
564601RunnableConfig session2 = RunnableConfig.builder()
565602 .threadId("session_afternoon")
566603 .addMetadata("user_id", "user_003")
604+ .store(memoryStore)
567605 .build();
568606
569607agent.invoke(
@@ -658,6 +696,7 @@ ReactAgent agent = ReactAgent.builder()
658696RunnableConfig config = RunnableConfig.builder()
659697 .threadId("learning_thread")
660698 .addMetadata("user_id", "user_004")
699+ .store(memoryStore)
661700 .build();
662701
663702// 用户表达偏好
@@ -666,6 +705,8 @@ agent.invoke("我偏好早上运动。", config);
666705
667706// 验证偏好已被存储
668707Optional<StoreItem > savedPrefs = memoryStore.getItem(List.of("user_data"), "user_004_preferences");
669- // 偏好应该被保存到长期记忆中`}
708+ if (savedPrefs.isPresent()) {
709+ // 偏好应该被保存到长期记忆中
710+ }`}
670711</Code >
671712
0 commit comments