SUI Dynamic Component Generation Flow - breadboard-ai/breadboard GitHub Wiki
sequenceDiagram
participant Host as Host Environment / Renderer
participant PromptBuilder as Prompt Builder (in Host)
participant LLM as Generator LLM
participant Sandbox as Sandbox Environment
participant GenCode as Generated Code (in Sandbox)
participant User
%% Step 1: Prompt Assembly
Host->>PromptBuilder: Provide component definitions & data
PromptBuilder->>LLM: Send complete prompt (API spec, component def, data, task)
%% Step 2: Code Generation & Execution
LLM-->>Host: Return TypeScript code string ("function createProfileCard() { ... }")
Host->>Sandbox: Inject and execute `createProfileCard()` function
%% Step 3: Initial Render
activate GenCode
GenCode->>Sandbox: suip.create('Card')
GenCode->>Sandbox: suip.render(cardComponent)
deactivate GenCode
activate Sandbox
Sandbox->>Host: JSON-RPC Request: suip/handshake
Host-->>Sandbox: JSON-RPC Response
Sandbox->>Host: JSON-RPC Notification: suip/append, suip/replace, etc.
deactivate Sandbox
activate Host
Host->>User: Display rendered card UI
deactivate Host
%% Step 4: User Interaction Loop
User->>Host: Click "Accept" button
activate Host
Host->>Sandbox: JSON-RPC Request: suip/event (handler: 'onClick_accept', ...)
deactivate Host
activate Sandbox
Sandbox->>GenCode: Invoke onClick handler
deactivate Sandbox
activate GenCode
GenCode->>GenCode: Modify statusText.content
GenCode->>Sandbox: suip.update(statusText)
deactivate GenCode
activate Sandbox
Sandbox->>Host: JSON-RPC Notification: suip/replace (for statusText)
deactivate Sandbox
activate Host
Host->>User: Update UI to show "Status: Accepted!"
deactivate Host
sequenceDiagram
participant Host as Host Environment / Renderer
participant PromptBuilder as Prompt Builder (in Host)
participant LLM as Generator LLM
participant Sandbox as Sandbox Environment
participant GenCode as Generated Code (in Sandbox)
participant User
%% Steps 1 & 2 are largely the same
Host->>PromptBuilder: Provide component definitions & data
PromptBuilder->>LLM: Send complete prompt
LLM-->>Host: Return TypeScript code string
Host->>Sandbox: Inject and execute `createProfileCard()` function
%% Step 3: Optimized Initial Render
activate GenCode
GenCode->>Sandbox: suip.render(cardComponent)
deactivate GenCode
activate Sandbox
Note over Sandbox, Host: Handshake can happen earlier/in parallel
Sandbox->>Host: JSON-RPC Request: suip/batchRender (sends entire initial tree)
deactivate Sandbox
activate Host
Host->>User: Display rendered card UI
deactivate Host
%% Step 4: OPTIMIZED User Interaction Loop
User->>Host: Click "Accept" button
activate Host
Host->>Sandbox: JSON-RPC Request: suip/event (handler: 'onClick_accept', ...)
deactivate Host
activate Sandbox
Sandbox->>GenCode: Invoke onClick handler
activate GenCode
GenCode->>GenCode: Modify statusText.content
GenCode-->>Sandbox: return operations: [{op: 'replace', ...}]
deactivate GenCode
Sandbox-->>Host: JSON-RPC Response (result contains UI operations)
deactivate Sandbox
activate Host
Host->>Host: Apply operations from response
Host->>User: Update UI to show "Status: Accepted!"
deactivate Host