UNPKG

hua-sdk-lite

Version:

HUA Lite API SDK - Emotional AI Chatbot Integration

210 lines (209 loc) β€’ 9.03 kB
"use strict"; // πŸ’” HUA SDK Lite v2.0.0 - μ—λŸ¬ 처리 // λ¦¬λ“¬μ΄μ˜ 마음처럼 μ‚¬μš©μžλ₯Ό μ΄ν•΄ν•˜κ³  λ”°λœ»ν•˜κ²Œ μ•ˆλ‚΄ν•˜λŠ” μ—λŸ¬λ“€ πŸ’– Object.defineProperty(exports, "__esModule", { value: true }); exports.RetryLimitExceededError = exports.ConfigurationError = exports.OpenAIApiError = exports.ServerError = exports.TimeoutError = exports.NetworkError = exports.InvalidLanguageError = exports.InvalidTierError = exports.InvalidModeError = exports.InvalidToneError = exports.MissingMessageError = exports.ValidationError = exports.InsufficientCreditsError = exports.RateLimitExceededError = exports.GuestKeyLimitExceededError = exports.InvalidApiKeyError = exports.MissingApiKeyError = exports.AuthenticationError = exports.HUAError = void 0; exports.createErrorFromResponse = createErrorFromResponse; exports.isHUAError = isHUAError; exports.isRetryableError = isRetryableError; exports.formatErrorMessage = formatErrorMessage; // ===== κΈ°λ³Έ HUA μ—λŸ¬ 클래슀 ===== class HUAError extends Error { constructor(code, message, statusCode = 500, details) { super(message); this.isHUAError = true; this.name = 'HUAError'; this.code = code; this.statusCode = statusCode; this.details = details; } // μ—λŸ¬λ₯Ό JSON ν˜•νƒœλ‘œ λ³€ν™˜ toJSON() { return { error: this.code, message: this.message, details: this.details }; } } exports.HUAError = HUAError; // ===== 인증 κ΄€λ ¨ μ—λŸ¬ ===== class AuthenticationError extends HUAError { constructor(message = '인증에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€. API ν‚€λ₯Ό ν™•μΈν•΄μ£Όμ„Έμš”.', details) { super('AUTHENTICATION_ERROR', message, 401, details); this.name = 'AuthenticationError'; } } exports.AuthenticationError = AuthenticationError; class MissingApiKeyError extends HUAError { constructor(message = 'API ν‚€κ°€ ν•„μš”ν•©λ‹ˆλ‹€. Authorization 헀더에 Bearer 토큰을 ν¬ν•¨ν•΄μ£Όμ„Έμš”.') { super('MISSING_API_KEY', message, 401); this.name = 'MissingApiKeyError'; } } exports.MissingApiKeyError = MissingApiKeyError; class InvalidApiKeyError extends HUAError { constructor(message = 'μœ νš¨ν•˜μ§€ μ•Šμ€ API ν‚€μž…λ‹ˆλ‹€.') { super('INVALID_API_KEY', message, 401); this.name = 'InvalidApiKeyError'; } } exports.InvalidApiKeyError = InvalidApiKeyError; class GuestKeyLimitExceededError extends HUAError { constructor(message = '게슀트 ν‚€ μ‚¬μš© ν•œλ„λ₯Ό μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. μƒˆλ‘œμš΄ ν‚€λ₯Ό λ°œκΈ‰λ°›μ•„μ£Όμ„Έμš”.') { super('GUEST_KEY_LIMIT_EXCEEDED', message, 401); this.name = 'GuestKeyLimitExceededError'; } } exports.GuestKeyLimitExceededError = GuestKeyLimitExceededError; // ===== μš”μ²­ μ œν•œ κ΄€λ ¨ μ—λŸ¬ ===== class RateLimitExceededError extends HUAError { constructor(message = 'μš”μ²­ ν•œλ„λ₯Ό μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€. μž μ‹œ ν›„ λ‹€μ‹œ μ‹œλ„ν•΄μ£Όμ„Έμš”.', details) { super('RATE_LIMIT_EXCEEDED', message, 429, details); this.name = 'RateLimitExceededError'; } } exports.RateLimitExceededError = RateLimitExceededError; class InsufficientCreditsError extends HUAError { constructor(message = 'ν¬λ ˆλ”§μ΄ λΆ€μ‘±ν•©λ‹ˆλ‹€. 더 λ§Žμ€ ν¬λ ˆλ”§μ„ μΆ©μ „ν•΄μ£Όμ„Έμš”.', details) { super('INSUFFICIENT_CREDITS', message, 402, details); this.name = 'InsufficientCreditsError'; } } exports.InsufficientCreditsError = InsufficientCreditsError; // ===== μž…λ ₯ 검증 κ΄€λ ¨ μ—λŸ¬ ===== class ValidationError extends HUAError { constructor(message = 'μž…λ ₯ 데이터가 μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.', details) { super('VALIDATION_FAILED', message, 400, details); this.name = 'ValidationError'; } } exports.ValidationError = ValidationError; class MissingMessageError extends HUAError { constructor(message = 'λ©”μ‹œμ§€κ°€ ν•„μš”ν•©λ‹ˆλ‹€.') { super('MISSING_MESSAGE', message, 400); this.name = 'MissingMessageError'; } } exports.MissingMessageError = MissingMessageError; class InvalidToneError extends HUAError { constructor(tone, message = `μœ νš¨ν•˜μ§€ μ•Šμ€ ν†€μž…λ‹ˆλ‹€: ${tone}. μ‚¬μš© κ°€λŠ₯ν•œ 톀: gentle, warm, cheerful, quirky, delicate`) { super('INVALID_TONE', message, 400); this.name = 'InvalidToneError'; } } exports.InvalidToneError = InvalidToneError; class InvalidModeError extends HUAError { constructor(mode, message = `μœ νš¨ν•˜μ§€ μ•Šμ€ λͺ¨λ“œμž…λ‹ˆλ‹€: ${mode}. μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“œ: empathy, analysis, suggestion, praise, playful`) { super('INVALID_MODE', message, 400); this.name = 'InvalidModeError'; } } exports.InvalidModeError = InvalidModeError; class InvalidTierError extends HUAError { constructor(tier, message = `μœ νš¨ν•˜μ§€ μ•Šμ€ λ“±κΈ‰μž…λ‹ˆλ‹€: ${tier}. μ‚¬μš© κ°€λŠ₯ν•œ λ“±κΈ‰: 1.0, 2.0, 3.0`) { super('INVALID_TIER', message, 400); this.name = 'InvalidTierError'; } } exports.InvalidTierError = InvalidTierError; class InvalidLanguageError extends HUAError { constructor(lang, message = `μ§€μ›ν•˜μ§€ μ•ŠλŠ” μ–Έμ–΄μž…λ‹ˆλ‹€: ${lang}. 지원 μ–Έμ–΄: ko, en`) { super('INVALID_LANGUAGE', message, 400); this.name = 'InvalidLanguageError'; } } exports.InvalidLanguageError = InvalidLanguageError; // ===== λ„€νŠΈμ›Œν¬ κ΄€λ ¨ μ—λŸ¬ ===== class NetworkError extends HUAError { constructor(message = 'λ„€νŠΈμ›Œν¬ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. 인터넷 연결을 ν™•μΈν•΄μ£Όμ„Έμš”.', details) { super('NETWORK_ERROR', message, 0, details); this.name = 'NetworkError'; } } exports.NetworkError = NetworkError; class TimeoutError extends HUAError { constructor(message = 'μš”μ²­ μ‹œκ°„μ΄ μ΄ˆκ³Όλ˜μ—ˆμŠ΅λ‹ˆλ‹€. μž μ‹œ ν›„ λ‹€μ‹œ μ‹œλ„ν•΄μ£Όμ„Έμš”.', details) { super('TIMEOUT_ERROR', message, 408, details); this.name = 'TimeoutError'; } } exports.TimeoutError = TimeoutError; // ===== μ„œλ²„ κ΄€λ ¨ μ—λŸ¬ ===== class ServerError extends HUAError { constructor(message = 'μ„œλ²„ λ‚΄λΆ€ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. μž μ‹œ ν›„ λ‹€μ‹œ μ‹œλ„ν•΄μ£Όμ„Έμš”.', details) { super('SERVER_ERROR', message, 500, details); this.name = 'ServerError'; } } exports.ServerError = ServerError; class OpenAIApiError extends HUAError { constructor(message = 'OpenAI API 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.', details) { super('OPENAI_API_ERROR', message, 500, details); this.name = 'OpenAIApiError'; } } exports.OpenAIApiError = OpenAIApiError; // ===== SDK κ΄€λ ¨ μ—λŸ¬ ===== class ConfigurationError extends HUAError { constructor(message = 'SDK 섀정이 μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.', details) { super('CONFIGURATION_ERROR', message, 500, details); this.name = 'ConfigurationError'; } } exports.ConfigurationError = ConfigurationError; class RetryLimitExceededError extends HUAError { constructor(message = 'μ΅œλŒ€ μž¬μ‹œλ„ 횟수λ₯Ό μ΄ˆκ³Όν–ˆμŠ΅λ‹ˆλ‹€.', details) { super('RETRY_LIMIT_EXCEEDED', message, 500, details); this.name = 'RetryLimitExceededError'; } } exports.RetryLimitExceededError = RetryLimitExceededError; // ===== μ—λŸ¬ νŒ©ν† λ¦¬ ν•¨μˆ˜ ===== function createErrorFromResponse(response, statusCode) { const errorCode = response?.error || 'UNKNOWN_ERROR'; const message = response?.message || 'μ•Œ 수 μ—†λŠ” 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.'; const details = response?.details; switch (errorCode) { case 'MISSING_API_KEY': return new MissingApiKeyError(message); case 'INVALID_API_KEY': return new InvalidApiKeyError(message); case 'GUEST_KEY_LIMIT_EXCEEDED': return new GuestKeyLimitExceededError(message); case 'RATE_LIMIT_EXCEEDED': return new RateLimitExceededError(message, details); case 'INSUFFICIENT_CREDITS': return new InsufficientCreditsError(message, details); case 'VALIDATION_FAILED': return new ValidationError(message, details); case 'MISSING_MESSAGE': return new MissingMessageError(message); case 'OPENAI_API_ERROR': return new OpenAIApiError(message, details); case 'SERVER_CONFIG_ERROR': return new ServerError(message, details); default: return new HUAError(errorCode, message, statusCode, details); } } // ===== μ—λŸ¬ μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜ ===== function isHUAError(error) { return error && error.isHUAError === true; } function isRetryableError(error) { const retryableCodes = [ 'NETWORK_ERROR', 'TIMEOUT_ERROR', 'SERVER_ERROR', 'OPENAI_API_ERROR' ]; return retryableCodes.includes(error.code); } // ===== μ—λŸ¬ λ©”μ‹œμ§€ ν¬λ§·νŒ… ===== function formatErrorMessage(error, lang = 'ko') { if (lang === 'en') { return `${error.message}${error.details ? ` (${error.details})` : ''}`; } return `${error.message}${error.details ? ` (${error.details})` : ''}`; }