- 人工智能
- AI Agent
- Agent 框架
- 工具调用
- Agent 工作流
- RAG
- MCP Clients
- 强化学习
【免费下载链接】agent-core-java
openJiuwen agent core Java是 openJiuwen Core的 Java版本,提供AI Agent开发、运行、调优与演进相关的全套SDK能力。
SupportMemoryType是 openJiuwen agent-core-java 记忆引擎(com.openjiuwen.memory)中用于标识「受支持的记忆类型」的公开枚举,位于 mem_model 数据模型包 之下。它只定义了两个值:USER_PROFILE(用户画像)与SUMMARY(摘要记忆),但这两个值贯穿了长期记忆的写入、检索与向量库 schema 迁移全链路。读完本文,你将掌握该枚举的源码结构、与MemoryType的职责差异,以及它在向量迁移白名单校验中的实际用法,能够准确理解记忆引擎中"用户画像 / 摘要记忆"两种记忆类型的标识约定。
一、枚举定位:管理层支持的记忆类型
在 SupportMemoryType.java 中,枚举被定义为com.openjiuwen.memory.manage.mem_model包下的公开类型,其 Javadoc 明确说明它的用途:
"Memory types supported by summary/vector-specific paths."
即:它是摘要记忆 / 向量专用路径所支持的记忆类型清单。从源码结构看,该枚举与 Python 版openjiuwen/core/memory/manage/mem_model/memory_unit.py中的SupportMemoryType一一对应(注释中注明 "Mirrors Python's ..."),是 Java 版对 Python 实现的对齐镜像。
完整源码如下:
package com.openjiuwen.memory.manage.mem_model; public enum SupportMemoryType { USER_PROFILE("user_profile"), SUMMARY("summary"); private final String value; SupportMemoryType(String value) { this.value = value; } public String getValue() { return value; } }二、枚举值:两个成员与原始值约定
SupportMemoryType仅包含两个枚举成员,每个成员都绑定一个字符串原始值(value),该原始值是与 Python 版保持一致的底层标识,用于存储层与迁移层的匹配。
| 枚举值 | 原始值(getValue()) | 说明 |
|---|---|---|
USER_PROFILE | user_profile | 用户画像记忆。对应长期记忆中描述用户偏好、身份等画像类信息的记忆类型。 |
SUMMARY | summary | 摘要记忆。对应跨多轮会话压缩生成的历史摘要记忆类型。 |
两个原始值均为小写蛇形命名(snake_case),与存储层使用的字符串标识完全一致,而不是 Java 惯例的USER_PROFILE大写形式——这一点在对接 SQL / 向量 / KV 存储时至关重要。
三、字段与公开方法:单字段枚举的标准形态
| 成员 | 类型 | 说明 |
|---|---|---|
字段value | String | 枚举的原始值,构造时通过私有构造器注入,不可变更。 |
方法public String getValue() | String | 返回当前枚举对应的原始值字符串。 |
这是一个非常标准的"值绑定"枚举模式:私有构造器接收字符串参数,getValue()暴露给外部使用。由于枚举实例本身是单例且value为final,因此getValue()返回的值在 JVM 生命周期内恒定不变,可以安全地作为存储键、集合名后缀或校验白名单使用。
与 MemoryType 的职责差异
同包下还有一个更完整的枚举 MemoryType.java,它定义了 7 个成员:FRAGMENT_MEMORY、USER_PROFILE、SEMANTIC_MEMORY、EPISODIC_MEMORY、VARIABLE、SUMMARY、UNKNOWN,并提供了fromValue(String)的字符串反查方法。
两者的关系可以这样理解:
MemoryType是全量记忆类型枚举,覆盖长期记忆引擎中出现的所有记忆分类,并负责"字符串 → 枚举"的反向解析(未知值回退为UNKNOWN);SupportMemoryType是受支持类型白名单,只列出向量 / 摘要专用路径允许出现的两种类型。
从 LongTermMemory.java 的管理器装配代码可以看到,五种MemoryType值被映射到三类管理器:
managers.put(MemoryType.USER_PROFILE.getValue(), fragmentMemoryManager); managers.put(MemoryType.EPISODIC_MEMORY.getValue(), fragmentMemoryManager); managers.put(MemoryType.SEMANTIC_MEMORY.getValue(), fragmentMemoryManager); managers.put(MemoryType.VARIABLE.getValue(), variableManager); managers.put(MemoryType.SUMMARY.getValue(), summaryManager);其中USER_PROFILE走fragmentMemoryManager(分片记忆管理器),SUMMARY走summaryManager(摘要记忆管理器)。可以看到,user_profile与summary这两个字符串值正是管理器注册表、向量集合命名与检索类型过滤所使用的底层标识。
四、实战场景一:向量迁移白名单校验
SupportMemoryType最直接的生产级用法出现在向量存储迁移器 VectorMigrator.java 中。向量迁移流程会先根据记忆类型字符串查找对应的集合,再用枚举构建合法类型白名单进行校验:
private void validateMemoryType(String memTypeStr) { List<String> supportedTypes = Arrays.stream(SupportMemoryType.values()) .map(SupportMemoryType::getValue) .sorted() .toList(); if (!supportedTypes.contains(memTypeStr)) { throw ErrorHelper.buildError( StatusCode.MEMORY_MIGRATE_MEMORY_EXECUTION_ERROR, "error_msg", "Unsupported memory type: '" + memTypeStr + "'. Supported types: " + supportedTypes ); } }这段逻辑说明了两点关键行为:
- 集合命名约定:向量集合通过
"_" + normalized后缀匹配,即user_profile对应形如xxx_user_profile的集合,summary对应形如xxx_summary的集合;实体键允许带vector_前缀(会被normalizeMemoryType剥离),最终以后缀匹配集合名; - 非法类型拦截:如果传入的记忆类型不在
SupportMemoryType白名单中,会抛出MEMORY_MIGRATE_MEMORY_EXECUTION_ERROR错误码,并列出当前支持的类型,避免迁移器对未知类型的集合执行 schema 更新。
迁移流程由 RunMigrations.java 统一驱动,通过MigrationPlan.getVectorRegistry()注册的操作逐实体执行tryMigrate,因此SupportMemoryType实质上充当了向量迁移的输入合法性闸门。
五、实战场景二:与记忆单元的固定类型约束联动
SupportMemoryType的两个成员在记忆单元模型中也有一一对应的落地载体:
- 摘要记忆单元 SummaryUnit.java:构造时强制
super(MemoryType.SUMMARY, memId),且setMemType(...)被重写为总是写回MemoryType.SUMMARY,确保摘要单元的类型不可被篡改; - 用户画像类记忆则通过 FragmentMemoryUnit.java 承载,允许显式指定
MemoryType(包括USER_PROFILE),配合OperationType(如ADD)记录记忆变更操作。
这种"枚举常量 + 固定类型单元"的组合,使记忆类型标识(user_profile/summary)在写入、存储、检索与迁移各环节保持一致。
六、测试验证:原始值契约被测试固化
仓库中的单元测试 MemoryUnitModelsTest.java 明确固化了SupportMemoryType的原始值契约:
assertThat(SupportMemoryType.SUMMARY.getValue()).isEqualTo("summary");同一条测试方法还断言了MemoryType.USER_PROFILE.getValue()等于"user_profile"、SEMANTIC_MEMORY等于"semantic_memory"等,说明user_profile/summary等字符串值是被测试锁定的稳定契约,任何改动都会导致测试失败。
七、记忆引擎中的使用背景
从整体功能定位看(参见 记忆引擎指南),openJiuwen agent-core-java 的长期记忆以LongTermMemory单例为唯一公开入口,通过registerStore(kvStore, vectorStore, dbStore, embeddingModel)注册 KV、向量、SQL 三类存储后,按userId + scopeId + sessionId边界写入与检索。AgentMemoryConfig中的enableLongTermMem、enableFragmentMemory、enableSummaryMemory、memVariables四个开关分别对应长期记忆总开关、片段(画像)记忆、摘要记忆与变量记忆——其中前两者正是SupportMemoryType覆盖的范围。因此,SupportMemoryType可以理解为:在长期记忆的两条专用路径(用户画像分片路径、摘要路径)上,唯一被允许出现的记忆类型集合。
八、使用建议
- 取原始值用
getValue():对接存储或迁移时,永远通过SupportMemoryType.USER_PROFILE.getValue()/SupportMemoryType.SUMMARY.getValue()获取字符串,不要硬编码,避免与 Python 版契约脱节; - 区分两个枚举:需要全量类型判断(含
UNKNOWN兜底、fromValue反查)时使用MemoryType;需要"受支持类型白名单"语义(如迁移校验)时使用SupportMemoryType; - 保持值的小写蛇形:
user_profile、summary同时充当集合名后缀与管理器注册键,变更需同步评估存储层兼容性。
参考入口
- 枚举源码:SupportMemoryType.java
- 全量类型枚举:MemoryType.java
- 摘要记忆单元:SummaryUnit.java
- 向量迁移器(白名单校验):VectorMigrator.java
- 迁移调度入口:RunMigrations.java
- 长期记忆主入口:LongTermMemory.java
- 单元测试(值契约):MemoryUnitModelsTest.java
- 包索引文档:mem_model.README.md
- 使用背景:记忆引擎.md
- 人工智能
- AI Agent
- Agent 框架
- 工具调用
- Agent 工作流
- RAG
- MCP Clients
- 强化学习
【免费下载链接】agent-core-java
openJiuwen agent core Java是 openJiuwen Core的 Java版本,提供AI Agent开发、运行、调优与演进相关的全套SDK能力。
相关推荐
openJiuwen agent-core-java 长期记忆管理层(manage 包)源码解析:分片/摘要/变量记忆与统一写入协调
openJiuwen agent core java 长期记忆管理层(manage 包)源码解析:分片/摘要/变量记忆与统一写入协调 导读 本文聚焦 openJ
人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习DLSS Swapper:9 种 DLL、8 个游戏库,不更新游戏也能切换缩放版本
DLSS Swapper:9 种 DLL、8 个游戏库,不更新游戏也能切换缩放版本 如果你的游戏还停在上一代 DLSS,而新版早就发布,你又不想等厂商推送补丁、
桌面应用openJiuwen 记忆引擎 MemoryStatus 枚举详解:记忆增量更新中的 ADD 与 DELETE 动作语义
openJiuwen 记忆引擎 MemoryStatus 枚举详解:记忆增量更新中的 ADD 与 DELETE 动作语义 导读 MemoryStatus 是 o
人工智能AI AgentAgent 框架工具调用Agent 工作流RAGMCP Clients强化学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考