目的:フロントエンド・バックエンド間の通信インターフェースを定義し、実装時の判断根拠とする。

境界決定・UMLシーケンス図の内容をもとに作成。

最終更新: 2026-03-21(実装に合わせて全面改訂)


共通仕様

項目 内容
ベースURL /api
データ形式 JSON(SSEエンドポイントを除く)
認証方式 Supabase Auth セッションクッキー
エラーフォーマット { error: string, code: string }

HTTPステータスコード

コード 意味
200 成功
201 作成成功
400 リクエスト不正
401 未認証(ログイン必須エンドポイント)
403 権限なし(他ユーザーのリソースへのアクセス)
429 レート制限超過
500 サーバーエラー

1. チャット系

POST /api/chat — 質問送信 → SSEストリーミング回答

ゲスト・ログインユーザー共通。personaIds は省略可(未指定時はバックエンドがランダムで3つ選択)。

仕様変更(実装済み)

リクエスト

{
  "question": "string",            // 必須。1〜1000文字
  "personaIds": ["string"],        // 任意。省略時はランダム3ペルソナを自動選択。最大3体
  "history": {                     // 任意。ペルソナIDごとの会話履歴
    "persona_id": [
      { "role": "user", "content": "string" },
      { "role": "assistant", "content": "string" }
    ]
  }
}

レスポンス Content-Type: text/event-stream(SSE)

// ペルソナの回答開始
data: { "type": "start", "personaId": "string", "personaName": "string" }

// 回答テキストのチャンク(逐次配信)
data: { "type": "chunk", "personaId": "string", "content": "string" }

// 1ペルソナの回答完了
data: { "type": "persona_done", "personaId": "string" }

// 1ペルソナの回答エラー
data: { "type": "persona_error", "personaId": "string", "error": "string" }

// 全ペルソナの回答完了
data: { "type": "done" }