rw-integrate-character-embed

Par runwayml · skills

Aide les utilisateurs à intégrer des appels à l'avatar Runway Character dans des applications React à l'aide du SDK `@runwayml/avatars-react`

npx skills add https://github.com/runwayml/skills --skill rw-integrate-character-embed

Intégrer des Personnages dans React (Avatars React SDK)

PRÉREQUIS :

  • +rw-check-compatibility — Le projet doit avoir une capacité côté serveur (la clé API ne doit jamais être exposée au client)
  • +rw-fetch-api-reference — Charger la dernière référence API depuis https://docs.dev.runwayml.com/api/ avant l'intégration
  • +rw-integrate-characters — Le Personnage (Avatar) doit être créé et le endpoint de session doit exister
  • Le projet doit utiliser React (Next.js, Vite+React, Remix, etc.)

OPTIONNEL :

  • +rw-integrate-documents — Ajouter une base de connaissances avant l'intégration

Intégrez des appels vidéo avatar en temps réel dans vos applications React en utilisant le SDK @runwayml/avatars-react.

Installation

npm install @runwayml/avatars-react

C'est un package côté client. Le package @runwayml/sdk côté serveur devrait déjà être installé à partir de +rw-integrate-characters.

Option A : Simple — Composant AvatarCall

La façon la plus rapide d'intégrer un personnage. Gère automatiquement la connexion WebRTC et affiche une UI par défaut.

'use client';

import { AvatarCall } from '@runwayml/avatars-react';
import '@runwayml/avatars-react/styles.css';

export default function CharacterPage() {
  return (
    <AvatarCall
      avatarId="your-avatar-id-here"
      connectUrl="/api/avatar/session"
      onEnd={() => console.log('Call ended')}
      onError={(error) => console.error('Error:', error)}
    />
  );
}

Props AvatarCall

Prop Type Description
avatarId string L'UUID Avatar du Portail Développeur ou de l'API
connectUrl string Votre endpoint de session côté serveur (ex : /api/avatar/session)
onEnd () => void Appelé quand l'appel se termine normalement
onError (error: Error) => void Appelé en cas d'erreur de connexion ou d'exécution

Pour les avatars personnalisés créés dans le Portail Développeur, utilisez l'UUID Avatar comme avatarId.

Option B : Entièrement Personnalisé — Hooks

Pour un contrôle total sur l'UI, utilisez AvatarSession avec les hooks.

Composants et Hooks

Export Type Description
AvatarSession Composant Provider qui gère la session WebRTC
AvatarVideo Composant Affiche le flux vidéo de l'avatar
UserVideo Composant Affiche le flux caméra de l'utilisateur
useAvatarSession Hook Accédez à l'état de la session : state, sessionId, error, end()
useLocalMedia Hook Contrôlez le média de l'utilisateur : isMicEnabled, toggleMic()

Exemple d'UI Personnalisée

'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 (
    <div className="relative w-full h-screen">
      {/* Avatar video takes full screen */}
      <AvatarVideo className="w-full h-full object-cover" />

      {/* User's camera in a small overlay */}
      <UserVideo className="absolute bottom-4 right-4 w-48 rounded-lg" />

      {/* Controls */}
      <div className="absolute bottom-4 left-4 flex gap-2">
        <button onClick={toggleMic}>
          {isMicEnabled ? 'Mute' : 'Unmute'}
        </button>
        <button onClick={end}>End Call</button>
      </div>

      {/* Connection state */}
      {state === 'connecting' && (
        <div className="absolute inset-0 flex items-center justify-center bg-black/50">
          Connecting...
        </div>
      )}
    </div>
  );
}

export function CustomAvatar({ credentials }: { credentials: SessionCredentials }) {
  return (
    <AvatarSession credentials={credentials} audio video>
      <CallUI />
    </AvatarSession>
  );
}

Récupérer les Credentials pour l'UI Personnalisée

Lors de l'utilisation des hooks, vous devez récupérer les credentials depuis votre endpoint serveur et les passer à 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<SessionCredentials | null>(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 <CustomAvatar credentials={credentials} />;
  }

  return (
    <button onClick={startCall} disabled={loading}>
      {loading ? 'Connecting...' : 'Start Conversation'}
    </button>
  );
}

Motifs d'Intégration

Next.js App Router (Exemple Complet)

Route serveur (app/api/avatar/session/route.ts): Voir +rw-integrate-characters pour le code complet de création de session côté serveur.

Page client (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 (
    <div className="flex items-center justify-center min-h-screen">
      <AvatarCall
        avatarId={AVATAR_ID}
        connectUrl="/api/avatar/session"
        onEnd={() => window.location.reload()}
        onError={(error) => {
          console.error('Avatar error:', error);
          alert('Connection failed. Please try again.');
        }}
      />
    </div>
  );
}

Affichage Conditionnel (Afficher/Masquer)

'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 (
    <div>
      <h1>Customer Support</h1>

      {!showAvatar ? (
        <button onClick={() => setShowAvatar(true)}>
          Talk to an Agent
        </button>
      ) : (
        <AvatarCall
          avatarId="support-agent-id"
          connectUrl="/api/avatar/session"
          onEnd={() => setShowAvatar(false)}
          onError={(error) => {
            console.error(error);
            setShowAvatar(false);
          }}
        />
      )}
    </div>
  );
}

Gestion des Erreurs

Journalisation d'Erreurs Détaillée

<AvatarCall
  avatarId="your-avatar-id"
  connectUrl="/api/avatar/session"
  onError={(error) => {
    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);
    }
  }}
/>

Déboguer l'État de la Session

import { useAvatarSession } from '@runwayml/avatars-react';

function DebugPanel() {
  const { state, sessionId, error } = useAvatarSession();

  return (
    <pre style={{ fontSize: 12, position: 'fixed', top: 0, right: 0 }}>
      {JSON.stringify({ state, sessionId, error: error?.message }, null, 2)}
    </pre>
  );
}

Support des Navigateurs

Navigateur Version Minimale
Chrome 74+
Firefox 78+
Safari 14.1+
Edge 79+

Les utilisateurs doivent accorder les permissions microphone quand demandé. Les permissions caméra sont nécessaires si la vidéo utilisateur est activée.

Conseils

  • Toujours importer les styles : import '@runwayml/avatars-react/styles.css' lors de l'utilisation de AvatarCall
  • La directive 'use client' est requise dans Next.js App Router pour tous les composants utilisant le React SDK
  • La durée maximale de session est de 5 minutes — gérez le callback onEnd pour afficher une option de reconnexion
  • Les credentials sont à usage unique — si la connexion échoue, récupérez de nouveaux credentials (créez une nouvelle session)
  • Pour le code source SDK complet, les exemples et le suivi des problèmes : github.com/runwayml/avatars-sdk-react

Skills similaires