# Context Display URL: /docs/ui/context-display Visualize token usage relative to a model's context window — ring, bar, or text — with a detailed hover popover. import { ContextDisplaySample } from "@/components/docs/samples/context-display"; This component requires server-side setup to [forward token usage metadata](#forward-token-usage-from-your-route-handler). Without it, ContextDisplay will show 0 usage and no breakdown data. Getting Started \[#getting-started] Add context-display \[#add-context-display] This adds a `/components/assistant-ui/context-display.tsx` file to your project. Forward token usage from your route handler \[#forward-token-usage-from-your-route-handler] Use `messageMetadata` in your Next.js route to attach `usage` from `finish` and `modelId` from `finish-step`: ```tsx title="app/api/chat/route.ts" import { streamText, convertToModelMessages } from "ai"; export async function POST(req: Request) { const { messages, modelName } = await req.json(); const result = streamText({ model: getModel(modelName), messages: await convertToModelMessages(messages), }); return result.toUIMessageStreamResponse({ messageMetadata: ({ part }) => { if (part.type === "finish") { return { usage: part.totalUsage, }; } if (part.type === "finish-step") { return { modelId: part.response.modelId, }; } return undefined; }, }); } ``` Use in your application \[#use-in-your-application] Pick a variant and place it in your thread footer, composer, or sidebar. Pass `modelContextWindow` with your model's token limit. ```tsx title="/components/assistant-ui/thread.tsx" {1,8} import { ContextDisplay } from "@/components/assistant-ui/context-display"; const ThreadFooter: FC = () => { return (
); }; ```
Variants \[#variants] Three preset variants are available, each wrapping the shared tooltip popover: ```tsx // SVG donut ring (default, compact) // Horizontal progress bar with label // Minimal monospace text ``` All presets accept `className` for styling overrides and `side` to control tooltip placement (`"top"`, `"bottom"`, `"left"`, `"right"`). Composable API \[#composable-api] For custom visualizations, use the building blocks directly: ```tsx import { ContextDisplay } from "@/components/assistant-ui/context-display"; ``` | Component | Description | | --------- | -------------------------------------------------------------------------------------------------------------------------------------- | | `Root` | Uses provided `usage` when supplied, otherwise fetches token usage internally; provides shared context and wraps children in a tooltip | | `Trigger` | Button that opens the tooltip on hover | | `Content` | Tooltip popover with the token breakdown (Usage %, Input, Cached, Output, Reasoning, Total) | API Reference \[#api-reference] Preset Props \[#preset-props] All preset variants (`Ring`, `Bar`, `Text`) share the same props: | Prop | Type | Default | Description | | -------------------- | ---------------------------------------- | ------- | ---------------------------------------------------------------------------------- | | `modelContextWindow` | `number` | — | Maximum token limit of the current model (required) | | `className` | `string` | — | Additional class names on the trigger button | | `side` | `"top" \| "bottom" \| "left" \| "right"` | `"top"` | Tooltip placement | | `usage` | `ThreadTokenUsage` | — | Optional externally-provided usage data (skips internal usage fetch when provided) | Color Thresholds \[#color-thresholds] Ring and Bar share the same severity colors: | Level | Threshold | Ring | Bar | | -------- | ----------- | -------------------- | ---------------- | | Low | `< 65%` | `stroke-emerald-500` | `bg-emerald-500` | | Warning | `65% – 85%` | `stroke-amber-500` | `bg-amber-500` | | Critical | `> 85%` | `stroke-red-500` | `bg-red-500` | Text displays numeric values only — no severity color. Related \[#related] * [Message Timing](/docs/ui/message-timing) — Streaming performance stats (TTFT, tok/s) * [Thread](/docs/ui/thread) — The thread component where ContextDisplay is typically placed