Console
A workbench for debugging and testing Pipecat agents. Connect flow, media, transcripts, metrics, and live events in one drop-in block.
The console is a multipurpose template for debugging and testing Pipecat agents. Drop it into a route, point it at your bot, and you have a complete workbench without building any UI: the connect flow with device controls, bot audio and video, live conversation transcripts, per-service metrics, session info, and a live RTVI event stream (metrics and bot LLM/TTS events are hidden, and botOutput shows once per spoken status). Use it as your local debugging page during bot development, a shared test harness on staging, or the starting point for your own operator console.
Opens the live console block in a fullscreen overlay. No bot is required — connecting without one demos the real-message error banner.
Installation
pnpm dlx shadcn@latest add @pipecat/consoleAlso installs @pipecat/audio-visualizer-bar, @pipecat/bot-audio, @pipecat/client-status, @pipecat/connect-button, @pipecat/conversation, @pipecat/dtmf-keypad, @pipecat/metrics, @pipecat/session-info, @pipecat/text-input, @pipecat/use-pipecat-app, @pipecat/use-pipecat-event-stream, @pipecat/use-pipecat-metrics, @pipecat/user-audio-control, @pipecat/user-screen-control, @pipecat/user-video-control as registry dependencies.
Transport packages are not installed with the block. Install the one you
connect with and pass it as transportFactory:
| Transport | Install |
|---|---|
smallwebrtc (default) | npm install @pipecat-ai/small-webrtc-transport |
daily | npm install @pipecat-ai/daily-transport |
websocket | npm install @pipecat-ai/websocket-transport |
moq | npm install @pipecat-ai/moq-transport |
livekit | npm install @pipecat-ai/livekit-transport |
transportFactory is read once, so remount the console with a key to swap
it. To let users switch transports instead, register a loader per type with
registerTransport before mounting; changing
transportType then rebuilds the client. Load failures surface in the error
banner instead of crashing the console.
Usage
The console is a drop-in: it builds its own client via
usePipecatApp and renders its own
PipecatClientProvider — do not nest it inside another provider. Give
it a sized container (it fills its parent):
import { SmallWebRTCTransport } from "@pipecat-ai/small-webrtc-transport";
import { Console } from "@/components/pipecat/console/console";
export default function DebugPage() {
return (
<div className="h-dvh">
<Console
transportFactory={() => new SmallWebRTCTransport()}
connectParams={{ endpoint: "/api/start" }}
layoutPersistenceKey="my-console"
/>
</div>
);
}What you get: a header with the connect flow (hover the button to see the resolved connection URL), resizable bot-media / conversation+metrics / info panes over a collapsible live events strip at 1024px and wider, and the same panels as bottom tabs on narrower screens, opening on the conversation. One tree, so every prop reaches both layouts. Connection errors show their real message in a dismissible banner.
Theming and the header slot
The console owns no theme. It renders off semantic tokens, so it follows
your app's light/dark class automatically; drop your own toggle (or any
app-specific actions) into headerSlot:
import { useTheme } from "next-themes";
function ThemeToggle() {
const { resolvedTheme, setTheme } = useTheme();
return (
<Button
variant="ghost"
size="icon-sm"
aria-label="Toggle theme"
onClick={() => setTheme(resolvedTheme === "dark" ? "light" : "dark")}
>
<SunMoonIcon />
</Button>
);
}
<Console headerSlot={<ThemeToggle />} />;Key props
| Prop | Type | Description |
|---|---|---|
transportType | "smallwebrtc" | "daily" | "websocket" | "moq" | "livekit" | Transport backing the client (default "smallwebrtc"). Match it to transportFactory. |
transportFactory | TransportFactory | Creates your installed transport. Read once; remount to change. |
connectParams / startBotParams / startBotResponseTransformer | — | Connect flow, forwarded to usePipecatApp. |
connectOnMount | boolean | Connect automatically (default false). |
initDevicesOnMount | boolean | Initialize devices on load (default true). |
titleText / logo / noLogo / headerSlot | — | Header content; headerSlot renders before the connect button. |
noUserAudio / noUserVideo / noScreenControl | boolean | Hide device controls. |
noBotAudio / noBotAudioControls / noAudioOutput | boolean | Bot audio pane / its volume control / playback entirely. |
noBotVideo | boolean | Bot video pane (default false). |
noConversation / noMetrics / noEvents / noStatusInfo / noSessionInfo / noTextInput / noDTMF | boolean | Remove the matching region. |
keypadMode | "buffered" | "immediate" | DTMF keypad dispatch (default "buffered"). |
textRenderMode / noTextRenderModeSwitch | — | Transcript render mode seed and its header select. |
conversationProps | Partial<ConversationProps> | Labels, renderers, and other transcript overrides. |
audioCodec / videoCodec | string | Codec preferences (smallwebrtc only). |
collapseInfoPanel / collapseMediaPanel / collapseEventsPanel | boolean | Initial collapse state per pane. |
layoutPersistenceKey | string | Persist pane sizes in localStorage under this key. |
onConnectionStateChange / onServerMessage / onInjectMessage / onClient | — | Wiring callbacks. |