Pipecat UI
Blocks

Console

A workbench for debugging and testing Pipecat agents. Connect flow, media, transcripts, metrics, and live events in one drop-in block.

View in Storybook

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/console

Also 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:

TransportInstall
smallwebrtc (default)npm install @pipecat-ai/small-webrtc-transport
dailynpm install @pipecat-ai/daily-transport
websocketnpm install @pipecat-ai/websocket-transport
moqnpm install @pipecat-ai/moq-transport
livekitnpm 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

PropTypeDescription
transportType"smallwebrtc" | "daily" | "websocket" | "moq" | "livekit"Transport backing the client (default "smallwebrtc"). Match it to transportFactory.
transportFactoryTransportFactoryCreates your installed transport. Read once; remount to change.
connectParams / startBotParams / startBotResponseTransformer—Connect flow, forwarded to usePipecatApp.
connectOnMountbooleanConnect automatically (default false).
initDevicesOnMountbooleanInitialize devices on load (default true).
titleText / logo / noLogo / headerSlot—Header content; headerSlot renders before the connect button.
noUserAudio / noUserVideo / noScreenControlbooleanHide device controls.
noBotAudio / noBotAudioControls / noAudioOutputbooleanBot audio pane / its volume control / playback entirely.
noBotVideobooleanBot video pane (default false).
noConversation / noMetrics / noEvents / noStatusInfo / noSessionInfo / noTextInput / noDTMFbooleanRemove the matching region.
keypadMode"buffered" | "immediate"DTMF keypad dispatch (default "buffered").
textRenderMode / noTextRenderModeSwitch—Transcript render mode seed and its header select.
conversationPropsPartial<ConversationProps>Labels, renderers, and other transcript overrides.
audioCodec / videoCodecstringCodec preferences (smallwebrtc only).
collapseInfoPanel / collapseMediaPanel / collapseEventsPanelbooleanInitial collapse state per pane.
layoutPersistenceKeystringPersist pane sizes in localStorage under this key.
onConnectionStateChange / onServerMessage / onInjectMessage / onClient—Wiring callbacks.

On this page