ReMe/docs4/reme_design.md
jinliyl 83831ec90c
feat(core): enhance reme4 (#281)
### 1. Agent Wrapper(统一 Agent 后端抽象)
- **`base_agent_wrapper.py`**:`reply()` 返回值从 `tuple[str, Any]` 改为 `dict`(含 `session_id` / `last_message` / `result` / 可选 `structured_output`);`reply_stream()` 改为产出统一的 `StreamChunk`。废弃 `add_tools()`,改为 `add_job_tools(names: list[str])`(按名解析 BaseJob)与 `add_skills()`;新增 `_resolve_job_tools()`、`_merged_kwargs()`、`_chunk()` 辅助方法及 `project_path` / `project_skills_root` 属性。
- **`as_agent_wrapper.py`(AgentScope 后端)**:
  - 会话持久化重写:`session_path` 落地到 `<vault>/<session_dir>/agentscope/`,`_load_state` 支持 `resume` / `session_id` / `fork_session`,并做 UUID 校验(`_validate_session_id`);`_cleanup_expired_sessions` 按天数清理过期会话。
  - 新增内置工具集(`BypassAnalysisBash` + Edit/Glob/Grep/Read/Write),`BypassAnalysisBash` 绕过 AgentScope 自带 Bash 静态分析以让 permission_mode 生效;`_resolve_skills()` 把配置的 skill 暴露给后端,`_load_tool_env()` 注入项目 `.env`。
  - `_event_to_chunk()` 把 20+ 种 AgentScope 事件(Reply/Text/Thinking/Data/ToolCall/ToolResult/ModelCall/ExceedMaxIters)归一化为 `StreamChunk`。
- **`cc_agent_wrapper.py`(Claude Code SDK 后端,+551 行)**:
  - 新增 `_CcFileSessionStore`:基于 vault 的文件型会话存储,实现 append(按 uuid 去重)/ load / list / delete / list_subkeys,并对路径做 `_safe_parts` + `resolve()` 防越界校验。
  - `_build_options()`:统一构建 `ClaudeAgentOptions`,处理 skills、disallowed_tools(默认禁 `WebSearch`)、`.env` 注入、Claude Code 的 API 凭据解析(`_claude_code_api_env`,多级 base_url/api_key 回退)、`CLAUDE_CONFIG_DIR` 设置、skill 目录软链接(`_ensure_claude_skill_dir`)。
  - `_raw_event_to_chunk()` / `_message_content_to_chunks()`:把 Anthropic 流式事件(message_start/delta/stop、content_block_*)与 SDK 消息块(AssistantMessage/UserMessage/ResultMessage/RateLimitEvent)转换为统一 `StreamChunk`;跟踪 block_id/block_type/tool_call_name 做关联;处理尾部 `"success"` 误报异常的吞掉逻辑。

### 2. 统一流式协议(StreamChunk / ChunkEnum)
- **`stream_chunk.py`**:`StreamChunk` 扩展为承载 AS + CC 双后端完整信息的统一结构,新增 `session_id` / `block_id` / `tool_call_id` / `tool_call_name` / `media_type` / `input_tokens` / `output_tokens` 等字段,纯文本流仍保持轻量。
- **`chunk_enum.py`**:补全生命周期标记 `REPLY_START` / `REPLY_END`,并文档化两套后端事件 → ChunkEnum 的映射。

### 3. Index 模块重构(变化批次化 + dispatch)
- 新增 `_change_batch.py`:`coalesce_changes()` 把同路径多次事件折叠为最终状态(结合 path 存在性判定),`bucket_changes()` 按 watchfiles.Change 分桶。
- 新增 `init_changes.py`(`InitChangesStep`):一次性扫描,对比 file_store / file_catalog 已索引节点计算 added/modified/deleted,写入 `context["changes"]` 后 dispatch。
- 新增 `update_changes.py`:抽象基类 `ChangeApplyStep` 统一 added/modified/deleted 处理与错误收集;`UpdateCatalogStep`(写 file_catalog)、`UpdateIndexStep`(写 file_store,含按后缀解析 chunker)。
- **`watch_changes.py`**:改用 `dispatch_step_specs`(基类提供的 `dispatch_steps()`),每批先 `coalesce_changes` 再 dispatch;默认参数调整(debounce 5000ms / step 1000ms / poll 5000ms)并暴露常量。
- 删除旧步骤:`clear_and_scan` / `foreach_dispatch` / `scan_changes` / `update_catalog`(旧) / `update_index`(旧);`clear_store.py` 取代 clear_and_scan。

### 4. Evolve / Dream 模块(拆分为多步 pipeline)
- 删除旧的单体 `auto_dream.py` / `dream.py` / `dream.yaml`,新增 `dream/` 子包,按 5 个步骤组织:
  - **`extract.py`**:扫描当日 day-index + daily 笔记,对比 file_catalog 找出 changed/deleted,调用 LLM 全局抽取 `units`(procedure/personal/wiki 三桶)与 `topics`,路径与桶做清洗/路由。
  - **`integrate.py`**:逐个 unit 调用 LLM 写入 digest,结构化输出 `IntegrateOutcome`(CREATE/CORROBORATE/REFINE/CORRECT),失败 unit/路径收集回写。
  - **`topics.py`**:写 `daily/<date>/interests.yaml`,结合当天已有 + 近 N 天做去重(`normalize_topic`),可走 LLM 或纯规则去重两条路径。
  - **`proactive.py`**:读取当日 `interests.yaml`,作为主动推荐话题的入口。
  - **`finish.py`**:把变更路径落盘到 dream file_catalog(checkpoint),渲染最终汇总摘要。
- 新增 `schema.py`(`DreamState` 等跨步骤共享状态与结构化输出模型)与 `utils.py`(状态存取、扫描打包、YAML 读写、结构化回复解析等公共函数)。
- `evolve/__init__.py` 导出全部新 step。

### 5. auto_memory / auto_resource(适配新 Agent API)
- **`auto_memory.py`**:会话路径迁移到 `<session_dir>/dialog/<session_id>.jsonl`;改用 `job_tools`;新增 `source_conversation` frontmatter 反向链接(`_session_link`);执行后刷新 day 索引(`refresh_day_index`),并对 session_id 做合法性校验。
- **`auto_resource.py`**:资源改用「同名 daily note」方案(`_compute_note_stem` 取文件 stem);批量处理 `changes: list[dict]`(`_handle_change` 逐项处理,返回逐项结果摘要);agent 会话 id 用稳定的 `uuid5`;同样刷新 day 索引。

### 6. BaseStep 基类增强
- 新增 `dispatch_steps` / `dispatch_step_specs` 机制:`_resolve_dispatch_step()` 支持字符串或 dict 形式的 step spec,`dispatch_steps()` 复用当前 context 调用下游 step。
- 新增 `config_value()`:按 key 取 app config,缺失时回退 `ApplicationConfig` 默认值。
- 小幅清理:`language` 初始化、`copy()`、`Ref.__init__` 签名精简。

### 7. Components 改动
- **`file_store/local_file_store.py`**:持久化改用 zstd 压缩(`.jsonl.zst`,通过新 `utils/jsonl_zst.py`);upsert 时先删除旧 chunk 的 keyword 文档;embedding 复用改为 `(text, embedding)` 键控,要求文本一致才复用;新增 `_matches_search_filter()` 对 vector/keyword 搜索做 path/path_prefix/metadata 的统一后过滤。
- **`keyword_index/bm25_index.py`**:索引文件名加入组件名 + tokenizer 指纹(sha256 前 12 位),快照/恢复时校验指纹防配置漂移;空索引 dump 时删除文件,加载失败抛错而非静默。
- **`file_chunker/markdown_file_chunker.py`**:弃用 `python-frontmatter`,改用内置 YAML 解析(非法 YAML 不阻断正文索引),并修正因 frontmatter 占用行号导致的 AST 行号偏移(`line_offset`)。
- **`cron_job.py`**:大幅简化(-187 行),由原来「dispatch 外部 job/step + 多种调度模式」改为「在自身 steps 上跑 cron 表达式」;`Application` 启动顺序随之调整为 base > stream > background > cron。
- 其余小调整:service(base/http/mcp)、file_graph、file_catalog、as_llm、as_embedding、tokenizer、prompt_handler、base_component 的签名/接口微调。

### 8. Application 生命周期
- `_start()` 启动顺序明确为 components → base → stream → background → cron,启动失败会触发 `_close()` 回滚并 re-raise(不再吞异常)。
- 启动时创建 `session_dir` 目录;新增 `update_component()`(按类型/名就地更新已存在组件,不存在则报错)。

### 9. File IO / 路径安全
- **`_path.py`**:`resolve_path` 增加 vault 越界防护(`is_relative_to` 校验),禁止 `.` / `..` 路径分量,支持 `allow_empty`。
- **`read.py`**:大文件(超过 `MAX_FILE_READ_BYTES`)走按行读取 `read_file_lines_safe`,避免一次性载入内存。
- **`_file_io.py` / `_daily_index.py` / `_path.py`** 等支持函数补齐(如 `refresh_day_index`、`read_file_lines_safe`)。
- **`env_utils.py`**:新增 `parse_env_file()`,`load_env()` 返回加载到的键值、支持 `override`、对无路径调用做幂等缓存。

### 10. Config
- `ApplicationConfig` 新增 `session_dir`(默认 `reme_session`)。
- `config_parser.py`:环境变量展开后做类型转换(`_convert_value`)、dot-notation 与 key=value 参数校验更严格、配置文件路径支持相对 `_CONFIG_DIR` 查找、根非 dict 报错。
- `default.yaml`:作业编排改用 `init_changes_step` + `dispatch_steps`(index/resource/digest 三个 watch loop 与 reindex);新增 `auto_dream`(4 步)、`proactive` 作业,移除旧 `dream`;file_catalog 增配 `resource` / `digest` / `dream` 实例;LLM 默认值与 Claude Code 凭据配置调整(tool_result_limit 50000、thinking_enable=false 等)。

### 11. 其它
- 新增 `steps/common/add.py`(`AddStep` 算术 demo)、`channel/__init__.py` 与 common `__init__` 导出整理。
- 新增 4 篇文档:`docs4/auto_dream_logic_and_step_refactor.md`、`docs4/watch_loop_step_refactor_plan.md`、`docs4/todo.md`,以及 `reme_design.md` 更新。
**
2026-06-19 01:35:31 +08:00

389 lines
24 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ReMe 设计文档
## 整体定位
> 一句话总结:**自进化的个人知识库**——你只管往里扔东西和对话,它自己长成一张知识图谱。
## 特性1:记忆分层
记忆按"原始 → 浅加工 → 深加工"三层组织:
### 1.1 目录结构
```
- reme_session/
- agentscope|claude_code / # 使用内置的agent wrapper,session会保存在这里
{session_id}.jsonl UUID格式要求 # /Users/yuli/workspace/ReMe/reme4/components/agent_wrapper
- dialog/
{session_id}.jsonl # auto memory保存 可以监控可以被检索【可选】
- resource/
- YYYY-MM-DD/
- {channel}_{xxxx}.html
- {channel}_{xxxx}.md
- daily/【日记,浅加工】
- YYYY-MM-DD.md
- YYYY-MM-DD/
- session_{session_id}.md
- {resource_stem}.md
- digest/
- personal/
- procedure/
- wiki/
```
### 1.2 分层详解
| 目录 | 存什么 | 谁写入 | 举例 |
|---------------------|----------------|-------------|-----------------------------------|
| `resource/` | 原始文件(研报、网页、邮件) | upload / 手动 | PDF 研报、对话 JSONL |
| `daily/` | 每天的事件记录 | auto-memory | "调试登录 CSS"、"与 Alice 聚餐" |
| `digest/procedure/` | 方法论、步骤 | auto-dream | "webpack 编译卡死排查路径" |
| `digest/personal/` | 用户画像、偏好 | auto-dream | "用户不爱写注释"、"用户喜欢 pnpm" |
| `digest/wiki/` | 通用知识、决策先例 | auto-dream | "光伏产业链"、"React Server Components" |
`resource/` 和 `daily/` 是只增不删的流水账;`digest/` 下三个桶是反复消费的精华层,各桶有独立的整合 prompt。
## 特性2:Obsidian 兼容的 Markdown 格式
所有笔记都是标准 Markdown + Obsidian 语法,可以直接用 Obsidian 打开浏览:
```
┌─────────────────────────────────────────────────────────────┐
│ 一个 .md 文件的完整结构 │
├─────────────────────────────────────────────────────────────┤
│ --- │
│ name: 宁德时代 ← YAML front matter │
│ description: 全球动力电池龙头 │
│ tags: [新能源, 电池] │
│ --- │
├─────────────────────────────────────────────────────────────┤
│ 所属行业:: [[新能源]] ← 语义化链接(Dataview) │
│ 竞争对手:: [[比亚迪]] │
│ │
│ # 基本面 ← Markdown 正文 │
│ 全球动力电池出货量第一,核心技术为 │
│ [[CTP]] 和 [[钠离子电池]]…… ← 标准 wikilink │
│ │
│ 参考 ![[2026Q1调研纪要]] ← 嵌入引用 │
├─────────────────────────────────────────────────────────────┤
│ ↓ AST 语义分块 ↓ │
│ chunk 1: [标题骨架] + 正文片段 │
│ chunk 2: [标题骨架] + 正文片段 │
└─────────────────────────────────────────────────────────────┘
```
### 2.1 YAML front matter
每个笔记头部的元数据:
```markdown
---
name: 光伏产业链研究
description: 从硅料到组件的全链条梳理
tags: [新能源, 光伏, 产业链]
---
```
`name` / `description` 是约定字段,其余键值对全部保留,不会丢弃任何自定义字段。
### 2.2 四种 wikilink 写法
| 写法 | 示例 | 语义 |
|------|----------------|----------|
| 标准链接 | `[[光伏产业链]]` | 指向目标文件 |
| 锚点链接 | `[[钴#应用]]` | 指向特定章节 |
| 别名链接 | `[[宁德时代\|宁德]]` | 自定义显示文本 |
| 嵌入引用 | `![[钴]]` | 内联嵌入目标内容 |
### 2.3 语义化链接(Dataview 风格)
普通 wikilink 只说"A 提到了 B",语义化链接还能表达"A 和 B 是什么关系":
```markdown
所属行业:: [[新能源]] ← 行级属性(独占一行)
总部:: [[宁德]]
[竞争对手:: [[比亚迪]]] ← 内联属性(嵌入正文中)
```
`WikilinkHandler` 是全系统唯一的 wikilink 解析入口,确保 parser、graph、search 各层规则一致。
### 2.4 AST 感知的语义分块
传统 RAG 按固定 token 长度切片,经常切坏文档结构。ReMe 基于 Markdown AST 做语义分块:
- 按 H1/H2/H3 章节嵌套建树,递归分块
- **每个 chunk 保留完整标题骨架**——检索到片段后一眼看出它在哪个章节下
- 表格自动重复表头、代码块保留 fence、列表按项打包
```
示例 chunk:
─────────────────────
# 光伏产业链
## 上游:硅料
### 多晶硅工艺
[chunk 正文] ← 实际内容
## 中游:硅片 ← 骨架(只有标题)
## 下游:组件
─────────────────────
```
## 特性3:自进化
> **ReMe 的记忆不是被动存的,是主动长成知识图谱的。**
```
用户对话 / 外部素材
│
├───────────────────────────────────┐
▼ ▼
┌────────────┐ ┌────────────┐
│ auto-memory│ │auto-resource│
│ 对话→日记 │ │ 素材→解析 │
└─────┬──────┘ └──────┬─────┘
│ │
▼ ▼
┌─────────────────────────────────────────────────┐
│ daily/ │
│ (事件日记 + resource 加工笔记) │
└─────────────────────┬───────────────────────────┘
│
▼ 定时触发
┌─────────────┐
│ auto-dream │
│ 提炼 + 建图谱 │
└──────┬──────┘
│
▼
┌─────────────────────────────────────────────────┐
│ digest/ │
│ (知识卡片 + wikilink 互联 = 知识图谱) │
└─────────────────────────────────────────────────┘
```
用户什么都不用做,Agent 在后台让笔记自己长出结构。
### 3.1 auto-resource
监控 `resource/` 目录,新文件进来后自动解析内容、整理为结构化笔记写入 `daily/` 下。
### 3.2 auto-memory
对话进行时,ReMe 在后台把上下文自动写入当天日记。不是简单的对话摘要——而是一个拥有完整读写能力的 LLM
Agent,自己决定记什么、怎么组织、合并还是新增。
### 3.3 auto-dream + auto-link:睡眠式记忆整理
借鉴人在睡眠中巩固记忆的机制——把日记和素材提炼成知识卡片,并自动织出图谱关系:
```
┌───────────────────────────┐
│ daily/2026-05-28/xxx.md │ ← 一篇日记或素材
└─────────────┬─────────────┘
│
╔═════════════════════════════════════╗
║ Phase 1 — Extract(一个 Agent) ║
║ "这份材料教了什么道理?" ║
║ ║
║ 输出 N 个抽象单元,各带 bucket 标签 ║
║ (空 → 结束,没东西值得记) ║
╚══════════╤══════════╤═══════════════╝
│ │
┌─────────────┘ └──────────────┐
▼ ▼
╔══════════════════════════════╗ ╔══════════════════════════════╗
║ Phase 2 — Integrate ║ ║ Phase 2 — Integrate ║
║ (每个 unit 独立一个 Agent) ║ ║ (每个 unit 独立一个 Agent) ║
║ ║ ║ ║
║ 1. search + traverse 召回 ║ ║ 1. search + traverse 召回 ║
║ 2. 决策: CREATE / UPDATE ║ ║ 2. 决策: CREATE / UPDATE ║
║ 3. 写入 + 自动织链接 ║ ║ 3. 写入 + 自动织链接 ║
╚══════════════╤═══════════════╝ ╚══════════════╤═══════════════╝
│ │
▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ digest/ │
│ procedure/key-rotation.md ←─ derived_from:: [[daily/..]] │
│ wiki/credential-compliance.md ─ relates_to:: [[...]] │
│ personal/user-pr-pref.md │
└──────────────────────────────────────────────────────────────┘
知识图谱自动生长
```
**Phase 1 筛选**——多个事实说明同一个道理就合并为一个 unit,分到三个桶:`procedure`(怎么做)/ `personal`(用户偏好)/ `wiki`
(通用知识)。没东西值得记则流程结束。
**Phase 2 先搜后写**——先搜已有 digest,再决策:新建(CREATE)、追加佐证(CORROBORATE)、补充精度(REFINE)、修正矛盾(CORRECT)。
**auto-link 是写入的副产品**——写 digest 时自动加 `derived_from:: [[素材]]` 溯源 + `relates_to::` 概念互联,图谱随每次
dream 自动变密。
**CronDreamer 定时批跑**——每天扫描当天所有 daily + resource 文件,逐个执行上述管线。
## 特性4:混合索引 + 渐进式展开
```
用户提问: "宁德时代的电池技术?"
│
├──────────────────────┬──────────────────────────┐
▼ ▼ │
┌─────────────────┐ ┌──────────────────┐ │
│ 全文倒排索引 │ │ 向量索引 │ │
│ (numpy + jieba) │ │ (faiss) │ │
│ │ │ │ │
│ "宁德时代" 精确 │ │ "动力电池龙头" │ │
│ 命中 │ │ 语义近似命中 │ │
└────────┬────────┘ └────────┬─────────┘ │
│ text_weight=0.3 │ vector_weight=0.7 │
└──────────┬──────────┘ │
▼ │
┌───────────────┐ │
│ RRF 融合排序 │ │
│ score = Σ(w/(k+rank)) │
└───────┬───────┘ │
▼ │
┌──────────────────────────────────────┐ │
│ 第一跳:Top-K chunk 全文 + 评分 │ │
└───────────────────┬──────────────────┘ │
▼ │
┌──────────────────────────────────────┐ │
│ 第二跳:邻居目录(只有标题,不展开正文)│ ← wikilink 图谱 │
└───────────────────┬──────────────────┘ │
▼ │
┌──────────────────────────────────────┐ │
│ 第 N 跳:Agent 按需追问,展开正文 │ │
└──────────────────────────────────────┘ │
```
### 4.1 混合索引构建
两套索引并行维护,各擅其长:
- **全文倒排索引**(基于numpy)——精确匹配专有名词,搜"宁德时代"必须命中。支持增量更新索引,无原生扩展依赖。
- **向量索引**(基于faiss)——语义相似度,搜"锂电正极原料"能命中"钴"。
### 4.2 基于 RRF 的混合检索
两条通路并行跑(`asyncio.gather`),用 RRF(Reciprocal Rank Fusion)融合排序:
```
融合分 = Σ( weight_i / (k + rank_i) ) k=60, vector_weight=0.7, text_weight=0.3
```
为什么要两路?纯向量容易错配名词("苹果公司"≈"水果"),纯关键词抓不到同义改写——融合互补盲区。
### 4.3 渐进式链接展开
传统 RAG 一次性把 Top-K 全塞进上下文,token 浪费且噪音多。ReMe 分跳展开,按需深入:
**第一跳** — 返回命中 chunk 全文 + 分数明细
**第二跳** — 展开 wikilink 邻居的"目录"(只有标题,不展开正文):
```
========== digest/wiki/宁德时代.md:5-22 [score=0.0247 vector=0.0156 keyword=0.0091] ==========
# 宁德时代
全球动力电池出货量第一,核心技术为 CTP(Cell to Pack)和钠离子电池……
outlinks (2):
→ digest/wiki/磷酸铁锂.md name="磷酸铁锂正极路线" description="磷酸铁锂与三元路线对比" via predicate=相关技术
→ digest/wiki/固态电池.md name="固态电池技术路线" description="全固态与半固态进展" via predicate=技术演进
inlinks (2):
← daily/2026-03-18/宁德调研.md name="宁德时代调研纪要" description="2026Q1产能与订单跟踪" via plain
← digest/wiki/新能源产业链.md name="新能源产业链全景" description="从锂矿到整车的全链条" via predicate=下游应用
```
**第 N 跳** — Agent 看过"目录"后,自己决定哪些邻居值得深入,再发起 read 拿正文。
二跳目录每条只占一行(最多 10 outlink + 10 inlink),Agent 拥有全局视野却不撑爆上下文。
## 特性5:多 Agent 框架集成
ReMe 不做独立 Agent 产品,而是作为**能力层**被任意框架调用:
| 集成路径 | 适用对象 | 方式 |
|---------------------|----------------------|---------------------------------------------|
| SDK 深度集成 | AgentScope / Qwenpaw | middleware 注册 tools + prompt,hook 注册 auto-* |
| MCP Tool + skill.md | Claude Code | MCP 注册 Tool,配 skill.md 开箱即用,hook 注册 auto-* |
| HTTP API + CLI | 通用方案 | skill.md + CLI 调用 |
---
# 二、工程架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Service 层(HTTP / MCP 双协议) │
│ FastAPI + FastMCP,同一套 Job 同时暴露为 REST 和 MCP Tool │
├─────────────────────────────────────────────────────────────────┤
│ Application 层 │
│ 配置加载 → 组件初始化 → Job 注册 → start() / close() 生命周期 │
├─────────────────────────────────────────────────────────────────┤
│ Job 层(编排) │
│ 每个 Job = 一组 Step 的有序管线,YAML 声明式配置 │
├─────────────────────────────────────────────────────────────────┤
│ Step 层(业务逻辑) │
│ 原子操作单元,按功能域分组:file_io / index / evolve / common │
├─────────────────────────────────────────────────────────────────┤
│ Component 层(可插拔基础设施) │
│ 统一注册表 R,一行配置切换实现 │
│ file_store / embedding / keyword_index / llm / file_graph │
└─────────────────────────────────────────────────────────────────┘
```
## 2.1 服务层
每个 Job 同时暴露为两种协议,写一次逻辑、两种方式调用:
| 协议 | 传输方式 | 适用场景 |
|---------------|-------------------------------|------------------------------|
| HTTP(FastAPI) | JSON POST / SSE | REST 调用、Web 前端 |
| MCP(FastMCP) | stdio / SSE / streamable-http | Claude Code、Cursor 等 MCP 客户端 |
- **按需拉起**:Agent 检测到服务未运行时自动后台启动,用户无感知
- **服务发现**:通过 `REME_SERVICE_INFO` 环境变量广播地址,`find_reme` 一键探活
## 2.2 组件系统(Component)
统一注册表 `R`,所有基础设施都是可插拔的——改一行配置就能切换后端:
| 组件 | 干什么 | 可选后端 |
|-----------------|---------------|-----------------------|
| file_store | 文件存储 + 索引协调 | local |
| file_graph | wikilink 双向图谱 | local / nx / neo4j |
| keyword_index | 全文倒排索引 | bm25(numpy + jieba) |
| embedding_store | 向量存储与检索 | local(faiss) |
| embedding | 文本转向量 | openai 兼容接口 |
| llm | 大模型调用 | anthropic / openai 兼容 |
| tokenizer | 分词 | regex / jieba |
## 2.3 Job 列表
**Job** 是 ReMe 暴露给外部的操作单元——同一个 Job 可以作为 Python 函数直接调用、作为 MCP Tool 被 Agent 使用、也可以作为 CLI
命令执行。
| 类别 | Job | 功能 |
|------|---------------------------|----------------------------------|
| 检索 | `search` | 混合检索(向量 + BM25 + RRF)+ 渐进式图展开 |
| 检索 | `traverse` | 从指定路径遍历 wikilink 图谱 |
| 文件读写 | `read` | 读取 markdown 文件内容 |
| 文件读写 | `read_image` | 读取图片文件(base64) |
| 文件读写 | `write` | 新建或覆写 markdown 文件(含 frontmatter) |
| 文件读写 | `edit` | 文件内查找替换 |
| 文件读写 | `delete` | 删除文件,返回残留入边 |
| 文件读写 | `move` | 移动 / 重命名,自动重写 wikilink |
| 文件读写 | `list` | 列出目录下文件 |
| 文件读写 | `stat` | 文件元信息(大小、修改时间) |
| 文件读写 | `frontmatter_read` | 读取 frontmatter |
| 文件读写 | `frontmatter_update` | 合并更新 frontmatter |
| 文件读写 | `frontmatter_delete` | 删除 frontmatter 字段 |
| 日记管理 | `daily_create` | 幂等创建当天日记文件 |
| 日记管理 | `daily_list` | 列出某天的所有日记 |
| 日记管理 | `daily_reindex` | 重建当天索引页 |
| 索引维护 | `reindex` | 清空并全量重建索引 |
| 索引维护 | `update_store_index_loop` | 后台监听文件变更,增量更新 |
| 自进化 | `auto_memory` | 对话记录写入日记(LLM Agent) |
| 自进化 | `dream` | 单文件记忆提炼到 digest(LLM Agent) |
| 自进化 | `auto-dream` | 批量扫描当天文件,逐个 dream |
| 系统 | `health_check` | 组件健康检查 |
| 系统 | `version` | 返回版本号 |
| 系统 | `help` | 列出所有已注册 Job |