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ão | Endpoint | Localização |
---|---|---|
us-east-1 | https://api-us-east.qwen.com | Estados Unidos (Leste) |
us-west-1 | https://api-us-west.qwen.com | Estados Unidos (Oeste) |
eu-west-1 | https://api-eu-west.qwen.com | Europa (Irlanda) |
ap-southeast-1 | https://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âmetro | Tipo | Obrigatório | Descrição |
---|---|---|---|
imagem | string | Buffer | File | ✅ | Caminho, URL, buffer ou objeto File da imagem |
prompt | string | ✅ | Descrição da edição desejada |
posicao | object | ❌ | Posição para novo texto |
cor | string | ❌ | Cor do texto (hex, rgb, nome) |
tamanho | string | number | ❌ | Tamanho do texto |
fonte | string | ❌ | Família da fonte |
preservarEstilo | boolean | ❌ | Manter estilo do texto original |
opacidade | number | ❌ | Opacidade (0-1) |
contorno | string | ❌ | Cor do contorno |
sombra | boolean | object | ❌ | Configuraçã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âmetro | Tipo | Obrigatório | Descrição |
---|---|---|---|
imagem | string | Buffer | File | ✅ | Imagem de entrada |
prompt | string | ✅ | Descrição da edição |
acao | string | ✅ | 'adicionar', 'remover', 'modificar' |
posicao | object | ❌ | Posição para novos elementos |
estilo | string | ❌ | Estilo do elemento |
fusao | string | ❌ | Tipo de fusão |
intensidade | number | ❌ | Intensidade da modificação (0-1) |
opacidade | number | ❌ | Opacidade 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âmetro | Tipo | Obrigatório | Descrição |
---|---|---|---|
imagem | string | Buffer | File | ✅ | Imagem de entrada |
estilo | string | ✅ | Descrição do estilo ou estilo predefinido |
intensidade | number | ❌ | Intensidade do estilo (0-1) |
preservarDetalhes | boolean | ❌ | Preservar detalhes da imagem |
paleta | array | ❌ | Paleta de cores personalizada |
contraste | number | ❌ | Ajuste de contraste |
saturacao | number | ❌ | Ajuste de saturação |
brilho | number | ❌ | Ajuste 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âmetro | Tipo | Obrigatório | Descrição |
---|---|---|---|
imagem | string | Buffer | File | ✅ | Imagem para análise |
detectar | array | ✅ | Tipos de detecção |
idioma | string | ❌ | Idioma para OCR |
confianca | number | ❌ | Ní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âmetro | Tipo | Obrigatório | Descrição |
---|---|---|---|
imagem | string | Buffer | File | ✅ | Imagem de entrada |
dimensoes | object | ✅ | Novas dimensões |
manterAspecto | boolean | ❌ | Manter proporção |
qualidade | number | ❌ | Qualidade de saída (0-1) |
formato | string | ❌ | Formato 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âmetro | Tipo | Obrigatório | Descrição |
---|---|---|---|
imagem | string | Buffer | File | ✅ | Imagem de entrada |
melhorias | array | ✅ | Tipos de melhoria |
intensidade | number | ❌ | Intensidade 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âmetro | Tipo | Obrigatório | Descrição |
---|---|---|---|
imagem | string | Buffer | File | ✅ | Imagem de entrada |
operacoes | array | ✅ | Operaçõ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ódigo | Descrição | Solução |
---|---|---|
AUTH_INVALID | Chave API inválida | Verificar chave API |
AUTH_EXPIRED | Chave API expirada | Renovar chave API |
QUOTA_EXCEEDED | Cota excedida | Aguardar reset ou upgrade |
RATE_LIMITED | Rate limit atingido | Aguardar ou reduzir frequência |
IMAGE_TOO_LARGE | Imagem muito grande | Redimensionar imagem |
IMAGE_FORMAT_UNSUPPORTED | Formato não suportado | Converter para formato suportado |
PROMPT_INVALID | Prompt inválido | Revisar prompt |
PROCESSING_FAILED | Falha no processamento | Tentar novamente |
NETWORK_ERROR | Erro de rede | Verificar conexão |
TIMEOUT | Timeout | Aumentar 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
Plano | Requisições/mês | Tamanho máximo | Concurrent requests |
---|---|---|---|
Gratuito | 100 | 5MB | 1 |
Básico | 1.000 | 10MB | 3 |
Pro | 10.000 | 25MB | 10 |
Enterprise | Ilimitado | 100MB | 50 |
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
- Início Rápido - Configure em minutos
- Exemplos - Casos de uso práticos
- Configuração - Configurações avançadas
- Solução de Problemas - Resolva problemas
- Funcionalidades Avançadas - Recursos avançados
🛠️ Ferramentas
- Playground: playground.qwen.com
- Postman Collection: Download
- OpenAPI Spec: Download
💬 Suporte
- Documentação: docs.qwen.com
- Discord: discord.gg/qwen
- Email: support@qwen.com
- Status: status.qwen.com
Precisa de ajuda? Consulte nossos exemplos práticos ou entre em contato com o suporte.