CLIメモリコマンドが「Unknown memory embedding provider: ollama」でクラッシュする
CLIメモリコマンド(status、backup、rebuild)は、ollama embedding providerが実行時にプラグインによって登録される,然而、CLIコードパスはプラグインを読み込まないため、ハードコードされたproviderルックアップが失敗し、クラッシュします。
🔍 症状
ollamaプロバイダを設定した状態でCLIメモリアイテムを実行すると、JavaScriptエラーが発生してコマンドが即座に終了します。
エラー出力
$ openclaw memory status
Error: Unknown memory embedding provider: ollama
at getAdapter (manager-FzeN0TEi.js:341:22)
at createEmbeddingProvider (manager-FzeN0TEi.js:393:25)
at MemoryIndexManager.loadProviderResult (manager-FzeN0TEi.js:2759:16)
$ openclaw memory backup
Error: Unknown memory embedding provider: ollama
at getAdapter (manager-FzeN0TEi.js:341:22)
at createEmbeddingProvider (manager-FzeN0TEi.js:393:25)
at MemoryIndexManager.loadProviderResult (manager-FzeN0TEi.js:2759:16)
$ openclaw memory rebuild
Error: Unknown memory embedding provider: ollama
at getAdapter (manager-FzeN0TEi.js:341:22)
at createEmbeddingProvider (manager-FzeN0TEi.js:393:25)
at MemoryIndexManager.loadProviderResult (manager-FzeN0TEi.js:2759:16)影響を受けるコマンド
openclaw memory statusopenclaw memory backupopenclaw memory rebuild
動作するコードパス(Gateway)
Gatewayランタイムでは、メモリシステムの初期化前にプラグインの初期化が行われるため、メモリ検索が正しく処理されます。
# Gateway memory_searchは正常に動作します
$ openclaw gateway memory_search "test query"
[ollama埋め込みを使用して結果を返します]버그를トリガーする設定
# ~/.openclaw/config.yaml
agents:
defaults:
memorySearch:
provider: "ollama"
model: "snowflake-arctic-embed2"
remote:
baseUrl: "http://192.168.1.100:11434"
fallback: "none"🧠 原因
Plugin登録とCLIコードパスのアーキテクチャ上の相違
メモリエンベッディングプロバイダシステムには、互換性のない初期化シーケンスを持つ2つの登録メカニズムが存在します。
メカニズム1: Pluginベース登録(Gateway対応)
ollama pluginは、Plugin APIを通じてランタイム時にエンベッディングプロバイダを登録します。
// extensions/ollama/index.js
api.registerMemoryEmbeddingProvider(ollamaMemoryEmbeddingProviderAdapter);この登録は、Gatewayランタイムでメモリシステムが完全に初期化される前に実行されるPlugin初期化フェーズ中に発生します。
メカニズム2: ハードコードされた組み込み登録(CLI専用)
CLIメモリアイテムは、 hardcoded配列に設定するregisterBuiltInMemoryEmbeddingProviders()を呼び出します。
// manager-FzeN0TEi.js(コンパイル済みバンドル)
const builtinMemoryEmbeddingProviderAdapters = [
'local',
'openai',
'gemini',
'voyage',
'mistral'
];
function registerBuiltInMemoryEmbeddingProviders() {
for (const adapter of builtinMemoryEmbeddingProviderAdapters) {
// 各Adapterとその関連メタデータを登録
}
}失敗シーケンス
- ユーザーが
openclaw memory statusを実行 - CLIが
MemoryIndexManagerインスタンスを初期化 - 設定されたプロバイダ(
"ollama")でMemoryIndexManager.loadProviderResult()が呼び出される createEmbeddingProvider()がgetAdapter()を呼び出すgetAdapter()が内部レジストリで"ollama"をチェック- CLIはPluginをロードしていないため、
"ollama"はレジストリに存在しない - エラーがスローされる:
"Unknown memory embedding provider: ollama"
Gatewayが動作する理由
Gatewayランタイムは、任意のサブシステムを初期化する前に、有効化されたすべてのPluginを明示的にロードして初期化します。
// Gateway初期化シーケンス(簡略化)
await pluginManager.loadPlugins(); // extensions/ollama/index.jsをロード
await pluginManager.initializePlugins(); // api.registerMemoryEmbeddingProvider()を呼び出す
await memoryManager.initialize(); // ollamaがレジストリにある状態になるより広範な影響
builtinMemoryEmbeddingProviderAdapters配列には、ドキュメント化された複数のプロバイダが欠落しています。
- ollama - ファーストパーティのバンドル拡張機能(このバグ)
- lmstudio - ランタイムスキーマで有効とドキュメント化されたもの
- bedrock - ランタイムスキーマで有効とドキュメント化されたもの
これらすべてが、CLIメモリプロバイダとして設定された場合、同一のクラッシュ動作を示します。
プライバシー/セキュリティの副作用
provider: “auto”を回避策として使用すると、自动選択の優先順位チェーンは次のようになります。
local(10) → openai(20) → gemini(30) → voyage(40) → mistral(50)ollamaにはautoSelectPriorityが定義されていないため、自动選択で選択されることは決してありません。ローカル/自己ホスト型埋め込みを求めるユーザーは、メモリデータをOpenAIのサーバーに意図せず送信する可能性があります。
🛠️ 解決手順
推奨修正: OllamaをBuilt-in Providerに追加
managerバンドルのbuiltinMemoryEmbeddingProviderAdapters配列を修正して、ollamaを含めます。
修正前
// manager-FzeN0TEi.js(約XXX行目)
const builtinMemoryEmbeddingProviderAdapters = [
'local',
'openai',
'gemini',
'voyage',
'mistral'
];修正後
// manager-FzeN0TEi.js(約XXX行目)
const builtinMemoryEmbeddingProviderAdapters = [
'local',
'openai',
'gemini',
'voyage',
'mistral',
'ollama'
];実装手順
- ソース管理ファイル(コンパイル済みバンドルではなく)から
builtinMemoryEmbeddingProviderAdapters定義を見つける - 配列の最後の要素として
'ollama'を追加 - アプリケーションバンドルをリビルド
- 代わりに、OpenClawリポジトリにプルリクエストを提交
代替修正: CLIメモリアイテムでPluginをロード
CLIとGateway間の機能パリティを維持することが望ましい場合。
// CLIメモリアイテムの初期化疑似コード
async function initializeMemoryCommands() {
// メモリシステムを初期化する前にPluginをロード
await pluginManager.loadPlugins();
await pluginManager.initializePlugins();
// これでollama(以及其他Pluginプロバイダ)が登録される
registerBuiltInMemoryEmbeddingProviders();
// コマンド設定を続ける
}一時的な回避策(本番環境では非推奨)
プロバイダをbuilt-inプロバイダのいずれかに変更します。
# ~/.openclaw/config.yaml
agents:
defaults:
memorySearch:
provider: "local" # ollamaの代わりにlocalを使用
# または、APIキーがある場合は"openai"を使用
# または"auto"を使用(プライバシーへの影響を考慮)🧪 検証
修正を適用した後、影響を受けるCLIコマンドを実行して検証します。
テストコマンド
# テスト1: メモリステータスコマンド
$ openclaw memory status
✓ メモリインデックスに接続済み
✓ プロバイダ: ollama
✓ モデル: snowflake-arctic-embed2
✓ エンドポイント: http://192.168.1.100:11434
✓ ステータス: Ready
# テスト2: メモリバックアップコマンド
$ openclaw memory backup --output ./memory-backup.json
✓ バックアップが正常に完了しました
✓ レコード: 1,247エントリ
✓ ファイル: ./memory-backup.json
# テスト3: メモリリビルドコマンド
$ openclaw memory rebuild --provider ollama
✓ リビルドを開始しました
✓ 埋め込みを処理中...
✓ 完了: 1,247件のレコードを再埋め込み期待される終了コード
すべてのコマンドは、成功時に終了コード0で終了する必要があります。
統合テスト: CLI対Gatewayパリティ
両方のコードパスが同一の結果を生成することを確認します。
# CLIで同じクエリを実行
$ openclaw memory search "先週のミーティングノート" --limit 5
[
{
"id": "mem_abc123",
"content": "四半期計画ミーティング...",
"score": 0.94
}
]
# Gatewayで同じクエリを実行
$ openclaw gateway memory_search "先週のミーティングノート"
[
{
"id": "mem_abc123",
"content": "四半期計画ミーティング...",
"score": 0.94
}
]
# 結果は一致する必要がありますPreviously Affectされたすべてのプロバイダでのテスト
他のPluginベースプロバイダ(lmstudio、bedrock)も、追加されれば修正されることを確認します。
# lmstudioがbuilt-inプロバイダに追加された場合
$ openclaw memory status --provider lmstudio
✓ プロバイダ: lmstudio
✓ モデル: 設定したモデル
✓ ステータス: Ready⚠️ よくある落とし穴
環境固有のトラップ
- Apple Silicon(macOS arm64): Apple Silicon上のOllamaは、特定のモデルに対してRosetta 2を必要とする場合があります。
ollama serveが実行されていることを確認してからメモリアイテムを実行してください。 - Docker環境: OpenClawがDocker内で実行されている場合、Ollamaエンドポイントにコンテナネットワークからアクセスできることを確認してください。
--network=hostを使用するか、適切なネットワーク設定を構成してください。 - Tailscale/リモートエンドポイント: Tailnet IPを使用する場合は、Tailscaleデーモンが実行されており、サブネットがアドバタイズされていることを確認してください。
設定の落とし穴
- エンドポイントURL形式: ベースURLにはポート番号が含まれている必要があります。不正しい例:
http://192.168.1.100/ollama、正しい例:http://192.168.1.100:11434 - モデル名の不一致: モデル名がOllamaで利用可能なものと完全に一致することを確認してください。
ollama listを実行して確認してください。 - Fallback設定:
fallback: "none"を設定すると、Ollamaに到達できない場合に即座に失敗します。復元力のためにfallback: "local"の使用を検討してください。
「auto」回避策のプライバシーへの影響
# 回避策としてauto-selectを使用するのは誤り
agents:
defaults:
memorySearch:
provider: "auto" # ⚠️ データをOpenAIに送信!
# 正しい方法: ローカルプロバイダを明示的に指定
agents:
defaults:
memorySearch:
provider: "ollama" # ✓ ローカルで維持Plugin対Built-in区別の誤解
多くのユーザーは、プロバイダが2つのカテゴリに分類されることを知りません。
- Built-inプロバイダ: マネージャーにハードコードされており、常に利用可能
- Pluginプロバイダ: ランタイム時にPluginによって登録される
この区別はドキュメント化されていないため、CLIコマンドが失敗했을 때混乱が生じます。
バージョン互換性
このバグはバージョン2026.4.12に影響します。以前のバージョンからアップグレードする場合は、ollama Pluginが新しいマネージャーバンドルと互換性があることを確認してください。
🔗 関連するエラー
直接的に関連するエラー
Unknown memory embedding provider: lmstudio— lmstudioプロバイダも同様に影響を受けるバグ(Plugin登録のため)Unknown memory embedding provider: bedrock— bedrockプロバイダも同様に影響を受けるバグ(Plugin登録のため)Unknown memory embedding provider: [任意のPlugin登録プロバイダ]— このバグの一般化
文脈的に関連するエラー
Plugin initialization failed: ollama— ollama Pluginのロードに失敗したときに発生し,某些情况下このエラーをマスクする可能性があるECONNREFUSED— Ollamaエンドポイントに到達できない場合のネットワークエラー。プロバイダ登録エラーとは異なる。Model not found: [モデル名]— Ollamaサーバーに要求されたモデルがない場合。異なるエラーパス。
歴史的背景
- 2026.3.x: ollamaプロバイダを含む拡張機能のPluginシステムが導入された
- 2026.4.x: CLIメモリアイテムがPlugin初期化をバイパスする отдельныеエントリポイントとして抽出された
- 2026.4.12: この問題のある現在のバージョン( diver bugs)
コードベース内の同様のパターン
同じアーキテクチャパターン(built-in対Plugin登録)は 以下にも存在します。
- メモリ検索プロバイダ
- LLMプロバイダ
- Tool Adapter
これらは同様のCLI対Gatewayの不整合を示す可能性があります。