Referência da API

Guia completo para usar a API Qwen Image Edit

Autenticação

Chave da API

Todas as requisições para a API do Qwen Image Edit requerem uma chave de API válida. Você pode obter sua chave no painel de controle.

// Configuração da autenticação
const editor = new QwenImageEdit({
  apiKey: 'sua-chave-api-aqui',
  region: 'us-east-1' // opcional
});

Cabeçalhos de Requisição

Authorization: Bearer sua-chave-api-aqui
Content-Type: application/json
User-Agent: QwenImageEdit/1.0

Regiões Disponíveis

RegiãoEndpointLocalização
us-east-1https://api-us-east.qwen.comEstados Unidos (Leste)
us-west-1https://api-us-west.qwen.comEstados Unidos (Oeste)
eu-west-1https://api-eu-west.qwen.comEuropa (Irlanda)
ap-southeast-1https://api-ap-southeast.qwen.comÁsia-Pacífico (Singapura)

Métodos Principais

editText()

Edita ou adiciona texto em imagens.

Sintaxe

const resultado = await editor.editText(opcoes);

Parâmetros

ParâmetroTipoObrigatórioDescrição
imagemstring | Buffer | FileCaminho, URL, buffer ou objeto File da imagem
promptstringDescrição da edição desejada
posicaoobjectPosição para novo texto
corstringCor do texto (hex, rgb, nome)
tamanhostring | numberTamanho do texto
fontestringFamília da fonte
preservarEstilobooleanManter estilo do texto original
opacidadenumberOpacidade (0-1)
contornostringCor do contorno
sombraboolean | objectConfiguração de sombra

Objeto posicao

{
  x: 400,           // Posição X em pixels
  y: 200,           // Posição Y em pixels
  alinhamento: 'centro' // 'esquerda', 'centro', 'direita'
}

Objeto sombra

{
  cor: '#000000',   // Cor da sombra
  deslocamentoX: 2, // Deslocamento horizontal
  deslocamentoY: 2, // Deslocamento vertical
  desfoque: 4       // Intensidade do desfoque
}

Exemplo

const resultado = await editor.editText({
  imagem: './banner.jpg',
  prompt: 'Mudar "SALE" para "PROMOÇÃO"',
  cor: '#ff0000',
  tamanho: 'grande',
  fonte: 'Arial Bold',
  preservarEstilo: true,
  sombra: {
    cor: '#000000',
    deslocamentoX: 2,
    deslocamentoY: 2,
    desfoque: 4
  }
});

Resposta

{
  imagemUrl: 'https://cdn.qwen.com/resultado/abc123.jpg',
  imagemOriginal: 'https://cdn.qwen.com/original/def456.jpg',
  alteracoes: [
    {
      tipo: 'texto_editado',
      textoOriginal: 'SALE',
      textoNovo: 'PROMOÇÃO',
      posicao: { x: 400, y: 200 }
    }
  ],
  tempoProcessamento: 2.3,
  creditos: 1
}

editElement()

Adiciona, remove ou modifica elementos em imagens.

Sintaxe

const resultado = await editor.editElement(opcoes);

Parâmetros

ParâmetroTipoObrigatórioDescrição
imagemstring | Buffer | FileImagem de entrada
promptstringDescrição da edição
acaostring'adicionar', 'remover', 'modificar'
posicaoobjectPosição para novos elementos
estilostringEstilo do elemento
fusaostringTipo de fusão
intensidadenumberIntensidade da modificação (0-1)
opacidadenumberOpacidade do elemento (0-1)

Valores para acao

  • 'adicionar': Adiciona novo elemento
  • 'remover': Remove elemento existente
  • 'modificar': Modifica elemento existente

Valores para estilo

  • 'fotorrealista': Estilo fotográfico
  • 'artistico': Estilo artístico
  • 'cartoon': Estilo cartoon
  • 'minimalista': Estilo minimalista

Valores para fusao

  • 'natural': Fusão natural
  • 'suave': Fusão suave
  • 'nitida': Bordas nítidas

Exemplo

// Adicionar elemento
const resultado = await editor.editElement({
  imagem: './sala.jpg',
  prompt: 'Adicionar uma planta verde no canto esquerdo',
  acao: 'adicionar',
  estilo: 'fotorrealista',
  fusao: 'natural',
  posicao: {
    x: 100,
    y: 400
  }
});

// Remover elemento
const resultado = await editor.editElement({
  imagem: './foto.jpg',
  prompt: 'Remover a pessoa da foto',
  acao: 'remover'
});

// Modificar elemento
const resultado = await editor.editElement({
  imagem: './carro.jpg',
  prompt: 'Mudar a cor do carro para azul',
  acao: 'modificar',
  intensidade: 0.8
});

