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

  1. Regístrate en la plataforma
  2. Ve a tu panel de control
  3. Genera una nueva clave API
  4. 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

PlanImágenes/mesTamaño máximoResolución máxima
Gratuito1005MB2048x2048
Básico1,00010MB4096x4096
Pro10,00025MB8192x8192
EmpresaIlimitado50MB16384x16384

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

Recursos Adicionales