Interactive panels
show_call_ui publishes native information and controls inside your active call. SwiftUI renders the data; no remote HTML, JavaScript, or executable components run on the phone.
Publish complete views
Send relevant dates, categories, or options together. The caller can switch views, page through content, or inspect chart values locally. These interactions do not contact the agent, fetch data, emit ui_action, or consume a submission.
{
"call_id":"<active-call-UUID>",
"panel":{
"title":"Project week",
"initialView":"mon",
"views":[
{"id":"mon","label":"Mon","blocks":[
{"id":"focus","type":"hero","label":"Focus time","value":"3h 30m","detail":"Design review at 10:00","accent":"purple"}
]},
{"id":"tue","label":"Tue","blocks":[
{"id":"focus","type":"hero","label":"Focus time","value":"4h 15m","detail":"Build the workspace","accent":"teal"}
]}
]
}
}
These are demonstration values. Obtain real information through your own agent tools before publishing a real panel. Download the shared examples for planning, comparisons, chart inspection, and legacy actions.
Native blocks
| Type | Content |
|---|---|
hero |
Label, value, optional detail, SF Symbol, and accent |
text |
Plain text |
stats |
Up to six labeled metrics |
chart |
Line or bar, up to three series and forty points per series |
table |
Up to thirty rows and five columns |
input |
Labeled field; value stays local until submitted |
For one view, use blocks. With views, top-level blocks are an optional legacy fallback. initialView must identify a supplied view. Symbols use SF Symbols names; unknown names get a native fallback. Color supplements labels.
Actions perform work
Actions are optional. Use them for a decision or genuinely new work, never to reveal information already supplied in another view.
{
"actions":[
{"id":"choose","label":"Use this option","style":"primary","symbol":"checkmark"}
]
}
Add that field inside panel. At most one action may be primary. On submission, next_call_event delivers ui_action with the panel ID, revision, action ID, selected view_id, and active view’s field values. Inputs reused in different views have separate state.
One submission is accepted per publication. Exact retries are idempotent. Different actions, values, or views cannot reuse it. Publish again only for updated data or results. Browsing remains available afterward. An action is conversational input, not blanket authorization or proof of spoken audio.
Minimize and restore
Tapping the compact avatar minimizes the panel; the panel control restores it. View selection, page, and field values survive. Updates stay minimized until restored. Captions and call controls keep their positions. Oversized content uses local pages rather than scrolling.
Permission and lifetime
Only the phone can grant Allow interactive UI in the contact profile. Turning it off removes the panel without ending the call; turning it on permits future panels and does not restore stale controls. Continue through speech if permission is disabled.
Only the owning agent publishes and only the paired phone submits. The call must be active. Replaced controls and ended calls reject submissions. Use panel: null to dismiss. Never request passwords, provider keys, or payment details in a panel.
Schema and limits
The authored payload is limited to 64,000 UTF-8 JSON bytes, twelve views, ten blocks per view, three inputs per view, and four actions. IDs must be unique within their scope. Tables must have matching row and column lengths; chart numbers must be finite.
Read the full block schema and interaction guide for every field. That guide is packaged with the calling service and remains available to agents independently of the website.