OpenUI は、LLM(大規模言語モデル)に 「テキスト」ではなく「UI(ユーザーインターフェース)」を生成させる ためのオープンソースのフレームワーク/標準です。 リポジトリの旗印はずばり「The Open Standard for Generative UI(生成UIのオープン標準)」。 LLMがチャートやフォーム、表といったUI部品を構造化して出力し、それが トークンの到着に合わせてリアルタイムにレンダリング されます。
開発元は、生成UI(C1など)に取り組む Thesys。ライセンスは MIT で、誰でも自由に使い・改変・組み込みができます。 本稿は 2026年6月25日(JST)時点 で、公式GitHubリポジトリ(thesysdev/openui)をもとに、仕組み・特徴・導入・他ツール比較を整理します。
「開発時にAIでアプリを生成する」AIアプリビルダーとの違いは、本文と Retool新AIアプリビルダー(R2)徹底解説 を併読すると掴みやすくなります。
- ・LLMに「UIを生成」させるためのオープン標準OSS(MIT・by Thesys)。
- ・OpenUI Lang=UI生成特化のストリーミング言語。JSONより最大67%少ないトークン。
- ・React/Vue/Svelte等のランタイムと、チャート/フォーム/表の組み込み部品。
- ・トークン到着に合わせてUIが段階的に組み上がる(ストリーミングレンダリング)。
- ・部品ライブラリからシステムプロンプトを自動生成。「実行時」の動的UI生成のためのインフラ。
1. OpenUIとは — 「AIの応答をUIにする」
LLMは文章の生成が得意です。 しかし、ユーザーが本当に欲しいのは文章ではなく、操作できるUI であることが多々あります。 「先月の売上は?」に対して、長い文章で説明されるより、棒グラフと表 がパッと出てくる方が圧倒的に分かりやすい——これが「生成UI(Generative UI)」の発想です。 人は文章を読むより、図や表を“見る”方が速く理解できる場面が多く、特に数値・比較・選択を伴う情報ではその差が顕著です。 AIがいくら賢く答えても、それが読みづらい文章の塊では、価値が半減してしまいます。
OpenUIは、この 「AIの応答そのものをUIにする」 ためのフレームワークです。 LLMにUI部品を構造化して出力させ、それを実際のコンポーネントとしてレンダリングします。
「The Open Standard」を名乗ることにも意味があります。 生成UIは各社が独自方式で実装しがちな領域ですが、出力形式(言語)がバラバラだと、モデルもツールも相互運用できません。 OpenUIは、LLMがUIを表現するための共通の語彙(OpenUI Lang)を“開いた標準”として提供 することで、特定ベンダーに縛られない生成UIの土台を目指しています。 オープンソース(MIT)であることは、この「標準を皆で使える状態にする」という姿勢の表れでもあります。
OpenUIが提供する主な要素は次のとおりです。
・OpenUI Lang:UI生成に特化した、コンパクトでストリーミング前提の言語
・ランタイム:React(およびVue/Svelte等)で動く、組み込み部品ライブラリ付きの実行環境
・組み込み部品:チャート・フォーム・表・レイアウトなど
・ストリーミングレンダラ:モデル出力が届くたびにUIを段階的に更新(待ち時間の体感を短縮)
・プロンプト自動生成:部品ライブラリから、LLMに渡すシステムプロンプトを生成
・すぐ使えるチャットUI:生成UIを組み込んだ、そのまま動かせるチャットインターフェース(ゼロから作らなくてよい)
要するにOpenUIは、「LLMが正しいUIを、安く・速く・段階的に吐き出せるようにする」 ための言語とランタイムの組み合わせです。
なぜいま「生成UI」が注目されるのかも押さえておきましょう。 2023〜2025年は「チャット」がAIのインターフェースの主役でした。 しかし、文章のやり取りだけでは限界があります。 数値を比べるなら表やグラフ、入力を求めるならフォーム、選択肢を示すならボタン——人間にとって最適な情報の受け取り方は、内容によって変わるからです。 従来のチャットボットは、どんな質問にも「文章の壁」で答えるしかありませんでした。 生成UIは、この制約を取り払い、「内容に最適な見せ方をAIが選んで描画する」 段階へ進めます。 これは、AIのUXが「会話」から「動的に組み上がるインターフェース」へと進化する流れであり、OpenUIはその基盤レイヤを“オープン標準”として提供しようとしている、と位置づけられます。 ChatGPTやClaudeのようなアシスタントが普及し、人々が「AIに頼んで何かをやってもらう」ことに慣れた今、次の課題は「その結果をどう返すか」です。 文章で返すだけの時代から、最適なUIで返す時代 へ——OpenUIは、その移行を支える道具立てを揃えようとしているのです。
2. なぜJSONではなく専用言語なのか(OpenUI Langの狙い)
LLMにUIを出力させる素朴な方法は、「JSONで部品ツリーを書かせる」ことです。 たとえば、こんな具合です(イメージ)。
{
"type": "card",
"children": [
{ "type": "heading", "text": "今月の売上" },
{ "type": "barChart", "data": [/* ... */] },
{ "type": "table", "columns": [/* ... */], "rows": [/* ... */] }
]
}
これは動きますが、3つの問題があります。
・トークンを大量に消費する:"type" や括弧、引用符などの構文がかさみ、コストとレイテンシが増える
・ストリーミングと相性が悪い:JSONは途中まで送ると壊れた状態になり、「届いた分だけ描画」が難しい
・壊れやすい:LLMが括弧やカンマを1つ間違えるだけでパースに失敗する
3つ目の「壊れやすさ」は、ストリーミングと組み合わさると特に厄介です。 JSONは構造が閉じて初めて妥当になるため、生成の途中段階は常に“不完全=壊れた”状態です。 そのため「届いた分から描画する」ことが難しく、結局すべて揃うまで待つことになります。 一方、ストリーミング前提に設計された言語は、途中の状態でも意味が取れる ように作られているため、部分的に描画を進められます。 この「設計思想の違い」が、体験の差として効いてくるわけです。
OpenUI Langは、この課題を 「UI生成専用の、コンパクトでストリーミング前提の言語」 で解きます。 公式によれば、JSONより最大67%少ないトークン で同じUIを表現できます。 トークンが減ればコストとレイテンシが下がり、ストリーミング前提なので 「トークンが届くたびにUIが少しずつ組み上がる」 体験を実現できます。
トークン効率が効くのは、コストだけではありません。 生成UIでは、LLMが出力するトークン数がそのまま 「UIが完成するまでの待ち時間」 に直結します。 JSONで冗長に書かせれば、それだけ多くのトークンを生成する必要があり、ユーザーは長く待たされます。 OpenUI Langのように表現を圧縮できれば、同じUIをより少ない生成で・より速く 返せます。 さらに「ストリーミング前提」という設計は、体感速度に大きく寄与します。 全部が揃うまで真っ白な画面を見せるのではなく、見出しが出て、次にグラフの枠が現れ、データが流れ込む——という 段階的な描画 は、実際の完了時間が同じでも「速い」と感じさせます。 チャットの文章がストリーミングで少しずつ表示されると速く感じるのと同じ原理を、UI全体に適用したものだと考えると分かりやすいでしょう。
(OpenUI Lang のイメージ:JSONより簡潔・ストリーミング前提)
card
heading "今月の売上"
barChart data=@sales
table cols=@cols rows=@rows
※ 上記は概念を示すための簡略イメージで、実際の構文は公式の仕様に従ってください。 ポイントは「冗長なJSONを避け、UI生成に最適化した表現でトークンを節約しつつ、ストリーミングで段階描画する」という設計思想です。
3. 仕組み:LLMがLangを吐き、ランタイムが段階描画する
全体像を図にすると次のようになります。
チャート/フォーム/表/レイアウト"] --> SP["システムプロンプト自動生成
(何を出力してよいかをLLMに教える)"] U["ユーザーの質問
例: 今月の指標を可視化して"] --> LLM["LLM"] SP --> LLM LLM -->|OpenUI Lang をストリーミング出力| RT["OpenUI ランタイム
(React / Vue / Svelte)"] RT -->|トークン到着ごとに段階描画| UI["操作できるUI
グラフ・表・フォーム"] UI --> USER["ユーザー"]
流れはこうです。
第一に、部品ライブラリからシステムプロンプトを自動生成 します。 これにより、LLMは「自分が出力してよいUI部品は何か」「どう書けばよいか」を正しく理解します。 この自動生成があるおかげで、開発者は「LLMに何を許可するか」を部品ライブラリの定義として一元管理でき、プロンプトを手書きで保守する負担から解放されます。
第二に、ユーザーの質問を受けたLLMが、OpenUI Langをストリーミングで出力 します。 JSONのように「全部揃ってから描画」ではなく、トークンが届くたびにランタイムがUIを段階的に組み上げます。
第三に、結果として 操作できるUI(グラフ・表・フォーム)がユーザーに返ります。 文章で説明する代わりに、その場でダッシュボードが生成される、というわけです。 しかも返ってくるのは静止画像ではなく、実際に操作できるUI部品 です。 生成された表をソートしたり、フォームに入力して送信したり、グラフのフィルタを切り替えたり——AIが作ったUIに対して、ユーザーがそのままインタラクションできます。 ここが「AIに画像を生成させる」のとも「スクリーンショットを見せる」のとも決定的に違う点で、生成UIが“次のインターフェース”と呼ばれる理由です。 AIの出力が、読むだけのものから、触って使えるもの へと変わるわけです。
この「プロンプト自動生成 → Lang出力 → 段階描画」のループが、OpenUIの核心です。
ここで「システムプロンプトの自動生成」の重要性を補足します。
LLMにUIを出力させるとき、最大の難所は「モデルが、存在しない部品や、間違った書式を出力してしまう」ことです。
たとえば、用意していない pieChart3D のような部品を勝手に出してきたり、引数の名前を間違えたりすると、描画は失敗します。
OpenUIは、開発者が定義した部品ライブラリから 「使える部品の一覧と、その正しい書き方」をシステムプロンプトとして自動で組み立てる ため、LLMが“出してよいもの”の範囲を正確に把握できます。
これは、自由すぎるLLMの出力を、レンダリング可能な範囲にガードレールで収める仕組みでもあります。
部品ライブラリを更新すれば、プロンプトも自動で追従するため、「部品を足したのにプロンプトの更新を忘れて壊れる」といった事故も防げます。
4. 導入とコード(最小イメージ)
OpenUIはJavaScript/TypeScriptエコシステムのライブラリ群として提供されます。 インストールはnpm系で行います(パッケージ名はリポジトリの指定に従ってください)。
# 例: ランタイムとコア言語パッケージを導入
npm install @openui/react @openui/lang
Reactでの利用イメージは、概ね次のような形です。
// 概念イメージ:LLMの出力(OpenUI Lang)をストリーミング描画する
import { OpenUIRenderer, useGenerativeUI } from "@openui/react";
function Assistant() {
const { stream } = useGenerativeUI({ endpoint: "/api/generate" });
// stream: LLMが吐く OpenUI Lang のトークン列
return <OpenUIRenderer stream={stream} />; // 届くたびに段階描画
}
上記のように、クライアント側は「ストリームを受け取って描画する」だけのシンプルな構成になります。 LLMが何を返すか・どう描画するかという複雑さは、ランタイムと部品ライブラリが吸収してくれるため、アプリ開発者は“器”を置くだけで生成UIを組み込めます。
サーバ側では、部品ライブラリから生成したシステムプロンプト をLLMに渡し、OpenUI Langで応答させます。
// 概念イメージ:部品ライブラリ → システムプロンプト → LLM
import { buildSystemPrompt } from "@openui/lang";
const system = buildSystemPrompt(componentLibrary); // 何を出力してよいかを定義
// この system を付けて LLM に問い合わせ、OpenUI Lang をストリーミングで受け取る
※ パッケージ名・API名は概念を示すイメージです。実際の名前・使い方は公式リポジトリのREADMEとドキュメントを確認してください。 重要なのは「部品ライブラリを定義 → そこからプロンプトを自動生成 → LLMがLangで応答 → ランタイムが段階描画」という一連の流れです。
OpenUIが「マルチフレームワーク」である意義も補足しておきます。 公式によれば、Reactを中心に、Vue・Svelte、さらにメール用やブラウザバンドルにも対応するとされています。 これは、同じOpenUI Langの出力を、異なる描画ターゲットで再利用できる ことを意味します。 たとえば、Webアプリ(React)でもモバイル相当でも、あるいはAIが生成した内容をメールHTMLとして送る場合でも、LLM側の出力(Lang)は共通にできます。 「UIの意味(何を見せたいか)」と「描画の実装(どのフレームワークか)」を分離するこの設計は、生成UIを長く使ううえで効いてきます。 モデルが吐く“UIの設計図”を一度きりの使い捨てにせず、複数の出力先で活かせるからです。 さらに、メール対応があるのは実務的に大きく、AIが生成したダッシュボードを定期レポートとしてメール配信する、といったワークフローも視野に入ります。
5. 他ツールとの違い(AIアプリビルダー / 素のJSON)
立ち位置を整理します。
| アプローチ | いつUIが決まるか | 出力形式 | 用途 |
|---|---|---|---|
| OpenUI | 実行時(毎回LLMが生成) | OpenUI Lang(ストリーミング) | AIの応答をUIで返す動的生成UI |
| Retool / v0 等のAIアプリビルダー | 開発時(生成後は固定) | React等のコード | アプリ/画面をAIで作る |
| 素のJSON → 部品マッピング | 実行時 | JSON(冗長) | 自前実装(トークン非効率) |
| LLMのテキスト/Markdown | 実行時 | 文章 | 説明・会話(UIではない) |
ここがOpenUIを理解する鍵です。 Retool やv0のようなAIアプリビルダーは「開発時に」UIを生成 し、その後は普通のアプリとして動きます。 一方 OpenUIは「実行時に」LLMがその場でUIを生成し続ける ためのインフラです。 ユーザーの質問に応じて、AIが毎回UIを組み立てて返す——この動的な生成UIを実装するのがOpenUIの役割です。
もう一つ重要な対比が、「素のJSON → 部品マッピング」を自前実装する方法との違いです。 実は、生成UIは専用言語なしでも作れます。 LLMにJSONで部品ツリーを書かせ、それを自分のコードで各コンポーネントにマッピングすればよいのです。 多くのチームが最初にこの方法に手を出しますが、すぐにトークンコスト、ストリーミングの難しさ、壊れた出力のハンドリング、プロンプト管理といった“地味だが重い”課題にぶつかります。 OpenUIは、この 「誰もが自前で再発明しがちな部分」を、最適化済みの言語・ランタイム・プロンプト生成としてまとめて提供 します。 つまりOpenUIの価値は、「JSONでもできることを、安く・速く・壊れにくく・標準的にできるようにした」ところにあります。 車輪の再発明を避けたい開発者にとって、これは大きな時間の節約になります。
「URLからサイトを生成する」OSSの Open Lovable なども“生成”という点で近縁ですが、OpenUIは AIアシスタントの応答そのものをUI化する という、より実行時寄りのレイヤを担います。
この「開発時」と「実行時」の違いは、何度強調してもしすぎることはありません。 AIアプリビルダーで作ったダッシュボードは、生成された瞬間に“完成品”として固定され、以後はそのまま動きます。 対してOpenUIで作るのは、「ユーザーが何を聞くか分からない」前提で、その都度AIが画面を組み立てる仕組みです。 たとえば社内データ分析アシスタントなら、ある社員は「地域別売上」を聞き、別の社員は「在庫の推移」を聞くかもしれません。 事前に全画面を用意するのは不可能ですが、生成UIなら、質問に応じてその場で最適な可視化を返せます。 この「事前に画面を設計しきれない、無限のバリエーションを持つUX」こそ、生成UIが本領を発揮する領域です。 逆に、画面のパターンが決まっているなら、わざわざ実行時生成にする必要はなく、AIアプリビルダーや通常の開発で十分です。 OpenUIを採用すべきかは、「UIのバリエーションが、事前に列挙できるか否か」で判断するのが実用的な指針になります。 言い換えれば、ユーザーの要求が型にはまらず、毎回違う見せ方が必要な“探索的”なプロダクトほど、生成UIの恩恵が大きくなります。 分析ツール、リサーチアシスタント、複雑なデータを扱う社内ツールなどが、その典型例です。 逆に、決まったフォームの入力画面や、固定レイアウトの管理画面のように“答えの形”があらかじめ決まっているものは、生成UIにする必要はありません。 適材適所を見極めることが、生成UIを過剰に使って複雑化させないコツになります。
6. 向き不向きと注意点
OpenUIは強力ですが、向き不向きがあります。
・向いている:AIアシスタント/社内ダッシュボード/データ探索ツールなど、AIの応答を操作可能なUIで返したい場面
・向いていない:単純なテキスト回答で十分なチャットボット(生成UIはオーバースペックになりがち)
導入時の注意点も押さえておきましょう。
・部品ライブラリの設計が肝:LLMが出力できるUIは、用意した部品の範囲。何を出させたいかを先に設計する
・プロンプトと検証:自動生成プロンプトに任せきりにせず、想定外のUIや壊れた出力への対処(フォールバック)を用意する
・セキュリティ:LLMが生成した内容をUIとして描画する以上、入力のサニタイズや権限の扱いに注意
・仕様の成熟度:新しい標準のため、APIや言語仕様は変わり得る。バージョン追従が必要
・モデル依存:生成UIの品質はLLMの能力に左右される。複雑なUIほど上位モデルが安定
・UI一貫性の担保:毎回生成するため、デザインの統一は部品ライブラリ側で固める必要がある
特に「UIの一貫性」は、生成UI特有の論点です。 人間がデザインした画面は、ボタンの形も余白も統一されています。 ところが、UIをLLMに毎回生成させると、放っておけば見た目が揺らぐ恐れがあります。 OpenUIが「部品ライブラリ」を中心に据えているのは、この問題への答えでもあります。 LLMが選べるのは“あらかじめデザインされた部品”だけ にしておけば、AIがどう組み合わせても、見た目とアクセシビリティの水準は部品側で担保されます。 つまり、生成の自由度(何を組み合わせるか)はLLMに、品質の保証(個々の部品の質)は開発者に、と責任を分担する設計です。 このあたりは、設計トークンやコンポーネント仕様で品質を固める考え方と共通しており、生成UIを実運用に乗せるうえで欠かせない発想になります。
いきなり全画面を生成UIにせず、「1つの質問に、グラフ+表で答える」小さな生成ダッシュボードから作るのがおすすめ。部品ライブラリを最小構成で定義し、プロンプト自動生成→Lang出力→段階描画の一連を体験してから、対応部品とフレームワークを広げると、設計がぶれない。
まとめ
OpenUIは、LLMに「テキスト」ではなく「UI」を生成させる ための、MITライセンスのオープンソース標準です。
要点を整理すると次のようになります。
・「生成UI(Generative UI)」のオープン標準を掲げる(by Thesys)
・OpenUI Lang=UI生成特化のストリーミング言語。JSONより最大67%少ないトークン
・React/Vue/Svelte等のランタイムと、チャート/フォーム/表の組み込み部品
・部品ライブラリからシステムプロンプトを自動生成し、LLMに正しく出力させる
・「開発時に作る」AIアプリビルダーと違い、「実行時に生成し続ける」インフラ
・採用判断の指針は「UIのバリエーションを事前に列挙できるか否か」。無限ならOpenUI、有限なら通常開発
OpenUIの本質は「AIの応答そのものをUIにする」ことだ。チャットの次は、文章ではなく操作できるUIをその場で生成するUX——その実装を、トークン効率の良い専用言語とストリーミングランタイムで支える。まずは『1つの質問にグラフと表で答える』小さな生成ダッシュボードから試し、部品ライブラリの設計勘を掴むのが近道だ。AIネイティブなプロダクトを作る開発者にとって、押さえておく価値のある標準である。チャットUIの“次”を考えているなら、いま触れておいて損はない。
なお、生成UIはまだ発展途上の領域であり、OpenUIもその標準化を狙う有力な一手という段階です。 今後、対応モデルや部品エコシステム、ツールチェーンがどこまで広がるかが、この分野の本格普及を左右します。 本サイトでは引き続き、生成UIやAIネイティブなフロントエンドの動向を追っていきます。OpenUIに興味を持ったら、まず公式リポジトリのデモとサンプルに触れ、「LLMがUIを吐く」感覚を一度味わってみることをおすすめします。
参照ソース
・thesysdev/openui(公式GitHubリポジトリ)
・Thesys(OpenUI開発元)
・Retool新AIアプリビルダー(R2)徹底解説(本サイト)
・AIエージェントとは?仕組み・種類・代表的OSSフレームワーク【2026年版】(本サイト・ピラー)