JavaScript SDK

ElevenAgents SDK: 맞춤형 대화형 음성 에이전트를 몇 분 만에 배포하세요.

ElevenAgents 개요도 참고하세요

설치

패키지 관리자를 통해 프로젝트에 패키지를 설치하세요.

npm install @elevenlabs/client
# or
yarn add @elevenlabs/client
# or
pnpm install @elevenlabs/client

이전 버전에서 업그레이드하시나요? npx skills add elevenlabs/packages를 실행해 AI 코딩 에이전트용 elevenlabs:sdk-migration 스킬을 설치하세요. 이 스킬은 import 변경 및 API 업데이트를 자동화합니다.

사용법

이 라이브러리는 주로 순수 JavaScript 프로젝트 개발용이거나 특정 프레임워크에 맞춘 라이브러리의 기반으로 사용됩니다. 사용 중인 프레임워크에 전용 라이브러리가 있는지 확인하는 것이 좋습니다. 하지만 모든 JavaScript 기반 프로젝트에서 이 라이브러리를 사용할 수 있습니다.

대화 초기화

먼저 Conversation.startSession을 사용하여 새 대화 세션을 만드세요.

const conversation = await Conversation.startSession(options);

이렇게 하면 연결이 설정되고 마이크를 사용해 ElevenLabs Agents 에이전트와 통신을 시작합니다. 대화를 시작하기 전에 앱 UI에서 마이크 액세스에 관해 설명하고 허용을 요청하는 것이 좋습니다.

// call after explaining to the user why the microphone access is needed
await navigator.mediaDevices.getUserMedia({ audio: true });

세션 구성

startSession에 전달하는 옵션은 세션 설정 방식을 지정합니다. 공개 또는 비공개 에이전트로 대화를 시작할 수 있습니다.

공개 에이전트

인증이 필요하지 않은 에이전트는 에이전트 ID를 사용해 대화를 시작할 수 있습니다. 에이전트 ID는 ElevenLabs UI에서 확인할 수 있습니다.

공개 에이전트의 경우 ID를 직접 사용할 수 있습니다.

const conversation = await Conversation.startSession({
agentId: "agent_7101k5zvyjhmfg983brhmhkd98n6",
});

연결 유형은 대화 모드에 따라 자동으로 추론됩니다. 음성 대화는 기본적으로 WebRTC를 사용하고, 텍스트 전용 대화는 WebSocket을 사용합니다. 필요한 경우 connectionType: 'webrtc' 또는 connectionType: 'websocket'을 명시적으로 지정할 수도 있습니다.

비공개 에이전트

대화에 인증이 필요한 경우, ElevenLabs API를 사용하여 서명된 URL(WebSockets 연결 유형 사용 시) 또는 대화 토큰(WebRTC 사용 시)을 요청하고 클라이언트에 반환하는 전용 엔드포인트를 서버에 추가해야 합니다.

다음은 WebSocket 연결 예시입니다.

// Node.js server
app.get("/signed-url", yourAuthMiddleware, async (req, res) => {
const response = await fetch(
`https://api.elevenlabs.io/v1/convai/conversation/get-signed-url?agent_id=${process.env.AGENT_ID}`,
{
method: "GET",
headers: {
// Requesting a signed url requires your ElevenLabs API key
// Do NOT expose your API key to the client!
"xi-api-key": process.env.XI_API_KEY,
},
}
);
if (!response.ok) {
return res.status(500).send("Failed to get signed URL");
}
const body = await response.json();
res.send(body.signed_url);
});
// Client
const response = await fetch("/signed-url", yourAuthHeaders);
const signedUrl = await response.text();
const conversation = await Conversation.startSession({
signedUrl,
});

다음은 WebRTC 예시입니다.

// Node.js server
app.get("/conversation-token", yourAuthMiddleware, async (req, res) => {
const response = await fetch(
`https://api.elevenlabs.io/v1/convai/conversation/token?agent_id=${process.env.AGENT_ID}`,
{
headers: {
// Requesting a conversation token requires your ElevenLabs API key
// Do NOT expose your API key to the client!
"xi-api-key": process.env.ELEVENLABS_API_KEY,
},
}
);
if (!response.ok) {
return res.status(500).send("Failed to get conversation token");
}
const body = await response.json();
res.send(body.token);
});

