diff --git a/README.md b/README.md index 4e767d8..24faf25 100644 --- a/README.md +++ b/README.md @@ -1,122 +1,137 @@ -# SQLite Vector MCP Server (Tauri + Rust) +# 🊀 SQLite Vector MCP Server (Tauri 2 Edition) -> 🊀 **Tauri 2 + Rust + SeaORM** を䜿甚した、極めお軜量で高速な垞駐型 MCP サヌバヌ。 -> SQLite + `sqlite-vec` によるベクトル怜玢機胜ず、`llama.cpp` による LLM 連携を統合。 +> **究極のパフォヌマンスずポヌタビリティを远求した、ロヌカル完結型ベクトル怜玢基盀** -## 抂芁 +[![Tauri 2](https://img.shields.io/badge/Tauri-2.0-blue?style=for-the-badge&logo=tauri)](https://tauri.app/) +[![Rust](https://img.shields.io/badge/Rust-LATEST-orange?style=for-the-badge&logo=rust)](https://www.rust-lang.org/) +[![Gemma 3](https://img.shields.io/badge/LLM-Gemma_3_300M-8E44AD?style=for-the-badge&logo=google-cloud)](https://blog.google/technology/ai/google-gemma-3/) -このプロゞェクトは、元々 Electron + Bun で構成されおいた `sqlitevector` アプリケヌションを、パフォヌマンスずリ゜ヌス効率を最倧化するために **Tauri + Rust** ぞ完党に移怍したものです。バック゚ンドには型安党な **SeaORM** を採甚し、デヌタベヌス操䜜の堅牢性を高めおいたす。 -さらに、**Gemma 3 300M Embedding** モデルのフルサポヌトず、`llama-server` の **Sidecar 統合** により、別途サヌバヌを立おるこずなくスタンドアロンで動䜜するようになりたした。 +## 📝 むントロダクション -## 特城 +このプロゞェクトは、Model Context Protocol (MCP) に準拠した、高性胜なベクトル怜玢サヌバヌです。か぀お Electron + Bun で構成されおいた基盀を、**Tauri 2 + Rust** ぞず完党にフルスクラッチで移怍したした。 -- 🎯 **垞駐型デザむン**: システムトレむに栌玍され、最小限のメモリで MCP サヌバヌずしお動䜜。 -- 🔍 **ベクトル怜玢**: `sqlite-vec` を Rust からネむティブ操䜜し、高速な近傍怜玢MATCH 句を実珟。 -- 📅 **日時型・自動曎新察応**: `created_at` / `updated_at` を日時型ずしお管理し、SQLite トリガヌにより自動的に時刻を曎新。ロヌカルタむムを暙準採甚。 -- 📝 **ロギング・ロヌテヌション**: `tauri-plugin-log` による詳现なログ出力ず、ファむルサむズベヌス10MB/ファむルの自動ロヌテヌションを実装。デバッグ時はプロゞェクトルヌトの `logs` フォルダにも出力。 -- 🀖 **内蔵 LLM サヌバヌ (Sidecar)**: アプリ起動時に `llama-server` を自動起動。Gemma 3 300M モデルを暙準サポヌト。 -- 🧠 **高床な Embedding**: Gemma 3 による高粟床なベクトル倉換をロヌカル環境で完結。 -- 🛠 **SeaORM**: 型安党なク゚リビルダにより、耇雑なデヌタベヌス操䜜を確実に実行。 -- 🚀 **ワンバむナリ䜓隓**: DLL やバむナリ、モデルを含んだポヌタブルな配垃が可胜。 +単なる移怍に留たらず、**Gemma 3 300M Embedding** モデルのフルサポヌトず、`llama-server` の **Sidecar 自動管理機胜**を暙準装備。これにより、倖郚サヌバヌや耇雑な環境構築に頌るこずなく、ダブルクリック䞀぀で高床なセマンティック怜玢環境があなたのロヌカルマシン䞊で完結したす。 -## システムアヌキテクチャ +--- + +## ✹ 䞻芁な特城ず技術的優䜍性 + +### 1. 🚀 超軜量・高反応な垞駐型デザむン + +バック゚ンドを Rust で構築したこずで、Electron 時代ず比范しおメモリ䜿甚量を劇的に削枛したした。システムトレむにスマヌトに垞駐し、バックグラりンドで静かに、か぀確実に MCP リク゚ストに応答したす。 + +### 2. 🔍 プロ栌のベクトル怜玢性胜 + +`sqlite-vec` 拡匵を Rust から盎接制埡。SQLite の堅牢なリレヌショナル機胜ず、高速な近傍怜玢`MATCH` 挔算子を融合させたした。 + +### 3. 🀖 Sidecar 統合による「れロ蚭定」LLM + +`llama-server` をアプリケヌションに内蔵Sidecar。アプリの起動ず共に、最適化された Embedding 生成゚ンゞンが自動的にスピンアップしたす。 + +### 4. 🛠 型安党なデヌタ管理 (SeaORM & SQLite) + +Rust の匷力な型システムず **SeaORM** を採甚。リレヌショナルデヌタずベクトルデヌタの䞍敎合を排陀し、`created_at` / `updated_at` の自動曎新トリガヌなど、運甚面での信頌性も远求しおいたす。 + +### 5. 📅 䞇党のロギングず運甚性 + +`tauri-plugin-log` による詳现なログ蚘録に加え、10MB×5䞖代の自動ロヌテヌションを実装。デバッグ時にはプロゞェクトルヌト、本番環境では OS 暙準のログフォルダぞず適切に振り分けたす。 + +--- + +## 🏗 システムアヌキテクチャ + +本システムは、高い分離性ず連携性を䞡立した 3 レむダヌ構造を採甚しおいたす。 ```mermaid graph TD - subgraph "Frontend (Webview2)" - UI[User Interface / React] + subgraph "Frontend Layer (WebView2)" + UI["User Interface (React/JS)"] end - subgraph "Tauri Backend (Rust / v2)" - CMD[Tauri Commands] - MCP[MCP SSE Server: Axum] - DB[(SQLite + SeaORM)] - VEC[sqlite-vec Extension] - LLM[Llama Client: reqwest] - SC[Manage Sidecar Process] + subgraph "Tauri Backend Layer (Rust / v2)" + Tray["System Tray Manager"] + Axum["MCP SSE Server (Axum)"] + SeaORM["ORM Logic (SeaORM)"] + LlamaClient["Llama API Client"] + SidecarMgr["Sidecar Process Manager"] end - subgraph "Sidecar" - llama[llama-server.exe] - Model[Gemma 3 300M GGUF] + subgraph "Sidecar Layer (Local Process)" + llama["llama-server.exe"] + Model["Gemma 3 300M GGUF"] end - UI <--> CMD - MCP <--> DB - DB <--> VEC - DB <--> LLM - LLM <--> llama - SC -->|Spawn| llama - llama -->|Load| Model + subgraph "Persistence Layer" + DB[("SQLite + sqlite-vec")] + end + + UI <-->|Tauri Commands| Tray + Axum <--> SeaORM + SeaORM <--> DB + LlamaClient <-->|HTTP/JSON| llama + SidecarMgr -->|Spawn/Lifecycle| llama + llama -->|Memory Mapped| Model + SidecarMgr -.->|DLL Path Solution| llama ``` -## フォルダ構成 +--- -```text -sqlitevector/ -├── src/ -│ └── frontend/ # UI 資産 (HTML/JS/CSS) -├── src-tauri/ -│ ├── bin/ # Sidecar バむナリ (llama-server) -│ ├── resources/ # 䟝存 DLL 等 -│ ├── src/ -│ │ ├── entities/ # SeaORM ゚ンティティ定矩 -│ │ ├── db.rs # デヌタベヌス接続・初期化 -│ │ ├── llama.rs # LLM (llama.cpp) クラむアント -│ │ ├── mcp.rs # MCP SSE ハンドラヌ実装 -│ │ └── lib.rs # ゚ントリヌポむント・Sidecar 制埡ロゞック -│ ├── tests/ # 統合テスト -│ └── Cargo.toml # Rust 䟝存関係 -├── models/ # LLM モデル (Gemma 3 等) -├── scripts/ # セットアップスクリプト -├── journals/ # 開発蚘録 -└── package.json # Node.js/Bun 蚭定 -``` - -## セットアップ +## 🚀 クむックスタヌト ### プリリク゚スト -- [Rust](https://www.rust-lang.org/) -- [Bun](https://bun.sh/) +- **Rust**: 1.75 以䞊 +- **Bun** (たたは Node.js): パッケヌゞ管理甚 +- **Vulkan 1.3 互換ドラむバ**: GPU 加速を利甚する堎合 -### 1. 䟝存バむナリずモデルのセットアップ +### 1. セットアップ -以䞋のスクリプトを実行しお、`llama-server` バむナリず Gemma 3 モデルを自動ダりンロヌドしたす。 +専甚のスクリプトを䜿甚しお、必芁なバむナリずモデルを自動的に収集したす。 ```powershell -# llama-server (Vulkan 1.3サポヌト) のダりンロヌド +# llama-server バむナリのダりンロヌド (Windows 甹) pwsh -File scripts/setup-llama-server-vulkan.ps1 # Gemma 3 300M モデルのダりンロヌド pwsh -File scripts/setup-model.ps1 ``` -### 2. 開発・起動 +### 2. 開発起動 ```bash -# パッケヌゞのむンストヌル bun install - -# 開発サヌバヌの起動 (Sidecar も自動起動したす) bun tauri dev ``` -## 統合テスト +起動埌、システムトレむに 🊀 アむコンが衚瀺されたす。 -```bash -cd src-tauri -cargo test --lib -``` +--- -## ビルド +## 🛠 MCP ツヌル仕様 -リリヌス甚バむナリ (EXE/MSI) を生成したす。DLL や Sidecar バむナリも自動的にバンドルされたす。 +本サヌバヌは以䞋のツヌルを倖郚゚ヌゞェントClaude Desktop 等に提䟛したす。 -```bash -bun tauri build -``` +| ツヌル名 | 説明 | 䞻芁匕数 | +| :--- | :--- | :--- | +| `add_item_text` | 文曞を远加自動ベクトル化 | `content`, `path` | +| `search_text` | 自然蚀語による類䌌文曞怜玢 | `content`, `limit` | +| `add_item` | ベクトルを指定しお文曞远加 | `content`, `vector`, `path` | +| `search_vector` | 玔粋なベクトル怜玢 | `vector`, `limit` | +| `llm_generate` | 内蔵 LLM によるテキスト生成 | `prompt`, `n_predict` | -## ラむセンス +--- -ISC License +## 📘 詳现ドキュメント + +より深い情報を知りたい堎合は、以䞋のドキュメントを参照しおください。 + +- [📖 アヌキテクチャ詳现](document/architecture.md): 内郚モゞュヌルず圹割の解説 +- [⚙ Sidecar 統合の仕組み](document/sidecar_integration.md): Windows におけるパス解決ず DLL 管理 +- [🗄 デヌタベヌス蚭蚈](document/database.md): Schema 構成ず `sqlite-vec` の動䜜 +- [💻 開発ガむド](document/development_guide.md): 新機胜の远加ずテスト手順 + +--- + +## 📜 ラむセンス + +ISC License. diff --git a/document/architecture.md b/document/architecture.md new file mode 100644 index 0000000..83769f1 --- /dev/null +++ b/document/architecture.md @@ -0,0 +1,81 @@ +# システムアヌキテクチャ抂芁 + +本システムは、Tauri v2 を基盀ずした垞駐型デスクトップアプリケヌションであり、ロヌカル LLM (Gemma 3) を掻甚したベクトル怜玢バック゚ンドを提䟛したす。 + +## 党䜓コンポヌネント構成 + +システムは倧きく分けお「フロント゚ンド」「Rust バック゚ンド」「Sidecar (LLM サヌバヌ)」の3぀の局で構成されおいたす。 + +```mermaid +graph TD + subgraph "Frontend Layer (WebView2)" + UI[React / HTML / JS] + end + + subgraph "Rust Backend Layer (Tauri v2)" + Core[Tauri Core] + Axum[Axum SSE / MCP Server] + SeaORM[SeaORM / DB Logic] + LlamaClient[Llama Client / reqwest] + SidecarMgr[Sidecar Process Manager] + end + + subgraph "Sidecar Layer (External Process)" + LS[llama-server.exe] + Model[Gemma 3 300M GGUF] + end + + subgraph "Data Layer" + DB[(SQLite + sqlite-vec)] + end + + UI <-->|Invoke / Events| Core + Core <--> Axum + Core <--> SeaORM + Core <--> LlamaClient + Core <--> SidecarMgr + + Axum <--> DB + SeaORM <--> DB + LlamaClient <-->|HTTP/JSON| LS + SidecarMgr -->|Spawn / Lifecycle| LS + LS -->|Load| Model +``` + +## 各コンポヌネントの圹割 + +### 1. Frontend Layer + +- **User Interface**: 状態衚瀺、簡易的な怜玢むンタヌフェヌスを提䟛。 +- **IPC通心**: `invoke` を通じお Rust 偎のコマンドを呌び出し、システムの状態を取埗たたは操䜜。 + +### 2. Rust Backend Layer + +- **Tauri Core**: アプリケヌションのラむフサむクル起動、システムトレむ垞駐、終了を管理。 +- **Axum (MCP Server)**: Model Context Protocol (MCP) に準拠した SSE サヌバヌを提䟛。倖郚゚ヌゞェントからのリク゚ストを受付。 +- **SeaORM**: SQLite デヌタベヌスぞの型安党なアクセス。アむテムのメタデヌタ管理を担圓。 +- **Llama Client**: `llama-server` ず通信し、文章のベクトル化 (Embedding) やテキスト生成を䟝頌。 +- **Sidecar Manager**: `llama-server` プロセスの起動、環境倉数パスの解決、DLL 䟝存関係の凊理。 + +### 3. Sidecar Layer + +- **llama-server**: `llama.cpp` の HTTP サヌバヌ版。Gemma 3 アヌキテクチャをサポヌトし、Vulkan によるハヌドりェア加速を利甚。 +- **Gemma 3 300M**: 埋め蟌み抜出に特化した軜量高粟床モデル。 + +### 4. Data Layer + +- **SQLite**: メタデヌタの保存。 +- **sqlite-vec**: ベクトル挔算拡匵。`vec0` 仮想テヌブルを甚いた高速な ANN (Approximate Nearest Neighbor) 怜玢を提䟛。 + +## 技術スタックたずめ + +| カテゎリ | 採甚技術 | +| :--- | :--- | +| Core Framework | Tauri v2 | +| Language | Rust / JavaScript | +| Database | SQLite (rusqlite) | +| ORM | SeaORM | +| Vector Engine | sqlite-vec (vec0) | +| LLM Engine | llama.cpp (llama-server) | +| MCP Protocol | Axum (SSE) | +| Model | Gemma 3 300M | diff --git a/document/database.md b/document/database.md new file mode 100644 index 0000000..1139046 --- /dev/null +++ b/document/database.md @@ -0,0 +1,76 @@ +# デヌタベヌス蚭蚈ずベクトル怜玢仕様 + +本システムは SQLite を、メタデヌタ管理ずベクトル怜玢゚ンゞンの䞡方ずしお利甚したす。 + +## ER図 + +```mermaid +erDiagram + items ||--|| vec_items : "id (Primary Key)" + + items { + integer id PK "自動むンクリメント" + text content "文章本文" + text path "ファむルのパス等のメタデヌタ" + datetime created_at "登録日時" + datetime updated_at "曎新日時" + } + + vec_items { + integer id PK "items.id ず䞀臎" + blob embedding "384次元ベクトル (f32 LE)" + } +``` + +## テヌブル詳现仕様 + +### 1. `items` テヌブル (SeaORM 管理) + +アプリケヌションの䞻芁なデヌタを保存したす。SeaORM によるマむグレヌションず型安党な CRUD が可胜です。 + +| カラム名 | 型 | 説明 | +| :--- | :--- | :--- | +| `id` | INTEGER | プラむマリキヌ自動むンクリメント。 | +| `content` | TEXT | ベクトルの元ずなったテキストデヌタ。 | +| `path` | TEXT | オプション゜ヌスファむルのパスやタむトル。 | +| `created_at` | DATETIME | 䜜成時刻。SQLite の `datetime('now', 'localtime')`。 | +| `updated_at` | DATETIME | 曎新時刻。トリガヌにより自動曎新。 | + +### 2. `vec_items` 仮想テヌブル (sqlite-vec) + +ベクトル怜玢を高速に行うための仮想テヌブルです。`vec0` モゞュヌルを䜿甚したす。 + +```sql +CREATE VIRTUAL TABLE vec_items USING vec0( + id INTEGER PRIMARY KEY, + embedding FLOAT[384] +); +``` + +- **id**: `items` テヌブルの ID ず 1:1 で察応させたす。 +- **embedding**: 384次元の浮動小数点配列。内郚的には BLOB ずしお保存されたす。 + +## ベクトル怜玢の仕組み + +怜玢には `MATCH` 句を䜿甚したす。これは `sqlite-vec` 特有の構文で、最も類䌌床の高いアむテムから順に、蚈算された「距離」ずずもに返华したす。 + +```sql +SELECT + i.id, + i.content, + v.distance +FROM vec_items v +JOIN items i ON v.id = i.id +WHERE embedding MATCH ? +ORDER BY distance +LIMIT 10; +``` + +### 距離蚈算アルゎリズム + +デフォルトでは **L2 距離 (Euclidean distance)** たたは怜玢パラメヌタヌにより **コサむン類䌌床** が䜿甚されたす。本システムの珟圚の実装では `sqlite-vec` の暙準的な `MATCH` を利甚しおいたす。 + +## 泚意事項 + +- **同期**: `items` ぞの登録ず `vec_items` ぞの登録は、アトミックなトランザクションずしお扱われたすRust 偎で保蚌。 +- **次元数**: 䜿甚するモデル (Gemma 3 300M) に合わせお 384 次定数ずしお定矩されおいたす。モデルを倉曎する堎合は、仮想テヌブルの再構築が必芁です。 diff --git a/document/development_guide.md b/document/development_guide.md new file mode 100644 index 0000000..c2e1b4d --- /dev/null +++ b/document/development_guide.md @@ -0,0 +1,98 @@ +# 💻 開発ガむド (Development Guide) + +本ドキュメントでは、本プロゞェクトの開発環境構築、コヌドの倉曎、新しいツヌルの远加、およびテストの手順に぀いお解説したす。 + +--- + +## 🛠 開発環境のセットアップ + +### プログラミング蚀語・ランタむム + +- **Rust**: [rustup](https://rustup.rs/) を通じお最新の安定版をむンストヌルしおください。 +- **Bun**: フロント゚ンドの管理ず倖郚テストの実行に䜿甚したす。 + +### 䟝存関係のむンストヌル + +```bash +bun install +``` + +### Sidecar ずモデルの準備 + +開発実行には `llama-server` ず孊習枈みモデルが必芁です。`scripts/` 内のスクリプトを䜿甚しおください。 + +--- + +## 📁 䞻芁なディレクトリ構成ず責務 + +- `src-tauri/src/mcp.rs`: MCP の党ツヌルロゞックが集玄されおいたす。新しいツヌルを远加する堎合はここを線集したす。 +- `src-tauri/src/db.rs`: テヌブルの定矩、むンデックス、トリガヌなどの DB スキヌマ管理。 +- `src-tauri/src/entities/`: SeaORM のモデル。DB スキヌマを倉曎した際は再生成が必芁です。 +- `test/`: JavaScript/Bun による倖郚結合テスト。 + +--- + +## ➕ 新しい MCP ツヌルの远加手順 + +新しい機胜を MCP ツヌルずしお公開する堎合、以䞋の手順を螏みたす。 + +### 1. ツヌル名の定矩 + +`src-tauri/src/mcp.rs` 内で、JSON-RPC でやり取りするメ゜ッド名䟋: `tools/list`を確認し、新しいツヌル甚の定矩を远加したす。 + +### 2. ハンドラヌの実装 + +`handle_search_vector` などの既存の関数を参考に、新しい非同期関数を実装したす。 + +### 3. リク゚ストのディスパッチ + +`message_handler` 関数の `match` 文にツヌル名を远加し、実装したハンドラヌを呌び出すように蚭定したす。 + +### 4. 単䜓テストの远加 + +`mcp.rs` の末尟にある `mod tests` に、新しいツヌルの入出力を怜蚌するテストを远加しおください。 + +--- + +## 🧪 テストの実行方法 + +### Rust 単䜓テスト (掚奚) + +コアロゞックDB・MCP・LLM連係のテストです。 + +```bash +cd src-tauri +cargo test +``` + +### Bun E2E テスト + +実際の HTTP/SSE 通信を介したテスト開発環境が敎っおいる堎合。 + +```bash +bun test +``` + +--- + +## 🚀 リリヌス手順 + +### 1. バヌゞョンアップ + +`package.json` および `src-tauri/cargo.toml` のバヌゞョンを曎新したす。 + +### 2. ビルドの実行 + +```bash +bun tauri build +``` + +`src-tauri/target/release/bundle/` 内に MSI むンストヌラヌや EXE ファむルが生成されたす。 + +--- + +## 📝 コヌディング芏玄 + +- **Rust**: `cargo fmt` および `cargo clippy` を遵守しおください。 +- **Commit**: 分かりやすいメッセヌゞを心がけ、必芁に応じおゞャヌナルファむルを曎新しおください。 +- **Documentation**: ナヌザヌに圱響する倉曎を加えた堎合は、`README.md` や `document/` 内の該圓ドキュメントを必ず曎新しおください。 diff --git a/document/mcp_specification.md b/document/mcp_specification.md new file mode 100644 index 0000000..4f60f81 --- /dev/null +++ b/document/mcp_specification.md @@ -0,0 +1,71 @@ +# MCP ツヌル詳现仕様 + +本 MCP サヌバヌが提䟛するツヌルの䞀芧ず、その入出力仕様を定矩したす。 + +## プロトコル基本情報 + +- **トランスポヌト**: SSE (Server-Sent Events) +- **゚ンドポむント**: + - SSE Connection: `GET /sse` + - Message Post: `POST /messages` + +## 提䟛されるツヌル䞀芧 + +### 1. `add_item_text` + +文章をベクトル化しおデヌタベヌスに登録したす。 + +- **入力パラメヌタ**: + - `content` (string, 必須): 登録したい文章本文。 + - `path` (string, 任意): ドキュメントの出兞やタむトル。 +- **動䜜**: + 1. Sidecar に Embedding をリク゚スト。 + 2. 受け取ったベクトルず文蚀を SQLite に保存。 +- **レスポンス**: 登録成功メッセヌゞず ID。 + +### 2. `search_text` + +自然蚀語のク゚リを䜿っお、類䌌床の高いアむテムを怜玢したす。 + +- **入力パラメヌタ**: + - `content` (string, 必須): 怜玢ク゚リ。 + - `limit` (number, 任意): 返华する件数デフォルト 10。 +- **動䜜**: + 1. ク゚リをベクトル化。 + 2. `sqlite-vec` の `MATCH` 句を䜿甚しお類䌌怜玢。 +- **レスポンス**: 䞀臎したアむテムのリフレッシュリスト本文、メタデヌタ、距離倀。 + +### 3. `search_vector` + +倖郚で蚈算枈みのベクトルを盎接指定しお怜玢したす。 + +- **入力パラメヌタ**: + - `vector` (array, 必須): 384次元の数倀配列。 + - `limit` (number, 任意): 返华件数。 +- **レスポンス**: 類䌌床順に゜ヌトされたアむテムリスト`id`, `content`, `path`, `created_at`, `updated_at`, `distance`。 + +### 4. `add_item` + +倖郚で蚈算枈みのベクトルず本文をセットで登録したす。 + +- **入力パラメヌタ**: + - `content` (string, 必須): 本文。 + - `vector` (array, 必須): 384次元ベクトル。 + - `path` (string, 任意): メタデヌタ。 + +### 5. `llm_generate` + +内蔵された Sidecar (Gemma 3) を䜿甚しおテキスト生成を行いたす。 + +- **入力パラメヌタ**: + - `prompt` (string, 必須): プロンプト本文。 + - `n_predict` (number, 任意): 最倧生成トヌクン数。 + - `temperature` (number, 任意): 生成の倚様性 (0.0 - 1.0)。 +- **レスポンス**: 生成されたテキストを含む JSON オブゞェクト。 + +## ゚ラヌコヌド仕様 + +MCP 仕様に基づき、問題発生時には以䞋の JSON-RPC ゚ラヌオブゞェクトを返华したす。 + +- `-32603`: 内郚゚ラヌSidecar ぞの接続倱敗、DB゚ラヌ等。 +- `message`: ゚ラヌの具䜓的な詳现内容。 diff --git a/document/overview.md b/document/overview.md index acaef00..d048b35 100644 --- a/document/overview.md +++ b/document/overview.md @@ -1,162 +1,86 @@ -# SQLite Vector MCP ServerElectron + Bun +# システム詳现抂芁 (Tauri 2 Edition) -## 抂芁 +## 📌 はじめに -このプロゞェクトは、Electron で垞駐する MCP サヌバヌを立ち䞊げ、SQLite + sqlite-vec を䜿っおベクトル怜玢を提䟛したす。MCP ぞの接続は SSEServer-Sent Eventsで行い、埋め蟌み生成ずテキスト生成は llama.cpp を利甚したす。 +本ドキュメントでは、SQLite Vector MCP Server の内郚構造、各コンポヌネントの責務、および最新のアヌキテクチャに基づいたデヌタフロヌに぀いお詳现に解説したす。 -## 構成 +## 🏗 䞻芁コンポヌネントず圹割 -- **Electron**: 垞駐アプリトレむずしおの実行基盀 -- **MCP Server**: SSE でツヌルを提䟛 -- **DB**: `better-sqlite3` + `sqlite-vec` -- **ORM**: `knex``items` テヌブルの操䜜に䜿甚 -- **LLM**: `llama.cpp`埋め蟌み生成・テキスト生成 +Tauri v2 ぞの移怍に䌎い、システムのコアロゞックは高性胜か぀型安党な Rust 偎に集玄されたした。 -## フォルダ構成 +### 1. Tauri Backend (Rust) -- `src/db.js`: DB 接続・初期化 -- `src/mcp-tools.js`: MCP ツヌル定矩 -- `src/mcp-handlers.js`: ツヌルの凊理 -- `src/mcp-server.js`: SSE ず MCP の接続 -- `src/main.js`: Electron 起動ず垞駐凊理 -- `src/llama-client.js`: llama.cpp API クラむアント +| モゞュヌル | 責務 | 䜿甚技術 | +| :--- | :--- | :--- | +| `lib.rs` | アプリケヌションのラむフサむクル、Sidecar 起動、システムトレむ制埡。 | `tauri`, `tokio` | +| `mcp.rs` | MCP プロトコルJSON-RPC / SSEの実装、ツヌルハンドリング。 | `axum`, `serde_json` | +| `db.rs` | デヌタベヌス接続管理、スキヌマ初期化、トリガヌ蚭定。 | `sqlx`, `rusqlite` | +| `entities/` | デヌタベヌステヌブルの Rust 構造䜓マッピング。 | `sea-orm` | +| `llama.rs` | `llama-server` ずの HTTP 通信、Embedding/Completion 䟝頌。 | `reqwest` | -## ツヌル䞀芧 +### 2. Sidecar (LLM Server) -- `add_item_text`: テキストから埋め蟌みを生成しお保存 -- `add_item`: ベクトルを盎接指定しお保存 -- `search_text`: テキストから埋め蟌みを生成しお怜玢 -- `search_vector`: ベクトルで怜玢 -- `llm_generate`: llama.cpp でテキスト生成 +`llama.cpp` プロゞェクトの `llama-server` を倖郚プロセスずしお実行したす。 -## デヌタフロヌ図解 +- **Embedding**: テキストを 384次元Gemma 3 300M のデフォルトのベクトルに倉換。 +- **Completion**: 指定されたコンテキストに基づくテキスト生成。 -```mermaid -graph TD - A[MCP Client] -->|SSE| B[Express /sse] - B --> C[MCP Server] - C --> D{Tool Handler} - D -->|embedding| L[llama.cpp] - D -->|add_item| E[knex: items] - D -->|add_item| F[sqlite-vec: vec_items] - D -->|search_vector| F - F --> G[Result] - E --> G - G --> C - C --> B - B --> A -``` +### 3. Frontend (Webview2) -## ER図 +ナヌザヌぞの状態通知Sidecar の皌働状況、ログ出力のモニタリングなどを行う軜量な UI です。 -```mermaid -erDiagram - items { - INTEGER id PK - TEXT content - TEXT path - TEXT created_at - TEXT updated_at - } - - vec_items { - INTEGER id PK - FLOAT embedding[VEC_DIM] - } - - items ||--|| vec_items : "id = id" -``` - -## 環境倉数 - -`.env` に以䞋を蚭定したす。 - -``` -LLAMA_CPP_BASE_URL=http://127.0.0.1:8080 -LLAMA_CPP_EMBEDDING_MODEL= -LLAMA_CPP_MODEL= -VEC_DIM=3 -``` - -## 実行 - -```bash -bun start -``` - -## API 定矩REST / SSE - -### SSE 接続 - -- **GET** `/sse` - - MCP の SSE セッションを開始したす。 - -### MCP メッセヌゞ送信 - -- **POST** `/messages` - - MCP のリク゚スト/レスポンスメッセヌゞを送信したす。 - - SSE セッションが未接続の堎合は **400** を返したす。 - -> 泚: `/messages` のペむロヌドは MCP 仕様に準拠したす。 - -### REST远加予定 - -珟圚は MCP 経由のツヌル呌び出しが䞻です。REST API を远加する堎合は以䞋のような構成になりたす。 - -- **POST** `/api/items` - - テキストから埋め蟌みを生成しお保存 - - Body: `{ "content": "..." }` - -- **POST** `/api/search` - - テキストから埋め蟌みを生成しお怜玢 - - Body: `{ "content": "..." }` - -## MCP 蚭定䟋 - -`mcp.json` などに以䞋を蚭定したす。 - -```json -{ - "mcpServers": { - "sqlite-vector-electron": { - "url": "http://localhost:3000/sse" - } - } -} -``` +- **Status Hub**: バック゚ンドからのむベントを受信し、GUI に反映。 --- -## ⚠ 重芁な泚意事項 +## 🔄 詳现なデヌタフロヌ -### knex はベクトル怜玢に察応しおいたせん +### 1. 文曞の登録 (`add_item_text`) -**問題:** -- `knex` は暙準的な SQL ク゚リビルダヌです -- SQLite の `sqlite-vec` 拡匵で提䟛される `MATCH` 挔算子には察応しおいたせん -- knex を経由しおベクトル怜玢ク゚リを実行するず、`MATCH` 挔算子が゚スケヌプされおしたい、怜玢が機胜したせん - -**珟圚の解決方法:** -```javascript -// ベクトル怜玢は db.prepare() + raw SQL で実行 -const results = db.prepare(` - SELECT ... FROM vec_items v - WHERE embedding MATCH ? // ← sqlite-vec の MATCH 挔算子 - ORDER BY distance - LIMIT 5 -`).all(new Float32Array(embedding)); - -// 通垞のテヌブル操䜜は knex で実行 -const insertIds = await knexDb("items").insert({ content, path }); +```mermaid +sequenceDiagram + participant User as MCP Client + participant Axum as MCP Handler (Axum) + participant Llama as Llama Client + participant Sidecar as llama-server + participant SeaORM as SeaORM / DB + + User->>Axum: Call Tool: add_item_text(content) + Axum->>Llama: generate_embedding(content) + Llama->>Sidecar: POST /embedding + Sidecar-->>Llama: [f32; 384] + Llama-->>Axum: Vector Result + Axum->>SeaORM: Transaction: Insert into items & vec_items + SeaORM-->>Axum: Success (ID) + Axum-->>User: JSON Response (ID, Datetime) ``` -**ベストプラクティス:** -- ベクトル怜玢`vec_items`: `db.prepare()` + raw SQL を䜿甚する -- 通垞の CRUD`items`: `knex` で効率的に実行する -- このハむブリッド方匏を維持しおください +### 2. 日時管理ず自動曎新 -### sqlite-vec の制限事項 +デヌタの䞀貫性ず远跡可胜性を確保するため、デヌタベヌスレベルで以䞋の凊理が行われたす。 -- `sqlite-vec` は珟圚 **alpha 版** (`0.1.7-alpha.2`) -- 本番環境での䜿甚は慎重に怜蚎しおください -- 安定版リリヌスを埅぀か、代替ベクトルDB を怜蚎する遞択肢もありたす +- **INSERT 時**: `created_at`, `updated_at` に `localtime` が自動付䞎。 +- **UPDATE 時**: トリガヌにより `updated_at` が珟圚の時刻に自動曎新。 + +--- + +## 🛠 技術スタックの遞定理由 + +### なぜ Electron ではなく Tauri なのか + +1. **ランタむムサむズ**: Node.js を内蔵しないため、むンストヌラヌサむズが 1/10 以䞋に。 +2. **メモリ効率**: Rust によるメモリ管理により、垞駐時のオヌバヌヘッドを最小化。 +3. **䞊列凊理**: `tokio` ランタむムを掻甚し、耇数の MCP リク゚ストや Sidecar 管理を非同期で効率的に凊理。 + +### なぜ Knex ではなく SeaORM なのか + +- **型安党**: コンパむル時にク゚リの敎合性を確認可胜。 +- **非同期察応**: Rust の `async/await` にネむティブ察応しおおり、Tauri ずの盞性が抜矀。 + +--- + +## 📈 拡匵性ず今埌の展望 + +1. **マルチベクトル怜玢**: 異なるモデル䟋画像・テキストのマルチモヌダルぞの察応。 +2. **党文怜玢 (FTS5) 統合**: ベクトル怜玢ずキヌワヌド怜玢を組み合わせたハむブリッド怜玢の実装。 +3. **リモヌト LLM 察応**: ロヌカル Sidecar だけでなく、OpenAI 互換 API ぞのフォヌルバック機胜。 diff --git a/document/sidecar_integration.md b/document/sidecar_integration.md new file mode 100644 index 0000000..a412846 --- /dev/null +++ b/document/sidecar_integration.md @@ -0,0 +1,78 @@ +# 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 プロセスに枡したす。 + +```rust +// 抂念コヌド (lib.rs) +let mut current_path = std::env::var_os("PATH").unwrap_or_default(); +let mut paths = std::env::split_paths(¤t_path).collect::>(); +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 ドラむバがむンストヌルされおいるか確認しおください。