codeforjapan / codeforjapan/workflow-interviewer
UX5. LLM応答のストリーミング表示で体感速度を改善する
- Dominant language
- TypeScript
- Stars
- 0
- Forks
- 0
- Avg merge
- 30m
- Merged PRs (30d)
- 2
Description
## 課題
毎ターン LLM を叩く設計で、応答が返るまで待たされる。ストリーミングが未実装のため、回答が一括で出るまで画面が固まって見え、体感が重い。
### Before(現状)
- 1ターンで、構造化抽出(`extract`)+次質問生成(`followup`)+3ターン毎のギャップ計算が同期実行され、すべて終わってから JSON がまとめて返る。
- 次の質問(assistant メッセージ)もストリーミングされず、確定後に一括表示。
### After(あるべき姿)
- 次の質問文が生成され次第、逐次(ストリーミング)表示され、待ち時間が体感で短くなる。
- 重い処理(ギャップ計算など)を応答表示のクリティカルパスから外し、体感を優先する。
## 技術的な着手ポイント
- `lib/server/openai.ts`
- `openai.chat.completions.parse` を使用(非ストリーミング・Structured Outputs)。質問生成のストリーミング化にはストリーム API への切替が必要(choices が structured 出力な点との両立は要検討)。
- `lib/server/interview/followup.ts`
- `generateAdaptiveQuestion`:`response_format: zodResponseFormat(...)` で構造化受信。本文(content)をストリームしつつ choices を確定させる方式の設計が要る(要調査)。
- `lib/server/routes/sessions.ts`
- `POST /api/sessions/:id/messages`(`handleUserTurn` 呼び出し)。SSE/ストリームレスポンスへの変更候補。Hono のストリーミングを利用。
- `components/session/SessionView.tsx`
- `sendMessage`(`fetch` 後に全文 JSON を待つ)。逐次受信+逐次描画への変更。
- 分割案:質問生成は同期のままでも、ギャップ計算を応答後の非同期に回すだけで体感が改善する可能性(段階実装の余地)。
## 受け入れ条件
- [ ] 次の質問がストリーミング(逐次)表示され、待ち時間の体感が改善する
- [ ] 選択肢(choices)が正しく表示される
- [ ] エラー時のフォールバック(従来の一括表示 or エラー表示)が機能する
- [ ] 抽出・ギャップ計算の結果が従来どおり保存・反映される
## 優先度
中。体感改善に効くが、内容の正しさ(UX1/2)より後。段階実装(ギャップ計算の非同期化)から着手できる。
> このIssueは Slack #gov_ai_agent での議論(Yuki Kawabe / sunagawa)に基づき起票されました。
Contributor guide
No contributing guide indexed for this repository
Research direction
Start by tracing POST /api/sessions/:id/messages in lib/server/routes/sessions.ts through handleUserTurn, then inspect generateAdaptiveQuestion in lib/server/interview/followup.ts and the parse call in lib/server/openai.ts. Compare this with sendMessage in components/session/SessionView.tsx. Done means the next question and choices render incrementally, fallbacks work, and extraction and gap results remain saved and applied.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- typescript
- Domain
- api, backend, frontend
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 48/100