/docsfor

API reference

Signatures and options for every generative-frame entry point.

generative-frame

createWidget

import { createWidget } from "generative-frame";

const widget: WidgetHandle = createWidget(options);
CreateWidgetOptions
containerHTMLElement

The element the frame is appended to.

tokensThemeTokens= DEFAULT_LIGHT_TOKENS

Theme tokens sent into the frame. See Theming.

cspCspOptions | string= buildCsp()

The frame's Content Security Policy, as options or a complete policy string.

maxHeight?number

The iframe never grows past this height; taller content scrolls inside it.

minHeightnumber= 0

The smallest height of the iframe.

code?string

Complete code to render immediately, as `write(code)` then `end()`.

productstring= "generative-frame"

Scopes the frame origin, see `SafeContentFrame`.

frame?SafeContentFrame

A preconfigured Safe Content Frame, for example with `useShadowDom`. Cannot be combined with `id`.

id?string

A stable origin, so the widget's storage persists for this id. Choose it on the host. See Persistent storage.

context?HostContext

Extra MCP Apps host context fields (locale, display mode, and so on) merged over the theme.

animateboolean= true

Fade in elements as they stream in. Always off under reduced motion.

css?string

Extra CSS appended after the frame's base styles.

readyTimeoutMsnumber= 15000

How long the frame may take to connect before `ready` rejects and an error is reported.

onPrompt?(text: string) => unknown

A widget called `sendPrompt(text)`.

onMessage?(params: UiMessageParams) => unknown

The raw MCP Apps `ui/message`. Takes precedence over `onPrompt`.

onOpenLink(url: string) => unknown= open in a new tab

An http(s) link the widget asked to open.

onCallTool?(call: { name, arguments? }) => unknown

A widget called `genframe.callTool` or MCP `tools/call`. The return value is the result.

onRequestDisplayMode?({ mode }) => unknown

A request for `inline`, `fullscreen`, or `pip`.

onUpdateModelContext?(params: unknown) => unknown

MCP Apps `ui/update-model-context`.

onWidgetState?(state: unknown) => void

A widget called `genframe.setState`.

onResize?(size: WidgetSize) => void

The content size changed.

onError?(error: WidgetError) => void

An error, unhandled rejection, CSP violation, failed resource, or script error in the widget.

onLog?(entry: ConsoleEntry) => void

Console output from the widget.

WidgetHandle

MemberDescription
ready: Promise<void>Resolves once the frame runtime is connected; rejects if it never connects.
code: stringAll code written so far.
ended: booleanWhether end() or replace() has been called.
iframe: HTMLIFrameElement | undefinedThe current iframe.
write(chunk)Appends streamed code. Throws after end().
end(): Promise<EndResult>Marks the code complete, runs held scripts, and resolves with { size, blank, errorCount }.
replace(code): Promise<EndResult>Renders new complete code, morphing in place, or remounting when scripts already ran.
setTheme(tokens)Sends new theme tokens.
setContext(context)Merges MCP Apps host context fields and notifies the widget.
notifyToolInput(args, { partial? })Forwards tool input to MCP Apps widgets.
notifyToolResult(result)Forwards a tool result to MCP Apps widgets.
screenshot({ scale?, background? }): Promise<Screenshot>Captures the widget as { dataUrl, width, height }.
inspect(): Promise<WidgetInspection>{ kind, ended, size, blank, errors, console, code }.
on(event, listener): () => voidSubscribes to ready, resize, error, log, or end.
dispose()Removes the frame.

Storage

FunctionDescription
clearWidgetStorage(id, { product?, readyTimeoutMs? })Clears the storage of widgets with this id; resolves with { cleared }, the storage kinds cleared.
widgetStorageSalt(id)The SafeContentFrame salt behind an id's origin.

previewWidget

previewWidget(code: string, options?: PreviewOptions): Promise<PreviewResult>

Options and result are on Repair loop and screenshots.