transferStyle()

Aplica transferência de estilo a imagens.

Sintaxe

const resultado = await editor.transferStyle(opcoes);

Parâmetros

ParâmetroTipoObrigatórioDescrição
imagemstring | Buffer | FileImagem de entrada
estilostringDescrição do estilo ou estilo predefinido
intensidadenumberIntensidade do estilo (0-1)
preservarDetalhesbooleanPreservar detalhes da imagem
paletaarrayPaleta de cores personalizada
contrastenumberAjuste de contraste
saturacaonumberAjuste de saturação
brilhonumberAjuste de brilho

Estilos Predefinidos

  • 'aquarela': Efeito aquarela
  • 'oleo': Pintura a óleo
  • 'impressionista': Estilo impressionista
  • 'pop-art': Arte pop
  • 'vintage': Efeito vintage
  • 'cinematografico': Estilo cinematográfico
  • 'anime': Estilo anime
  • 'cartoon': Estilo cartoon

Exemplo

// Estilo predefinido
const resultado = await editor.transferStyle({
  imagem: './retrato.jpg',
  estilo: 'aquarela',
  intensidade: 0.7,
  preservarDetalhes: true
});

// Estilo personalizado
const resultado = await editor.transferStyle({
  imagem: './paisagem.jpg',
  estilo: 'pintura impressionista com cores vibrantes',
  intensidade: 0.6,
  paleta: ['#ff6b6b', '#4ecdc4', '#45b7d1', '#96ceb4'],
  contraste: 1.2,
  saturacao: 1.1
});

analyzeImage()

Analisa o conteúdo de imagens.

Sintaxe

const analise = await editor.analyzeImage(opcoes);

Parâmetros

ParâmetroTipoObrigatórioDescrição
imagemstring | Buffer | FileImagem para análise
detectararrayTipos de detecção
idiomastringIdioma para OCR
confiancanumberNível mínimo de confiança

Tipos de Detecção

  • 'texto': Detecção de texto (OCR)
  • 'objetos': Detecção de objetos
  • 'faces': Detecção de rostos
  • 'cores': Análise de cores
  • 'estilo': Análise de estilo
  • 'qualidade': Análise de qualidade
  • 'conteudo_sensivel': Detecção de conteúdo sensível

Exemplo

const analise = await editor.analyzeImage({
  imagem: './foto.jpg',
  detectar: ['texto', 'objetos', 'cores'],
  idioma: 'pt',
  confianca: 0.7
});

Resposta

{
  texto: [
    {
      conteudo: 'PROMOÇÃO',
      posicao: { x: 400, y: 200, largura: 200, altura: 50 },
      confianca: 0.95,
      idioma: 'pt'
    }
  ],
  objetos: [
    {
      nome: 'pessoa',
      posicao: { x: 100, y: 150, largura: 300, altura: 400 },
      confianca: 0.89
    }
  ],
  cores: {
    dominantes: ['#ff0000', '#00ff00', '#0000ff'],
    paleta: [
      { cor: '#ff0000', porcentagem: 35.2 },
      { cor: '#00ff00', porcentagem: 28.7 },
      { cor: '#0000ff', porcentagem: 21.1 }
    ]
  },
  qualidade: {
    pontuacao: 0.85,
    resolucao: 'alta',
    nitidez: 0.9,
    ruido: 0.1
  }
}

Métodos Utilitários

resizeImage()

Redimensiona imagens mantendo qualidade.

Sintaxe

const resultado = await editor.resizeImage(opcoes);

Parâmetros

ParâmetroTipoObrigatórioDescrição
imagemstring | Buffer | FileImagem de entrada
dimensoesobjectNovas dimensões
manterAspectobooleanManter proporção
qualidadenumberQualidade de saída (0-1)
formatostringFormato de saída

Exemplo

const resultado = await editor.resizeImage({
  imagem: './imagem-grande.jpg',
  dimensoes: {
    largura: 800,
    altura: 600
  },
  manterAspecto: true,
  qualidade: 0.9,
  formato: 'webp'
});

enhanceImage()

Melhora a qualidade de imagens.

Sintaxe

const resultado = await editor.enhanceImage(opcoes);

Parâmetros

ParâmetroTipoObrigatórioDescrição
imagemstring | Buffer | FileImagem de entrada
melhoriasarrayTipos de melhoria
intensidadenumberIntensidade das melhorias

Tipos de Melhoria

  • 'nitidez': Aumentar nitidez
  • 'contraste': Melhorar contraste
  • 'cores': Realçar cores
  • 'ruido': Reduzir ruído
  • 'resolucao': Aumentar resolução (AI upscaling)

