Ir al contenido principal

Solución de API de edición

Edita la imagen que tienes, no una que el modelo se inventa.

Los endpoints de edición toman al menos dos entradas: la imagen y la instrucción. Es en la imagen —URL pública, subida confirmada o data URI incrustada— donde se atascan la mayoría de las integraciones.

El reto

Lo difícil es hacer entrar la referencia

La indicación es la mitad fácil. La otra es un archivo en el teléfono de tus usuarios, que debe llegar al modelo sin exponer un bucket privado y cumplir límites que se comprueban antes de que exista la tarea.

01

Hay tres caminos y fallan de formas distintas

Un campo de imagen declarado acepta una URL HTTPS pública, una URI de archivo spicy:// confirmada o una data URI incrustada. En línea: 1 MiB decodificado y 8.388.608 píxeles por imagen, dentro de un cuerpo de 2 MiB. Por encima hace falta un tique de subida.

02

Las URL HTTPS firmadas funcionan si el archivo es accesible

Un enlace firmado puede apuntar a un bucket privado si nuestros servidores descargan el archivo sin cookies ni otro inicio de sesión. Debe seguir válido durante el procesamiento. Se rechazan IP privadas, loopback y credenciales user:password en la URL.

03

Editar no es generar

El nombre público de llamada termina en /edit, el esquema suele exigir image_url o image_urls y algunos endpoints añaden mask_url o strength. Un valor model de text-to-image dentro de un flujo de edición falla la validación en lugar de degradarse.

El enfoque

Sube una vez, confirma y luego referencia la URI del archivo

Para archivos de usuario pide un tique, envía por PUT exactamente los bytes declarados con todas las cabeceras devueltas, confirma y pasa la URI spicy:// en el campo de imagen del modelo. La referencia pasa a ser de tu cuenta, se comprueba una vez y se reutiliza sin volver a subirla.

Tique, PUT, confirmación, creación. El material ya público se salta los tres primeros pasos.

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

Lo que conviene fijar desde el principio

API de edición de imágenes: con una referencia — Lo que conviene fijar desde el principio
Campo o cabeceraValor o límite
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

Desliza horizontalmente para ver todas las columnas.

Integración

De la primera llamada a producción

  1. 01POST /api/v1/common/upload-url con contentType y el número exacto de bytes; imágenes de hasta 10 MiB en JPEG, PNG, WebP o GIF.
  2. 02Envía los bytes por PUT a la URL firmada repitiendo todas las cabeceras del tique y llama a POST /api/v1/files/{fileId}/commit.
  3. 03Llama a createTask con el valor model de edición y la URI spicy:// en image_url o image_urls.
  4. 04Lee output.assets desde la devolución o recordInfo y guarda tú mismo el archivo editado.

Encaje

Cuándo este camino es el adecuado

Elígelo si

  • Tu producto parte de fotos de usuario: retoque, cambio de fondo, cambio de estilo, borrado de objetos.
  • La misma referencia se usa en varias tareas y no debería subirse de nuevo cada vez.

Busca otra vía si

  • No hay imagen de origen. Text-to-image es más barato y más simple.
  • Necesitas edición de vídeo fotograma a fotograma. Estos endpoints devuelven imágenes fijas.

Comprobaciones

Lo que puedes verificar tú mismo

Las subidas quedan ligadas a la cuenta y se comprueban al confirmar

La confirmación compara bytes y tipo de medio con el tique, verifica la firma de la imagen y calcula un SHA-256. Solo entonces el archivo puede referenciarse.

Las imágenes en línea no vuelven en el registro

Las data URI se guardan como archivos ligados a la cuenta. La entrada normalizada que devuelve recordInfo contiene URI de archivo, nunca los bytes Base64 originales.

El material y los resultados tienen relojes distintos

El material subido se conserva un día; los resultados generados, 14 días. Ambos plazos están publicados y no se negocian por cuenta.

Antes del lanzamiento

Comportamientos de la plataforma que conviene confirmar

  • Decide quién confirma los derechos sobre la imagen de origen; la plataforma no la revisa por ti.
  • Valida tipo y tamaño en el cliente antes de pedir un tique: un 413 sale más barato evitado que gestionado.
  • Conserva las URI spicy:// en tus registros si vas a reeditar la misma fuente.
  • Trata invalid_asset como un error para el usuario, no como una caída del servicio.

Preguntas frecuentes

Lo que más se pregunta en esta página

Cualquiera de las dos. Una URL HTTPS de medios accesible públicamente entra directamente en el campo de imagen. Los tiques existen para archivos no públicos y para todo lo que supere los límites en línea.