Newer
Older
TelosDB / docs / sidecar_integration.md

llama-server Sidecar 統合詳細

🧠 コンセプト

本アプリケーションは、外部の LLM サーバー(埋め込み用)に依存せず、スタンドアロンで動作することを目指しています。これを実現するために、Tauri の Sidecar 機能を利用して llama-server プロセスをバックエンド(Rust)から直接起動・管理しています。

🛠️ 技術的課題と解決策:Windows における DLL 解決

Windows 環境において、外部バイナリ(.exe)を Sidecar として実行する際、最も大きな懸念点は「依存 DLL(ggml.dll, llama.dll 等)の読み込みエラー」です。

通常、Windows は以下の順序で DLL を検索します。

  1. 実行ファイルのあるディレクトリ。
  2. カレントディレクトリ。
  3. システムディレクトリ。
  4. PATH 環境変数に含まれるディレクトリ。

Tauri のデフォルト設定で Sidecar を起動すると、実行ディレクトリやカレントディレクトリの解決が不安定になり、DLL が見つからず起動に失敗するケースが多発します。

本プロジェクトでの解決アプローチ

src-tauri/src/lib.rs において、以下の 3 つの戦略を組み合わせて「DLL 地獄」を回避しています。

1. 実行パスの絶対パス解決

std::env::current_dir()PathBuf を駆使し、実行バイナリとモデルファイルのパスをOSに依存しない形式で、なおかつ「絶対パス」で構築します。

2. 起動時カレントディレクトリ (CWD) の強制指定

Command::current_dir を使用して、Sidecar の起動ディレクトリを、バイナリと DLL が物理的に配置されている src-tauri/bin (またはインストール先の対応フォルダ) に強制的に設定します。これにより、Windows の検索ルール (1) が確実に適用されます。

3. 環境変数 PATH の継承と補強

親プロセス(Tauri 本体)の PATH を取得し、その先頭に Sidecar フォルダへのパスを明示的に追加した上で、Sidecar プロセスに渡します。

// 概念コード (lib.rs)
let mut current_path = std::env::var_os("PATH").unwrap_or_default();
let mut paths = std::env::split_paths(&current_path).collect::<Vec<_>>();
paths.insert(0, sidecar_dir_path.clone()); // DLLのあるフォルダを最優先に

let new_path = std::env::join_paths(paths).unwrap();
let mut cmd = tauri::process::Command::new_sidecar("llama-server").unwrap();
cmd = cmd.current_dir(sidecar_dir_path); // CWDの設定
cmd = cmd.env("PATH", new_path); // 補強されたPATHの継承

🔄 ライフサイクル管理

Sidecar は単なる「起動」だけでなく、適切な「終了」も管理されています。

  1. 起動: アプリ本体の setup フック内でスピンアップ。
  2. 疎通確認: 起動直後、バックエンドから health check リクエストを送り、準備完了を待機。
  3. 終了: アプリ本体の終了イベント(トレイからの Quit 等)に連動して、Sidecar プロセスを確実に Kill します。これにより「ゾンビプロセス」の発生を防ぎます。

⚙️ Sidecar の実行引数 (最適化)

llama-server は以下のオプションで最適化されて起動します。

  • --host 127.0.0.1: ローカルループバックアドレスに限定(セキュリティ)。
  • --port 8080: デフォルトの待機ポート(環境変数で変更可能)。
  • -m [MODEL_PATH]: Gemma 3 300M の GGUF ファイルを指定。
  • --embedding: 埋め込み抽出機能を有効化。
  • --parallel 4: 同時リクエスト処理数の最適化。

💡 トラブルシューティング

Sidecar が起動しない場合

  1. バイナリの存在: libs/llama-server.exe が正しいアーキテクチャ名(llama-server-x86_64-pc-windows-msvc.exe 等)で配置されているか確認してください。
  2. DLL の存在: 同一フォルダに ggml.dll, llama.dll が存在することを確認してください。
  3. Vulkan: 最新の GPU ドライバがインストールされているか確認してください。