Referencia de API
Guía completa para usar la API de Qwen Image Edit
Autenticación
Todas las llamadas a la API requieren autenticación mediante clave API.
const editor = new QwenImageEdit({
apiKey: 'tu-clave-api-aqui',
region: 'us-east-1' // opcional
});
Obtener Clave API
- Regístrate en la plataforma
- Ve a tu panel de control
- Genera una nueva clave API
- Copia y guarda la clave de forma segura
Métodos Principales
editText()
Edita o agrega texto en imágenes.
editText(opciones: EditTextOptions): Promise<EditResult>
Parámetros
interface EditTextOptions {
imagen: string; // Ruta o URL de la imagen
prompt: string; // Descripción de la edición
idioma?: string; // Idioma del texto (por defecto: 'auto')
fuente?: string; // Familia de fuente
tamaño?: 'pequeño' | 'mediano' | 'grande' | number;
color?: string; // Color en hex, rgb o nombre
posicion?: Posicion; // Posición del texto
preservarEstilo?: boolean; // Mantener estilo original
opacidad?: number; // Opacidad (0-1)
}
interface Posicion {
x?: number; // Coordenada X
y?: number; // Coordenada Y
alineacion?: 'izquierda' | 'centro' | 'derecha';
vertical?: 'arriba' | 'centro' | 'abajo';
}
Respuesta
interface EditResult {
imagenUrl: string; // URL de la imagen editada
imagenOriginal: string; // URL de la imagen original
metadatos: {
ancho: number;
alto: number;
formato: string;
tamaño: number; // Tamaño en bytes
};
procesamiento: {
tiempoMs: number;
modelo: string;
version: string;
};
}
Ejemplo
const resultado = await editor.editText({
imagen: './mi-imagen.jpg',
prompt: 'Cambiar "Hola" por "Adiós" manteniendo el estilo',
idioma: 'es',
preservarEstilo: true
});
console.log('Imagen editada:', resultado.imagenUrl);
editElement()
Agrega, modifica o elimina elementos en imágenes.
editElement(opciones: EditElementOptions): Promise<EditResult>
Parámetros
interface EditElementOptions {
imagen: string;
prompt: string;
accion?: 'agregar' | 'modificar' | 'eliminar';
estilo?: string;
posicion?: Posicion;
tamaño?: 'pequeño' | 'mediano' | 'grande';
opacidad?: number;
fusion?: 'natural' | 'suave' | 'fuerte';
}
Ejemplo
const resultado = await editor.editElement({
imagen: './paisaje.jpg',
prompt: 'Agregar un árbol en el lado izquierdo',
accion: 'agregar',
estilo: 'fotorrealista',
fusion: 'natural'
});
transferStyle()
Aplica transferencia de estilo a imágenes.
transferStyle(opciones: StyleTransferOptions): Promise<EditResult>
Parámetros
interface StyleTransferOptions {
imagen: string;
estilo: string | EstiloPredefinido;
intensidad?: number; // 0-1
preservarDetalles?: boolean;
paleta?: string[];
filtros?: string[];
contraste?: number;
saturacion?: number;
}
type EstiloPredefinido =
| 'acuarela'
| 'oleo'
| 'anime'
| 'cartoon'
| 'vintage'
| 'minimalista'
| 'cyberpunk'
| 'art-deco';
Ejemplo
const resultado = await editor.transferStyle({
imagen: './retrato.jpg',
estilo: 'anime',
intensidad: 0.8,
preservarDetalles: true
});
analyzeImage()
Analiza el contenido de una imagen.
analyzeImage(opciones: AnalyzeOptions): Promise<AnalysisResult>
Parámetros
interface AnalyzeOptions {
imagen: string;
detectar: DetectionType[];
idioma?: string;
}
type DetectionType =
| 'texto'
| 'objetos'
| 'rostros'
| 'colores'
| 'estilo'
| 'calidad';
Respuesta
interface AnalysisResult {
texto?: TextoDetectado[];
objetos?: ObjetoDetectado[];
rostros?: RostroDetectado[];
colores?: ColorInfo[];
estilo?: EstiloInfo;
calidad?: CalidadInfo;
}
interface TextoDetectado {
contenido: string;
idioma: string;
confianza: number;
posicion: BoundingBox;
fuente?: string;
tamaño?: number;
color?: string;
}
interface ObjetoDetectado {
nombre: string;
categoria: string;
confianza: number;
posicion: BoundingBox;
}
interface BoundingBox {
x: number;
y: number;
ancho: number;
alto: number;
}
Ejemplo
const analisis = await editor.analyzeImage({
imagen: './documento.jpg',
detectar: ['texto', 'objetos'],
idioma: 'es'
});
console.log('Texto encontrado:', analisis.texto);
console.log('Objetos detectados:', analisis.objetos);
Métodos de Utilidad
resizeImage()
Redimensiona imágenes manteniendo calidad.
resizeImage(opciones: ResizeOptions): Promise<EditResult>
Parámetros
interface ResizeOptions {
imagen: string;
dimensiones: {
ancho?: number;
alto?: number;
};
recorte?: 'centrado' | 'inteligente' | 'manual';
calidad?: number; // 1-100
formato?: 'jpg' | 'png' | 'webp';
mantenerAspecto?: boolean;
}
enhanceImage()
Mejora la calidad de imágenes.
enhanceImage(opciones: EnhanceOptions): Promise<EditResult>
Parámetros
interface EnhanceOptions {
imagen: string;
mejoras: MejoraType[];
intensidad?: number;
}
type MejoraType =
| 'nitidez'
| 'contraste'
| 'brillo'
| 'colores'
| 'ruido'
| 'desenfoque';
cleanImage()
Limpia y optimiza imágenes.
cleanImage(opciones: CleanOptions): Promise<EditResult>
Parámetros
interface CleanOptions {
imagen: string;
eliminar: ElementoAEliminar[];
preservar?: string[];
}
type ElementoAEliminar =
| 'ruido'
| 'artefactos'
| 'marcas-agua'
| 'texto'
| 'objetos-pequeños';
Configuración Avanzada
Configuración del Cliente
interface QwenImageEditConfig {
apiKey: string;
region?: string;
timeout?: number; // Timeout en ms
reintentos?: number; // Número de reintentos
cache?: boolean; // Habilitar caché
debug?: boolean; // Modo debug
endpoint?: string; // Endpoint personalizado
}
Configuración de Caché
const editor = new QwenImageEdit({
apiKey: 'tu-clave',
cache: true,
cacheConfig: {
ttl: 3600, // TTL en segundos
maxSize: 100, // Máximo elementos en caché
storage: 'memory' // 'memory' | 'disk'
}
});
Manejo de Errores
Tipos de Error
interface QwenError {
codigo: string;
mensaje: string;
detalles?: any;
timestamp: string;
}
// Códigos de error comunes
type CodigoError =
| 'AUTH_INVALID' // Clave API inválida
| 'QUOTA_EXCEEDED' // Cuota excedida
| 'IMAGE_TOO_LARGE' // Imagen muy grande
| 'INVALID_FORMAT' // Formato no soportado
| 'PROCESSING_FAILED' // Error en procesamiento
| 'NETWORK_ERROR' // Error de red
| 'TIMEOUT' // Timeout
| 'RATE_LIMITED'; // Límite de velocidad
Manejo de Errores
try {
const resultado = await editor.editText({
imagen: 'imagen.jpg',
prompt: 'Editar texto'
});
} catch (error) {
switch (error.codigo) {
case 'AUTH_INVALID':
console.error('Clave API inválida');
break;
case 'QUOTA_EXCEEDED':
console.error('Cuota excedida, actualiza tu plan');
break;
case 'IMAGE_TOO_LARGE':
console.error('Imagen muy grande, redimensiona primero');
break;
default:
console.error('Error desconocido:', error.mensaje);
}
}
Límites y Cuotas
Límites por Plan
Plan | Imágenes/mes | Tamaño máximo | Resolución máxima |
---|---|---|---|
Gratuito | 100 | 5MB | 2048x2048 |
Básico | 1,000 | 10MB | 4096x4096 |
Pro | 10,000 | 25MB | 8192x8192 |
Empresa | Ilimitado | 50MB | 16384x16384 |
Límites de Velocidad
- Gratuito: 10 solicitudes/minuto
- Básico: 60 solicitudes/minuto
- Pro: 300 solicitudes/minuto
- Empresa: 1000 solicitudes/minuto
Webhooks
Configurar Webhooks
// Configurar webhook para procesamiento asíncrono
const resultado = await editor.editTextAsync({
imagen: 'imagen-grande.jpg',
prompt: 'Edición compleja',
webhook: {
url: 'https://tu-servidor.com/webhook',
eventos: ['completado', 'error'],
secreto: 'tu-secreto-webhook'
}
});
console.log('ID de trabajo:', resultado.trabajoId);
Verificar Webhook
const crypto = require('crypto');
function verificarWebhook(payload, firma, secreto) {
const firmaEsperada = crypto
.createHmac('sha256', secreto)
.update(payload)
.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(firma),
Buffer.from(firmaEsperada)
);
}
SDK y Bibliotecas
JavaScript/TypeScript
npm install qwen-image-edit
Python
pip install qwen-image-edit
Otros Lenguajes
- PHP: Disponible en Packagist
- Java: Disponible en Maven Central
- Go: Disponible como módulo Go
- Ruby: Disponible como gem