import { NextResponse } from 'next/server'; export const API_ERROR_CODES = { MISSING_REQUIRED_FIELD: 'MISSING_REQUIRED_FIELD', MISSING_API_KEY: 'MISSING_API_KEY', MISSING_PROVIDER: 'MISSING_PROVIDER', MISSING_MODEL: 'MISSING_MODEL', INVALID_CREDENTIALS: 'INVALID_CREDENTIALS', INVALID_REQUEST: 'INVALID_REQUEST', UNAUTHENTICATED: 'UNAUTHENTICATED', ASSET_NOT_FOUND: 'ASSET_NOT_FOUND', PROVIDER_DISABLED: 'PROVIDER_DISABLED', VOXCPM_AUTO_VOICE_REQUIRES_CONTEXT: 'VOXCPM_AUTO_VOICE_REQUIRES_CONTEXT', INVALID_URL: 'INVALID_URL', REDIRECT_NOT_ALLOWED: 'REDIRECT_NOT_ALLOWED', TOO_MANY_REDIRECTS: 'TOO_MANY_REDIRECTS', CONTENT_SENSITIVE: 'CONTENT_SENSITIVE', UPSTREAM_ERROR: 'UPSTREAM_ERROR', RATE_LIMITED: 'RATE_LIMITED', QWEN_VC_CONFIG_MISSING: 'QWEN_VC_CONFIG_MISSING', QWEN_VC_ENDPOINT_INVALID: 'QWEN_VC_ENDPOINT_INVALID', QWEN_VC_HTTP_ERROR: 'QWEN_VC_HTTP_ERROR', QWEN_VC_TIMEOUT: 'QWEN_VC_TIMEOUT', QWEN_VC_TRANSPORT_ERROR: 'QWEN_VC_TRANSPORT_ERROR', QWEN_VC_RESPONSE_JSON_INVALID: 'QWEN_VC_RESPONSE_JSON_INVALID', QWEN_VC_RESPONSE_VOICE_MISSING: 'QWEN_VC_RESPONSE_VOICE_MISSING', QWEN_VC_RESPONSE_AUDIO_URL_MISSING: 'QWEN_VC_RESPONSE_AUDIO_URL_MISSING', QWEN_VC_AUDIO_URL_INVALID: 'QWEN_VC_AUDIO_URL_INVALID', QWEN_VC_AUDIO_DOWNLOAD_FAILED: 'QWEN_VC_AUDIO_DOWNLOAD_FAILED', QWEN_VC_AUDIO_TOO_LARGE: 'QWEN_VC_AUDIO_TOO_LARGE', QWEN_VC_AUDIO_EMPTY: 'QWEN_VC_AUDIO_EMPTY', QWEN_VC_VOICE_NOT_FOUND: 'QWEN_VC_VOICE_NOT_FOUND', QWEN_VC_BOOTSTRAP_UNSUPPORTED: 'QWEN_VC_BOOTSTRAP_UNSUPPORTED', QWEN_VC_REFERENCE_AUDIO_INVALID: 'QWEN_VC_REFERENCE_AUDIO_INVALID', QWEN_TTS_ERROR: 'QWEN_TTS_ERROR', GENERATION_FAILED: 'GENERATION_FAILED', TRANSCRIPTION_FAILED: 'TRANSCRIPTION_FAILED', PARSE_FAILED: 'PARSE_FAILED', INTERNAL_ERROR: 'INTERNAL_ERROR', } as const; export type ApiErrorCode = (typeof API_ERROR_CODES)[keyof typeof API_ERROR_CODES]; export interface ApiErrorBody { success: false; errorCode: ApiErrorCode; error: string; details?: string; } export function apiError( code: ApiErrorCode, status: number, error: string, details?: string, ): NextResponse { return NextResponse.json( { success: false as const, errorCode: code, error, ...(details ? { details } : {}), }, { status }, ); } export function apiSuccess>(data: T, status = 200): NextResponse { return NextResponse.json({ success: true, ...data }, { status }); }