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))。

  1. 复制内置 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
  1. 把 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: immutable

name 字段保持原样。

  1. 在 ov.conf(容器内 /app/.openviking/ov.conf)里启用:
"memory": {
    "custom_templates_dir": "/app/.openviking/custom_templates"
}
  1. 重启服务生效。

验证

改完模板后正常对话,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 命名的目录层级,不需要改。

编辑此页

目录