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 字段决定:
# 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))。
- 复制内置 entities.yaml 到自定义目录:
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- 把 category 字段的 description 改成无条件英文(不依赖
{{ language }}):
# 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: immutablename 字段保持原样。
- 在
ov.conf(容器内/app/.openviking/ov.conf)里启用:
"memory": {
"custom_templates_dir": "/app/.openviking/custom_templates"
}- 重启服务生效。
验证
改完模板后正常对话,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 命名的目录层级,不需要改。