# アーキテクチャ概要 ## 全体構成 ``` フロントエンド (Vue 3 + TypeScript + Vite, port 5173) ↕ REST / SSE バックエンド (FastAPI + Python, port 8000) ↕ SQLite (playchat.db) ↕ LiteLLM → OpenAI / Anthropic / Ollama (任意のLLM) ``` ## バックエンド ### エントリーポイント `app/main.py` — FastAPI インスタンス作成、CORS 設定、DB 初期化、ルーター登録。 ### ルーター | ファイル | エンドポイント | 役割 | |---|---|---| | `app/api/chat.py` | `POST /chat/stream` | SSE でストリーミング応答 | | `app/api/chat.py` | `GET /chat/sessions` | セッション一覧 | | `app/api/chat.py` | `DELETE /chat/sessions/{id}` | セッション削除 | | `app/api/memory.py` | `GET /memory/{session_id}` | メモリ一覧 | | `app/api/memory.py` | `DELETE /memory/{id}` | メモリ削除 | ### メモリ機構 - **短期メモリ**: セッション内のすべてのメッセージをコンテキストとして送信 - **長期メモリ**: メッセージ数が `MEMORY_SUMMARIZE_THRESHOLD`(デフォルト20) を超えると古い半分をLLMで要約し `memories` テーブルに保存 - 要約はシステムメッセージとして次回以降のコンテキスト先頭に注入される ### LLM 接続 `app/core/llm.py` が LiteLLM を薄くラップ。モデル名は `DEFAULT_MODEL` 環境変数で制御。 ローカルの Ollama は `ollama/llama3` のように `ollama/` プレフィックスで指定。 ## フロントエンド ### 状態管理 `src/stores/chat.ts` (Pinia) が全状態を保持: - `sessions` — バックエンドから取得したセッション一覧 - `messages` — 現在セッションの表示用メッセージ配列 - `isStreaming` — SSE 受信中フラグ - `selectedModel` — UI で選択中のモデル ### SSE ストリーミング `src/api/client.ts` の `streamChat()` が fetch + ReadableStream で SSE を受信。 チャンクは3種類: `session_id`(新規セッションID通知)、`chunk`(テキスト断片)、`done`(完了)。