import { Message, ConversationEventData, AvatarData } from '../types'; import { KleverOneClientConfig, ClientState, ClientMetrics, ScriptSegment } from '../types/client.types'; /** * Klever One SDK의 메인 클라이언트 클래스 * * 이 클래스는 실시간 방 관리, 스트리밍, AI 대화 기능을 통합하여 * 개발자가 쉽게 사용할 수 있도록 단일 인터페이스를 제공합니다. * * 주요 기능: * - 방 연결 및 관리 (WebSocket) * - 스트리밍 연결 및 아바타 제어 * - AI와의 텍스트/음성 대화 * - 음성 녹음 및 전송 * - 상태 관리 및 메트릭 추적 * * 사용 예제: * ```typescript * const client = new KleverOneClient({ * apiKey: 'your-api-key', * container: document.getElementById('streaming-container') * }); * * await client.connect(); * await client.sendText('안녕하세요!'); * ``` */ export declare class KleverOneClient { /** 실제 사용되는 설정 (기본값이 모두 적용된 상태) */ private readonly config; /** API 인증에 사용되는 키 */ private readonly apiKey; /** 스트리밍 화면이 들어갈 HTML 엘리먼트 */ private readonly container; /** 사용자가 설정한 이벤트 콜백 함수들 */ private readonly callbacks; /** 방 연결과 WebSocket 연결을 관리 */ private readonly roomManager; /** 스트리밍 연결과 아바타 제어를 관리 */ private readonly streamingOrchestrator; /** AI와의 대화 처리를 관리 */ private readonly conversationManager; /** 각 서비스 간 이벤트 통신을 담당 */ private readonly eventBus; /** 음성 녹음을 관리 */ private readonly recorderService; /** SDK 사용 이력 추적을 관리 */ private readonly analytics; /** 메시지 델타 처리를 위한 이전 content 저장소 */ private readonly messageContentCache; /** 아바타와 대화 시스템 초기화 완료 여부 */ private isInitialized; /** 마지막 대화 완료 상태 추적 */ private lastCompletionState; /** 이벤트 리스너 해제를 위한 함수들 */ private eventUnsubscribeFunctions; /** 스트리밍 컨테이너 크기 변경을 감지 */ private resizeObserver; /** speak() 메서드로 전송된 문장들 */ private speakSentences; /** speak() 현재 인덱스 */ private speakCurrentIndex; /** 기본 음성 ID (아바타 목소리) */ private static readonly DEFAULT_VOICE_ID; /** 기본 언어 설정 */ private static readonly DEFAULT_LANGUAGE; /** TTS(텍스트 음성 변환) 서비스 */ private static readonly DEFAULT_TTS_SERVICE; /** 아바타의 기본 인사말 */ private static readonly DEFAULT_GREETING; /** 에러 발생 시 기본 응답 */ private static readonly DEFAULT_ERROR_MESSAGE; /** 금지된 주제들 */ private static readonly DEFAULT_FORBIDDEN_WORDS; /** 사용자 기본 위치 */ private static readonly DEFAULT_USER_LOCATION; /** 현재 클라이언트의 연결, 녹음, 준비 상태를 추적 */ private _state; /** 사용량 및 성능 지표를 추적하는 메트릭 */ private _metrics; /** * KleverOneClient 생성자 * * @param config - 클라이언트 설정 객체 * @throws {Error} API 키가 없거나 컨테이너 엘리먼트가 없을 때 */ constructor(config: KleverOneClientConfig); /** * 서버에 연결을 시도합니다. * * 연결 순서: * 1. 방 연결 요청 (WebSocket) * 2. 방 정보 수신 대기 * 3. 스트리밍 연결 * 4. AI 대화 시스템 초기화 * * @throws {Error} 연결 실패 시 오류 발생 */ connect(): Promise; /** * 내부 이벤트 리스너들을 설정합니다. */ private setupInternalEventListeners; /** * 내부 이벤트 리스너들을 정리합니다. * 메모리 누수를 방지하기 위해 모든 이벤트 리스너를 해제합니다. */ private cleanupInternalEventListeners; /** * 방 정보 업데이트 이벤트를 처리합니다. * * 작업 순서: * 1. 방 정보 검증 * 2. 스트리밍 컨테이너 설정 * 3. 스트리밍 서버 연결 * 4. 콜백 호출 */ private handleRoomInfoUpdated; /** * 모든 연결을 종료하고 리소스를 정리합니다. * * 정리 작업: * 1. 녹음 중인 경우 중지 * 2. 대화 내역 삭제 * 3. 스트리밍 연결 종료 * 4. 방 WebSocket 연결 종료 * 5. 이벤트 리스너 정리 * 6. 상태 초기화 */ disconnect(): void; /** * 서버에 재연결을 시도합니다. * 내부적으로 disconnect 후 connect를 호출합니다. */ reconnect(): Promise; /** * AI에게 텍스트 메시지를 전송합니다. * * @param message - 전송할 텍스트 메시지 * @throws {Error} 연결되지 않은 상태에서 호출 시 */ sendText(message: string): Promise; /** * TTS(텍스트 음성 변환)를 통해 아바타가 말하게 합니다. * 단일 텍스트 또는 텍스트 배열을 지원합니다. * * @param input - 아바타가 말할 텍스트 (단일 문자열) * @throws {Error} 연결되지 않은 상태에서 호출 시 */ speak(input: string): void; /** * TTS(텍스트 음성 변환)를 통해 아바타가 말하게 합니다. * 단일 텍스트 또는 텍스트 배열을 지원합니다. * * @param input - 아바타가 말할 텍스트 배열 * @throws {Error} 연결되지 않은 상태에서 호출 시 */ speak(input: string[]): void; /** * 음성 녹음을 시작합니다. * * 작업 순서: * 1. 마이크 접근 권한 요청 * 2. MediaRecorder 설정 * 3. 녹음 시작 * 4. 상태 업데이트 * * @throws {Error} 마이크 접근 배수 또는 녹음 오류 시 */ startRecording(): Promise; /** * 녹음을 중지하고 AI에게 전송합니다. * * 작업 순서: * 1. 녹음 중지 * 2. 음성 데이터 변환 * 3. AI 서버로 전송 */ stopRecording(): Promise; /** * 현재 녹음 중인지 확인합니다. * * @returns 녹음 중이면 true, 아니면 false */ isRecording(): boolean; /** * 현재 클라이언트 상태를 반환합니다. * * @returns 연결, 녹음, 준비 상태 등을 포함한 전체 상태 */ getState(): Readonly; /** * 클라이언트 사용량 메트릭을 반환합니다. * * @returns 메시지 수, 녹음 세션 수, 오류 수 등 성능 지표 */ getMetrics(): Readonly; /** * 클라이언트 메트릭을 초기화합니다. */ private resetMetrics; /** * 클라이언트가 AI와 대화할 준비가 되었는지 확인합니다. * * 모든 준비가 되어야 하는 조건: * - 방 연결 완료 * - 스트리밍 준비 완료 * - AI 대화 시스템 준비 완료 * * @returns 모두 준비되면 true, 아니면 false */ isReady(): boolean; /** * 현재 AI 대화의 상세 상태를 반환합니다. * * @returns 대화 상태와 메시지 내역 */ getConversationState(): ConversationEventData; /** * 현재 AI와 나눔 대화의 모든 메시지 내역을 반환합니다. * * @returns 사용자와 AI의 메시지 리스트 (시간 순 정렬) */ getMessages(): Message[]; /** * 스트리밍 화면 크기를 조정합니다. * * @param width - 너비 (픽셀) * @param height - 높이 (픽셀) */ resize(width: number, height: number): void; /** * 아바타 번호를 설정합니다. * * @param avatarNum - 아바타 번호 또는 ID */ sendAvatarNum(avatarNum: number | string): void; /** * 아바타 외형을 변경합니다. * * @param avatarData - 아바타 외형 데이터 */ sendAvatarAppearanceChange(avatarData: AvatarData): void; /** * 아바타 외형 카테고리를 선택합니다. * * 다음 형식의 메시지를 전송합니다: * ```json * { * "Category": "AvatarSetting", * "Type": "AppearanceCategorySelected", * "AppearanceType": avatarAppearanceType * } * ``` * * @param avatarAppearanceType - 선택할 외형 카테고리 타입 */ sendAvatarAppearanceCategorySelected(avatarAppearanceType: string): void; /** * 아바타 외형 카테고리 선택을 초기화합니다. * 빈 문자열로 카테고리 선택을 리셋합니다. */ resetAvatarAppearanceCategorySelected(): void; /** * 아바타 외형 옵션을 선택합니다. * * 다음 형식의 메시지를 전송합니다: * ```json * { * "Category": "AvatarSetting", * "Type": "AppearanceOptionSelected", * "AppearanceType": appearanceType, * "AppearanceID": appearanceId * } * ``` * * @param appearanceType - 외형 타입 * @param appearanceId - 외형 ID */ sendAppearanceOptionSelected(appearanceType: string, appearanceId: string): void; /** * 배경을 변경합니다. * * @param id - 배경 ID */ sendPlaceBackgroundChange(id: string): void; /** * 기본 배경(DEFAULT_WORLD_BG_ID)으로 배경을 초기화합니다. */ resetPlaceBackground(): void; /** * 배경 설정 URL을 전송합니다. * * @param url - 배경 설정 URL */ sendBackgroundMusicUrl(url: string): void; /** * 배경 사운드를 초기화합니다. */ sendBackgroundMusicReset(): void; /** * 숏폼 미리보기를 전송합니다. * 세그먼트 배열은 내부적으로 Base64 인코딩되어 전송됩니다. * UUID는 내부적으로 자동 생성됩니다. * 해상도는 SDK가 자동으로 플레이어 컨테이너 크기를 감지하여 계산합니다. * * @param segments - 스크립트 세그먼트 배열 */ sendShortformPreview(segments: ScriptSegment[]): void; /** * 숏폼 다운로드를 요청합니다. * 다운로드가 준비되면 onShortformDownloadReady 콜백이 호출됩니다. */ sendShortformDownload(): void; /** * 음성 설정을 변경합니다. * * @param voiceId - 음성 ID */ sendVoiceSetting(voiceId: string): void; /** * 애니메이션 액션을 실행합니다. * * 다음 형식의 메시지를 전송합니다: * ```json * { * "Category": "AnimationSetting", * "Type": "StartAnim", * "Gesture": actionId * } * ``` * * @param actionId - 실행할 액션 ID (예: JOB_001) */ /** * 애니메이션 액션을 실행합니다. * * 다음 형식의 메시지를 전송합니다: * ```json * { * "Category": "AnimationSetting", * "Type": "StartAnim", * "Gesture": actionId * } * ``` * * @param actionId - 실행할 액션 ID (예: JOB_001) */ executeAction(actionId: string): void; /** * 발화를 중지합니다. * * 다음 형식의 메시지를 전송합니다: * ```json * { * "Category": "AnimationSetting", * "Type": "LipmotionStop" * } * ``` */ stopSpeaking(): void; /** * 오디오 볼륨을 설정합니다. * * @param volume - 볼륨 레벨 (0.0 ~ 1.0) */ setVolume(volume: number): void; /** * 현재 오디오 볼륨을 반환합니다. * * @returns 현재 볼륨 레벨 (0.0 ~ 1.0) */ getVolume(): number; /** * 아바타를 줌 인합니다. */ sendZoomIn(): void; /** * 아바타를 줌 아웃합니다. */ sendZoomOut(): void; /** * 아바타를 시계방향으로 회전합니다. */ sendTurnRight(): void; /** * 아바타를 반시계방향으로 회전합니다. */ sendTurnLeft(): void; /** * 대화를 완전히 초기화합니다. * * 초기화 항목: * - AI 대화 메시지 내역 (UI 표시용) * - TTS 문장 버퍼 및 처리 큐 * - 메시지 델타 처리 캐시 * - 서버 LLM 컨텍스트 (다음 메시지부터 새 대화로 시작) * * 유지 항목: * - 방 연결 상태 (WebSocket) * - 스트리밍 연결 상태 * - 아바타 설정 * * @throws {Error} 연결되지 않은 상태에서 호출 시 * * @example * ```typescript * // 대화 내역 초기화 후 새로운 대화 시작 * client.resetConversation(); * await client.sendText("새로운 질문입니다"); * ``` */ resetConversation(): void; /** * UI 상호작용 데이터를 전송합니다. * * @param data - 상호작용 데이터 */ /** * UI 상호작용 데이터를 전송합니다. * * @deprecated 이 메서드는 내부용으로만 사용됩니다. * 대신 sendText(), speak(), sendAvatarNum() 등 특정 메서드를 사용하세요. * * @param data - 상호작용 데이터 * @internal */ /** * 웹소켓을 통해 원시 메시지를 전송합니다. * * @param message - 전송할 메시지 (문자열, 객체, ArrayBuffer, Blob) */ sendMessage(message: string | object | ArrayBuffer | Blob): void; /** * 대용량 데이터를 청크로 나누어 전송합니다. * * @param params - 전송 매개변수 * @param params.payload - 전송할 데이터 (Uint8Array) * @param params.actionName - 액션 이름 * @param params.chunkSize - 청크 크기 (선택적, 기본값: 64KB) */ sendDataInChunks(params: { payload: Uint8Array; actionName: string; chunkSize?: number; }): Promise; /** * 스트리밍 연결 완료 이벤트를 처리합니다. * * 작업 순서: * 1. 컨테이너에서 로딩 메시지 제거 * 2. 스트리밍 UI를 컨테이너에 추가 * 3. 아바타 초기화 (준비된 경우) */ private handleStreamingConnected; private handleStreamingAllocating; private handleRoomDisconnected; private handleStreamingStatusChange; private handleIsReadyToSendChange; private handleRecorderStatusChange; private handleStreamerListUpdated; private handleStreamingFailed; private handleStreamingReconnecting; private handleRecorderError; private handleRoomSessionTimeout; private handleLipMotionStart; /** * speak() 전용 LIP_MOTION_START 이벤트 핸들러 * conversation과 독립적으로 speak() 문장을 처리합니다. */ private handleSpeakLipMotionStart; private handleConversationEnd; private handleShortformPreviewEnd; private handleShortformDownloadReady; private initializeSizeObserver; /** * 아바타 초기화를 수행합니다. * * 설정 작업: * 1. 아바타 외모 설정 * 2. 음성 설정 */ private initializeAvatar; /** * 아바타 외모를 초기화합니다. * * 설정 작업: * 1. 아바타 외모 ID를 기반으로 외모 변경 이벤트 전송 */ private initializeAvatarAppearance; /** * 배경을 초기화합니다. * * 설정 작업: * 1. roomInfo의 backgroundSetting(JSON)에서 selectedId를 파싱하여 배경 변경 이벤트 전송 */ private initializeBackground; /** * AI 대화 시스템을 초기화합니다. * * 설정 작업: * 1. 대화 설정 생성 (음성, 언어, AI 모델 등) * 2. 대화 매니저 초기화 * 3. AI 응답 수신 이벤트 등록 * 4. 전체 시스템 준비 완료 처리 */ private initializeConversationManager; /** * ConversationManager 초기화를 위한 config 객체를 생성합니다. */ private createConversationConfig; /** * 아바타의 직업 설명을 생성합니다. */ private buildJobDescription; /** * 클라이언트 상태를 업데이트하고 관련 콜백을 호출합니다. * * @param updates - 업데이트할 상태 항목들 */ private updateState; /** * 클라이언트 상태를 초기화합니다. * * 수행 작업: * 1. connection, recording, streaming, conversation 상태를 기본값으로 초기화 * 2. MediaRecorder 및 녹음된 Blob 참조 제거 * 3. 초기화 여부 플래그(isInitialized) false로 설정 * 4. container의 DOM 내용을 비움 * 5. 메시지 content 캐시 초기화 */ private resetState; /** * 에러를 처리합니다. * * 수행 작업: * 1. 에러 카운트 및 마지막 에러 발생 시간 갱신 * 2. 콘솔과 내부 로그에 에러 메시지 출력 * 3. connection 상태를 "error"로 업데이트 * 4. onError 콜백 호출 (외부에서 에러를 처리할 수 있도록 전달) * * @param error 발생한 에러 객체 */ private handleError; private handleConverSationError; private handleRoomError; /** * 로그 메시지를 출력합니다. * * 수행 작업: * 1. 콘솔에 로그 메시지 출력 * 2. onLog 콜백 호출 (외부에서 로그를 수집하거나 표시 가능) * * @param message 출력할 로그 메시지 */ private log; /** * 메서드 호출을 추적합니다. (Fire-and-forget) * 추적 실패는 비즈니스 로직에 영향을 주지 않습니다. */ private track; }