New:Microsoft Teams Notifications Are Now Available in Socket.Learn more
Get Started

@convai/web-sdk

Package Overview
Dependencies
Maintainers
1
Versions
66
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@convai/web-sdk

Build web apps with lifelike AI characters. The Convai Web SDK gives you real-time voice, lipsync, emotions, and dynamic context — with first-class support for React and vanilla TypeScript.

Source
npmnpm
Version
1.6.0-beta.3
Version published
Weekly downloads
306
-33.48%
Maintainers
1
Weekly downloads
 
Created
Source

@convai/web-sdk

Real-time conversational AI characters for the web.

npm TypeScript License

TypeScript-first SDK for embedding Convai AI characters into React and vanilla JS applications. Voice, text, lipsync, emotions, video, and screen share — all in one package.

Features

  • React & vanilla JSuseConvaiClient hook, ConvaiWidget, and a framework-agnostic core
  • Real-time audio/video — full-duplex WebRTC with echo cancellation, camera, and screen share
  • Lipsync — ARKit and MetaHuman blendshape streams for facial animation
  • Emotions — per-turn emotion detection with intensity scale
  • Dynamic context & vision — inject text state, scene metadata, and LiveKit video frames mid-session
  • Long-term memory — persistent cross-session memories scoped to each end user
  • File upload — send images to the character during a live session
  • WebSocket transport — opt-in alternative to WebRTC for constrained networks
  • Auth tokens — server-side token exchange for production deployments

Installation

npm install @convai/web-sdk
# or
pnpm add @convai/web-sdk
# or
yarn add @convai/web-sdk

React peer dependencies: react and react-dom ^18 || ^19

Runtime requirement: secure context (https:// or http://localhost) for microphone/camera access.

Quick start

React

import { useConvaiClient, ConvaiWidget } from "@convai/web-sdk";

export function App() {
  const client = useConvaiClient({
    apiKey: import.meta.env.VITE_CONVAI_API_KEY,
    characterId: import.meta.env.VITE_CONVAI_CHARACTER_ID,
  });

  return <ConvaiWidget convaiClient={client} />;
}

Vanilla TypeScript

import { ConvaiClient, createConvaiWidget } from "@convai/web-sdk/vanilla";

const client = new ConvaiClient({
  apiKey: import.meta.env.VITE_CONVAI_API_KEY,
  characterId: import.meta.env.VITE_CONVAI_CHARACTER_ID,
});

const widget = createConvaiWidget(document.body, { convaiClient: client });

window.addEventListener("beforeunload", () => {
  widget.destroy();
  void client.disconnect();
});

Documentation

Full documentation is at docs.convai.com.

GuideDescription
Quick StartFirst working integration in under 5 minutes
ConfigurationAll ConvaiConfig options
React IntegrationuseConvaiClient, ConvaiWidget, and React-specific patterns
Vanilla JSConvaiClient, createConvaiWidget, and audio setup
EventsFull event reference — botReady, stateChange, messagesChange, interactionCreated, and more
Context ManagementDynamic context, updateContext, file upload, session management
EmotionsPer-turn emotion detection with provider options
LipsyncARKit / MetaHuman blendshape streams and BlendshapeQueue API
ActionsTrigger character behaviors and scene actions
MemoryLong-term memory scoped to end users
Audio & VideoMicrophone, camera, screen share controls
Error Handlingerror, disconnect, serverResponse, retry patterns
Auth TokensServer-side token exchange for production
WebSocket TransportAlternative transport for WebRTC-constrained environments

Package entry points

Import pathContents
@convai/web-sdkReact hooks, components, and re-exported core types
@convai/web-sdk/reactSame as default (React-explicit alias)
@convai/web-sdk/vanillaConvaiClient, createConvaiWidget, AudioRenderer
@convai/web-sdk/coreFramework-agnostic ConvaiClient, managers, and all types
@convai/web-sdk/lipsync-helpersBlendshape format utilities and queue helpers
@convai/web-sdk/vanilla/websocketOpt-in. Registers the WebSocket transport. Import alongside /vanilla when using transport: "websocket".

WebSocket transport

The default transport is WebRTC (LiveKit). A WebSocket-based transport is available for environments where WebRTC is unavailable or undesirable.

// Add this import once (e.g. in your app entry file)
import "@convai/web-sdk/vanilla/websocket";
import { ConvaiClient } from "@convai/web-sdk/vanilla";

const client = new ConvaiClient({
  apiKey: "...",
  characterId: "...",
  transport: "websocket",
});

The WebSocket packages (@pipecat-ai/client-js, @pipecat-ai/websocket-transport) are excluded from your bundle unless you import the /vanilla/websocket subpath — so LiveKit-only apps pay no bundle cost.

See the WebSocket Transport guide for the full feature comparison.

Vision dynamic context beta

Vision dynamic context is the default WebRTC/LiveKit vision path when enableVideo: true. Camera, screen, canvas, and custom video tracks can feed unified vision context; set visionInputConfig.enabled: false only when you need to keep the video channel while opting out.

import { useConvaiClient } from "@convai/web-sdk";

const client = useConvaiClient({
  apiKey: import.meta.env.VITE_CONVAI_API_KEY,
  characterId: import.meta.env.VITE_CONVAI_CHARACTER_ID,
  enableVideo: true,
  visionInputConfig: {
    framesPerTurn: 12,
    bufferFrames: 30,
    samplingWindows: [
      { count: 6, intervalMs: 300 },
      { count: 6, intervalMs: 1000 },
    ],
    stalenessSeconds: 10,
    replacePreviousVisionContext: true,
  },
  respondModes: {
    vision: "silent",
    contextUpdate: "auto",
    sceneMetadata: "silent",
    trigger: "must_respond",
  },
});

Publish visual sources with semantic labels so acknowledgments can distinguish webcam, canvas, screen, and custom feeds:

await client.videoControls.enableVideo(); // webcam source

const handle = await client.videoControls.publishCanvas(canvas, {
  source: "canvas",
  name: "canvas-pov",
  fps: 1,
});

const statusId = client.visionStatus();
const triggerId = client.visionTrigger({
  respondMode: "silent",
  frameIndices: [-1, -1],
});

await client.videoControls.unpublishVisionSource(handle);

visionStatus() and visionTrigger() return an update id. Match it against serverResponse events for outcomes such as frames_available, buffer_empty, attached, or no_active_video.

After the beta package is published, install it with:

npm install @convai/web-sdk@beta

Actions

Declare affordances in actionConfig, then handle the actionResponse event. Actions run in order; a target means it's parameterized (acts on an object/character).

client.on("actionResponse", ({ actions }: ActionResponseEvent) => {
  for (const { name, target } of actions) {
    target ? runParameterized(name, target) : runSimple(name); // e.g. "Move To"/"Cube" vs "Wave"
  }
});

License

Licensed under the Apache License 2.0. Copyright 2025 Convai.

Keywords

convai

FAQs

Package last updated on 03 Jul 2026

Related posts