One question, two wires. Source of truth:
ADR 0029 (Proposed) and
ADR 0019 (today's wire).
loading @ag-ui/core 1.0.2 schemas…
For the agent, BFF and analytics teams. Each lane shows the
request the backend receives, the stream it emits, and what the user sees as a
result. Press Play and watch both turns on one clock: today the answer arrives whole after ~22 s;
on AG-UI the user sees intent, a chart frame and the first words within 3 s.
Pick a scenario below to see what moves the AG-UI turn. All ids, names and numbers are made-up samples;
paths and field names follow the ADRs.
User asks
0.00 s
Scenario · AG-UI lane
Presets and sliders rebuild the AG-UI frames, screen, NFR table, ruler, copy and downloads. Today's lane stays fixed: it has none of these levers.
Today: DataCopilot passthrough
ADR 0019. The BFF forwards the upstream agent's own vocabulary.
Input · request the BFF receives
one POST per turn
Output · stream the BFF emits
Documented but never observed on any deployment: llm_token,
sql_query_token, structured_answer_token. Nothing streams.
Screen · what the user sees
AG-UI 1.0.2
ADR 0029. Agent emits AG-UI, or the BFF translates. Same wire either way.
Input · RunAgentInput
Output · AG-UI events over SSE
Click a frame for its JSON. Badges: schema ✓ validated against
@ag-ui/core 1.0.2; mi ✓ our mi.* payload shape;
step a known stepName id.
Screen · what the user sees
F3-E5 latency targets, measured from send
Cells fill in as the clock passes each milestone. Today: the ADR 0029 example. AG-UI: the scenario above. Not measurements.
Requirement
Target
Today
AG-UI
Today
AG-UI
Bar = turn open. Blocks = something new on screen (hover for what). Dashed lines = NFR thresholds
0.5 s, 1 s, 2 s, 3 s, 10 s. Red line = now.
What the backend must emit (ADR 0029)
mi.intent as soon as the classifier answers. Before any data query.
mi.widget twice: phase: "spec" first, then phase: "data" with
basis. Same widgetSpec / widgetData shapes as today, so copilot charts still save to a dashboard.
Text before the query ends, but framing only. A sentence with a value waits for the data; a number before data is a fabricated number.
stepName is an id from a closed list, never display text. Unknown ids show "Working…".
basis carries counts and unit ids, not prose. The FE writes and translates the footer.
RUN_ERROR only for failures. Refusals and "not found" are ordinary answers.
Tool calls are free to emit. The FE never renders them.
Tenant and user come from the session cookie, never from RunAgentInput. context is user-controlled: data, not instructions.
One pinned AG-UI version across agent, BFF and FE. The FE sends it as protocolVersion on every run.
Open questions for the backend teams
Agent or BFF? Can the mi-assist agent emit AG-UI natively, or should the BFF translate its events? (agentic, BFF)
Pipeline split. Can the classifier's answer (intent + widget spec) leave before the data query starts? Without it, P2 and P3 fall back to today. (agentic, analytics)
Unbuffered SSE. Does the deployed gateway pass SSE through without buffering? If it buffers, every frame lands at the end and no event design helps. (foundation, BFF)
stepName owner. Who owns the id list, and how does the FE hear about a new id? (agentic, FE)
Version. Which AG-UI 1.x do we pin, and what emits the mi-horizon demo's events today? (all)
messages. Whole conversation, or only the new turn, in RunAgentInput.messages? (agentic, BFF)
basis. Can the data step return record and entity counts, and what it excluded? (analytics)
Next phases of this page
Scenarios and latency sliders.on this pageSlow classifier (ADR-0011 p95 3.79 s), gateway buffering, no pipeline split, RUN_ERROR mid-stream, unknown stepName, refusal as an ordinary answer; sliders for classifier, query and token pacing. The URL hash keeps the scenario, so a link shares it.
Agentic approval (HITL).Supplier-delay run ends RUN_FINISHED with an interrupt outcome; approve or reject starts a new run carrying resume, as in the AI Studio POC.
Emitter view.Agent-native AG-UI vs the BFF translating the agent's own events: agent frames in, AG-UI frames out.
Frame editor and contract lint.Paste or edit frames; schema and mi.* checks; ADR rules (spec before data, no numbers before data, known stepName, no tenant in the run input); export test vectors.