React SDK
ElevenAgents SDK:カスタマイズされたインタラクティブな音声エージェントを数分で導入。
ElevenAgentsの仕組みについては、ElevenAgentsの概要を参照してください。
インストール
パッケージマネージャーを使用して、プロジェクトにパッケージをインストールします。
以前のバージョンからアップグレードしますか?npx skills add elevenlabs/packagesを実行すると、
AIコーディングエージェント向けのelevenlabs:sdk-migrationスキルがインストールされ、importの変更、
ConversationProviderのラップ、APIの更新が自動化されます。
@elevenlabs/reactは@elevenlabs/clientのすべてを再エクスポートするため、
両方のパッケージをインストールする必要はありません。
使用方法
エージェントに接続し、ユーザーが音声会話を開始・終了できる最小限の動作例を以下に示します:
以下のセクションで、各部分を詳しく説明します。
ConversationProvider
すべての会話フックはConversationProvider内で使用する必要があります。このプロバイダーでアプリ(または対象のサブツリー)をラップしてください。
プロバイダーのprops
プロバイダーは、コールバック、クライアントツール、オーバーライド、サーバーロケーションを含むuseConversationと同じオプションを受け取ります。そのため、各フックの利用側ではなくプロバイダーレベルで設定できます。
制御されたミュート状態
プロバイダーは、制御されたミュート状態の管理用にisMutedとonMutedChange propsをサポートしています。これにより、ミュート状態を外部で永続化できます(例:セッション間)。
useConversation
すべての粒度の細かいフックを単一の戻り値にまとめた便利なReactフックです。親要素にConversationProviderが必要です。
レンダリングパフォーマンスを向上させるには、代わりに粒度の細かいフックの使用を検討してください。
useConversationは状態が変わるたびに再レンダリングを実行しますが、粒度の細かいフックは
それぞれが対象とする状態の一部が変化した場合にのみ再レンダリングします。
会話を初期化する
ElevenAgentsでは、音声会話にマイクへのアクセスが必要です。会話が始まる前に、アプリのUIで理由を説明し、アクセスを許可できるようにしてください。
オプション
フックはオプション付きで初期化できます。これらはConversationProviderレベルでも渡せます。
オプションは次のとおりです:
- clientTools - エージェントが呼び出せるクライアントツールのオブジェクト定義。詳細は以下を参照してください。
- overrides - 会話設定のオーバーライド用オブジェクト定義。詳細は以下を参照してください。
- textOnly - 会話をテキストのみモードで実行するかどうか。詳細は以下を参照してください。
- serverLocation - サーバーロケーションを指定します(
"us"、"eu-residency"、"in-residency"、"global")。デフォルトは"us"です。
コールバックの概要
- onConnect - 会話接続が確立されたときに呼び出されるハンドラー。
- onDisconnect - 会話接続が終了したときに呼び出されるハンドラー。
- onMessage - 新しいメッセージを受信したときに呼び出されるハンドラー。ユーザー音声の暫定または確定の文字起こし、LLMが生成した応答、デバッグオプションが有効な場合のデバッグメッセージが含まれます。
- onError - エラーが発生したときに呼び出されるハンドラー。
- onAudio - オーディオデータを受信したときに呼び出されるハンドラー。
- onModeChange - 会話モード(話す/聞く)が変わったときに呼び出されるハンドラー。
- onStatusChange - 接続ステータスが変わったときに呼び出されるハンドラー。
- onCanSendFeedbackChange - フィードバックを送信できるかどうかが変わったときに呼び出されるハンドラー。
- onDebug - デバッグ情報が利用可能になったときに呼び出されるハンドラー。
- onUnhandledClientToolCall - 未処理のクライアントツール呼び出しが発生したときに呼び出されるハンドラー。
- onVadScore - 音声アクティビティ検出スコアが変わったときに呼び出されるハンドラー。
- onAudioAlignment - オーディオアラインメントデータを受信したときに呼び出されるハンドラー。エージェント音声の文字単位のタイミング情報を提供します。
- onAgentChatResponsePart - エージェントの応答テキストが生成される際に、start、delta、stopイベントとして呼び出されるハンドラー。テキストのみモードでは常に送信されます。音声会話では、エージェントの
client_events設定でagent_chat_response_partを有効にしてください。
クライアントツール
クライアントツールを使うと、エージェントがクライアント側の機能を呼び出せます。モーダルを開く、ユーザーに代わってAPI呼び出しを行うなど、クライアントでのアクションをトリガーできます。
クライアントツールの定義は関数のオブジェクトで、ElevenLabs UI内の設定と一致している必要があります。UIでは、さまざまなツールに名前と説明を付け、エージェントから渡されるパラメーターを設定できます。
関数が値を返す場合、その値は応答としてエージェントに返されます。
エージェントが応答を待機して反応できるよう、ElevenLabs UIでツールが会話をブロックするよう明示的に設定する必要があります。そうしない場合、エージェントは成功したものとみなし、会話を続行します。
よりReactらしい方法でクライアントツールを登録するには、 useConversationClientToolを参照してください。
会話のオーバーライド
会話のさまざまな設定をオーバーライドし、他のユーザー操作に基づいて動的に設定できます。
さまざまな設定をオーバーライドできます。これらの設定は任意で、会話体験のカスタマイズに使用できます。
利用可能な設定は次のとおりです:
テキストのみ
エージェントがテキストのみモード、つまりオーディオメッセージを送受信しないように設定されている場合、このフラグを使用して軽量版の会話を利用できます。この場合、ユーザーにマイクの権限を求めることはなく、オーディオコンテキストも作成されません。
制御された状態
フックオプションを通じて、会話状態の特定の要素を直接制御できます:
データレジデンシー
接続するElevenLabsサーバーリージョンを指定できます。詳細はデータレジデンシーガイドを参照してください。
メソッド
startSession
startSessionメソッドは接続を確立し、マイクを使用してElevenLabs Agentsエージェントとの通信を開始します。このメソッドはオプションオブジェクトを受け取り、signedUrl、conversationToken、agentIdのいずれかが必須です。
エージェントIDはElevenLabs UIで取得できます。
会話をユーザーに紐付けるため、独自のエンドユーザーIDも渡すことをおすすめします。
接続タイプは会話モードに応じて自動的に推論されます。音声会話では
WebRTCが、テキストのみの会話ではデフォルトでWebSocketが使用されます。必要に応じて、
connectionTypeを明示的に指定することもできます。
パブリックエージェント(認証が有効になっていないエージェント)の場合、必要なのはagentIdのみです。
会話に認可が必要な場合は、REST APIを使用して、WebSocket接続用の署名付きリンクまたはWebRTC接続用の会話トークンを生成してください。
startSessionは、conversationIdに解決されるPromiseを返します。この値は、個別の会話を識別するために使用できるグローバルに一意な会話IDです。
WebSocket接続
WebRTC接続
endSession
会話を手動で終了するためのメソッドです。接続を切断して会話を終了します。
setVolume
会話の出力音量を設定します。0から1までのvolumeフィールドを持つオブジェクトを受け取ります。
sendUserMessage
エージェントにテキストメッセージを送信します。
マイクを使用する代わりに、ユーザーがメッセージを入力できるようにするために使用できます。sendContextualUpdateとは異なり、これはユーザーメッセージとして扱われ、エージェントに会話の応答を促します。
sendContextualUpdate
応答をトリガーしないコンテキスト情報をエージェントに送信します。
sendFeedback
会話の品質に関するフィードバックを提供します。これはエージェントのパフォーマンス向上に役立ちます。
sendUserActivity
中断を防ぐため、ユーザーのアクティビティをエージェントに通知します。ユーザーがアプリを操作中で、エージェントが発話を一時停止すべき場合、たとえばユーザーがチャットで入力している場合に便利です。
このシグナルを受信した後、エージェントは約2秒間発話を停止します。
changeInputDevice
アクティブな音声会話中にオーディオ入力デバイスを切り替えます。このメソッドは音声会話でのみ使用できます。
changeOutputDevice
アクティブな音声会話中にオーディオ出力デバイスを切り替えます。このメソッドは音声会話でのみ使用できます。
デバイスの切り替えは音声会話でのみ機能します。特定のdeviceIdが指定されていない場合、
ブラウザーはデフォルトのデバイス選択を使用します。利用可能なデバイスは
MediaDevices.enumerateDevices()
APIで列挙できます。
getId
現在の会話IDを返します。
getInputVolume / getOutputVolume
現在の入出力音量レベル(0~1のスケール)を返すメソッドです。
getInputByteFrequencyData / getOutputByteFrequencyData
現在の入出力周波数データを含むUint8Arrayを返すメソッドです。詳細はAnalyserNode.getByteFrequencyDataを参照してください。
これらのメソッドは音声会話でのみ使用できます。WebRTCモードではオーディオにpcm_48000が
ハードコードされているため、返されたデータを使用するビジュアライゼーションでは、WebSocket接続とは
異なるパターンが表示される場合があります。
sendMCPToolApprovalResult
MCP(Model Context Protocol)ツール呼び出しの承認結果を送信します。
戻り値
上記のメソッドに加えて、useConversationは以下のリアクティブな状態を返します:
- status - 現在の接続ステータス(
"disconnected"、"connecting"、"connected")。 - isSpeaking - エージェントが現在話しているかどうか。
- isListening - エージェントが現在聞いているかどうか。
- mode - 現在の会話モード(
"speaking"または"listening")。 - isMuted - マイクが現在ミュートされているかどうか。
- setMuted - マイクをミュート/ミュート解除する関数。
- canSendFeedback - 現在の会話にフィードバックを送信できるかどうか。
- message - 会話からの最新メッセージ。
粒度の細かいフック
レンダリングパフォーマンスを向上させるには、useConversationの代わりにこれらのフックを使用してください。各フックは対象とする状態の一部のみを購読するため、コンポーネントは消費するデータが変化した場合にのみ再レンダリングされます。
すべての粒度の細かいフックには、親要素にConversationProviderが必要です。
useConversationControls
会話を制御するアクションメソッドを返します。安定した関数参照のみを提供するため、このフックによって再レンダリングが発生することはありません。
useConversationStatus
現在の接続ステータスと任意のステータスメッセージを返します。
useConversationInput
ミュート状態と、マイクのオン/オフを切り替えるセッターを返します。
useConversationMode
エージェントの発話/聞き取り状態を返します。
useConversationFeedback
フィードバックの可否と、フィードバックを送信するメソッドを返します。
useRawConversation
生の会話インスタンスを返します。これは、基盤となるVoiceConversationまたはTextConversationオブジェクトに直接アクセスする必要がある高度なユースケース向けのエスケープハッチです。
useConversationClientTool
Reactコンポーネントからクライアントツールを動的に登録するためのフックです。コンポーネントがアンマウントされると、ツールは自動的に登録解除されます。
プロバイダーレベルでは利用できないコンポーネントのstateやpropsに、ツールのハンドラーからアクセスする必要がある場合に便利です。
このフックは常にハンドラーの最新のクロージャ値を使用するため、古いstateを心配する必要はありません。