showcase/shell-docs/src/content/docs/generative-ui/open-generative-ui.mdx
Open Generative UI lets the agent generate complete, sandboxed UI on the fly (HTML, CSS, and JavaScript) and stream it live into the chat. The user sees the interface build in real time: styles apply first, then HTML streams in progressively, and finally JavaScript expressions execute one by one.
Key benefits:
<script> tagsTurning on Open Generative UI takes one flag in the runtime plus a plain
<CopilotChat /> on the frontend; the built-in activity renderer is
auto-registered by CopilotKitProvider, so no extra wiring is needed.
Add OpenGenerativeUIMiddleware to your runtime configuration:
The OpenGenerativeUIMiddleware then converts the agent's streamed
generateSandboxedUi tool call into open-generative-ui activity events,
which the built-in OpenGenerativeUIActivityRenderer mounts inside a
sandboxed iframe.
<CopilotChat /> into the pageWrap your app in CopilotKitProvider and render <CopilotChat> — no extra props needed:
That's it. Ask the agent "build me a simple greeting card" to see HTML stream into a sandboxed preview live.
Sandbox functions let the generated UI call back into your host application — a generated settings panel can toggle your app's theme, a product card can push items into your cart, or a data view can ask the host to fetch data the iframe can't reach directly.
<InlineDemo demo="open-gen-ui-advanced" />The server-side flag is identical to the minimal cell; the advanced behaviour is a pure frontend addition.
<Snippet region="advanced-runtime-config" cell="open-gen-ui-advanced" />Each sandbox function is a Zod-validated, host-side bridge the agent can
invoke from inside the generated iframe via
Websandbox.connection.remote.<name>(args). The handler runs in the host
page and its description is appended to the agent's context, so the agent
knows which bridges are available when generating HTML/JS.
The agent generates the tool call's parameters in an order optimized for the user experience:
placeholderMessages — shown immediately while generatingcss — all styles first; the preview starts once CSS is completehtml — streams live into the preview as it's generatedjsFunctions — reusable helpers injected before expressionsjsExpressions — executed one by one; the user sees each take effectThe middleware parses the tool-call arguments incrementally and emits activity events as each parameter completes, so the preview updates progressively.
The sandboxed iframe can load external libraries from CDNs; just include
<script> or <link> tags in the generated HTML <head>. Chart.js, D3,
Three.js, and any other CDN-hosted library work out of the box.
<head>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<canvas id="myChart"></canvas>
</body>