harness - 会话与心智记忆
2026年6月16日 上午9:28:32
会话(Session)保存一次对话的上下文,心智记忆(Memory)则在多次对话之间长期留存关键事实。两者配合,让 Agent 既有“短期记忆”也有“长期记忆”。
1、会话提供者(sessionProvider)
sessionProvider 是构建引擎的必填项,决定会话如何创建与存储。最简单的是内存实现:
HarnessEngine engine = HarnessEngine.of("work", ".soloncode/")
.sessionProvider(InMemoryAgentSession::of) // 内存会话(进程级,重启即失)
.build();
获取/使用会话:
AgentSession session = engine.getSession("default"); // 按实例 id 获取
engine.prompt("hello")
.session(session) // 不传则为临时会话(不留历史)
.call();
需要持久化会话时,实现自定义的
AgentSessionProvider,把会话落到文件/数据库即可。会话相关的运行态数据默认落在{harnessHome}/sessions/下。
2、会话窗口与上下文压缩
为控制上下文长度,引擎提供两层机制(详见 《harness - 配置参考》):
sessionWindowSize:新指令携带几条历史消息(默认 8)。compressionThreshold(maxMessages, maxTokens):消息条数或内容长度超阈值时,自动压缩历史上下文。
3、心智记忆(Memory)
心智记忆让 Agent 把用户偏好、项目规约等关键事实长期保存,并在需要时检索召回。需满足两个条件:memoryEnabled=true(默认开启)且已通过 memoryProvider(...) 配置记忆方案。
记忆的存取由 MemorySolution 和 MemorySolutionProvider 定义,MemorySolution 组合了两个能力:
MemoryStorer:物理持久化与 TTL 管理。(有不同的适配,按需选择)MemorySearcher:语义检索与热记忆提取。(有不同的适配,按需选择)
通过 memoryProvider(Factory) 注入,工厂按工作区(__cwd)返回对应方案,从而支持多租户/多项目隔离:
HarnessEngine engine = HarnessEngine.of("work", ".soloncode/")
.sessionProvider(InMemoryAgentSession::of)
.memoryProvider(new MemoryProvider()) // 按工作区构建记忆方案
.build();
内置的 Markdown 方案(零外部依赖)把记忆以 MD 文件存储,Store 与 Search 共享同一份内存数据,写入即更新索引:
public class MemoryProvider implements MemorySolutionProvider {
private Map<String, MemorySolution> cached = new ConcurrentHashMap<>();
private boolean memoryIsolation;
public MemoryProvider(boolean memoryIsolation) {
this.memoryIsolation = memoryIsolation;
}
@Override
public MemorySolution get(String __cwd) {
if (memoryIsolation== false) { //
__cwd = System.getProperty("user.home");
}
return cached.computeIfAbsent(__cwd, k ->
new MemorySolutionMdImpl(Paths.get(k, ".demo/memory/")));
}
}
除 MD 外,记忆模块还提供 Redis、Lucene、Repository(向量库)等存储/检索实现,可按需组合自己的
MemorySolution。
4、记忆能力
配置记忆方案后,Agent 可自主进行:提取(写入事实)、召回(按 key 精确取)、语义检索、认知整合(碎片升维合并)与修剪(删除过时认知)。记忆条目带重要度评分,便于按价值排序与管理。