토큰을 얻은 후 startSession에 제공하면 WebRTC를 사용하여 대화가 시작됩니다.

// Client
const response = await fetch("/conversation-token", yourAuthHeaders);
const conversationToken = await response.text();
const conversation = await Conversation.startSession({
conversationToken,
});

선택적 콜백

startSession에 전달하는 옵션으로 선택적 콜백도 등록할 수 있습니다.

  • onConnect - 대화 WebSocket 연결이 설정될 때 호출되는 핸들러입니다.
  • onDisconnect - 대화 WebSocket 연결이 종료될 때 호출되는 핸들러입니다.
  • onMessage - 새 텍스트 메시지를 받을 때 호출되는 핸들러입니다. 사용자 음성의 임시 또는 최종 전사, LLM이 생성한 응답일 수 있습니다. 주로 대화 전사를 처리하는 데 사용됩니다.
  • onError - 오류가 발생했을 때 호출되는 핸들러입니다.
  • onStatusChange - 연결 상태가 변경될 때마다 호출되는 핸들러입니다. connected, connecting, disconnected(초기)일 수 있습니다.
  • onModeChange - 상태가 변경될 때 호출되는 핸들러입니다. 예를 들어 에이전트가 speaking에서 listening으로 전환되거나 그 반대의 경우입니다.
  • onCanSendFeedbackChange - 피드백 전송이 가능하거나 불가능해질 때 호출되는 핸들러입니다.
  • onAudioAlignment - 에이전트 음성의 문자 수준 타이밍 정보를 제공하는 오디오 정렬 데이터를 수신할 때 호출되는 핸들러입니다.

모든 클라이언트 이벤트가 에이전트에 기본적으로 활성화되어 있는 것은 아닙니다. 콜백을 활성화했지만 이벤트가 수신되지 않는다면 ElevenLabs 에이전트에서 해당 이벤트가 활성화되어 있는지 확인하세요. ElevenLabs 대시보드의 에이전트 설정에서 “Advanced” 탭을 통해 확인할 수 있습니다.

반환 값

startSession은 세션을 제어하는 데 사용할 수 있는 대화 인스턴스(모드에 따라 VoiceConversation 또는 TextConversation)를 반환합니다. 세션을 설정할 수 없으면 이 메서드는 오류를 발생시킵니다. 사용자가 마이크 액세스를 거부하거나 연결에 실패한 경우 발생할 수 있습니다.

endSession

대화를 수동으로 종료하는 메서드입니다. 대화를 종료하고 WebSocket 연결을 해제합니다. 이후 대화 인스턴스는 사용할 수 없으며 안전하게 폐기할 수 있습니다.

await conversation.endSession();

getId

대화 ID를 반환하는 메서드입니다.

const id = conversation.getId();

setVolume

대화의 출력 볼륨을 설정하는 메서드입니다. 0에서 1 사이의 volume 필드를 포함하는 객체를 받습니다.

await conversation.setVolume({ volume: 0.5 });

getInputVolume / getOutputVolume

현재 입력/출력 볼륨을 0에서 1까지의 척도로 반환하는 메서드입니다. 0은 -100dB이고 1은 -30dB입니다.

const inputVolume = await conversation.getInputVolume();
const outputVolume = await conversation.getOutputVolume();

sendFeedback

에이전트에 이진 피드백을 전송하는 메서드입니다. true는 긍정적 피드백, false는 부정적 피드백을 나타내는 불리언 값을 받습니다.

피드백은 항상 가장 최근의 에이전트 응답과 연결되며, 응답당 한 번만 전송할 수 있습니다.

onCanSendFeedbackChange를 수신하여 현재 피드백을 전송할 수 있는지 확인할 수 있습니다.

conversation.sendFeedback(true); // positive feedback
conversation.sendFeedback(false); // negative feedback

sendContextualUpdate