Exemplo

const resultado = await editor.enhanceImage({
  imagem: './foto-antiga.jpg',
  melhorias: ['nitidez', 'contraste', 'cores'],
  intensidade: 0.7
});

cleanImage()

Limpa e otimiza imagens.

Sintaxe

const resultado = await editor.cleanImage(opcoes);

Parâmetros

ParâmetroTipoObrigatórioDescrição
imagemstring | Buffer | FileImagem de entrada
operacoesarrayOperações de limpeza

Operações de Limpeza

  • 'remover_fundo': Remover fundo
  • 'remover_ruido': Remover ruído
  • 'corrigir_perspectiva': Corrigir perspectiva
  • 'enderezar': Enderezar imagem
  • 'recortar_automatico': Recorte automático

Exemplo

const resultado = await editor.cleanImage({
  imagem: './documento-escaneado.jpg',
  operacoes: ['enderezar', 'corrigir_perspectiva', 'remover_ruido']
});

Configuração Avançada

Configuração do Cliente

const editor = new QwenImageEdit({
  // Autenticação
  apiKey: 'sua-chave-api',
  region: 'us-east-1',
  
  // Timeouts
  timeout: 30000,           // Timeout geral (ms)
  uploadTimeout: 60000,     // Timeout de upload (ms)
  
  // Retry
  maxRetries: 3,            // Máximo de tentativas
  retryDelay: 1000,         // Delay entre tentativas (ms)
  
  // Cache
  cache: true,              // Habilitar cache
  cacheConfig: {
    ttl: 3600,              // TTL em segundos
    maxSize: 100            // Máximo de itens
  },
  
  // Proxy
  proxy: {
    host: 'proxy.exemplo.com',
    port: 8080,
    auth: {
      username: 'usuario',
      password: 'senha'
    }
  },
  
  // Headers customizados
  headers: {
    'User-Agent': 'MeuApp/1.0',
    'X-Custom-Header': 'valor'
  },
  
  // Logging
  debug: true,              // Habilitar logs debug
  logLevel: 'info'          // Nível de log
});

Configuração de Upload

// Upload direto de arquivo
const resultado = await editor.editText({
  imagem: fs.createReadStream('./imagem.jpg'),
  prompt: 'Editar texto'
});

// Upload de buffer
const buffer = fs.readFileSync('./imagem.jpg');
const resultado = await editor.editText({
  imagem: buffer,
  prompt: 'Editar texto'
});

// Upload de URL
const resultado = await editor.editText({
  imagem: 'https://exemplo.com/imagem.jpg',
  prompt: 'Editar texto'
});

// Upload de base64
const base64 = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQ...';
const resultado = await editor.editText({
  imagem: base64,
  prompt: 'Editar texto'
});

Tratamento de Erros

Códigos de Erro

CódigoDescriçãoSolução
AUTH_INVALIDChave API inválidaVerificar chave API
AUTH_EXPIREDChave API expiradaRenovar chave API
QUOTA_EXCEEDEDCota excedidaAguardar reset ou upgrade
RATE_LIMITEDRate limit atingidoAguardar ou reduzir frequência
IMAGE_TOO_LARGEImagem muito grandeRedimensionar imagem
IMAGE_FORMAT_UNSUPPORTEDFormato não suportadoConverter para formato suportado
PROMPT_INVALIDPrompt inválidoRevisar prompt
PROCESSING_FAILEDFalha no processamentoTentar novamente
NETWORK_ERRORErro de redeVerificar conexão
TIMEOUTTimeoutAumentar timeout ou tentar novamente

Exemplo de Tratamento

try {
  const resultado = await editor.editText({
    imagem: './imagem.jpg',
    prompt: 'Editar texto'
  });
  
  console.log('Sucesso:', resultado.imagemUrl);
  
} catch (error) {
  switch (error.codigo) {
    case 'AUTH_INVALID':
      console.error('Chave API inválida. Verifique suas credenciais.');
      break;
      
    case 'QUOTA_EXCEEDED':
      console.error('Cota excedida. Aguarde o reset ou faça upgrade do plano.');
      break;
      
    case 'IMAGE_TOO_LARGE':
      console.error('Imagem muito grande. Redimensione para menos de 10MB.');
      break;
      
    case 'RATE_LIMITED':
      console.error('Rate limit atingido. Aguarde antes de fazer nova requisição.');
      break;
      
    default:
      console.error('Erro:', error.message);
      console.error('Detalhes:', error.detalhes);
  }
}

Retry Automático

