Saltar al contenido

GPT Image

Genere y edite imágenes con GPT Image: parámetros, respuestas y advertencias.

ElementoValor
Base URLhttps://api.hop-base.com/v1
Generar imágenesPOST /v1/images/generations
Editar imágenesPOST /v1/images/edits
Consultar tareas asíncronasGET /v1/images/tasks?task_id=…
Grupo de la claveGPT Image (todos los modelos)

Por defecto la respuesta es síncrona y trae imágenes en Base64; añada Prefer: respond-async para usar una tarea asíncrona. Las claves de grupos de chat reciben 404 con gpt-image-*.

Modelos disponibles

ModeloID de modeloNiveles de qualityPrecio oficial
GPT Image 2.5 Flaregpt-image-2.5-flarelow / medium / high / xhigh / max$5 / $30/ 1M tokens
GPT Image 2.5 Sunburstgpt-image-2.5-sunburstlow / medium / high / xhigh / max$5 / $30/ 1M tokens
GPT Image 2gpt-image-2low / medium / high$5 / $30/ 1M tokens

Cómo elegir: Flare es la opción diaria; Sunburst ofrece mayor fidelidad y es algo más lento que Flare con la misma configuración; gpt-image-2 es de uso general y su ID es gpt-image-2, no gpt-image-2.0. Tiempos de referencia para una imagen de 1024x1024: unos 14 segundos en low con cualquiera de los dos modelos 2.5; en high, Flare tarda unos 19 segundos y Sunburst unos 37.

Parámetros de la solicitud

Generar

POST /v1/images/generations con cuerpo JSON.

ParámetroObligatorioTipo y límitesPredeterminadoNotas
modelObligatoriostring—Uno de los tres ID de arriba
promptObligatoriostring, ≤ 32.000 caracteres—No puede quedar vacío tras quitar espacios
sizeOpcionalauto o WIDTHxHEIGHT—Reglas bajo la tabla
qualityOpcionalauto / low / medium / high—2.5 añade xhigh / max
nOpcionalinteger, 1–101Algunos grupos solo aceptan 1
backgroundOpcionalauto / opaque / transparent—Transparente requiere png / webp
output_formatOpcionalpng / jpeg / webppngFormato de la imagen decodificada
output_compressionOpcionalinteger, 0–100100Solo jpeg / webp
moderationOpcionalauto / low—No desactiva los controles de seguridad
userOpcionalstring—Identificador del usuario final
streamOpcionalbooleanfalsetrue cambia a Images SSE
response_formatOpcionalstring—Omítalo
input_fidelityOpcionallow / high—Campo de compatibilidad; omítalo

En size, WIDTHxHEIGHT debe usar múltiplos de 16, cada lado ≤ 3840, relación de aspecto ≤ 3:1 y total de píxeles 655.360–8.294.400. No se aceptan las abreviaturas 1K / 2K / 4K; un size no válido devuelve 400 antes de generar y no se cobra.

Los niveles de quality más altos generan más tokens de salida y cuestan más. response_format siempre devuelve b64_json; user no es un ID de cuenta de HopBase ni cambia a quién se factura.

Editar

POST /v1/images/edits acepta todos los parámetros anteriores, más referencias y máscara. Prefiera multipart/form-data para archivos locales; también acepta JSON con URL / Data URL.

ParámetroObligatorioTipo y límitesPredeterminadoNotas
imageObligatorio1–16 imágenes—Multipart: image o image[] repetido
maskOpcionalPNG con canal alfa—Los píxeles transparentes marcan la zona a editar

En JSON, image puede ser una cadena URL / Data URL, un array de cadenas u objetos {"url": …}. No se lee images, y no se acepta base64 sin prefijo ni file_id.

