チャットのリアルタイム更新 — 共有ルームの挙動
チャットのリアルタイム更新 — 共有ルームの挙動
iknow.dev の Web チャットは HTTP で送信し、WebSocket でリアルタイムに反映 します。同じチャットルームを開いている人全員が、ほぼ同時に新しいメッセージを見られます。
基本的な仕組み
あなたが送信 → サーバーが保存 → WebSocket で全員に配信 → 画面に即時表示
↓
AI が回答生成 → 同様に配信
- ブローカ: Laravel Reverb(WebSocket)
- チャネル:
chat.{chatId}(チャットを開くと自動購読) - イベント:
message.sent— 確定したメッセージ(ユーザー発言・AI 応答)が届く /message.answer-chunk— AI 回答の生成中に本文の増分が逐次届く(ストリーミング表示)
未ログインでも パブリックチャットの閲覧 では WebSocket 接続が行われ、他者の新着メッセージがリアルタイムで見えます(送信はログインが必要。iknow Navigator の匿名送信は例外)。
共有チャットであることの意味
- 同じエージェントのチャットルームは ユーザー間で共有 されます
- あなたの発言も、他の人の過去のやりとりも、同じ画面 に並びます
- サイドバーのチャット一覧も、そのエージェントに紐づく 共有の履歴 です
- 自分だけの履歴 を探すときは ユーザーメニュー → チャット履歴(個人の閲覧・発言履歴)を使います
送信時の画面の動き
- オプティミスティック表示 — 送信直後に自分のメッセージと AI のローディング(3 点)が先に出ます
- ストリーミング表示 — AI 回答の生成が始まると、ローディングが本文の逐次表示(タイプライター風)に切り替わります(
message.answer-chunk)。質問は画面上部に固定され、回答はその下に流れ込むため、生成中に画面は動きません。メンション応答・多言語エージェント・メッセージ編集時の再生成は対象外で、生成完了後にまとめて届きます - 確定配信 — サーバー保存が完了すると、同じルームの全員(自分含む)に
message.sentが届き、ストリーミング行はその位置で確定表示に置き換わります - 重複抑止 — HTTP と WebSocket の二重表示を防ぐため、メッセージ ID で同一メッセージを判別します
新規チャット作成時
- 「+ 新しいチャット」押下時点では まだ DB に保存されません
- 最初のメッセージ送信時 にチャットが作成され、URL が
/chat/{agentId}/new→/chat/{chatId}に切り替わります - 初回送信では WebSocket 購読を開始し、サイドバーへの追加は タイトル確定後(送信レスポンス受信後)に行われます
他者の操作が見えるケース
| 操作 | リアルタイムで見える? |
|---|---|
| 誰かが新規メッセージを送信 | ✓ 全員に配信 |
| AI が回答を生成 | ✓ 全員に配信(生成中の本文も逐次配信され、閲覧者にも少しずつ表示される) |
| 誰かがメッセージを編集・削除 | 反映タイミングは再取得・イベント次第(編集・削除は主に操作者側で更新) |
| チャットタイトル変更(オーナー) | ヘッダー・サイドバーは更新される |
接続が切れたとき
- ネットワーク断やタブ休眠後、WebSocket が再接続されることがあります
- 表示が古い場合は ページを再読み込み するか、スクロールして最新まで確認してください
- 送信に失敗した場合はエラー表示され、再送が必要です
匿名チャット(iknow Navigator)でも同じ
iknow Navigator への匿名送信も 同じ共有ルーム です。同じチャット URL を開いている人からは「匿名」として発言が見えます。
→ 「匿名チャットと iknow Navigator」