에이전트에 상황별 업데이트를 전송하는 메서드입니다. 대화와 직접 관련되지는 않지만 에이전트 응답에 영향을 줄 수 있는 사용자 작업을 에이전트에 알리는 데 사용할 수 있습니다.

conversation.sendContextualUpdate(
"User navigated to another page. Consider it for next response, but don't react to this contextual update."
);

sendUserMessage

에이전트에 텍스트 메시지를 전송합니다.

마이크 대신 사용자가 메시지를 입력하도록 할 때 사용할 수 있습니다. sendContextualUpdate와 달리 사용자 메시지로 처리되며, 에이전트가 대화에서 자신의 차례에 응답하도록 합니다.

sendButton.addEventListener("click", (e) => {
conversation.sendUserMessage(textInput.value);
textInput.value = "";
});

sendUserActivity

에이전트에 사용자 활동을 알립니다.

사용자 활동이 감지된 후 에이전트는 최소 2초 동안 말하려고 시도하지 않습니다.

사용자가 입력 중일 때 에이전트가 사용자를 방해하지 않도록 하는 데 사용할 수 있습니다.

textInput.addEventListener("input", () => {
conversation.sendUserActivity();
});

setMicMuted

마이크를 음소거/음소거 해제하는 메서드입니다.

// Mute the microphone
conversation.setMicMuted(true);
// Unmute the microphone
conversation.setMicMuted(false);

changeInputDevice

활성 음성 대화 중 오디오 입력 장치를 변경할 수 있습니다. 이 메서드는 음성 대화에서만 사용할 수 있습니다.

WebRTC 모드에서는 입력 형식과 샘플 레이트가 각각 pcm 및 48000으로 하드코딩되어 있습니다. 입력 장치를 변경할 때 이 값을 변경해도 아무런 효과가 없습니다.

const conversation = await Conversation.startSession({
agentId: "agent_7101k5zvyjhmfg983brhmhkd98n6",
// Alternatively you can provide a device ID when starting the session
// Useful if you want to start the conversation with a non-default device
inputDeviceId: "a1b2c3d4e5f6",
});
// Change to a specific input device
await conversation.changeInputDevice({
sampleRate: 16000,
format: "pcm",
preferHeadphonesForIosDevices: true,
inputDeviceId: "a1b2c3d4e5f6",
});

장치 ID가 유효하지 않으면 기본 장치가 대신 사용됩니다.

changeOutputDevice

활성 음성 대화 중 오디오 출력 장치를 변경할 수 있습니다. 이 메서드는 음성 대화에서만 사용할 수 있습니다.

WebRTC 모드에서는 출력 형식과 샘플 레이트가 각각 pcm 및 48000으로 하드코딩되어 있습니다. 출력 장치를 변경할 때 이 값을 변경해도 아무런 효과가 없습니다.

const conversation = await Conversation.startSession({
agentId: "agent_7101k5zvyjhmfg983brhmhkd98n6",
// Alternatively you can provide a device ID when starting the session
// Useful if you want to start the conversation with a non-default device
outputDeviceId: "a1b2c3d4e5f6",
});
// Change to a specific output device
await conversation.changeOutputDevice({
sampleRate: 16000,
format: "pcm",
outputDeviceId: "a1b2c3d4e5f6",
});

장치 전환은 음성 대화에서만 작동합니다. 특정 deviceId를 제공하지 않으면 브라우저가 기본 장치를 사용합니다. MediaDevices.enumerateDevices() API를 사용하여 사용 가능한 장치를 열거할 수 있습니다.

getInputByteFrequencyData / getOutputByteFrequencyData

현재 입력/출력 주파수 데이터를 포함하는 Uint8Array를 반환하는 메서드입니다. 자세한 내용은 AnalyserNode.getByteFrequencyData를 참조하세요.

이 메서드는 음성 대화에서만 사용할 수 있습니다. WebRTC 모드에서는 오디오가 pcm_48000을 사용하도록 하드코딩되어 있으므로 반환된 데이터를 사용하는 시각화에서 WebSocket 연결과 다른 패턴이 표시될 수 있습니다.