A2UI
Agent-to-User Interface — エージェントが「UI を話す」ためのオープン標準。宣言的 JSON で安全かつ表現力のある UI を実現する。
A2UI は、エージェント(LLM 等)が生成する UI を宣言的 JSONで表現するオープン標準と、そのレンダラー群。エージェントは「コード」ではなく「UI の意図」を JSON で送り、クライアント側が信頼済みのカタログに基づいてネイティブなコンポーネント(Flutter / Angular / Lit 等)で描画する。データのように安全で、コードのように表現力がある UI を実現する。
- セキュリティ第一: LLM が生成する任意コードの実行は危険。A2UI は実行可能コードではなく宣言的データ。クライアントが「カタログ」で許可したコンポーネント(Card, Button, TextField 等)だけをレンダリングする。
- LLM 向け・増分更新: UI はフラットなコンポーネントリストと ID 参照で表現され、LLM が増分的に出力しやすい。プログレッシブレンダリングや会話の進行に合わせた更新が可能。
- フレームワーク非依存: UI 構造と実装を分離。エージェントは抽象的なコンポーネントツリーとデータモデルを送り、クライアントが自前のウィジェットにマッピングする。同じ A2UI ペイロードを Web / Flutter / React 等で描画できる。
- 柔軟性: オープンなレジストリで、サーバー側の型をカスタム実装(Smart Wrapper)にマッピングできる。サンドボックスや信頼の段階を開発者が制御できる。
動的フォーム生成(日付・スライダー・入力欄を会話文脈に合わせて生成)、リモートサブエージェントが返す UI をメインのチャット内に表示、企業向けエージェントによる承認ダッシュボードや可視化のオンザフライ生成など。
UI の「生成」と「実行」を分離する。
| 段階 | 説明 |
|---|---|
| Generation | エージェント(Gemini 等)が A2UI Response(JSON)を生成。コンポーネント構成とプロパティを記述。 |
| Transport | メッセージをクライアントへ送る(A2A, AG UI 等)。 |
| Resolution | クライアントの A2UI Renderer が JSON をパース。 |
| Rendering | 抽象コンポーネント(例: type: 'text-field')をクライアントの実装(ウィジェット)にマッピングして描画。 |
サーバーからクライアントへ、JSON オブジェクトのストリームで通信。主なメッセージは次の 4 種類。
| メッセージ | 役割 |
|---|---|
createSurface | 新しいサーフェスを作成し、その描画を開始するようクライアントに指示。 |
updateComponents | 指定サーフェスに追加・更新するコンポーネント定義のリストを送る。 |
updateDataModel | サーフェスのデータモデルにデータを挿入または置換。 |
deleteSurface | サーフェスとその内容を UI から明示的に削除。 |
トランスポートはプロトコルから分離されており、順序保証・メッセージ区切り・メタデータ(データモデル同期や capability 交換)を満たす必要がある。双方向(action の返送)はオプション。
| レンダラー | 説明 |
|---|---|
| Web (Lit) | Lit ベースの Web レンダラー。markdown-it レンダラーと web_core を組み合わせて利用。 |
| Flutter | GenUI SDK(flutter/genui)が A2UI を利用。 |
| Angular / React | renderers 配下に Angular / React 向けの実装がある。 |
トランスポートは A2A Protocol や AG UI と組み合わせて利用。LLM は JSON を出力できるモデルなら利用可能。Roadmap では React / Jetpack Compose / SwiftUI 等の公式サポートや、REST 等のトランスポート追加が掲げられている。
Node.js(Web クライアント)、Python(エージェントサンプル)、Gemini API Key が必要。
- リポジトリをクローンし、
GEMINI_API_KEYを export。 - バックエンド:
samples/agent/adk/restaurant_finderでuv run .。 - フロント:
renderers/markdown/markdown-it→npm install && npm run build。続けてrenderers/web_core、renderers/litを同様にビルド。 - クライアント:
samples/client/lit/shellでnpm install && npm run dev。
Flutter 利用時は GenUI SDK を参照。
- GitHub: google/A2UI — 本体リポジトリ(Apache 2.0)
- A2UI docs — 仕様・概念・ガイド(MkDocs)
- GenUI SDK — Flutter で A2UI を利用
- A2UI Widget Builder (CopilotKit) — ブラウザで試すデモ
- CONTRIBUTING.md — コントリビューション手順