Solución de Problemas
Soluciones a problemas comunes y consejos de solución de problemas
Problemas de Autenticación
Error: "Clave API Inválida"
Síntomas:
- Código de error:
AUTH_INVALID
- Mensaje: "La clave API proporcionada no es válida"
Soluciones:
-
Verificar la clave API
// Verificar que la clave esté correctamente configurada console.log('Clave API:', process.env.QWEN_API_KEY?.substring(0, 10) + '...');
-
Regenerar clave API
- Ve a tu panel de control
- Navega a "Configuración de API"
- Genera una nueva clave
- Actualiza tu configuración
-
Verificar formato de clave
// La clave debe tener este formato const formatoValido = /^qwen_[a-zA-Z0-9]{32,}$/.test(apiKey); if (!formatoValido) { console.error('Formato de clave API inválido'); }
Error: "Región No Soportada"
Síntomas:
- Código de error:
REGION_INVALID
- Mensaje: "La región especificada no está disponible"
Soluciones:
// Regiones válidas
const regionesValidas = [
'us-east-1',
'us-west-2',
'eu-west-1',
'ap-southeast-1'
];
const editor = new QwenImageEdit({
apiKey: process.env.QWEN_API_KEY,
region: 'us-east-1' // Usar región válida
});
Problemas de Cuota y Límites
Error: "Cuota Excedida"
Síntomas:
- Código de error:
QUOTA_EXCEEDED
- Mensaje: "Has excedido tu límite mensual"
Soluciones:
-
Verificar uso actual
const uso = await editor.getUsage(); console.log('Uso actual:', uso); console.log('Límite:', uso.limite); console.log('Restante:', uso.limite - uso.usado);
-
Actualizar plan
- Ve a "Facturación" en tu panel
- Selecciona un plan superior
- El límite se actualizará inmediatamente
-
Optimizar uso
// Usar caché para evitar procesamiento duplicado const editor = new QwenImageEdit({ apiKey: process.env.QWEN_API_KEY, cache: true, cacheConfig: { ttl: 3600, // 1 hora maxSize: 1000 } });
Error: "Límite de Velocidad"
Síntomas:
- Código de error:
RATE_LIMITED
- Mensaje: "Demasiadas solicitudes por minuto"
Soluciones:
-
Implementar rate limiting
import pLimit from 'p-limit'; const limit = pLimit(5); // Máximo 5 solicitudes concurrentes const promesas = imagenes.map(imagen => limit(() => editor.editText({ imagen, prompt: 'Editar' })) ); const resultados = await Promise.all(promesas);
-
Usar delays entre solicitudes
async function procesarConDelay(imagenes) { const resultados = []; for (const imagen of imagenes) { const resultado = await editor.editText({ imagen, prompt: 'Editar' }); resultados.push(resultado); // Esperar 1 segundo entre solicitudes await new Promise(resolve => setTimeout(resolve, 1000)); } return resultados; }
Problemas de Imagen
Error: "Imagen Muy Grande"
Síntomas:
- Código de error:
IMAGE_TOO_LARGE
- Mensaje: "El archivo de imagen excede el tamaño máximo"
Soluciones:
-
Redimensionar imagen
// Redimensionar antes de procesar const imagenRedimensionada = await editor.resizeImage({ imagen: 'imagen-grande.jpg', dimensiones: { ancho: 2048, alto: 2048 }, mantenerAspecto: true }); // Luego procesar la imagen redimensionada const resultado = await editor.editText({ imagen: imagenRedimensionada.imagenUrl, prompt: 'Editar texto' });
-
Comprimir imagen
const imagenComprimida = await editor.compressImage({ imagen: 'imagen-grande.jpg', calidad: 80, formato: 'jpeg' });
Error: "Formato No Soportado"
Síntomas:
- Código de error:
INVALID_FORMAT
- Mensaje: "El formato de imagen no es compatible"
Soluciones:
-
Convertir formato
// Formatos soportados const formatosSoportados = ['jpg', 'jpeg', 'png', 'webp', 'bmp', 'tiff']; // Convertir a formato soportado const imagenConvertida = await editor.convertFormat({ imagen: 'imagen.gif', formatoDestino: 'png' });
-
Validar formato antes de procesar
function validarFormato(rutaImagen) { const extension = rutaImagen.split('.').pop()?.toLowerCase(); const formatosValidos = ['jpg', 'jpeg', 'png', 'webp']; if (!formatosValidos.includes(extension)) { throw new Error(`Formato ${extension} no soportado`); } }
Problemas de Red
Error: "Timeout de Conexión"
Síntomas:
- Código de error:
TIMEOUT
- Mensaje: "La solicitud ha excedido el tiempo límite"
Soluciones:
-
Aumentar timeout
const editor = new QwenImageEdit({ apiKey: process.env.QWEN_API_KEY, timeout: 60000, // 60 segundos maxRetries: 3 });
-
Implementar reintentos con backoff
async function editarConReintentos(opciones, maxReintentos = 3) { for (let intento = 1; intento <= maxReintentos; intento++) { try { return await editor.editText(opciones); } catch (error) { if (error.codigo === 'TIMEOUT' && intento < maxReintentos) { const delay = Math.pow(2, intento) * 1000; // Backoff exponencial await new Promise(resolve => setTimeout(resolve, delay)); continue; } throw error; } } }
Error: "Error de Red"
Síntomas:
- Código de error:
NETWORK_ERROR
- Mensaje: "No se pudo conectar al servidor"
Soluciones:
-
Verificar conectividad
async function verificarConectividad() { try { const response = await fetch('https://api.qwen.com/health'); if (response.ok) { console.log('Conectividad OK'); } else { console.error('Servidor no disponible'); } } catch (error) { console.error('Error de red:', error.message); } }
-
Configurar proxy si es necesario
const editor = new QwenImageEdit({ apiKey: process.env.QWEN_API_KEY, proxy: { host: 'proxy.empresa.com', port: 8080, auth: { username: process.env.PROXY_USER, password: process.env.PROXY_PASS } } });
Problemas de Procesamiento
Error: "Procesamiento Fallido"
Síntomas:
- Código de error:
PROCESSING_FAILED
- Mensaje: "No se pudo procesar la imagen"
Soluciones:
-
Verificar calidad de imagen
// Analizar imagen antes de procesar const analisis = await editor.analyzeImage({ imagen: 'imagen.jpg', detectar: ['calidad', 'objetos'] }); if (analisis.calidad.puntuacion < 0.5) { console.warn('Imagen de baja calidad, mejorando...'); const imagenMejorada = await editor.enhanceImage({ imagen: 'imagen.jpg', mejoras: ['nitidez', 'contraste'] }); }
-
Simplificar prompt
// Prompt muy complejo const promptComplejo = 'Cambiar el texto azul en la esquina superior derecha que dice "Hola" por "Adiós" manteniendo exactamente el mismo estilo, fuente y color pero en rojo'; // Prompt simplificado const promptSimple = 'Cambiar "Hola" por "Adiós" en rojo'; const resultado = await editor.editText({ imagen: 'imagen.jpg', prompt: promptSimple });
Error: "Contenido No Detectado"
Síntomas:
- Código de error:
CONTENT_NOT_FOUND
- Mensaje: "No se encontró el contenido especificado"
Soluciones:
-
Analizar contenido primero
// Detectar texto disponible const analisis = await editor.analyzeImage({ imagen: 'imagen.jpg', detectar: ['texto'] }); console.log('Texto detectado:', analisis.texto); // Usar texto detectado en el prompt if (analisis.texto.length > 0) { const textoOriginal = analisis.texto[0].contenido; const resultado = await editor.editText({ imagen: 'imagen.jpg', prompt: `Cambiar "${textoOriginal}" por "Nuevo texto"` }); }
-
Usar coordenadas específicas
const resultado = await editor.editText({ imagen: 'imagen.jpg', prompt: 'Agregar texto "Nuevo"', posicion: { x: 100, y: 50, alineacion: 'centro' } });
Problemas de Performance
Procesamiento Lento
Síntomas:
- Tiempos de respuesta muy altos
- Timeouts frecuentes
Soluciones:
-
Optimizar imágenes
// Redimensionar para mejor performance const imagenOptimizada = await editor.resizeImage({ imagen: 'imagen-4k.jpg', dimensiones: { ancho: 1920, alto: 1080 }, calidad: 85 });
-
Usar procesamiento asíncrono
// Para imágenes grandes, usar webhooks const trabajo = await editor.editTextAsync({ imagen: 'imagen-grande.jpg', prompt: 'Editar texto', webhook: { url: 'https://mi-app.com/webhook', eventos: ['completado', 'error'] } }); console.log('ID de trabajo:', trabajo.id);
-
Implementar caché inteligente
import crypto from 'crypto'; function generarCacheKey(opciones) { const hash = crypto.createHash('md5'); hash.update(JSON.stringify(opciones)); return hash.digest('hex'); } const cache = new Map(); async function editarConCache(opciones) { const cacheKey = generarCacheKey(opciones); if (cache.has(cacheKey)) { console.log('Resultado desde caché'); return cache.get(cacheKey); } const resultado = await editor.editText(opciones); cache.set(cacheKey, resultado); return resultado; }
Problemas de Memoria
Error: "Memoria Insuficiente"
Síntomas:
- Aplicación se bloquea
- Errores de "out of memory"
Soluciones:
-
Procesar en lotes
async function procesarEnLotes(imagenes, tamañoLote = 5) { const resultados = []; for (let i = 0; i < imagenes.length; i += tamañoLote) { const lote = imagenes.slice(i, i + tamañoLote); const resultadosLote = await Promise.all( lote.map(imagen => editor.editText({ imagen, prompt: 'Editar' })) ); resultados.push(...resultadosLote); // Limpiar memoria entre lotes if (global.gc) { global.gc(); } } return resultados; }
-
Usar streams para archivos grandes
import fs from 'fs'; async function procesarConStream(rutaImagen) { const stream = fs.createReadStream(rutaImagen); const resultado = await editor.editTextStream({ imagenStream: stream, prompt: 'Editar texto' }); return resultado; }
Herramientas de Debug
Logging Detallado
const editor = new QwenImageEdit({
apiKey: process.env.QWEN_API_KEY,
debug: true,
logger: {
error: (msg, meta) => console.error('❌', msg, meta),
warn: (msg, meta) => console.warn('⚠️', msg, meta),
info: (msg, meta) => console.info('ℹ️', msg, meta),
debug: (msg, meta) => console.debug('🐛', msg, meta)
}
});
Interceptor de Solicitudes
const editor = new QwenImageEdit({
apiKey: process.env.QWEN_API_KEY,
interceptors: {
request: (config) => {
console.log('📤 Enviando:', {
url: config.url,
metodo: config.method,
tamaño: config.data?.length || 0
});
return config;
},
response: (response) => {
console.log('📥 Recibido:', {
status: response.status,
tamaño: response.data?.length || 0,
tiempo: response.duration
});
return response;
},
error: (error) => {
console.error('💥 Error:', {
codigo: error.codigo,
mensaje: error.mensaje,
url: error.config?.url
});
throw error;
}
}
});
Health Check
async function verificarSalud() {
try {
const salud = await editor.healthCheck();
console.log('✅ Servicio saludable:', salud);
return true;
} catch (error) {
console.error('❌ Servicio no disponible:', error.message);
return false;
}
}
// Verificar cada 30 segundos
setInterval(verificarSalud, 30000);
Contacto de Soporte
Si los problemas persisten:
- Documentación: Consulta la documentación completa
- Ejemplos: Revisa los ejemplos de código
- Comunidad: Únete a nuestro Discord
- Soporte: Contacta a support@qwen.com
Información para Soporte
Cuando contactes soporte, incluye:
// Información del sistema
const infoSistema = {
version: process.version,
plataforma: process.platform,
arquitectura: process.arch,
qwenVersion: editor.version,
timestamp: new Date().toISOString()
};
console.log('Información del sistema:', infoSistema);
- Código de error específico
- Mensaje de error completo
- Pasos para reproducir el problema
- Configuración utilizada (sin claves API)
- Logs relevantes