Skip to content

이벤트

이벤트 등록 타이밍

콜백은 init() 전후 언제든 등록할 수 있습니다. 단, onStatusinit() 중 상태 변경(CONNECTING, SOCKET_CONNECTED 등)을 수신하려면 init() 호출 전에 등록하세요.

  • 각 타입당 콜백 1개만 등록 가능하며, 마지막 등록이 이전을 덮어씁니다.
  • destroy() 후에도 콜백은 유지되므로 재초기화 시 다시 등록할 필요 없습니다.

onSignal(callback)

서버로부터 수신한 시그널을 받습니다.

js
SDK.onSignal((data) => {
  console.log(data.signal, data.payload);
});
jsx
useEffect(() => {
  window.KlleonSDK.onSignal((data) => {
    console.log(data.signal, data.payload);
  });
}, []);

콜백 파라미터

필드타입필수설명
signalIncomingSignalO시그널 종류 (enum, 런타임에는 문자열)
payloadobjectX시그널별 추가 데이터
idstringO시그널 UUID
typestringO"SESSION" | "INPUT" | "OUTPUT"

주요 시그널

대화 흐름

시그널설명payload
RESPONSE_TEXT아바타 응답 텍스트{ text: string, language: string }
STT_RESULT음성 인식 결과{ text: string }
RESPONSE_PREPARING응답 준비 중 (LLM 요청 직전)-
RESPONSE_STARTED응답 시작-
RESPONSE_ENDED응답 완료-
USER_SPEECH_STARTEDSTT 세션 내 발화 구간 시작 (마이크는 이미 켜져 있음)-
USER_SPEECH_STOPPEDSTT 세션 내 발화 구간 종료 (마이크는 여전히 켜져 있음)-
ERROR서버 에러 (세션 유지){ type: "STT_ERROR" | "LLM_ERROR" | ... }
REJECTED입력 거절 (세션 유지){ type: "STT_EMPTY" | "MODERATION" | ... }

세션 관리

시그널설명payload
MATCH_WAITING매칭 대기 중 (로딩 UI 표시용)-
WAIT서버 준비 중 (계속 대기)-
SESSION_ENDED세션 정상 종료-
SESSION_TIMED_OUT세션 타임아웃-
TIME_EXHAUSTED사용 시간 소진-
QUOTA_EXCEEDED동접 quota 초과-
SUSPEND_WARNED오랜 대기 경고-

onStatus(callback)

SDK 연결 상태 변경을 받습니다.

js
SDK.onStatus((status) => {
  console.log('상태:', status);
  if (status === 'CONNECTED_FINISH') {
    console.log('아바타 준비 완료');
  }
});
jsx
const [status, setStatus] = useState('IDLE');

useEffect(() => {
  window.KlleonSDK.onStatus((s) => setStatus(s));
}, []);

onError(callback)

SDK 내부 에러 + 서버 에러를 받습니다.

js
SDK.onError((error) => {
  console.error(error.code, error.message);
});
jsx
useEffect(() => {
  window.KlleonSDK.onError((error) => {
    console.error(error.code, error.message);
  });
}, []);

콜백 파라미터

필드타입필수설명
codestringO에러 코드
messagestringX상세 메시지

에러 코드 상세

초기화 에러 (init 실패 시)

코드발생 시점message 예시
SOCKET_FAILEDSDK 키 검증 실패 또는 WebSocket 연결 실패"Failed to connect: ..."
STREAMING_FAILED스트리밍 연결 실패"Failed to connect streaming: ..."

init 실패 시 onError는 호출되지 않습니다. init()Error를 throw하므로 try/catch로 처리하세요.

런타임 에러 (연결 중 발생)

코드발생 시점message 예시
SOCKET_DISCONNECTED_UNEXPECTEDLYWebSocket 에러 발생"WebSocket disconnected unexpectedly"
STREAMING_FAILED원격 트랙 구독 실패"Failed to subscribe to remote track"
STREAMING_DISCONNECTED_UNEXPECTEDLY스트리밍 비정상 종료"Streaming disconnected: NETWORK_ERROR"

서버 에러

코드발생 시점message 예시
SERVER_ERROR서버에서 SERVER_ERROR 시그널 수신서버가 보낸 메시지 또는 "SERVER_ERROR"
WORKER_DISCONNECTED서버 연결 종료 시그널 수신"WORKER_DISCONNECTED"

이벤트 등록 예제

js
const SDK = window.KlleonSDK;

SDK.onStatus((status) => console.log('상태:', status));

SDK.onSignal((data) => {
  if (data.signal === 'RESPONSE_TEXT') {
    console.log('아바타:', data.payload.text);
  }
});

SDK.onError((error) => {
  console.error(`[${error.code}] ${error.message}`);
});

SDK.init({
  sdk_key: 'YOUR_SDK_KEY',
  avatar_id: 'YOUR_AVATAR_ID',
}).catch((e) => console.error(e.message));
jsx
import { useEffect, useRef } from 'react';

function App() {
  const initialized = useRef(false);

  useEffect(() => {
    const SDK = window.KlleonSDK;

    SDK.onStatus((status) => console.log('상태:', status));

    SDK.onSignal((data) => {
      if (data.signal === 'RESPONSE_TEXT') {
        console.log('아바타:', data.payload.text);
      }
    });

    SDK.onError((error) => {
      console.error(`[${error.code}] ${error.message}`);
    });

    SDK.init({
      sdk_key: 'YOUR_SDK_KEY',
      avatar_id: 'YOUR_AVATAR_ID',
    })
      .then(() => { initialized.current = true; })
      .catch((e) => console.error(e.message));

    return () => {
      if (initialized.current) SDK.destroy();
    };
  }, []);

  return <avatar-container style={{ width: 400, height: 600 }} />;
}