目的:フロントエンド・バックエンド間の通信インターフェースを定義し、実装時の判断根拠とする。
境界決定・UMLシーケンス図の内容をもとに作成。
最終更新: 2026-03-21(実装に合わせて全面改訂)
| 項目 | 内容 |
|---|---|
| ベースURL | /api |
| データ形式 | JSON(SSEエンドポイントを除く) |
| 認証方式 | Supabase Auth セッションクッキー |
| エラーフォーマット | { error: string, code: string } |
| コード | 意味 |
|---|---|
| 200 | 成功 |
| 201 | 作成成功 |
| 400 | リクエスト不正 |
| 401 | 未認証(ログイン必須エンドポイント) |
| 403 | 権限なし(他ユーザーのリソースへのアクセス) |
| 429 | レート制限超過 |
| 500 | サーバーエラー |
/api/chat — 質問送信 → SSEストリーミング回答ゲスト・ログインユーザー共通。personaIds は省略可(未指定時はバックエンドがランダムで3つ選択)。
仕様変更(実装済み)
- チャット履歴はDBに保存しない。会話の文脈はクライアントがメモリで管理し、
historyフィールドで送信する
- SSEイベント形式を変更(下記参照)
chatId/turnIdの概念は廃止
リクエスト
{
"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" }