OpenAI Responses API の会話状態管理(previous_response_id)を利用して、直前の応答を引き継ぐ
OpenAI Responses API の会話状態管理(previous_response_id)を利用して、直前の応答を引き継ぐ
アーキテクチャ
GPT-5.icon
はい。OpenAI Responses API の会話状態管理(previous_response_id)を利用して、直前の応答を引き継ぐ実装になっています。ユーザーごとに前回の response.id を保存し、次回の呼び出しで previous_response_id として渡すことで、コンテキスト(思考の連続性)を維持しています。
どこで引き継いでいるか(実装の要点)
src/services/taskManagement.ts
会話状態の保存とTTL管理
conversationHistory: Map<string, string> と conversationTimestamps: Map<string, number> によりユーザーごとの直近 response.id を管理
CONVERSATION_TTL = 30 * 60 * 1000(30分)を超えるとクリア
cleanupExpiredConversations()(47–59 行)で期限切れの会話を削除
保存・取得のAPI
saveResponseId(userId, responseId)(61–68 行)
getPreviousResponseId(userId)(70–79 行)
rememberResponseId(userId, responseId)(81–86 行)
実際の API 呼び出し
callGPT5Mini(prompt, previousResponseId?)(329–412 行)で Responses API を使用
リクエストボディ(357–373 行)
model: "gpt-5-mini"
input: ...(今回の新しい入力)
previous_response_id に前回の response.id を条件付きで設定(369–372 行)
応答で得た response.id を次回のために保存(390–396 行)
ユースケース別の呼び出し箇所
指示処理: processInstruction(...)(112–121 行)
前回IDを取得 → callGPT5Mini(..., previousResponseId) → 返ってきた responseId を保存
提案生成: generateSuggestions(...)(155–162 行)
同様に previous_response_id を引き継ぎ
クイック提案: generateQuickSuggestions(...)(201–210 行)
同様に previous_response_id を引き継ぎ
src/types/prompts.ts
リクエスト型 GPTRequestBody に previous_response_id?: string を定義(65–76 行)
実装の流れ(簡略)
1. ユーザーの入力を受け取る(例: processInstruction)。
2. conversationHistory から前回の response.id を取得(TTLチェック付き)。
3. callGPT5Mini で Responses API に送る際、previous_response_id にセット。
4. 応答で得た response.id を保存(次回用)。
これにより、OpenAI 側で直前の思考チェーンを引き継いだ回答が返るため、アプリ側は新規入力のみを渡せます(質問文の要件どおり)。
その上での注意点・改善の提案
プロセス再起動に弱い
現状は Map に常駐保存のため、ワーカー再デプロイや再起動で揮発します。
対策: Durable Objects / KV / D1 等への永続化、もしくは DO に会話ID→response.id を持たせる。
分岐(スレッド)管理
現在は「ユーザーID→直前ひとつ」のみ。複数スレッドやDM/チャンネルごとの会話を分けるならキーに channelId/threadId を含めると良いです。
TTL の調整
30分で自然消滅。業務要件により延長/短縮、または明示的に「会話リセット」コマンドを用意してもよいです。
入力の最小化
Responses API の会話状態を活用している一方、PromptBuilder でフル文脈を毎回与えている場合は、必要に応じて差分のみに最適化可能(コスト/レイテンシ最適化)。
エラーハンドリング
タイムアウト(30秒)や OpenAI.APIError は既にハンドリング済み(353–355, 400–409 行)。用途に応じてリトライ/フォールバックも検討。
チェックリスト
(x) previous_response_id を Responses API に渡している
(x) 返ってきた response.id を保存して次回に利用
(x) TTL による期限切れクリーンアップ
( ) 再起動時の永続化(改善余地)
( ) 会話分岐(チャンネル/スレッド単位のキー分割)(必要なら)
まとめ
コードは OpenAI Responses API の「会話状態管理」を正しく利用し、previous_response_id によりコンテキストを引き継ぐ設計になっています。運用要件に応じて、状態の永続化やスレッド単位管理を追加すると、より堅牢になります。