Skip to content

[Feature]: 为 ReActAgent 提供基于 MemoryProvider 的标准长期记忆 Rail #82

Description

@openjiuwen-collaboration-bot

🚀 背景描述

现状

组件 面向 问题
LongTermMemory core.memory 引擎 ✅ 已有
MemoryProvider / OpenJiuwenMemoryProvider core.memory.external 抽象 + 默认实现 ✅ 已有
ReActAgent.configureMemScope() core.singleagent scope 配置 ✅ 仅 setScopeConfig,无 prefetch/sync
ExternalMemoryRail harness.rails DeepAgent ⚠️ init() 硬绑 DeepAgent,挂到 ReActAgent 时 静默 no-op

ExternalMemoryRail.init() 当前逻辑:

public void init(Object agent) {
    if (!(agent instanceof DeepAgent deepAgent)) {
        return;  // ReActAgent 注册后 owner=null,prefetch/sync/tools 全部失效
    }
    ...
}

影响

  1. ReActAgent 无法使用 harness 记忆 Rail。
  2. 集成测试 / 业务示例应用层必须自写 TravelUserMemoryRail,重复 prefetch/sync/工具注册。
  3. core 内 DeepAgent 与 ReActAgent 的长期记忆接入路径不一致,MemoryProvider 语义难以在裸 ReActAgent 上复用。

设计思路

推荐方案:在 core 新增 ReActExternalMemoryRail(保留 harness 类不变)

新增类(建议包名):

com.openjiuwen.core.memory.external.rail.ReActExternalMemoryRail
  extends com.openjiuwen.core.singleagent.rail.AgentRail

设计原则

  • 复用 ExternalMemoryRail语义(prefetch 块格式、syncTurn、provider 工具 schema),但 init/工具注册 面向 BaseAgent / ReActAgent
  • ExternalMemoryRail 保持 DeepAgent 专用,避免破坏 harness 现有测试与 HarnessConfigBuilder 行为;后续可选择性委托到共享 helper。
  • Rail 不依赖 Spring;scope 参数通过构造函数或 MemoryScope 值对象注入。

涉及到的对外API

与其他模块的相关性描述

测试设计与测试计划

验证 ReActExternalMemoryRail 在裸 ReActAgent 上具备与现有 ExternalMemoryRail 对齐的长期记忆能力,并确保 DeepAgent 现有路径无回归:

  1. Rail 生命周期正确:注册时初始化 owner / prompt / tools,注销时清理 prompt / tools / provider。
  2. 记忆读写闭环正确:beforeInvoke 初始化 provider,beforeModelCall prefetch 并注入 prompt,afterInvoke syncTurn 写回。
  3. 工具可见且可执行:ltm_search / ltm_search_summary 不仅出现在 ReActAgent tool schema 中,也能通过 AbilityManager 找到 LocalFunction 并调用 provider。
  4. 异常与边界场景可降级:空输入、provider 抛错、连续 sync 失败、provider 无工具、空 recall 不影响主流程。
  5. 与现有 harness memory 行为兼容:ExternalMemoryRail + DeepAgent 测试保持 green。

其他信息

感谢您的贡献 🎉!

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions