大模型应用
模型需要运行时自行编排 UI、未知组件名报错/静默、或生成…
在 assistant-ui 中用预置组件词汇表让模型通过 present 工具或后端 message part 组合 UI,并复用到 Slack、Teams、A2UI 等输出。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
模型需要运行时自行编排 UI、未知组件名特定
解决思路
- 先查阅 https://www.assistant-ui.com/llms.txt 获取最新 API。
- 按两个问题选择模式:布局由模型组合还是提前绑定;UI 来自工具调用还是后端发出的 message part。
- 若模型要从你提供的词汇表组合仪表盘、卡片和布局,用 `JSONGenerativeUI` + `present`。
- 若只是已知某次工具调用对应的 widget,改用 tools skill 的 toolkit `render`(Tool UI)。
- 若后端已发出 `generative-ui` message part,用 `MessagePrimitive.GenerativeUI` + 允许列表。
- 若 LangGraph agent 在 LangGraph stream 上发 UI,用 `makeAssistantDataUI` + `ui_message`。
- 若已投入 OpenUI 生态,用第三方 `@openuidev/assistant-ui`。
- 安装包:`npm install @assistant-ui/react-generative-ui`。
- 添加 styled element:`npx assistant-ui@latest add generative-ui`。
- 为框架启用 `"use generative"` 编译器:Next 在 `next.config.ts` 用 `withAui` 包裹配置;Vite/TanStack Start 用 `@assistant-ui/vite` 的 `aui()`(`plugins: [aui({ ... })]`);Expo/bare React Native 在 `metro.config.js` 用 `const { withAui } = require("@assistant-ui/metro");`。
- 利用 `"use generative"` 让同一文件声明 client 和 server route 都 import 的 tools;编译器会从 server build 剥离 browser-only 部分、从 client build 剥离 schemas。
- 在 `"use generative"` 文件中用 `new JSONGenerativeUI({ library: defaultGenerativeUILibrary })` 把组件库转成 `present` 的模型 schema,并用 `defineToolkit({ present: generative.present({ display: "standalone" }) })` 注册为普通工具。
- 选择 `display: "standalone"` 让结果独立表面渲染、不进入 chain-of-thought trace;省略则内联渲染。默认 27 组件词汇表可直接用,无需自定义组件。
- 在客户端通过 `AuiConfig({ tools: Tools({ toolkit }) })` 注册 toolkit,并设置 `sendAutomaticallyWhen` 让 frontend tool 解析后继续运行。
- 在 `useChatRuntime` 设置 `sendAutomaticallyWhen: lastAssistantMessageIsCompleteWithToolCalls`;否则 `present` 渲染 UI 后对话会停,模型不会继续说。
- 在服务端 route import 同一个 toolkit 模块;编译器会解析为 server build,只让 schemas 跨过去,避免 browser code 进入 server bundle。
- 服务端示例:用 `AISDKToolkit({ toolkit })`,在 `streamText` 中传 `tools: await aiToolkit.tools({ frontend: tools })`,按需设置 `stopWhen: stepCountIs(10)`。
- 如果没有你自己的后端 import toolkit 模块(如 cloud-hosted run),用 `withAui({ ...yourConfig, aui: { backendless: true } })` 编译,使 client 上传所有 schemas(包括 `present` 的)。
- 样式:运行 `npx assistant-ui@latest add generative-ui` 安装样式表和 `components/assistant-ui/elements/generative-ui.tsx`;它导出 `styledGenerativeUILibrary`(27 组件 + markdown renderer)。
- `styledGenerativeUILibrary` 是 `"use client"` 模块;在 `"use generative"` 文件中只能作为 `defineGenerativeComponents` 调用内联 `render` 值引用,不能 spread、顶层常量或直接作 `library` 选项;无 `"use generative"` 的普通文件才可直接传给 `library`。
- 扩展词汇表:用 `defineGenerativeComponents` 加自有组件,或读取模型产出的树用于显示;详见 `vocabulary.md`。
- 让渲染节点通过 `$action` 回调 app(`createActionRegistry`、交互组件回传的 `$input` 形状)详见 `actions.md`。
- 渲染后端已发出的 `generative-ui` message part:用 `MessagePrimitive.GenerativeUI` 和 consumer 提供的 allowlist;默认 shadcn `Thread` 没接它,需在 message renderer 显式 opt in。
- 未知组件名处理:`present` 路径会丢掉未识别 `$type` 并在开发时 warning;primitive 会抛 `GenerativeUIRenderError`,除非传 `Fallback`;两种边界都不约束组件 props,需自行校验 `href`/`src`,绝不要把 agent 提供的 props 传给 `dangerouslySetInnerHTML`。
- 发到 Slack 或 Microsoft Teams、渲染 A2UI over AG-UI、接 OpenUI:用同一棵为 `present` 构建的 `$type` 树给 converters;转换完整但有损,读取返回的 `warnings`;primitive 的 `{ component, props }` 形状没有 Slack、Teams、A2UI converter。
- 若 `useChatRuntime` 从不发出原生 `generative-ui` part:AI SDK 把工具结果映射为 `tool-call` parts,不是 `generative-ui` parts;用一个 `render_gui` 工具桥接,并自行把结果解析成 spec(文档中的 helper 叫 `parseRenderGuiResult`,不是 package export)。
- 深入实现前按需查阅 references:`vocabulary.md`、`actions.md`、`renderers.md`、`a2ui-openui.md`、`tokens.md`。
适用边界 · 注意事项
- 已知某次工具调用对应固定 widget 时,不要用 Generative UI,改用 tools skill 的 toolkit `render`(Tool UI)。
- 需要 Slack/Teams/A2UI 转换时,不要使用 `MessagePrimitive.GenerativeUI` 的 `{ component, props }` 形状;只有为 `present` 构建的 `$type` 树可转换。
- 未使用 assistant-ui 或不想引入 `@assistant-ui/react-generative-ui` 及其编译器/运行时配置时,不适用。