generative-ui について
generative-ui は、再利用可能なコンポーネントを組み合わせて UI を構築する assistant-ui のスキルとパッケージです。モデルまたはバックエンドによる UI 生成に対応し、コンポーネントツリーをブラウザー、Slack、Microsoft Teams 向けに変換できます。
主な機能
- 01標準 UI コンポーネント 29 種
- 02present によるレイアウト構成
- 03バックエンド生成 UI メッセージの表示
- 04コンポーネント語彙の拡張
- 05Slack・Teams 向けツリー変換
- 06A2UI サーフェスの変換
活用シーン
- 01UI コンポーネントからモデルにダッシュボードを構成させる
- 02バックエンド生成の UI メッセージパーツを表示する
- 03コンポーネントツリーを Slack または Microsoft Teams に送る
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ assistant-ui/ skills --skill generative-uiインストール後、Claude Code で/generative-uiを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/a2ui-openui.mdactions.mdrenderers.mdtokens.mdvocabulary.md詳細
assistant-ui 生成 UI
最新の API については、常に assistant-ui.com/llms.txt を参照してください。
生成 UI は、通常のツールレンダリングの関係を逆転させます。ツール呼び出しごとに 1 つのコンポーネントを手書きする代わりに、コンポーネントの語彙を提供し、そこから何かがツリーを組み立てるようにします。それはモデルが present ツールを通じて行うことも、バックエンドがメッセージパートまたは LangGraph イベントを通じて行うこともできます。@assistant-ui/generative-ui は、29 個のコンポーネント(カード、ファクト、テーブル、チャート、フォーム、コントロール)からなるデフォルトの語彙と、同じツリーを Slack Block Kit や Microsoft Teams Adaptive Card に変換するコンバーター、さらに A2UI サーフェスをそれに変換するコンバーターを提供します。そのため、一度構築したコンポジションをブラウザー内でも外でもレンダリングできます。
リファレンス
- ./references/vocabulary.md -- 29 個のデフォルトコンポーネントと、
defineGenerativeComponentsで独自のコンポーネントを追加する方法 - ./references/actions.md --
_actionディスパッチ、createActionRegistry、およびインタラクティブなコンポーネントが返す$inputの形状 - ./references/renderers.md --
MessagePrimitive.GenerativeUIとその許可リスト、Slack および Teams コンバーター、そして 2 つの仕様形状が互換でない理由 - ./references/a2ui-openui.md -- AG-UI 上の A2UI サーフェスとサードパーティの OpenUI 統合
- ./references/tokens.md -- 共有トークン配列と、語彙を再スタイルまたは上書きする方法
どの生成 UI パターンを使うべきか?
2 つの質問がパターンを分けます。モデルがレイアウトを構成するのか、それとも事前にバインドするのか。そして、UI はツール呼び出しから生じるのか、バックエンドが出力するパートから生じるのか。
| パターン | API | 最適な用途 |
|---|---|---|
present ツール | JSONGenerativeUI + present | モデルが、提供した語彙からダッシュボード、カード、レイアウトを構成する |
| ツール UI | toolkit の render(tools を参照) | すでに把握している 1 つのツール呼び出しに紐づくウィジェット |
| 生成 UI プリミティブ | MessagePrimitive.GenerativeUI + 許可リスト | すでに generative-ui メッセージパートを出力するバックエンド |
| LangGraph データ UI | makeAssistantDataUI + ui_message | LangGraph ストリーム上で UI を出力する LangGraph エージェント。assistant-ui.com/docs/runtimes/langgraph/generative-ui を参照 |
| OpenUI | @openuidev/assistant-ui、サードパーティ | すでに OpenUI エコシステムとそのコンポーネントキットに投資している場合 |
最初の 2 つはツール駆動であるため、UI がいつ表示されるかはモデルが決めます。LangGraph の行はバックエンド駆動であるため、UI がいつ表示されるかはエージェントが決めます。present と生成 UI プリミティブはどちらも JSON コンポーネントツリーを受け取りますが、互換性のない形状です。詳しくは 仕様形状の違い を参照してください。present 用に構築されたツリーは、Slack および Teams コンバーターが受け入れ、A2UI コンバーターが生成する形状でもあります。
クイックスタート
パッケージをインストールし、スタイル付き要素を追加して、お使いのフレームワーク向けの "use generative" コンパイラを有効にします。
zod は /react エントリーがインポートするオプションの peer 依存関係であるため、パッケージと一緒にインストールしてください。
npm install @assistant-ui/generative-ui zod
npx assistant-ui@latest add generative-ui
import { withAui } from "@assistant-ui/next";
export default withAui({
/* your Next config */
});
Vite と TanStack Start は @assistant-ui/vite の aui() を使用します(plugins: [aui({ ... })])。Expo と bare React Native は metro.config.js 内で const { withAui } = require("@assistant-ui/metro"); を使用します。このディレクティブにより、1 つのファイルでブラウザーとサーバールートの両方がインポートするツールを宣言できます。コンパイラはサーバービルドからブラウザー専用の部分を、クライアントビルドからスキーマを除去します。
JSONGenerativeUI はコンポーネントライブラリを present 向けのモデル対向スキーマに変換します。結果は他のツールと同様にツールキットに登録します。
"use generative";
import { defineToolkit } from "@assistant-ui/react";
import {
JSONGenerativeUI,
defaultGenerativeUILibrary,
} from "@assistant-ui/generative-ui/react";
const generative = new JSONGenerativeUI({
library: defaultGenerativeUILibrary,
});
export default defineToolkit({
present: generative.present({ display: "standalone" }),
});
display: "standalone" は結果を思考の連鎖のトレースの外側にある専用のサーフェスに描画します。省略するとインラインで描画されます。デフォルトのボキャブラリーは独自のコンポーネントなしですでに動作する構成です。完全なリストと拡張方法については vocabulary.md を参照してください。
AuiConfig を介してクライアントにツールキットを登録し、フロントエンドツールが解決したら実行が継続するように sendAutomaticallyWhen を設定します。
"use client";
import { AssistantRuntimeProvider, AuiConfig, Tools } from "@assistant-ui/react";
import { useChatRuntime } from "@assistant-ui/ai-sdk";
import { lastAssistantMessageIsCompleteWithToolCalls } from "ai";
import toolkit from "./toolkit";
export function MyRuntimeProvider({
children,
}: {
children: React.ReactNode;
}) {
const runtime = useChatRuntime({
sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls,
});
const config = AuiConfig({ tools: Tools({ toolkit }) });
return (
<AssistantRuntimeProvider runtime={runtime} config={config}>
{children}
</AssistantRuntimeProvider>
);
}
present はフロントエンドツールです。ブラウザーで解決され、sendAutomaticallyWhen がない場合、UI が描画されてからモデルが何か言う前に会話が停止します。
ルートは同じツールキットモジュールをインポートします。コンパイラはそのインポートをサーバービルドに解決するため、スキーマだけが受け渡され、ブラウザーコードがサーバーバンドルに入ることはありません。
import { openai } from "@ai-sdk/openai";
import { AISDKToolkit } from "@assistant-ui/ai-sdk";
import { convertToModelMessages, stepCountIs, streamText } from "ai";
import toolkit from "@/app/toolkit";
const aiToolkit = new AISDKToolkit({ toolkit });
export async function POST(req: Request) {
const { messages, tools } = await req.json();
const result = streamText({
model: openai("gpt-5.6-luna"),
messages: await convertToModelMessages(messages),
stopWhen: stepCountIs(10),
tools: await aiToolkit.tools({ frontend: tools }),
});
return result.toUIMessageStreamResponse();
}
ツールキットモジュールをインポートするバックエンドが存在しない場合、たとえばクラウドホスト型の実行では、backendless: true でコンパイルするとクライアントが present のものを含むすべてのアップロード可能なスキーマを保持します。
export default withAui({ ...yourConfig, aui: { backendless: true } });
スタイルを適用する
上で実行した npx assistant-ui@latest add generative-ui は、同梱のスタイルシートと components/assistant-ui/elements/generative-ui.tsx をインストールします。後者は styledGenerativeUILibrary をエクスポートします。これは同じ 29 個のコンポーネントで、デフォルトのプレーンテキストのものと入れ替えて実際の markdown レンダラーを使用します。これは "use client" モジュールであるため、"use generative" ツールキットファイルへの組み込みは以下の注意点にあるクライアントモジュールのルールに従います。正確なオーバーライドパターン、data-aui スタイリングフック、トークン配列については tokens.md を参照してください。
present 以外の用途
- 独自のコンポーネントでボキャブラリーを拡張する、または表示用にモデルが生成したツリーを読み戻す: vocabulary.md。
_actionを介して描画されたノードからアプリにコールバックさせる: actions.md。- バックエンドがすでに出力している
generative-uiメッセージパートを、MessagePrimitive.GenerativeUIと利用側が提供する許可リストで描画する: renderers.md。 - ツリーを Slack や Microsoft Teams に投稿する、AG-UI 上で A2UI サーフェスを描画する、またはサードパーティの OpenUI 連携を組み込む: renderers.md と a2ui-openui.md。
よくある落とし穴
present が UI をレンダリングしたあと、会話がそのまま止まる
presentはフロントエンドのツールです。useChatRuntimeにsendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCallsを指定しないと、解決後に実行が続行されません。
クラウドホスト型バックエンドでは、モデルが present を認識しない
- クライアントビルドは、あなたのバックエンドが同じツールキットモジュールをインポートしていると想定するため、フロントエンドと human のスキーマのアップロードを省略します。あなたのサーバーがどれもこれを行わない場合は、
aui: { backendless: true }でコンパイルしてください。
styledGenerativeUILibrary が "use generative" ビルドを壊す
- これは
"use client"モジュールです。"use generative"ファイルから参照できるのは、defineGenerativeComponents呼び出し内のインラインrender値としてのみで、スプレッド、トップレベルの定数、あるいはlibraryオプションとして直接渡すことはできません。libraryに直接渡す方法が機能するのは、"use generative"ディレクティブのない通常のファイル内だけです。詳しくは tokens.md を参照してください。
generative-ui メッセージパーツが何もレンダリングしない
- デフォルトの shadcn
ThreadはMessagePrimitive.GenerativeUIを接続していません。メッセージレンダラーで明示的にオプトインしてください。詳しくは renderers.md を参照してください。
不明なコンポーネント名:黙って破棄される場合とエラーがスローされる場合
presentツールの経路では、認識されない_typeは破棄され、開発時に警告が出ます。 generative UI プリミティブは、Fallbackを渡さない限り型付きのGenerativeUIRenderErrorをスローします。どちらの境界も、それらのコンポーネントが受け取る props を制約しません。href/srcの値はご自身で検証し、エージェントが指定した props をdangerouslySetInnerHTMLに決して転送しないでください。
Slack や Teams の出力がブラウザと一致しない
- 変換は完全ですが不可逆です。返される
warnings配列を確認してください。変換されるのはpresent用に構築された$typeツリーのみです。プリミティブの{ component, props }形式には Slack、Teams、A2UI のコンバーターがありません。
useChatRuntime はネイティブの generative-ui パーツを決して出力しない
- AI SDK はツール結果を
generative-uiパーツではなくtool-callパーツにマッピングします。結果をご自身でスペックにパースするrender_guiツールで橋渡ししてください(ドキュメントではそのヘルパーをparseRenderGuiResultと呼んでいますが、これはパッケージのエクスポートではありません)。詳しくは renderers.md を参照してください。
関連スキル
- tools -- ツールキットの作成、
"use generative"コンパイラー、および特定のツール呼び出しに紐づくウィジェット向けのツール UI - elements --
generative-uiスタイル要素とカタログの残りのインストール - primitives --
MessagePrimitiveとその他のスタイルなしビルディングブロック - runtime --
AuiConfig、Tools、および設定関連の残りの部分