
rw-integrate-character-embed
โ 55by runwayml ยท part of runwayml/skills
Help users embed Runway Character avatar calls in React apps using the @runwayml/avatars-react SDK
Help users embed Runway Character avatar calls in React apps using the @runwayml/avatars-react SDK
Inspect the full instructions your agent will receiveExpandCollapse
This is the exact playbook injected into your agent when the skill activates โ shown here so you can audit it before installing. You don't need to read it to use the skill.
by runwayml
Help users embed Runway Character avatar calls in React apps using the @runwayml/avatars-react SDK
npx skills add https://github.com/runwayml/skills --skill rw-integrate-character-embed
Download ZIPGitHub55
Embed Characters in React (Avatars React SDK)
PREREQUISITES:
-
+rw-check-compatibilityโ Project must have server-side capability (API key must never be exposed to the client) -
+rw-fetch-api-referenceโ Load the latest API reference from https://docs.dev.runwayml.com/api/ before integrating -
+rw-integrate-charactersโ Character (Avatar) must be created and session endpoint must exist -
Project must use React (Next.js, Vite+React, Remix, etc.)
OPTIONAL:
+rw-integrate-documentsโ Add knowledge base before embedding
Embed real-time avatar video calls in React applications using the @runwayml/avatars-react SDK.
Option A: Simple โ AvatarCall Component
The fastest way to embed a character. Handles WebRTC connection and renders a default UI automatically.
'use client';
import { AvatarCall } from '@runwayml/avatars-react';
import '@runwayml/avatars-react/styles.css';
export default function CharacterPage() {
return (
console.log('Call ended')}
onError={(error) => console.error('Error:', error)}
/>
);
}
AvatarCall Props
Prop Type Description
avatarId string The Avatar UUID from the Developer Portal or API
connectUrl string Your server-side session endpoint (e.g., /api/avatar/session)
onEnd () => void Called when the call ends normally
onError (error: Error) => void Called on connection or runtime errors
For custom avatars created in the Developer Portal, use the Avatar UUID as avatarId.
Option B: Fully Custom โ Hooks
For full control over the UI, use AvatarSession with hooks.
Components & Hooks
Export Type Description
AvatarSession Component Provider that manages the WebRTC session
AvatarVideo Component Renders the avatar's video stream
UserVideo Component Renders the user's camera feed
useAvatarSession Hook Access session state: state, sessionId, error, end()
useLocalMedia Hook Control user's media: isMicEnabled, toggleMic()
Custom UI Example
'use client';
import {
AvatarSession,
AvatarVideo,
UserVideo,
useAvatarSession,
useLocalMedia,
} from '@runwayml/avatars-react';
import type { SessionCredentials } from '@runwayml/avatars-react';
function CallUI() {
const { state, end } = useAvatarSession();
const { isMicEnabled, toggleMic } = useLocalMedia();
return (
{/* Avatar video takes full screen */}
{/* User's camera in a small overlay */}
{/* Controls */}
{isMicEnabled ? 'Mute' : 'Unmute'}
End Call
{/* Connection state */}
{state === 'connecting' && (
Connecting...
)}
);
}
export function CustomAvatar({ credentials }: { credentials: SessionCredentials }) {
return (
);
}
Fetching Credentials for Custom UI
When using the hooks approach, you need to fetch credentials from your server endpoint and pass them to AvatarSession:
'use client';
import { useState, useCallback } from 'react';
import type { SessionCredentials } from '@runwayml/avatars-react';
import { CustomAvatar } from './CustomAvatar';
export default function CharacterPage() {
const [credentials, setCredentials] = useState (null);
const [loading, setLoading] = useState(false);
const startCall = useCallback(async () => {
setLoading(true);
try {
const res = await fetch('/api/avatar/session', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ avatarId: 'your-avatar-id-here' }),
});
const data = await res.json();
setCredentials(data);
} catch (error) {
console.error('Failed to connect:', error);
} finally {
setLoading(false);
}
}, []);
if (credentials) {
return ;
}
return (
{loading ? 'Connecting...' : 'Start Conversation'}
);
}
Integration Patterns
Next.js App Router (Full Example)
Server route (app/api/avatar/session/route.ts):
See +rw-integrate-characters for the complete server-side session creation code.
Client page (app/character/page.tsx):
'use client';
import { AvatarCall } from '@runwayml/avatars-react';
import '@runwayml/avatars-react/styles.css';
const AVATAR_ID = process.env.NEXT_PUBLIC_AVATAR_ID || 'your-avatar-id';
export default function CharacterPage() {
return (
window.location.reload()}
onError={(error) => {
console.error('Avatar error:', error);
alert('Connection failed. Please try again.');
}}
/>
);
}
Conditional Rendering (Show/Hide)
'use client';
import { useState } from 'react';
import { AvatarCall } from '@runwayml/avatars-react';
import '@runwayml/avatars-react/styles.css';
export default function SupportPage() {
const [showAvatar, setShowAvatar] = useState(false);
return (
# Customer Support
{!showAvatar ? (
setShowAvatar(true)}>
Talk to an Agent
) : (
setShowAvatar(false)}
onError={(error) => {
console.error(error);
setShowAvatar(false);
}}
/>
)}
);
}
Error Handling
Verbose Error Logging
{
console.error('Avatar error:', error);
console.error('Error name:', error.name);
console.error('Error message:', error.message);
if (error.cause) {
console.error('Cause:', error.cause);
}
}}
/>
Debug Session State
import { useAvatarSession } from '@runwayml/avatars-react';
function DebugPanel() {
const { state, sessionId, error } = useAvatarSession();
return (
{JSON.stringify({ state, sessionId, error: error?.message }, null, 2)}
);
}
Browser Support
Browser Minimum Version Chrome 74+ Firefox 78+ Safari 14.1+ Edge 79+
Users must grant microphone permissions when prompted. Camera permissions are needed if user video is enabled.
Tips
-
Always import the styles:
import '@runwayml/avatars-react/styles.css'when usingAvatarCall -
'use client'directive is required in Next.js App Router for all components using the React SDK -
Session max duration is 5 minutes โ handle the
onEndcallback to show a reconnect option -
Credentials are one-time use โ if connection fails, fetch new credentials (create a new session)
-
For the full SDK source, examples, and issue tracking: github.com/runwayml/avatars-sdk-react
npm install @runwayml/avatars-reactRun this in your project โ your agent picks the skill up automatically.
Installation
npm install @runwayml/avatars-react
This is a client-side package. The server-side @runwayml/sdk should already be installed from +rw-integrate-characters.
No common issues documented yet. If you hit a problem, the repository's GitHub Issues page is the best place to look.