agentscope-ai / agentscope-ai/agentscope-java

[Feature]: memory/archive/ 与 session 需要真正的删除保留期(当前只有「归档」没有「清理」)

Abierto
#2,695 3 comentarios 0 reacciones 0 asignados Ver en GitHub
area/core/memory enhancement
Lenguaje dominante
Java
Estrellas
5.6k
Forks
1.3k
Merge medio
4 d 12 h
PR fusionados (30 d)
77

Descripción

> Labels 建议:`enhancement` / `harness` / `memory`

## 环境

| | |
|---|---|
| agentscope-harness | 2.0.2 |
| store | `agentscope-extensions-mysql` 2.0.2(`JdbcStore` → MySQL 8.0.21) |
| 场景 | **非 sandbox**,`CompositeFilesystem` + 远程 store,长期在线服务 |

## 问题

框架给了两个看起来像「保留期」的配置,但都没有真正删除数据的能力。

### 一、`dailyFileRetentionDays` 只搬家,不删除

```java
// MemoryMaintenanceMiddleware.java:247-256
LocalDate fileDate = LocalDate.parse(baseName);
if (fileDate.isBefore(cutoff)) {
String fromPath = WorkspaceConstants.MEMORY_DIR + "/" + fileName;
String toPath = WorkspaceConstants.MEMORY_DIR + "/archive/" + fileName;
fs.move(rc, fromPath, toPath); // 只是移进 archive
}
```

过期日更文件被移进 `memory/archive/`,而 **archive 目录本身没有任何清理逻辑**,也没有对应的配置项。数据只是换了个位置继续躺着,**永久增长**。

对文件系统后端而言这也许还能接受(磁盘便宜),但在远程 store(MySQL / Redis / OSS)后端下,它就是一张只增不减的表。

### 二、`sessionRetentionDays` 实际不生效

`pruneOldSessions()` 因为两个独立缺陷完全不工作(glob 路径层级与路由前缀对不上;空 mtime 被跳过),详见姊妹 issue。**配置项存在但没有任何效果。**

此外 `sessions.json`(会话树索引,`WorkspaceManager.updateSessionIndex():403` 每次 offload 整份重写)的条目**只增不减**,框架侧没有任何删除逻辑。它在响应路径上被同步读写,体积直接换算成每轮延迟。

## 我们被迫做的事

为了让存储不无界增长,我们写了一个定时任务,**绕过框架抽象直接对 `agentscope_store` 执行 SQL**:

1. 删 `memory` 段里 `item_key LIKE '/archive/%'` 且过期的行
2. 删 `sessions` 段里过期的 `*.jsonl`(保留 `/sessions.json` 整行)
3. 删 `tasks` 段里过期的行
4. 解析 `/sessions.json` 的 `value_json`,剪掉里面过期的会话条目再写回

这条路的代价是**我们必须依赖框架的内部实现细节**:

- 命名空间在 `JdbcStore` 里以 ASCII `0x1F` 连接各段、且结尾也带一个(写 SQL 得用 `CHAR(31)`)
- `item_key` 带前导斜杠(`CompositeFilesystem.routeForPath` 剥掉路由前缀后产出 `"/" + suffix`)
- `value_json` 是 `FileData` 的 JSON 包装,正文在 `content` 字段里

这些都是实现细节,任何一处变化都会让清理**静默失效**(删不到任何行、且不报错)。我们只能写测试和 PoC 去钉住这些契约 —— 但这本不该由使用方承担。

## 期望

1. **给 archive 一个真正的保留期**,例如新增 `archiveRetentionDays`;或者让 `dailyFileRetentionDays` 到期直接删除(配合一个 `archiveBeforeDelete` 开关保留现有行为)
2. **修好 session 侧的实际删除**,让 `sessionRetentionDays` 名副其实(见姊妹 issue)
3. **`sessions.json` 的条目按同一保留期剪枝** —— 它是唯一一个体积直接影响每轮响应延迟的文件
4. 清理动作最好都经由 `AbstractFilesystem`,这样对文件系统 / sandbox / 远程 store 三种后端行为一致,使用方也不需要知道任何存储层的字节格式

## 相关

- 「`pruneOldSessions` 的 glob 路径与路由前缀不匹配」(本 feature 的前置 bug)
- 「`WorkspaceIndex` 快速路径返回空 mtime」(同样阻断清理)

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.