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