# OpenViking 记忆目录中英文分裂：用自定义模板统一


OpenViking 的记忆路径出现中英文两套目录：`entities/infrastructure/` 和 `entities/基础设施/` 并存，装的是同类内容。根因在 session commit 的自动提取流程：它按会话语言生成目录名，中文会话就写出中文目录。改记忆模板可以统一目录命名，步骤在下面。

## 现象

`viking://user/<user>/memories/entities/` 下同时存在：

```
entities/infrastructure/   ← dmit.md、surface.md（Hermes 通过 viking_remember 写入）
entities/基础设施/         ← backrest_backup.md、legion_wsl.md（session commit 自动提取）
entities/services/         ← hermes_gateway_sessions.md
entities/服务/             ← 同上，另一套
```

两个入口写入的目录语言不一致：Hermes 写英文目录，OpenViking 自动提取写中文目录，同一类内容被拆成两份。

## 根因

session commit 提取记忆时，OpenViking 会按会话内容自动检测输出语言（`session_extract_context_provider.py` 的 `_detect_language()`）。中文会话 → 模板变量 `{{ language }}` = zh-CN。

记忆类型的 YAML 模板里，entities 的目录由 category 字段决定：

```yaml
# prompts/templates/memory/entities.yaml
filename_template: "{{ category }}/{{ name }}.md"

fields:
  - name: category
    description: |
      Category written in {{ language }}.
      {% if language == 'en' %}Use lowercase with underscores, max 3 words.{% else %}Keep it concise and natural in {{ language }}.{% endif %}
```

语言自适应让 LLM 用中文写 category（"基础设施"、"服务"），目录就变成了中文。文件名的 name 字段允许中英混合，不影响路径层级，不用管。

## 修改模板

OpenViking 支持 `memory.custom_templates_dir`：从该目录加载的 YAML 会覆盖内置同名模板（`MemoryTypeRegistry.load_from_directory(..., replace=True)`）。

1. 复制内置 entities.yaml 到自定义目录：

```bash
mkdir -p /path/to/openviking/data/custom_templates
podman cp systemd-openviking:/app/.venv/lib/python3.13/site-packages/openviking/prompts/templates/memory/entities.yaml \
  /path/to/openviking/data/custom_templates/entities.yaml
```

2. 把 category 字段的 description 改成无条件英文（不依赖 `{{ language }}`）：

```yaml
# custom_templates/entities.yaml
  - name: category
    type: string
    description: |
      ALWAYS English: lowercase with underscores, max 3 words.
      Never use Chinese or any other language for this field, even if the conversation is in Chinese.
    merge_op: immutable
```

name 字段保持原样。

3. 在 `ov.conf`（容器内 `/app/.openviking/ov.conf`）里启用：

```json
"memory": {
    "custom_templates_dir": "/app/.openviking/custom_templates"
}
```

4. 重启服务生效。

## 验证

改完模板后正常对话，session commit 提取的新实体全部落在英文目录：

| 会话提到的实体                   | 落盘路径                                                |
| -------------------------------- | ------------------------------------------------------- |
| netcup 服务器                    | `entities/infrastructure/netcup.md`（并入已有英文目录） |
| wireguard 隧道                   | `entities/networking/wireguard_tunnel.md`               |
| PEAK（合作攀岩游戏，用户装模组） | `entities/game/peak.md`                                 |

没有新的中文目录产生。事件类记忆的文件名仍可以是中文（`events/2026/08/12/WireGuard隧道配置完成.md`），文件名不影响路径统一。

其他记忆类型（events、preferences、cases 等）的目录都是固定结构（日期、用户名），不存在 LLM 命名的目录层级，不需要改。


---

> 作者: Nite  
> URL: https://www.nite07.com/zh-cn/posts/openviking-memory-path-language/  

