2.1 KiB
2.1 KiB
アーキテクチャ概要
全体構成
フロントエンド (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(完了)。