Theme

ExportDescription
readThemeTokens(element?, sources?)Reads the page theme into ThemeTokens.
defaultThemeTokens(scheme), DEFAULT_LIGHT_TOKENS, DEFAULT_DARK_TOKENSBuilt-in palettes.

CSP

ExportDescription
buildCsp(options?)The policy string for CspOptions. See Security model.
DEFAULT_CDN_ORIGINSThe default CDN allowlist.

generative-frame/react

<Widget>

WidgetProps are every createWidget option except container and code, plus:

WidgetProps
codestring

Widget code, complete or still growing.

streamingboolean= false

True while `code` is still growing; scripts run once it turns false.

className?string

Class for the wrapper `div`.

style?CSSProperties

Style for the wrapper `div`.

Hooks and helpers

ExportDescription
useWidget(options): { ref, widget }Mounts a frame into the element passed to ref. Options are read once per mount; handlers call their latest version; a new tokens object becomes setTheme.
useThemeTokens(element?, sources?, { observeBodyStyle? }?)Theme tokens that update with the page; one shared observer per element and sources.

generative-frame/tools

ExportDescription
createWidgetTools({ registry?, guidance?, preview?, modules?, extraTools? }){ read_me, show_widget, edit_widget, preview_widget }, plus extraTools. See Tools and prompts.
toAISDKTools(tools, { jsonSchema })The tools in the Vercel AI SDK shape.
getToolDeclarations(tools){ description, inputSchema } per tool, without execute.
buildWidgetInstructions(tools, { preload? }): Promise<string>A system prompt section for the tools.
createWidgetRegistry(initial?)The latest code per title.
applyWidgetEdits(code, edits){ ok: true, code } or { ok: false, error, index }.

The ToolDefinition, AnyTool, GuidanceModule, and JsonSchema types are exported too. A GuidanceModule is { name, summary, guidance(): string }.

generative-frame/prompts

buildWidgetGuidance(options?: GuidanceOptions): string
GuidanceOptions
modulesWidgetModule[]= []

`diagram`, `chart`, `data_viz`, `interactive`, `mockup`, `elicitation`, `art`.

platform"desktop" | "mobile"= "desktop"

The user's client.

tokens?ThemeTokens

The tokens the host sends; their names become the token reference.

cdnOriginsstring[]= DEFAULT_CDN_ORIGINS

Where the model may load libraries from.

connectOriginsstring[]= []

Where widget code may send requests.

allowEvalboolean= false

Whether `eval` is available.

widthnumber= 680 on desktop, 360 on mobile

Frame width in CSS pixels.

hostApi{ prompt?: boolean; callTool?: boolean }= { prompt: true, callTool: false }

Which host functions the guidance documents.

WIDGET_MODULES lists the module names.

generative-frame/repair

ExportDescription
repairLoop(options): Promise<RepairLoopResult>Generate, render, and feed back until accepted or out of rounds. Resolves with { ok, code, report, rounds }.
buildRepairFeedback(report, options?)Model-readable feedback for a RenderReport.

Options are on Repair loop and screenshots.

generative-frame/assistant-ui

createWidgetToolkit(options?: WidgetToolkitOptions): { toolkit, tools, registry }
useWidgetInstructions(tools, { preload? }): void
useAssistantUiThemeTokens(element?): ThemeTokens

WidgetToolkitOptions takes the createWidgetTools options except extraTools, plus:

WidgetToolkitOptions
execution"frontend" | "backend"= "frontend"

`frontend` runs the tools in the browser; `backend` only renders.

widget?Omit<UseWidgetOptions, "tokens">

Options for every widget frame (csp, product, maxHeight, handlers).

spec?WidgetToolkitExtension

Spec mode, from `createSpecToolkit(catalog, options)` in `generative-frame/spec/assistant-ui`. Adds `render_spec` and the `spec` module of `read_me`.

