2026-06-20 OpenViking メモリプロバイダー移行
🤖
🔐 概要
OpenViking は Volcengine (ByteDance) 製のオープンソースコンテキストデータベース。 Embedding と VLM は両方ともローカルの Ollama を使用。外部API不要。
📁 構成図
Your Hermes Agent
↕ HTTP (httpx)
OpenViking Server (127.0.0.1:1933)
↕ Ollama API (localhost:11434)
Ollama
bge-m3 → embedding (1024dim) ←これは結局NaNを出して使えなかった
qwen2.5:7b → VLM (要約・抽出)
🔖 インストール手順
📂 Ollama モデルの準備
ollama pull bge-m3 日本語対応の埋め込みモデル(1.2GB)
(VLM用 qwen2.5:7b は既存)
📂 openviking のインストール
python3 -m venv ~/.local/opt/openviking-env
source ~/.local/opt/openviking-env/bin/activate
pip install openviking
※ pre-built wheel (manylinux_2_31_x86_64) あり、NixOS でもコンパイル不要
📂 ~/.openviking/ov.conf の作成
設定ファイルの内容(JSON):
embedding.dense.provider = ollama
embedding.dense.model = bge-m3
vlm.provider = openai(OllamaのOpenAI互換API経由)
vlm.model = qwen2.5:7b
server.host = 127.0.0.1
server.port = 1933
workspace = ~/openviking_workspace
📂 ラッパースクリプト(NixOS用)
~/.local/bin/openviking-server
~/.local/bin/ov
中身: LD_LIBRARY_PATH に GCC の libstdc++.so.6 パスを設定してから openviking を実行
📂 Hermes 側の設定
hermes config set memory.provider openviking
(httpx は Hermes の venv に既にインストール済み)
📋 得られるツール
viking_search セマンティック検索(fast/deep/auto)
viking_read viking:// URI の内容読み取り(L0/L1/L2)
viking_browse ファイルシステム風ナビゲーション
viking_add_resource URL/ドキュメントの取り込み
🔍 確認結果
openviking doctor → ALL CHECKS PASSED
Hermes のツール確認 → viking_* 5個のツールが利用可能
🚧 NixOS のハマりどころ
📂 libstdc++.so.6 問題
NixOS では libstdc++.so.6 が標準パスにない。
OpenViking の Native Engine(Rust製ベクトルDB)が dlopen 時にこのライブラリを必要とする。
対策: ov.conf と openviking-server のラッパースクリプト内で LD_LIBRARY_PATH を設定。
.bashrc に以下を追加してもよい:
for _p in /nix/store/*-gcc-*-lib/lib/libstdc++.so.6; do
-f "$_p" && export LD_LIBRARY_PATH="$(dirname "$_p"):${LD_LIBRARY_PATH:-}" && break done
📂 Python 環境
python3 は nix-shell -p python3 経由。
Hermes 本体の venv は ~/.hermes/hermes-agent/venv/(Python 3.11)。
📌 備考
OpenViking は auth_mode=dev(認証不要)で起動中。
Embedding の初回プローブに約5秒かかる(Ollama への初回リクエスト)。
ByteRover のメモリはそのまま残っている(今回の作業で削除はしていない)。
---
📝 2026-06-20 追記: 移行後に発覚した問題と対応
✅ 対応済み: embedding モデルを bge-m3 → qwen3-embedding:0.6b に変更
症状
bge-m3 が Ollama 経由で NaN を返す
failed to encode response: json: unsupported value: NaN (HTTP 500)
OpenViking 起動直後の async プローブで毎回失敗 → embedding circuit breaker が常時 OPEN
Ollama に直接 curl すると bge-m3 は正常応答 → OpenViking 経由のリクエスト固有
原因
Ollama 上流の既知バグ
部分修正の PR #13599 は normalize 関数の NaN/Inf チェック追加のみで根治していない OpenViking 側で encoding_format="float" を渡せば回避できるかも、と思って試したが
PR #2092 で encoding_format サポートが追加されたが Ollama は対象外(ollama factory は渡さない設計) 対応
bge-m3 を諦めて Ollama 公式の qwen3-embedding:0.6b に乗り換え
1024 dim (bge-m3 と同じ → collection の次元再設計不要)
639MB、多言語、32k コンテキスト
プレフィックス不要 (cl-nagoya/ruri 系は "クエリ: "/"文章: " 前提なので除外)
手順
ollama pull qwen3-embedding:0.6b
~/.openviking/ov.conf の embedding.dense.model を変更
既存 workspace は embedding メタデータが bge-m3 のまま → EmbeddingRebuildRequiredError で起動失敗
ov.conf に allow_metadata_override=true を足せば既存ベクトル流用可だが、bge-m3 空間と qwen3-emb 空間が混在し検索精度が落ち
前回 NaN で実質 indexing 失敗していたので、クリーンリビルドを選択
バックアップ: /tmp/openviking_workspace_backup_20260620_211456.tar.gz (83KB)
rm -rf ~/openviking_workspace && mkdir ~/openviking_workspace
systemctl --user restart openviking-server
code:ov.conf (差分)
"embedding": {
"dense": {
"provider": "ollama",
- "model": "bge-m3",
+ "model": "qwen3-embedding:0.6b",
"dimension": 1024
},
...
}
検証結果
systemd: active (running)
/health → {"status":"ok","healthy":true,"version":"0.4.4"}
POST /api/v1/search/search (query: "OpenViking メモリプロバイダーの設定方法") → score 0.64〜0.67 で正常応答
journal の NaN / circuit breaker / embedding error → 一切なし
症状
AttributeError: 'str' object has no attribute 'value'
スタックトレース起点: openviking/storage/content_write.py の ctx.role.value
原因
PR #2709 (auth refactor) で Role(str, Enum) → Role(str) に変更 .value 参照が 8 ファイル残存していた
修正状況
main では PR #2728 でマージ済み (2026-06-19 05:30 UTC) ただし v0.4.4 タグは 2026-06-18 13:12 UTC → 未収録
v0.4.5 はまだ未リリース (2026-06-20 時点で 0.4.4 が最新)
関連 issue
当面の運用
viking_remember は使わず Hermes 標準メモリで代替
0.4.5+ のリリース待ち、急ぐなら main からソース install かローカルパッチ
⏳ 未対応: Docker への乗り換え検討
📌 学び
encoding_format は OpenAI/Azure には渡るが Ollama には渡らない(設計)
ollama factory 経由は素のリクエストになるので、上流の Ollama 側で不安定なモデルを使うと直撃する
モデル選定では「Ollama での NaN 報告がないこと」を一つの軸にしたほうが良い
NG: bge-m3, nomic-embed-text (空ベクトル報告)
OK: qwen3-embedding 系、multilingual-e5 系、ruri 系(ただしプレフィックス制約)
collection の embedding メタデータは dim 一致でも model 違いで起動拒否される
allow_metadata_override=true か workspace 作り直しのどちらか