Una URL remota debe ser ≤ 25 MiB, con Content-Type image/* y sin apuntar a una dirección interna; puede comprimirse a 4 MiB antes de reenviarse. El cuerpo completo tiene un límite de 60 MB; si lo supera, devuelve 413.

Asíncrono

Añada la cabecera HTTP Prefer: respond-async a una solicitud de generación o edición; el cuerpo no cambia. Es una cabecera, no un parámetro JSON.

Las tareas asíncronas conservan solo model, prompt, n, size, quality, background, output_format, input_fidelity y las imágenes / máscara de edición; el resto se descarta.

Respuesta

Síncrona

CampoTipoNotas
createdintegerSegundos Unix
data[].b64_jsonstringImagen en Base64; decodifíquela y guárdela según output_format
usage.input_tokensintegerTokens de entrada (puede devolverse)
usage.output_tokensintegerTokens de salida (puede devolverse)
usage.total_tokensintegerTotal (puede devolverse)
errorobjectSi falla: message, type, code
{
  "created": 1760000000,
  "data": [
    {
      "b64_json": "iVBORw0KGgoAAA..."
    }
  ],
  "usage": {
    "input_tokens": 42,
    "output_tokens": 1760,
    "total_tokens": 1802
  }
}
Generaciones de más de 40 segundos: el estado sigue siendo 200 - revise el campo error.

Pasados unos 40 segundos, el servidor devuelve HTTP 200 y sigue escribiendo espacios en blanco al inicio del cuerpo para mantener la conexión; el JSON completo llega después. Desde entonces el estado sigue siendo 200 aunque la generación falle, así que busque error en el cuerpo y configure el tiempo de lectura en al menos 300 segundos.

Streaming (stream: true)

La respuesta pasa a Images SSE: mientras espera, el flujo envía líneas de comentario de keepalive que empiezan por dos puntos, y el último evento data: contiene el JSON completo de Images, seguido de [DONE]. No son los eventos progresivos nativos de OpenAI.

: hopbase-keepalive

data: {"created":1760000000,"data":[{"b64_json":"iVBORw0KGgoAAA..."}]}

data: [DONE]

Tareas asíncronas

Al enviar, la respuesta llega de inmediato con 202 Accepted; la cabecera Location apunta a la misma URL de consulta:

{
  "object": "image.task",
  "task_id": "su-task-id",
  "status": "pending",
  "status_url": "/v1/images/tasks?task_id=su-task-id"
}

Consulte solo con GET /v1/images/tasks?task_id=…; no se admite poner el ID de la tarea en la ruta. pending, processing y retrying indican que sigue en curso; completed y failed son finales.

CampoTipoNotas
task_idstringID de la tarea
statusstringEstado de la tarea
result_contentstringAl completarse: Markdown, una línea por imagen
errorstringSolo si failed: motivo en inglés, sin código
usage.costnumberImporte realmente descontado por esta tarea
usage.currencystringMoneda contable, actualmente CNY
usage.cost_cnynumberImporte en CNY, para conciliar
usage.cost_usdnumberImporte en USD, para conciliar
{
  "task_id": "su-task-id",
  "status": "completed",
  "result_content": "![image](/assets-runtime/2026/09/xxxxxxxxxxxx.png)",
  "usage": {
    "cost": 1.36,
    "currency": "CNY",
    "cost_cny": 1.36,
    "cost_usd": 0.2
  }
}

result_content contiene rutas relativas; anteponga https://api.hop-base.com para descargar. usage aparece cuando la tarea está completed o failed, y solo la ve la clave que creó la tarea.

Ejemplos

Generar

curl https://api.hop-base.com/v1/images/generations \
  -H "Authorization: Bearer sk-su-clave" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2.5-flare",
    "prompt": "Un shiba inu bajo un cerezo en flor, acuarela japonesa",
    "size": "1024x1024",
    "quality": "medium",
    "output_format": "png"
  }' \
  | jq -r '.data[0].b64_json' | base64 --decode > result.png

El ejemplo de curl necesita tener jq instalado.

Editar (varias referencias + máscara)

curl https://api.hop-base.com/v1/images/edits \
  -H "Authorization: Bearer sk-su-clave" \
  -F "model=gpt-image-2.5-flare" \
  -F "prompt=Pon un jarrón en la zona enmascarada, al estilo de la 2.ª imagen" \
  -F "image[][email protected]" \
  -F "image[][email protected]" \
  -F "[email protected]" \
  -F "size=1024x1024" \
  -F "quality=high" \
  -F "output_format=png"

En JSON, sustituya los archivos por URL: "image": ["https://example.com/scene.png", "https://example.com/style.png"] y "mask": "https://example.com/mask.png".

Asíncrono

# 1. Enviar y recibir 202 + task_id
curl -i https://api.hop-base.com/v1/images/generations \
  -H "Authorization: Bearer sk-su-clave" \
  -H "Content-Type: application/json" \
  -H "Prefer: respond-async" \
  -d '{
    "model": "gpt-image-2",
    "prompt": "Una ciudad futurista de noche, estilo cinematográfico",
    "size": "2048x2048"
  }'

# 2. Consultar con el task_id de la primera respuesta
curl "https://api.hop-base.com/v1/images/tasks?task_id=su-task-id" \
  -H "Authorization: Bearer sk-su-clave"

Advertencias

  • Para imágenes 2K / 4K, prefiera el modo asíncrono y así evitar que la CDN corte solicitudes largas.
  • Configure el tiempo de lectura del cliente para solicitudes síncronas en al menos 300 segundos.
  • size solo acepta auto o WIDTHxHEIGHT; las abreviaturas de nivel devuelven 400.
  • xhigh / max solo existen en los dos modelos 2.5.
  • background: "transparent" requiere png o webp; la transparencia en gpt-image-2 es una función en vista previa.
  • No se admite el campo oficial de streaming partial_images (0–3); omítalo.
  • Con los SDK oficiales, mantenga stream en su valor predeterminado false.
  • El gateway redimensiona la máscara al tamaño de la primera referencia y no garantiza conservar píxel a píxel el resto.
  • La URL de result_content se abre sin clave, así que no la comparta públicamente y descárguela pronto a su propio almacenamiento.

Errores frecuentes

Los parámetros no válidos devuelven 400 antes de generar y no se cobran. Un rechazo de seguridad de contenido también devuelve 400 sin cargo, con error.code igual a safety_rejected.

ErrorQué hacer
size must be WIDTHxHEIGHT or auto y otros errores de sizeAjuste el valor según las reglas de size
prompt must not be emptyEnvíe un prompt no vacío
n must be 1 for this model in the current groupDivida en solicitudes separadas
/v1/images/edits requires at least one imagePonga las referencias en image, no en images
image download returned HTTP 404Use una URL pública que el servidor pueda descargar
Your request was rejected by the safety system.Reformule el prompt o cambie la referencia
Request body exceeds the size limit (60 MB) (413)Comprima las imágenes o envíe URL
HTTP 200 con error en el cuerpoFalló tras iniciarse el keepalive; revise error.message

Facturación

Se factura por token; un quality más alto genera más tokens de salida. Medido a 1024x1024: unos 200 en low, 1.760 en high, 3.120 en xhigh y 7.020 en max. En tareas asíncronas, el cargo real es usage.cost en la consulta (cost_cny / cost_usd con un cambio fijo de 1 USD = 6,8 CNY), y una tarea fallida suele mostrar 0.

Los precios están en las fichas de modelo de arriba y en el catálogo de modelos tras iniciar sesión.

Próximos pasos