概要
Chat API は、 Fess の AI 検索モード(RAG チャット)機能にプログラムからアクセスするための v2 API です。 検索結果を基にした LLM による回答(補完)を取得できます。
このAPIは以下の3つのエンドポイントを提供します。
| エンドポイント | 説明 |
|---|---|
POST /chat | 一括(非ストリーミング)RAG チャット補完。 |
POST /chat/stream | ストリーミング RAG チャット補完(Server-Sent Events)。 |
DELETE /chat/sessions/{session_id} | チャットセッションの会話履歴をクリア。 |
ベースURLや共通のレスポンスエンベロープ・エラーコードについては APIの概要 を参照してください。
ローカル環境の例:
前提条件
Chat API を使用するには、以下の設定が必要です。
AI 検索モード(RAG チャット)機能が有効になっていること(
rag.chat.enabled=true)LLM プロバイダーが設定されていること
機能が無効( rag.chat.enabled=false )の場合、リクエストは invalid_request エラーになります。
詳細な設定方法は AI検索モード機能の設定 および LLM統合の概要 を参照してください。
認証とCSRF
Chat API のすべてのエンドポイントは状態を変更するリクエスト( POST / DELETE )であるため、 X-Fess-CSRF-Token ヘッダーが必要です。 CSRF トークンの取得方法および認証・セッションの詳細は APIの概要 を参照してください。
レート制限
POST /chat および DELETE /chat/sessions/{session_id} には、ユーザーごとのレート制限が適用されます。
既定値: 1分あたり30リクエスト(ユーザーごと)
設定キー:
api.v2.chat.rate.limit.per.user.per.minute
レート制限を超えた場合、 rate_limited エラー(HTTP 429)が返されます。 Retry-After ヘッダーに待機すべき秒数が示されます。 このレート制限は POST /chat と DELETE /chat/sessions/{session_id} で共有されます。
POST /chat
同期的なチャット補完を行います。 セッションは session_id で識別します。 session_id を省略した場合、サーバーがセッションを作成し、レスポンスの session_id で返します。
fields.label や extra_queries に渡された不正な値は、解決済みリクエストから無言で除去され、レスポンスエンベロープには表面化しません。
エンドポイント
リクエストボディ
Content-Type: application/json の JSON ボディです。
リクエスト例:
レスポンス
成功時(HTTP 200, ChatResponse)
レスポンスは共通エンベロープ response に格納されます。 session_id は常に存在します。
| フィールド | 型 | 説明 |
|---|---|---|
session_id | string | セッションID。 |
content | string (nullable) | 生成されたメッセージテキスト。常に存在しますが、モデルが内容を生成しなかった場合は null になりえます。 |
sources | array | 参照元ドキュメントの配列。各要素は ChatSource。 |
ChatSource
レスポンス例:
HTTPステータスコード
| コード | 説明 |
|---|---|
| 200 | リクエスト成功。 |
| 400 | リクエストが不正( message の欠落、 rag.chat.enabled=false など)。 |
| 403 | CSRF トークンの欠落・失効など。 |
| 404 | リソースが見つかりません。 |
| 405 | HTTP メソッドが許可されていません。 |
| 413 | リクエストボディがサイズ上限を超えています。 |
| 415 | サポートされていない Content-Type です。 |
| 429 | レート制限を超えました。 |
| 500 | サーバー内部エラー。 |
cURL の例
POST /chat/stream
ストリーミング形式でチャット補完を行います。 リクエストボディは POST /chat と同じ(ChatRequest)です。
成功レスポンスは text/event-stream 形式(Server-Sent Events)の名前付きイベントです。 各イベントは event: <名前> と data: <JSON> で構成されます。
ストリーム前のバリデーション失敗は、依然として JSON エンベロープを返します( POST /chat と同じエラーコード)。 fields.label や extra_queries に渡された不正な値は無言で除去され、レスポンスエンベロープにも SSE イベントにも表面化しません。
エンドポイント
SSEイベント
| イベント | 説明(ペイロード) |
|---|---|
phase | パイプラインのフェーズ遷移( { phase, status, message?, keywords?, hit_count?, ... } )。 message と keywords は onPhaseStart で出力されます。追加の任意フィールド(例: hit_count )は onPhaseComplete のペイロードから流れてきます。 |
chunk | 生成テキストの断片( { content } )。 |
sources | 取得されたソース( { sources: [ChatSource] } )。 |
retry | 一時的失敗のバックオフ( { phase, operation, attempt, max_attempts, sleep_ms, cause? } )。 |
waiting | 長時間フェーズの進捗( { phase, reason, elapsed_ms, timeout_ms } )。 |
fallback | クエリ書き換え・戦略フォールバック( { phase, reason, original_query?, new_query? } )。 |
warning | 回復可能な警告( { phase, code, detail? } )。 |
done | ストリーム終了( { session_id, html_content? } )。 |
error | 終端のストリーム途中失敗( { phase?, message, error_code } )。 message フィールドは error_code と同じ文字列を持ちます。クライアントは error_code を基にローカライズすべきです。 |
SSE ストリーム例:
HTTPステータスコード
ストリーム前のバリデーションで失敗した場合は、以下のエラーコードが JSON エンベロープで返されます。
| コード | 説明 |
|---|---|
| 200 | SSE ストリームを開始(成功)。 |
| 400 | リクエストが不正( message の欠落、 rag.chat.enabled=false など)。 |
| 403 | CSRF トークンの欠落・失効など。 |
| 405 | HTTP メソッドが許可されていません。 |
| 413 | リクエストボディがサイズ上限を超えています。 |
| 415 | サポートされていない Content-Type です。 |
| 429 | レート制限を超えました。 |
| 500 | サーバー内部エラー。 |
cURL の例
DELETE /chat/sessions/{session_id}
指定したチャットセッションの会話履歴をクリアします。 セッションはパスの session_id で識別します。
成功時には cleared: true が返ります。一致するアクティブセッションがないときは not_found エラー(HTTP 404)になります。
エンドポイント
パスパラメーター
| パラメーター | 型 | 説明 |
|---|---|---|
session_id | string | クリア対象のセッションID。minLength 1、maxLength 128、パターン ^[A-Za-z0-9._-]+$ 。 |
レスポンス
成功時(HTTP 200, ChatClearResponse)
レスポンスは共通エンベロープ response に格納されます。 session_id と cleared は常に存在します。
レスポンス例:
HTTPステータスコード
| コード | 説明 |
|---|---|
| 200 | セッションをクリアしました。 |
| 400 | リクエストが不正です。 |
| 401 | 認証が必要です。 |
| 403 | CSRF トークンの欠落・失効など。 |
| 404 | 一致するアクティブセッションが見つかりません。 |
| 405 | HTTP メソッドが許可されていません。 |
| 429 | レート制限を超えました。 |
| 500 | サーバー内部エラー。 |
cURL の例
セキュリティ
Chat API を使用する際のセキュリティ上の注意点:
認証: v2 API はセッションベースの認証を採用しています。詳細は APIの概要 を参照してください。
CSRF: 状態変更リクエストには
X-Fess-CSRF-Tokenヘッダーが必要です。レート制限: DoS 攻撃を防ぐため、ユーザーごとのレート制限(既定 30/分)が適用されます。設定キーは
api.v2.chat.rate.limit.per.user.per.minuteです。
参考情報
AI検索モード機能の設定 - AI 検索モード機能の設定
LLM統合の概要 - LLM 統合の概要
AI検索モード - エンドユーザー向けチャット検索ガイド
APIの概要 - API概要