hua-sdk-lite
Version:
HUA Lite API SDK - Emotional AI Chatbot Integration
210 lines (209 loc) β’ 9.03 kB
JavaScript
;
// π 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})` : ''}`;
}