mirror of
https://github.com/agentscope-ai/ReMe.git
synced 2026-10-08 03:10:24 +00:00
refactor(vault): rename metadata and session directories for consistency
- Change reme_metadata to metadata in application config and fixtures - Change reme_session to session in application config and fixtures - Update all documentation references from reme_metadata to metadata - Update all documentation references from reme_session to session - Fix integration tests to use new directory names - Update SVG diagrams to reflect new directory naming convention - Adjust cleanup logic in vault fixture to use updated directory names
This commit is contained in:
parent
9f7479d4b8
commit
4fbec46a1b
14 changed files with 37 additions and 37 deletions
|
|
@ -115,15 +115,15 @@ QwenPaw 2.0 将集成新版 ReMe;后续也会推出 Claude Code plugin,进
|
|||
|
||||
> Memory as File, File as Memory.
|
||||
|
||||
ReMe 将**记忆视为文件**,让原始对话和外部资料从 `reme_session/`、`resource/` 渐进加工到 `daily/`,再沉淀为 `digest/`
|
||||
ReMe 将**记忆视为文件**,让原始对话和外部资料从 `session/`、`resource/` 渐进加工到 `daily/`,再沉淀为 `digest/`
|
||||
中可长期复用的知识节点。
|
||||
|
||||
### 目录结构
|
||||
|
||||
```text
|
||||
<vault_dir>/
|
||||
├── reme_metadata/ # 系统索引、图谱、catalog 等持久状态
|
||||
├── reme_session/ # 原始对话和 Agent session
|
||||
├── metadata/ # 系统索引、图谱、catalog 等持久状态
|
||||
├── session/ # 原始对话和 Agent session
|
||||
│ ├── dialog/
|
||||
│ │ └── <session_id>.jsonl
|
||||
│ ├── agentscope/
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@
|
|||
|
||||
<rect class="panel" x="126" y="502" width="948" height="82"/>
|
||||
<text class="note" x="176" y="532">Conversation source</text>
|
||||
<text class="chip-text" x="176" y="554">reme_session/dialog/<session_id>.jsonl</text>
|
||||
<text class="chip-text" x="176" y="554">session/dialog/<session_id>.jsonl</text>
|
||||
<line class="line" x1="454" y1="518" x2="454" y2="566"/>
|
||||
<text class="chip-title" x="498" y="532">Resource source</text>
|
||||
<text class="chip-text" x="498" y="554">resource/<date>/<resource_file></text>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
|
|
@ -67,7 +67,7 @@
|
|||
<text class="section-title" x="116" y="438">Raw input</text>
|
||||
<text class="section-subtitle" x="82" y="468">keep the original scene</text>
|
||||
<rect class="chip" x="82" y="494" width="168" height="28"/>
|
||||
<text class="chip-text" x="166" y="513" text-anchor="middle">reme_session/ + resource/</text>
|
||||
<text class="chip-text" x="166" y="513" text-anchor="middle">session/ + resource/</text>
|
||||
|
||||
<rect class="panel" x="326" y="398" width="224" height="144"/>
|
||||
<circle class="badge" cx="360" cy="432" r="15"/>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 7 KiB After Width: | Height: | Size: 7 KiB |
|
|
@ -158,7 +158,7 @@
|
|||
<text class="label" x="10" y="30" text-anchor="middle">.json</text>
|
||||
<line class="ink thin" x1="26" y1="28" x2="50" y2="28"/>
|
||||
<line class="ink thin" x1="22" y1="42" x2="52" y2="42"/>
|
||||
<text class="label" x="106" y="19">reme_session/</text>
|
||||
<text class="label" x="106" y="19">session/</text>
|
||||
<text class="tiny" x="106" y="39">raw session logs</text>
|
||||
</g>
|
||||
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
|
@ -71,7 +71,7 @@ daily/<date>/**/*.md
|
|||
| `digest/personal/*.md` | 用户、团队、项目相关的偏好、事实、长期上下文。 |
|
||||
| `digest/wiki/*.md` | 通用知识、概念、观察、决策先例。 |
|
||||
| `daily/<date>/interests.yaml` | 当天值得上层 Agent 主动关注的兴趣主题。 |
|
||||
| `reme_metadata/file_catalog/dream*` | dream 专用 catalog,用于判断 daily 输入是否变化。 |
|
||||
| `metadata/file_catalog/dream*` | dream 专用 catalog,用于判断 daily 输入是否变化。 |
|
||||
|
||||
## 四个阶段
|
||||
|
||||
|
|
|
|||
|
|
@ -7,13 +7,13 @@ Auto Memory 是 ReMe 的对话记忆入口:每段对话先按 `session_id` 沉
|
|||
<img src="../figure/auto-memory-resource.svg" alt="ReMe Auto Memory 与 Auto Resource 写入 daily 记忆卡片的流程" width="92%">
|
||||
</p>
|
||||
|
||||
关于 `daily/`、`reme_session/`、frontmatter 和 wikilink 的通用文件语义,见 [Memory as File](./memory_as_file.md)。
|
||||
关于 `daily/`、`session/`、frontmatter 和 wikilink 的通用文件语义,见 [Memory as File](./memory_as_file.md)。
|
||||
|
||||
```text
|
||||
Conversation
|
||||
├─ step 1: daily/YYYY-MM-DD/<session_id>.md # 每段对话先成卡片
|
||||
├─ step 2: daily/YYYY-MM-DD.md # 当天索引再串起来
|
||||
└─ source: reme_session/dialog/<session_id>.jsonl # 原始对话
|
||||
└─ source: session/dialog/<session_id>.jsonl # 原始对话
|
||||
```
|
||||
|
||||
## 它记录什么
|
||||
|
|
@ -60,7 +60,7 @@ daily/2026-06-20/session-a.md
|
|||
Auto Memory 在生成记忆卡片的同时,也会保存原始会话:
|
||||
|
||||
```text
|
||||
reme_session/
|
||||
session/
|
||||
dialog/
|
||||
session-a.jsonl
|
||||
session-b.jsonl
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ flowchart LR
|
|||
Jobs --> Steps["Steps<br/>reme/steps/**"]
|
||||
Steps --> Ctx["RuntimeContext<br/>data + Response + stream queue"]
|
||||
Steps --> Components["Components<br/>store / graph / index / llm / agent / catalog"]
|
||||
Components --> Vault["Vault<br/>daily / digest / resource / reme_metadata"]
|
||||
Components --> Vault["Vault<br/>daily / digest / resource / metadata"]
|
||||
```
|
||||
|
||||
核心分层:
|
||||
|
|
@ -75,8 +75,8 @@ reme/
|
|||
|
||||
```text
|
||||
<vault_dir>/
|
||||
reme_metadata/ # file_store、file_graph、keyword_index、file_catalog 等持久状态
|
||||
reme_session/ # Agent session 与原始对话
|
||||
metadata/ # file_store、file_graph、keyword_index、file_catalog 等持久状态
|
||||
session/ # Agent session 与原始对话
|
||||
resource/ # 外部资源
|
||||
daily/ # 浅加工记忆
|
||||
digest/ # 长期 digest 记忆
|
||||
|
|
|
|||
|
|
@ -34,15 +34,15 @@ ReMe 把记忆设计成文件,不只是为了“方便存储”,而是为了
|
|||
ReMe 的 vault 把记忆分成四层:
|
||||
|
||||
```text
|
||||
raw input -> reme_session/ + resource/
|
||||
raw input -> session/ + resource/
|
||||
working memory -> daily/
|
||||
long memory -> digest/
|
||||
system state -> reme_metadata/
|
||||
system state -> metadata/
|
||||
```
|
||||
|
||||
这四层解决的是不同问题。
|
||||
|
||||
`reme_session/` 和 `resource/` 保存原始输入。它们强调“不要丢现场”:对话、Agent session、上传资料、网页或报告先原样留下,作为以后核对的证据。
|
||||
`session/` 和 `resource/` 保存原始输入。它们强调“不要丢现场”:对话、Agent session、上传资料、网页或报告先原样留下,作为以后核对的证据。
|
||||
|
||||
`daily/` 是浅加工层。它把当天发生的对话和资源整理成更适合阅读的 daily note:什么事情发生了、有哪些结论、留下了哪些后续任务、对应原文在哪里。
|
||||
daily 不追求最终抽象,它更像当天工作台。
|
||||
|
|
@ -50,14 +50,14 @@ daily 不追求最终抽象,它更像当天工作台。
|
|||
`digest/` 是深加工层。这里保存的是可以长期复用的记忆节点,例如用户偏好、项目背景、流程经验、概念知识、决策先例。digest
|
||||
不应该只是复制 daily,而应该把多次出现的事实、方法和关系合并成更稳定的表述。
|
||||
|
||||
`reme_metadata/` 是系统索引层。它保存 file catalog、chunk 索引、图谱快照等运行状态。用户通常不需要手写这里的内容;真正的人工编辑入口是
|
||||
`metadata/` 是系统索引层。它保存 file catalog、chunk 索引、图谱快照等运行状态。用户通常不需要手写这里的内容;真正的人工编辑入口是
|
||||
`daily/`、`digest/` 和必要时的 `resource/`。
|
||||
|
||||
这个分层让 ReMe 可以同时保留“现场”和“抽象”:daily 负责还原当时发生了什么,digest 负责回答以后还能复用什么。
|
||||
|
||||
## 目录结构
|
||||
|
||||
ReMe 用目录表达记忆组织和记忆分层。原始材料先进入 `resource/` 或 `reme_session/`,再沉淀到 `daily/`,最后由 `auto_dream`
|
||||
ReMe 用目录表达记忆组织和记忆分层。原始材料先进入 `resource/` 或 `session/`,再沉淀到 `daily/`,最后由 `auto_dream`
|
||||
整合到 `digest/`。
|
||||
|
||||
对应的自动流程分别是 [Auto Memory](./auto_memory.md)、[Auto Resource](./auto_resource.md) 和 [Auto Dream](./auto_dream.md)。
|
||||
|
|
@ -65,8 +65,8 @@ ReMe 用目录表达记忆组织和记忆分层。原始材料先进入 `resourc
|
|||
|
||||
```text
|
||||
<vault_dir>/
|
||||
├── reme_metadata/ # 系统索引层;ReMe 索引、图谱、catalog 等持久状态,不作为人工编辑入口
|
||||
├── reme_session/ # 原始输入层;原始对话和 Agent session
|
||||
├── metadata/ # 系统索引层;ReMe 索引、图谱、catalog 等持久状态,不作为人工编辑入口
|
||||
├── session/ # 原始输入层;原始对话和 Agent session
|
||||
│ ├── dialog/
|
||||
│ │ └── <session_id>.jsonl # auto_memory 保存的对话消息
|
||||
│ ├── agentscope/
|
||||
|
|
@ -95,7 +95,7 @@ ReMe 用目录表达记忆组织和记忆分层。原始材料先进入 `resourc
|
|||
|
||||
```text
|
||||
对话
|
||||
-> reme_session/dialog/<session_id>.jsonl
|
||||
-> session/dialog/<session_id>.jsonl
|
||||
-> daily/YYYY-MM-DD/<session_id>.md
|
||||
-> digest/personal | digest/procedure | digest/wiki
|
||||
|
||||
|
|
@ -137,7 +137,7 @@ Frontmatter 是文件开头的 YAML 块,用 `---` 包住:
|
|||
---
|
||||
name: 文档名
|
||||
description: 文档描述
|
||||
source_conversation: [[reme_session/dialog/abc.jsonl]]
|
||||
source_conversation: [[session/dialog/abc.jsonl]]
|
||||
---
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ index_update_loop:
|
|||
2. 把文件解析成一个 `FileNode` 和多个 `FileChunk`。
|
||||
3. 对新增或修改的文件,先删除旧 chunk,再 upsert 新 chunk。
|
||||
4. 对删除的文件,从 `file_store`、`keyword_index` 和 `file_graph` 清掉对应记录。
|
||||
5. 有变化时 dump 到 `reme_metadata/`,让下次启动可以恢复。
|
||||
5. 有变化时 dump 到 `metadata/`,让下次启动可以恢复。
|
||||
|
||||
Markdown chunker 会解析 YAML frontmatter、标题结构和 `[[...]]`,产出 `FileNode`、`FileChunk` 和 `FileLink`。更细的分块规则见
|
||||
[Memory as File](./memory_as_file.md#memory-chunking)。
|
||||
|
|
|
|||
|
|
@ -65,8 +65,8 @@ reme list
|
|||
|
||||
```text
|
||||
.reme/
|
||||
├── reme_metadata/ # 索引、图谱、catalog 等持久状态
|
||||
├── reme_session/ # Agent session 与原始对话
|
||||
├── metadata/ # 索引、图谱、catalog 等持久状态
|
||||
├── session/ # Agent session 与原始对话
|
||||
├── resource/ # 外部资料
|
||||
├── daily/ # daily note
|
||||
└── digest/ # 长期记忆
|
||||
|
|
|
|||
|
|
@ -29,8 +29,8 @@ class ApplicationConfig(BaseModel):
|
|||
|
||||
app_name: str = Field(default=os.getenv("APP_NAME", "ReMe"), description="Application display name")
|
||||
vault_dir: str = Field(default=".reme", description="Vault root directory for runtime files")
|
||||
metadata_dir: str = Field(default="reme_metadata", description="Subdirectory for ReMe persistent state")
|
||||
session_dir: str = Field(default="reme_session", description="Subdirectory for persisted agent sessions")
|
||||
metadata_dir: str = Field(default="metadata", description="Subdirectory for ReMe persistent state")
|
||||
session_dir: str = Field(default="session", description="Subdirectory for persisted agent sessions")
|
||||
resource_dir: str = Field(default="resource", description="Subdirectory for external assets")
|
||||
daily_dir: str = Field(default="daily", description="Subdirectory for daily memory")
|
||||
digest_dir: str = Field(default="digest", description="Subdirectory for digest memory")
|
||||
|
|
|
|||
|
|
@ -253,7 +253,7 @@ Redis key `auth:jwks:current_kid` 保存当前活跃 kid;Auth Service
|
|||
""",
|
||||
}
|
||||
|
||||
_CLEAN_DIRS = ("daily", "digest", "resource", "reme_metadata")
|
||||
_CLEAN_DIRS = ("daily", "digest", "resource", "metadata")
|
||||
|
||||
|
||||
# ─────────────────────────────────────────────────────────────────────────────
|
||||
|
|
@ -418,7 +418,7 @@ class VaultEnv:
|
|||
|
||||
def clean(self) -> list[str]:
|
||||
"""Remove fixture-managed subdirs (``daily/``, ``digest/``, ``resource/``,
|
||||
``reme_metadata/``) under the vault so the next seed starts clean.
|
||||
``metadata/``) under the vault so the next seed starts clean.
|
||||
Returns relative paths that were actually removed."""
|
||||
removed: list[str] = []
|
||||
for rel in _CLEAN_DIRS:
|
||||
|
|
|
|||
|
|
@ -61,7 +61,7 @@ def _copy_outputs(env, message_files: list[Path]) -> list[Path]:
|
|||
for path in message_files:
|
||||
if dst := _copy_artifact(path, "messages"):
|
||||
copied.append(dst)
|
||||
for root in ("daily", "digest", "reme_metadata", "reme_session", "agent_logs"):
|
||||
for root in ("daily", "digest", "metadata", "session", "agent_logs"):
|
||||
if dst := _copy_artifact(env.vault_dir / root, root):
|
||||
copied.append(dst)
|
||||
return copied
|
||||
|
|
@ -83,9 +83,9 @@ def _all_digest_text(env) -> str:
|
|||
|
||||
|
||||
def _file_graph_links(env) -> dict[str, list[dict]]:
|
||||
"""Map ``path -> links`` from every ``reme_metadata/file_graph/*.jsonl``."""
|
||||
"""Map ``path -> links`` from every ``metadata/file_graph/*.jsonl``."""
|
||||
out: dict[str, list[dict]] = {}
|
||||
graph_dir = env.vault_dir / "reme_metadata" / "file_graph"
|
||||
graph_dir = env.vault_dir / "metadata" / "file_graph"
|
||||
if not graph_dir.is_dir():
|
||||
return out
|
||||
for graph_path in sorted(graph_dir.glob("*.jsonl")):
|
||||
|
|
@ -123,7 +123,7 @@ def test_auto_dream_and_proactive():
|
|||
topic_diversity_days=7,
|
||||
)
|
||||
dumped = await recorder.dump()
|
||||
session_jsonl = sorted((env.vault_dir / "reme_session" / "agentscope").glob("*.jsonl"))
|
||||
session_jsonl = sorted((env.vault_dir / "session" / "agentscope").glob("*.jsonl"))
|
||||
message_files = [*dumped, *session_jsonl]
|
||||
_print_message_files(message_files)
|
||||
|
||||
|
|
@ -138,7 +138,7 @@ def test_auto_dream_and_proactive():
|
|||
day_index = env.vault_dir / "daily" / f"{DREAM_DATE}.md"
|
||||
changed_note = env.vault_dir / DREAM_INPUT_PATH
|
||||
interests = env.vault_dir / "daily" / DREAM_DATE / "interests.yaml"
|
||||
catalog = env.vault_dir / "reme_metadata" / "file_catalog" / "dream.jsonl"
|
||||
catalog = env.vault_dir / "metadata" / "file_catalog" / "dream.jsonl"
|
||||
assert changed_note.is_file(), f"changed note missing: {changed_note}"
|
||||
assert interests.is_file(), f"interests.yaml missing: {interests}"
|
||||
assert catalog.is_file(), f"dream catalog missing: {catalog}"
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ def test_auto_resource_create():
|
|||
file_path = env.place_resource(RESOURCE_FILENAME, RESOURCE_CONTENT_V1)
|
||||
note_stem = _compute_note_stem(RESOURCE_FILENAME)
|
||||
agent_session_id = _compute_agent_session_id(file_path)
|
||||
expected_session_jsonl = env.vault_dir / "reme_session" / "agentscope" / f"{agent_session_id}.jsonl"
|
||||
expected_session_jsonl = env.vault_dir / "session" / "agentscope" / f"{agent_session_id}.jsonl"
|
||||
|
||||
print(f"[CREATE] file_path = {file_path}")
|
||||
print(f"[CREATE] note_stem = {note_stem}")
|
||||
|
|
@ -142,7 +142,7 @@ def test_auto_resource_create():
|
|||
assert expected_session_jsonl.is_file(), (
|
||||
f"agent session not persisted at {expected_session_jsonl}; "
|
||||
f"AgentScope files: "
|
||||
f"{[p.name for p in (env.vault_dir / 'reme_session' / 'agentscope').glob('*.jsonl')]}"
|
||||
f"{[p.name for p in (env.vault_dir / 'session' / 'agentscope').glob('*.jsonl')]}"
|
||||
)
|
||||
|
||||
note_text = _print_text_file("CREATE result.md", note_path)
|
||||
|
|
@ -198,7 +198,7 @@ def test_auto_resource_update():
|
|||
file_path = env.place_resource(RESOURCE_FILENAME, RESOURCE_CONTENT_V1)
|
||||
note_stem = _compute_note_stem(RESOURCE_FILENAME)
|
||||
agent_session_id = _compute_agent_session_id(file_path)
|
||||
session_jsonl = env.vault_dir / "reme_session" / "agentscope" / f"{agent_session_id}.jsonl"
|
||||
session_jsonl = env.vault_dir / "session" / "agentscope" / f"{agent_session_id}.jsonl"
|
||||
|
||||
response = await app.run_job("auto_resource", changes=[{"path": file_path, "change": "added"}])
|
||||
assert response.success is True, f"Initial create failed: {response.answer!r}"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue