Files
playchat/docs/architecture.md
T
2026-06-01 20:16:53 +09:00

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(完了)。