Skip to main content

Overview

Tavus CVI delivers AI-powered video conversations directly in your application. You can integrate it using:
MethodWhen to choose thisProduction suitabilityDependencies
iframeFastest working UI for demos, prototypes, and simple production embeds. Create a conversation and set src to the returned conversation_url.Good when Tavus’s default room UI is enough.None beyond your backend create-conversation route.
@tavus/cvi-uiRecommended React component path when you want Tavus-provided components, hooks, and styling control.Good for React apps that want a faster path than building directly on Daily.@tavus/cvi-ui CLI plus installed Daily React dependencies.
Daily JS / ReactUse when your app needs deeper control over room state, events, or a fully custom in-call UI.Good for teams comfortable owning more call UI and state.@daily-co/daily-js and optionally Daily React.
LiveKit AgentUse only if you already run a LiveKit Agents pipeline and want Tavus as the avatar video layer.Not the recommended path for most CVI embeds; LiveKit only provides rendering, while Tavus’s Full Pipeline includes perception, turn-taking, and rendering.LiveKit Agents app plus Tavus LiveKit integration.
Every flow below needs a join URL: call Create Conversation with a valid Authentication header and read the conversation_url string from the response. Use that value wherever the samples use conversation_url (JavaScript) or YOUR_CONVERSATION_URL (string placeholders in HTML or query strings).
For the quickest path, use an iframe with allow="camera; microphone; fullscreen; display-capture; autoplay".
For private rooms, create the conversation with require_auth: true and use the returned meeting_token. Append it to the iframe URL as ?t=TOKEN, or pass it to Daily with join({ url: conversation_url, token: meeting_token }).

Implementation Steps

This method provides a full-featured React component library. It offers pre-built, customizable components and hooks for embedding Tavus CVI in your app.@tavus/cvi-ui is a CLI that copies React source files into your project. It is not a hosted widget: you import generated files from your app, wrap UI in CVIProvider, render Conversation with a Tavus conversation_url, and use generated server helpers to keep TAVUS_API_KEY off the client. For the complete reference and lifecycle example, see the component library overview, blocks, components, hooks, and server helpers.

React component library (@tavus/cvi-ui)

The Tavus Conversational Video Interface (CVI) React component library provides a complete set of pre-built components and hooks for integrating AI-powered video conversations into your React applications. This library simplifies setting up Tavus in your codebase, allowing you to focus on your application’s core features.Key features include:
  • Pre-built video chat components
  • Device management (camera, microphone, screen sharing)
  • Real-time audio/video processing
  • Customizable styling and theming
  • TypeScript support with full type definitions

Quick Start

Prerequisites

Before getting started, ensure you have a React project set up.Alternatively, you can start from our example project: CVI UI Haircheck Conversation Example - this example already has the HairCheck and Conversation blocks set up.

1. Initialize CVI in Your Project

npx @tavus/cvi-ui@latest init
  • Creates a cvi-components.json config file
  • Prompts for TypeScript preference
  • Installs npm dependencies (@daily-co/daily-react, @daily-co/daily-js, jotai)

2. Add CVI Components

npx @tavus/cvi-ui@latest add conversation

3. Wrap Your App with the CVI Provider

In your root directory (main.tsx or index.tsx):
import { CVIProvider } from './components/cvi/components/cvi-provider';

function App() {
  return <CVIProvider>{/* Your app content */}</CVIProvider>;
}

4. Add a Conversation Component

Learn how to create a conversation URL at https://docs.tavus.io/api-reference/conversations/create-conversation. To create a conversation URL from your app without exposing your TAVUS_API_KEY in the browser, use the server helpers in Server (tavus-api for Next.js/Remix/TanStack Start, or tavus-api-vite-ssr for Vite-with-server).Note: The Conversation component requires a parent container with defined dimensions to display properly.
Ensure your body element has full dimensions (width: 100% and height: 100%) in your CSS for proper component display.
import { Conversation } from './components/cvi/components/conversation';

function CVI() {
  const conversation_url = 'YOUR_CONVERSATION_URL';
  const handleLeave = () => {
    // handle leave
  };
  return (
    <div
      style={{
        width: '100%',
        height: '100%',
        maxWidth: '1200px',
        margin: '0 auto',
      }}
    >
      <Conversation
        conversationUrl={conversation_url}
        onLeave={handleLeave}
      />
    </div>
  );
}

Documentation Sections

  • Overview – Overview of the CVI component library
  • Blocks – High-level component compositions and layouts
  • Components – Individual UI components
  • Hooks – Custom React hooks for managing video call state and interactions
  • Server – Server-side helpers (tavus-api, tavus-api-vite-ssr) for creating and ending conversations without exposing your API key

FAQs

How can I reduce background noise during calls?

Tavus provides a built-in voice isolation feature that separates speech from background noise in the participant’s microphone audio. You can enable it via the voice_isolation parameter in the Conversational Flow layer of your persona.Learn more in our Voice Isolation documentation.

Can I add event listeners to the call client?

Yes, you can attach Daily event listeners to monitor and respond to events like participants joining, leaving, or starting screen share.