Charts in the answer
When an answer contains a set of comparable numbers, the agent draws it — unprompted, mid-conversation. Nine chart types with a worked example of each, the containment gate that refuses a chart whose numbers are not in your material, and why derived figures are computed in code rather than by the model.
Ask a support agent what each plan costs and you get a paragraph. Ask a person and they sketch four bars. The agent does the second thing: when an answer already contains a set of comparable numbers, it draws them — without being asked to, in the middle of an ordinary conversation.
Every chart on this page is rendered by the same component your visitors see, from the same spec the model emits. Nothing here is a screenshot.
What the model actually writes
A fenced block, next to the words:
```chart
{"type": "bar", "source": "passage:kb", "title": "Monthly price by plan", "unit": "USD",
"labels": ["Free", "Starter", "Pro", "Enterprise"],
"series": [{"name": "monthly USD", "values": [0, 49, 499, null]},
{"name": "tokens (M)", "values": [5, 25, 250, null]}]}
```which renders as:
Three things in that example are load-bearing.
null, not 0. Enterprise pricing is "contact sales", so there is no number — and a zero bar
would be a claim the material never made. Zero is a meaningful value; "unknown" is not zero.
The prose stays. The chart supplements the answer, never replaces it. Telegram, WhatsApp and screen readers receive the same content as a compact table, so an agent that answered only in a picture would answer nothing at all on half its channels.
source is required. A chart with no provenance is a number with no citation, and the badge in
the corner says which kind of material it came from. Where a single retrieved passage carries the
figures, that badge is a live citation you can open.
The numbers have to be in your material
This is the part that matters more than the drawing.
passage: charts are the common case: the numbers come from your knowledge base, and the model
copies them out. Copying is reliable — measured across three models pulling a price table out of
retrieved text, with a stale price sitting in the same passage as a distractor: 9 out of 9 correct,
none taken in by the decoy.
Arithmetic is not. The same models, the same passages, asked to work out a bill from a base fee plus an overage rate: 12 out of 12 wrong. Every multiplication was right and every formula was wrong.
So before a chart renders, a deterministic check runs over it: every label-and-value pair must appear in the material the agent actually retrieved this turn. A pair that cannot be found means the whole block is dropped — the answer keeps its words and loses its picture. Unlike the sentence-level grounding marks elsewhere in the product, this one refuses rather than annotates: a mis-drawn bar has finished making its point long before anyone reads a footnote.
The check compares numbers, in every written form they take — 4,200 and 4200, 25M and
25000000, 2500万 and 25 million. It does not verify units, and it cannot always tell which of
two labels in one sentence a number belongs to. It is a floor under fabrication, not a proof of
correctness.
Derived figures are computed, not written
Shares, growth rates and running totals are exactly what the model gets wrong, and exactly what makes a chart worth looking at. So the model does not calculate them.
It hands the verbatim figures to a tool, names the derivation it wants — share of total, percent change, running total — and the platform computes the series in code. The result stays on the server; the model writes a reference, and the numbers are filled in before the block is sent. It never gets the chance to mistype what the code just worked out.
The chart says so: a series computed this way is labelled on the chart itself, because "copied from your material" and "calculated for you" are different guarantees and a reader deserves to know which one they are looking at.
Charts you can talk to
Click a bar — or a row of a table — and the agent receives a follow-up question about that category, as if the visitor had typed it. The chart stops being output and becomes input: someone who cannot articulate which slice of the data they want can simply point at it.
Every chart also exports to CSV, and bar / sideways / line / area are the same sentence told four ways, so a reader can switch between them. Pie, funnel, radar and scatter are different sentences — composition, drop-off, shape, correlation — so they do not offer the switch.
The nine types, and when each one is right
A type set the model cannot choose between is the same as having one type. Each of these answers a different question, and picking the wrong one is worse than not drawing at all: the chart is still there, quietly saying something else.
bar — how do these categories compare?
The default. Reach for it when nothing more specific fits.
hbar — the same question, with long labels
Category names that are country or product names stop fitting under vertical bars and the axis starts rotating them 45°. Turned sideways they simply fit. The platform switches to this by itself past twelve categories — not to a line, because these categories have no order and a line would invent a trend.
line — where is this heading?
For categories that genuinely have an order: months, stages, versions. Gaps are joined rather than broken, because a break reads as two separate series rather than one missing number.
area — the same trend, when the volume is the point
Use it when the accumulated quantity matters more than the rate of change.
stacked — a comparison that also has parts
Not a type of its own, a modifier on bar, hbar and area: still a comparison, but each bar
opens up to show what it is made of.
pie — what is this whole made of?
Only when the parts genuinely add up to the thing. One series, no negatives, at most eight slices — past that nobody can tell which slice is which, and it degrades to bars.
funnel — where are people dropping out?
Each stage must be a subset of the one above it. A series that does not descend is not a funnel, it is a set of side-by-side numbers — and the platform draws it as bars instead.
radar — what shape does each option have?
Several things compared across the same few dimensions. It needs the dimensions to be on comparable scales: put a 0–10 rating next to a 0–1,000,000 count and one axis pegs while the other flatlines, so the platform falls back to bars.
scatter — are these two things related?
Exactly two series: the first is x, the second is y, and the labels name the points.
table — when none of the above is honest
Two measures on different scales, or data that was always a table. It is also where every other type lands when its premise breaks.
| days | fee (USD) | |
|---|---|---|
| Brazil | 90 | 4,200 |
| Mexico | 60 | 2,800 |
| Colombia | 45 | 1,900 |
| Chile | 55 | 2,100 |
| Peru | 70 | 2,450 |
| Argentina | — | — |
When it stays quiet
Three numbers is the floor. "Up from 120k to 150k" is a sentence, not a bar chart, and drawing it is noise. Yes/no questions and single-value lookups get an answer, not a picture. At most two charts in one reply, and a second only when the two measures are in different units — the platform counts, so the model cannot talk itself into a third.
And if nothing was retrieved this turn, there is nothing to draw. The agent says what it knows and what it does not, which is the same thing it does with words.
Turning it on
Nothing to turn on. Any agent with a knowledge base or tools does this already, and the containment gate means a chart it should not have drawn never reaches the visitor. Charts are stored with the message, so reopening the conversation a month later shows the same picture, not a hole in the middle of an answer that still discusses it.