本アプリケーションは、外部の LLM サーバー(埋め込み用)に依存せず、スタンドアロンで動作することを目指しています。これを実現するために、Tauri の Sidecar 機能を利用して llama-server プロセスをバックエンド(Rust)から直接起動・管理しています。
Windows 環境において、外部バイナリ(.exe)を Sidecar として実行する際、最も大きな懸念点は「依存 DLL(ggml.dll, llama.dll 等)の読み込みエラー」です。
通常、Windows は以下の順序で DLL を検索します。
PATH 環境変数に含まれるディレクトリ。Tauri のデフォルト設定で Sidecar を起動すると、実行ディレクトリやカレントディレクトリの解決が不安定になり、DLL が見つからず起動に失敗するケースが多発します。
src-tauri/src/lib.rs において、以下の 3 つの戦略を組み合わせて「DLL 地獄」を回避しています。
std::env::current_dir() や PathBuf を駆使し、実行バイナリとモデルファイルのパスをOSに依存しない形式で、なおかつ「絶対パス」で構築します。
Command::current_dir を使用して、Sidecar の起動ディレクトリを、バイナリと DLL が物理的に配置されている src-tauri/bin (またはインストール先の対応フォルダ) に強制的に設定します。これにより、Windows の検索ルール (1) が確実に適用されます。
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(¤t_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 は単なる「起動」だけでなく、適切な「終了」も管理されています。
setup フック内でスピンアップ。health check リクエストを送り、準備完了を待機。llama-server は以下のオプションで最適化されて起動します。
--host 127.0.0.1: ローカルループバックアドレスに限定(セキュリティ)。--port 8080: デフォルトの待機ポート(環境変数で変更可能)。-m [MODEL_PATH]: Gemma 3 300M の GGUF ファイルを指定。--embedding: 埋め込み抽出機能を有効化。--parallel 4: 同時リクエスト処理数の最適化。libs/llama-server.exe が正しいアーキテクチャ名(llama-server-x86_64-pc-windows-msvc.exe 等)で配置されているか確認してください。ggml.dll, llama.dll が存在することを確認してください。