Pular para o conteúdo principal

Solução de API de edição

Edite a imagem que você tem, não uma que o modelo inventou.

Endpoints de edição recebem pelo menos duas entradas: a imagem e a instrução. É na imagem — URL pública, upload confirmado ou data URI embutida — que a maioria das integrações trava.

O desafio

A parte difícil é fazer a referência entrar

O prompt é a metade fácil. A outra é um arquivo no celular dos seus usuários, que precisa chegar ao modelo sem expor um bucket privado e caber em limites verificados antes de a tarefa existir.

01

São três caminhos, e cada um falha de um jeito

Um campo de imagem declarado aceita URL HTTPS pública, URI de arquivo spicy:// confirmada ou data URI embutida. Embutida: 1 MiB decodificado e 8.388.608 pixels por imagem, dentro de um corpo de 2 MiB. Acima disso, é preciso um tíquete de upload.

02

Signed HTTPS URLs can work if the file is reachable

A presigned link can reference a private bucket if the URL lets our servers download the file without cookies or a separate login. Keep it valid during processing. Private network addresses, loopback hosts and user:password URL credentials are rejected.

03

Editar não é gerar

O nome público da chamada termina em /edit, o esquema normalmente exige image_url ou image_urls e alguns endpoints acrescentam mask_url ou strength. Um valor model de text-to-image num fluxo de edição falha na validação em vez de degradar.

A abordagem

Suba uma vez, confirme e depois referencie a URI do arquivo

Para arquivos do usuário peça um tíquete, envie por PUT exatamente os bytes declarados com todos os cabeçalhos devolvidos, confirme e passe a URI spicy:// no campo de imagem do modelo. A referência passa a ser da sua conta, é verificada uma vez e pode ser reutilizada sem novo upload.

Tíquete, PUT, confirmação, criação. Mídia já pública pula os três primeiros passos.

Ticket → PUT → commit → create

POST /api/v1/common/upload-url
{ "contentType": "image/png", "bytes": 482113 }
→ { "fileId": "fil_01k3…", "uploadUrl": "https://…", "method": "PUT", "headers": { … } }

PUT <uploadUrl>            # exactly 482113 bytes, every returned header replayed
POST /api/v1/files/fil_01k3…/commit
→ { "status": "ready", "uri": "spicy://f/fil_01k3…", "sha256": "…" }

POST /api/v1/jobs/createTask

{
  "model": "<publisher>/<model>/edit",
  "input": {
    "prompt": "Replace the background with an overcast beach at dusk",
    "image_urls": ["spicy://f/fil_01k3m8x9q2z4v7n5p6r8s0t1w3"]
  }
}

Contrato

O que vale fixar logo de início

API de edição de imagens: com uma referência — O que vale fixar logo de início
Campo ou cabeçalhoValor ou limite
POST /api/v1/common/upload-urlJPEG · PNG · WebP · GIF ≤ 10 MiB
POST /api/v1/files/{fileId}/commitreturns spicy://f/fil_…
inline data URI≤ 1 MiB decoded · ≤ 8192 px per side
request body≤ 2 MiB · ≤ 16 images

Deslize horizontalmente para ver todas as colunas.

Integração

Da primeira chamada até produção

  1. 01POST /api/v1/common/upload-url com contentType e o número exato de bytes; imagens até 10 MiB em JPEG, PNG, WebP ou GIF.
  2. 02Envie os bytes por PUT para a URL assinada repetindo todos os cabeçalhos do tíquete e chame POST /api/v1/files/{fileId}/commit.
  3. 03Chame createTask com o valor model de edição e a URI spicy:// em image_url ou image_urls.
  4. 04Leia output.assets no retorno ou no recordInfo e guarde você mesmo o arquivo editado.

Adequação

Quando este caminho é o certo

Escolha se

  • Seu produto começa em fotos de usuário: retoque, troca de fundo, mudança de estilo, remoção de objetos.
  • A mesma referência é usada em várias tarefas e não deveria ser enviada de novo a cada vez.

Procure outro caminho se

  • Não há imagem de origem. Text-to-image é mais barato e mais simples.
  • Você precisa de edição de vídeo quadro a quadro. Estes endpoints devolvem imagens paradas.

Evidências

O que você mesmo pode verificar

Uploads ficam ligados à conta e são verificados na confirmação

A confirmação compara bytes e tipo de mídia com o tíquete, verifica a assinatura da imagem e calcula um SHA-256. Só então o arquivo pode ser referenciado.

Imagens embutidas não voltam no registro

Data URIs são guardadas como arquivos ligados à conta. A entrada normalizada que recordInfo devolve traz URIs de arquivo, nunca os bytes Base64 originais.

Material e resultados têm relógios diferentes

O material enviado fica um dia; os resultados gerados, 14 dias. Os dois prazos são publicados e não se negociam por conta.

Antes de lançar

Comportamentos da plataforma a confirmar

  • Defina quem confirma os direitos sobre a imagem de origem; a plataforma não examina isso por você.
  • Valide tipo e tamanho no cliente antes de pedir o tíquete — um 413 sai mais barato evitado do que tratado.
  • Guarde as URIs spicy:// nos seus registros se a mesma origem for editada de novo.
  • Trate invalid_asset como erro para o usuário, não como indisponibilidade.

Perguntas frequentes

O que mais perguntam nesta página

Qualquer um dos dois. Uma URL HTTPS de mídia publicamente acessível entra direto no campo de imagem. Os tíquetes existem para arquivos não públicos e para tudo que passe dos limites embutidos.