// Configurar retry automático
const editor = new QwenImageEdit({
  apiKey: 'sua-chave-api',
  maxRetries: 3,
  retryDelay: 1000,
  retryCondition: (error) => {
    // Fazer retry apenas para erros temporários
    return ['NETWORK_ERROR', 'TIMEOUT', 'PROCESSING_FAILED'].includes(error.codigo);
  }
});

Limites e Cotas

Limites por Plano

PlanoRequisições/mêsTamanho máximoConcurrent requests
Gratuito1005MB1
Básico1.00010MB3
Pro10.00025MB10
EnterpriseIlimitado100MB50

Rate Limiting

  • Gratuito: 10 requisições/minuto
  • Básico: 60 requisições/minuto
  • Pro: 300 requisições/minuto
  • Enterprise: 1000 requisições/minuto

Verificar Cota

// Verificar cota atual
const cota = await editor.getQuota();
console.log('Cota:', cota);

// Resposta
{
  plano: 'pro',
  requisicoes: {
    usadas: 2847,
    limite: 10000,
    resetEm: '2024-02-01T00:00:00Z'
  },
  rateLimit: {
    limite: 300,
    restante: 287,
    resetEm: '2024-01-15T14:35:00Z'
  }
}

Webhooks

Configuração

// Configurar webhook para processamento assíncrono
const resultado = await editor.editText({
  imagem: './imagem.jpg',
  prompt: 'Editar texto',
  webhook: {
    url: 'https://meuapp.com/webhook',
    eventos: ['processamento_concluido', 'erro'],
    segredo: 'meu-segredo-webhook'
  },
  assincrono: true
});

console.log('Job ID:', resultado.jobId);

Payload do Webhook

// POST para https://meuapp.com/webhook
{
  evento: 'processamento_concluido',
  jobId: 'job_abc123',
  timestamp: '2024-01-15T14:30:00Z',
  dados: {
    imagemUrl: 'https://cdn.qwen.com/resultado/abc123.jpg',
    imagemOriginal: 'https://cdn.qwen.com/original/def456.jpg',
    alteracoes: [...],
    tempoProcessamento: 2.3,
    creditos: 1
  }
}

Verificação de Assinatura

const crypto = require('crypto');

function verificarAssinatura(payload, assinatura, segredo) {
  const hash = crypto
    .createHmac('sha256', segredo)
    .update(payload)
    .digest('hex');
    
  return `sha256=${hash}` === assinatura;
}

// No seu endpoint de webhook
app.post('/webhook', (req, res) => {
  const assinatura = req.headers['x-qwen-signature'];
  const payload = JSON.stringify(req.body);
  
  if (!verificarAssinatura(payload, assinatura, 'meu-segredo-webhook')) {
    return res.status(401).send('Assinatura inválida');
  }
  
  // Processar webhook
  console.log('Webhook recebido:', req.body);
  res.status(200).send('OK');
});

SDKs e Bibliotecas

JavaScript/TypeScript

npm install qwen-image-edit
import { QwenImageEdit } from 'qwen-image-edit';
// ou
const { QwenImageEdit } = require('qwen-image-edit');

Python

pip install qwen-image-edit
from qwen_image_edit import QwenImageEdit

editor = QwenImageEdit(api_key='sua-chave-api')
resultado = editor.edit_text(
    imagem='./imagem.jpg',
    prompt='Editar texto'
)

PHP

composer require qwen/image-edit
use Qwen\ImageEdit\QwenImageEdit;

$editor = new QwenImageEdit('sua-chave-api');
$resultado = $editor->editText([
    'imagem' => './imagem.jpg',
    'prompt' => 'Editar texto'
]);

Java

<dependency>
    <groupId>com.qwen</groupId>
    <artifactId>image-edit</artifactId>
    <version>1.0.0</version>
</dependency>
import com.qwen.imageedit.QwenImageEdit;

QwenImageEdit editor = new QwenImageEdit("sua-chave-api");
EditResult resultado = editor.editText(
    "./imagem.jpg",
    "Editar texto"
);

Go

go get github.com/qwen/image-edit-go
import "github.com/qwen/image-edit-go"

editor := imageedit.New("sua-chave-api")
resultado, err := editor.EditText("./imagem.jpg", "Editar texto")

Ruby

gem install qwen-image-edit
require 'qwen/image_edit'

editor = Qwen::ImageEdit.new('sua-chave-api')
resultado = editor.edit_text(
  imagem: './imagem.jpg',
  prompt: 'Editar texto'
)

Recursos Adicionais

📚 Documentação Relacionada

🛠️ Ferramentas

💬 Suporte


Precisa de ajuda? Consulte nossos exemplos práticos ou entre em contato com o suporte.