extraTools?Record<string, ToolDefinition>

More tools for the model, such as data lookups. They execute like the widget tools and render nothing in the thread.

themeElementElement | null= document root

Where the theme is read from.

display"standalone" | "inline"= "standalone"

How the widget tools are presented relative to the reasoning trace.

renderReport{ timeoutMs?, settleMs? } | false= { timeoutMs: 10000, settleMs: 300 }

Frontend execution: `show_widget` and `edit_widget` results wait for the frame and carry a `render` report. `false` returns at once.

preview(code, { width?, appearance? }) => Promise<PreviewResult>= previewWidget

Renders code for `preview_widget`.

previewScreenshotboolean= false

Keep the PNG in `preview_widget` results.

widgetId(({ toolCallId, threadId }) => string) | false= <remoteId>:<toolCallId>, or aui:<toolCallId> without a remote id

The storage id of a widget's frame, from the thread's remote id and the `show_widget` call that created it. `false` gives every frame a fresh origin.

The RenderReportOptions, WidgetRenderReport, WidgetToolkitExtension, ToolkitExecution, and ToolkitDisplay types are exported too.

generative-frame/spec

ExportDescription
defineCatalog({ components, actions? })A Catalog with component, action, propsSchema, paramsSchema, validateProps, validateParams, and prompt.
catalog.prompt({ mode?, customRules?, omitExample? })Model guidance; mode is "jsonl" (default) or "inline".
createSpecStream({ mode?, initial? }){ push(chunk), result(), spec }; mode is "jsonl" (default) or "inline".
parseSpecStream(source, options?)The same for a complete string.
applyPatch(doc, operations)Applies RFC 6902 operations.
validateSpec(spec, catalog, { partial? }){ ok, issues }.
formatSpecIssues(issues)Issues as model-readable text.
createStateStore(initial?){ getState, get, set, seed, subscribe }.
emptySpec()An empty spec.

generative-frame/spec/react

ExportDescription
useSpecStream({ source?, complete?, mode?, initial? }){ spec, text, errors, push, end, reset }.
<SpecPlaceholder>The default placeholder for elements that cannot render.

<SpecRenderer>

SpecRendererProps
specSpec

The spec to render.

componentsSpecComponents

Implementations by component type.

catalog?Catalog

Validates props before rendering; invalid elements render a placeholder.

state?SpecStateStore

An external store. Otherwise one is created and seeded from `spec.state`.

handlers?Record<string, ActionHandler>

Action handlers by name.

onAction?(name, params, context) => unknown

Called for catalog actions without a handler.

onError?(error, { elementId? }) => void

A component threw or an action failed.

streamingboolean= false

Missing children render as pending.

placeholderComponentType<SpecPlaceholderProps>= SpecPlaceholder

Rendered for elements that cannot render.

generative-frame/spec/tools

ExportDescription
createSpecTools(catalog, { specs? }){ render_spec }. specs is a Map<string, { spec, version }> shared with the host. See render_spec.
specGuidanceModule(catalog, promptOptions?)The spec module for createWidgetTools({ modules }). promptOptions are catalog.prompt options except mode.
toAISDKTools(tools, { jsonSchema }), getToolDeclarations(tools)The same adapters as in generative-frame/tools.

generative-frame/spec/assistant-ui

createSpecToolkit(catalog: Catalog, options: SpecToolkitOptions): WidgetToolkitExtension

Pass the result of createSpecToolkit to createWidgetToolkit({ spec }).

SpecToolkitOptions
componentsSpecComponents

Implementations for the catalog's components.

handlers?Record<string, ActionHandler>

Action handlers by name.

onAction?(name, params, context) => unknown

Called for catalog actions without a handler.

placeholder?ComponentType<SpecPlaceholderProps>

Placeholder for elements that cannot render.

specPrompt?Omit<SpecPromptOptions, "mode">

Options for the `spec` module guidance (`customRules`, `omitExample`).