Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【登壇資料】デリッシュAIを インタラクティブでストリーミング応答の AIアシスタントに作り替...

Avatar for エブリー エブリー
October 02, 2026
7

【登壇資料】デリッシュAIを インタラクティブでストリーミング応答の AIアシスタントに作り替えるまで

2026/10/02 DroidKaigi & iOSDC After Talks Night 2026

Avatar for エブリー

エブリー

October 02, 2026

More Decks by エブリー

Transcript

  1. 仕組み iOS アプリ サーバー 入力の送信 1 エージェント ↓ SSE ストリーミング

    2 3 画面の構成 選択肢 ハンバーグ レシピ検索 唐揚げ パスタ … ↓ UI 生成
  2. 仕組み iOS アプリ サーバー 入力の送信 1 エージェント ↓ SSE ストリーミング

    2 ツール実行 3 レシピ検索「唐揚げ 子供向け」 画面の構成 レシピ一覧 もっと簡単 別の味つけ レシピ検索 ↓ UI 生成
  3. iOS 側の実装 1 AG-UI イベントの解釈 2 ループ状態の保持 @MainActor URLSession.bytes type

    で enum に デコード ↓ イベント受信 awaiting ↓ 画面の構成(A2UI) 最初の イベント 送信 idle A2UI の描画 @Observable RUN_FINISHED ↓ SSE の行 3 receiving RUN_* ↓ Jsonから組み立て レシピ一覧 root TEXT_MESSAGE_* RUN_ERROR 停止 TOOL_CALL_* ACTIVITY_SNAPSHOT ↓ stopped failed 選択肢 ↓ SwiftUIでレンダリング 縦並び レシピ一覧 選択肢 関連する質問 SwiftUI の View AsyncThrowingStream
  4. Actor と AsyncStream Repository 1 イベントを受け取る SSE をデコードして AsyncThrowingStream に

    yield @MainActor の Store 2 MainActorの状態を逐次的に更新 Concurrencyの知識が重要になる 3 キャンセルの伝播 Task のキャンセルが onTermination 経由で通信へ
  5. Swift Testing と Xcode Previews 1 サーバー無しで再現できる Repositoryプロトコルのスタブを用意してパターンを網羅 遅延や失敗を再現してテストを実装 2

    状態の遷移をテストできる 3 途中の画面を目で見られる 同じイベント列を Xcode Previews に渡す 様々なUIの状態のViewを網羅的にチェックできる Swift Testing で phase の遷移をテストする