
2026/02/13 4:59
「Show HN:データからウェブインターフェースを生成」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
## Summary: syntuxは、ReactとNext.js向けの軽量な生成型UIライブラリであり、任意のデータ値を完全にレンダリングされたインターフェースへ変換し、結果を従来のJSXコードではなくフラットJSONスキーマ(React Interface Schema、RIS)として出力します。RISは`id`、`parentId`、`type`、および`props`フィールドを持つオブジェクトで構成され、クライアントにストリームして高速レンダリングが可能です。また、ディスクまたはメモリ上にキャッシュでき、`cached`プロパティを介してリクエスト間で再利用できます。開発者はsyntuxとAIモデルプロバイダー(例:@ai‑sdk/anthropic)およびVercelのai SDKをインストールします。オープンソースMITライセンスには、`npx getsyntux generate-defs` のようなツールが含まれており、コンポーネント定義を自動生成できます。 このライブラリは `components` 配列によるカスタムコンポーネント、`defineTool` を通じたサーバーアクション、および配列用の `__ForEach__` のような反復構造をサポートします。新しいRISが生成されると、オプショナルな `onGenerate` コールバックをトリガーできます。大規模または信頼できないデータは `skeletonize` オプションで処理可能です。RISスキーマはトークン効率が高く、ステートフルコードの生成を回避し、同一RIS文字列をマッチングしてキャッシュすることもサポートします。 開発者がJSXを書かずに任意のデータからUIをレンダリングできるようにすることで、syntuxはレンダリングコストを削減し、フロントエンド開発を高速化し、React/Next.jsプロジェクト間での再利用性を向上させ、動的UI生成に対して費用最適化かつトークン効率の高いソリューションを提供します。
本文
syntux はウェブ向けの生成型 UI ライブラリです。
値を渡すと、その値を表示する UI を自動で設計します。
🎬 デモ
⚡ 主な特徴
- ストリーム可能 – UI が生成されるたびに即座に表示。
- カスタムコンポーネント対応 – 自作の React コンポーネントを利用可。
- キャッシュ可能 – 新しい値で再利用できるように生成済み UI を保存。
仕組みは?
syntux は UI を表す JSON‑DSL(React Interface Schema、RIS)を生成します。詳細は FAQ に記載しています ➜ ドキュメントを見る
API
syntux は React と Next.js 用に設計されています。
1 つのコンポーネントで完結します。
import { GeneratedUI } from "@/lib/getsyntux/GeneratedUI"; import { createAnthropic } from "@ai-sdk/anthropic"; const anthropic = createAnthropic({ apiKey: "…" }); export default function Home() { const valueToDisplay = { username: "John", email: "john@gmail.com", age: 22, }; return ( <GeneratedUI model={anthropic("claude-sonnet-4-5")} value={valueToDisplay} hint="UI should look like…" /> ); }
はオブジェクト・配列・プリミティブなど任意のデータ型を受け付けます。value
大きな配列や信頼できない入力は
プロパティを使用してください(説明参照)。skeletonize
インストール
# プロジェクトルートで実行: $ npm i ai $ npm i @ai-sdk/anthropic # Claude を使う場合
これにより
lib/getsyntux に必要なコンポーネントが自動インストールされます。Vercel AI SDK を使用して、すべての LLM プロバイダーをサポートします。
例
基本例
import { GeneratedUI } from "@/lib/getsyntux/GeneratedUI"; import { createAnthropic } from "@ai-sdk/anthropic"; const anthropic = createAnthropic({ apiKey: "…" }); export default function Home() { const valueToDisplay = { /* … */ }; return ( <GeneratedUI model={anthropic("claude-sonnet-4-5")} value={valueToDisplay} hint="UI should look like…" /> ); }
キャッシュ
const cache: Map<number, string> = new Map(); export default function Home() { const userID = 10; const valueToDisplay = { /* … */ }; return ( <GeneratedUI cached={cache.get(userID)} onGenerate={(result) => cache.set(userID, result)} model={anthropic("claude-sonnet-4-5")} value={valueToDisplay} /> ); }
カスタムコンポーネント
import { CustomOne, CustomTwo } from "@/my_components"; export default function Home() { const valueToDisplay = { /* … */ }; return ( <GeneratedUI components={[ { name: "Button", props: "{ color: string, text: string }", component: CustomOne, }, { name: "Input", props: "{ initial: string, disabled: boolean }", component: CustomTwo, context: "Creates an input field with an (initial) value. Can be disabled.", }, ]} /> ); }
配列はcomponentsで自動生成できます。npx getsyntux generate-defs <component.tsx>
カスタムアクション
import { defineTool } from "getsyntux"; export default function Home() { const valueToDisplay = { /* … */ }; return ( <GeneratedUI actions={{ delete: defineTool( async (id: string) => { "use server"; // … }, "id: string", "deletes post with id" ), refresh: defineTool(async () => { "use server"; // … }), }} /> ); }
アクション名は LLM に見える目的を示すものにし、
で文脈を追加してください。defineTool
FAQ
生成コストはどれくらいかかりますか?
syntux はトークン消費を最小化するよう高度に最適化されています。コスト見積テーブル と解説をご覧ください。
ソースコードを出力しますか?
いいえ。syntux は React Interface Schema(RIS)を生成し、これを hydration してレンダリングします。これによりセキュリティ・再利用性・キャッシュ性が保証されます。
キャッシュはどう機能しますか?
生成された UI は RIS 文字列で決定されます。
cached と onGenerate を使ってこの文字列を保存・取得してください。メモリ、ファイル、データベースなど任意に保管できます。
ステートは生成可能ですか?
ステートの生成はアンチパターンです。ステートレスコンポーネントをステートフルなラッパーで包み、それらをカスタムコンポーネントとして syntux に渡してください。
RIS の構造は?
RIS は改行区切りの JSON オブジェクト列です。各オブジェクトには要素/コンポーネント情報、props、
id、parentId が含まれます。例:
{"id":"loop_1","parentId":"root","type":"__ForEach__","props":{"source":"authors"}} {"id":"card_1","parentId":"loop_1","type":"div","props":{"className":"card"},"content":{"$bind":"$item.name"}}
v0.2.x 以前は深い JSON ツリーでしたが、v0.2.x 後はストリーミングに適したフラットリストになりました。
ライセンス
syntux は MIT ライセンスの下でオープンソースです。