HiAPI
Blog

Tutorial

Optimización de costes de la API de Seedream: cómo reducir el coste de generación de imágenes en hiapi

Oct 8, 2026
Optimización de costes de la API de Seedream: cómo reducir el coste de generación de imágenes en hiapi

Seedream está disponible en hiapi en cuatro niveles distintos —seedream-5.0-flash, seedream-5.0-lite, seedream-5.0-pro y la versión heredada seedream-4.5— y cada nivel se factura de forma diferente. Si eliges el nivel equivocado o la resolución equivocada, puedes acabar pagando entre 2 y 4 veces más por imagen sin ninguna mejora visible de calidad. Esta guía muestra la estructura de precios real de cada nivel y ofrece un ejemplo de código funcional para invocar el modelo de menor coste que cumpla tus requisitos.

Qué vas a construir y requisitos previos

Vas a construir un pequeño cliente en Python que crea tareas de imagen de Seedream a través de la API unificada de tareas de hiapi, espera los resultados y elige de forma deliberada la combinación de resolución/modelo, en lugar de copiar los valores predeterminados de un tutorial. Primero, obtén una clave de API desde tu consola de hiapi—cada una de las solicitudes siguientes la envía como Authorization: Bearer sk-....

La estructura de precios que vas a optimizar

Precios actuales por imagen (verifica siempre la página de precios en tiempo real antes de lanzar, ya que las tarifas cambian):

  • seedream-5.0-flash — $0.025/imagen fijo, con el mismo precio para texto a imagen e imagen a imagen. El nivel más barato de la plataforma; ideal para borradores, miniaturas y cualquier escenario en el que vayas a regenerar varias veces antes de elegir el resultado final.
  • seedream-5.0-lite — $0.035/imagen fijo y, algo clave, el precio es el mismo tanto si renderizas en 2K como en 4K. En este nivel nunca hay motivo, desde el punto de vista del coste, para solicitar 2K: 4K es una mejora gratuita.
  • seedream-4.5 (heredado) — $0.045/imagen fijo en ambos endpoints.
  • seedream-5.0-pro — se factura por niveles de resolución, no de forma fija: texto a imagen cuesta $0.05 en 1K y $0.10 en 2K; imagen a imagen cuesta $0.06 en 1K y $0.10 en 2K. En este nivel la resolución es donde realmente se va tu presupuesto: un borrador en 1K cuesta aproximadamente la mitad que un render final en 2K.

Esta asimetría es el núcleo de toda la optimización: lite premia solicitar mayor resolución (gratis), pro penaliza la mayor resolución (el coste se duplica aproximadamente). Trátalos de forma diferente en el código de invocación, en lugar de codificar la misma resolución en todas partes.

Ejemplo mínimo funcional

Cada llamada a Seedream pasa por el mismo endpoint de tareas asíncronas: se crea con POST /v1/tasks y luego se consulta con GET /v1/tasks/{taskId} o se recibe mediante un callback de webhook. Los ID de modelo son simples, sin prefijo models/ ni prefijo de proveedor.

import os
import time
import requests

API_KEY = os.environ["HIAPI_API_KEY"]  # starts with sk-
BASE_URL = "https://api.hiapi.ai/v1"
HEADERS = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}


def create_task(model: str, input_payload: dict) -> str:
    resp = requests.post(f"{BASE_URL}/tasks", headers=HEADERS,
                          json={"model": model, "input": input_payload}, timeout=30)
    resp.raise_for_status()
    return resp.json()["data"]["taskId"]


def wait_task(task_id: str, interval: float = 3.0, timeout: float = 180.0) -> dict:
    deadline = time.time() + timeout
    while time.time() < deadline:
        resp = requests.get(f"{BASE_URL}/tasks/{task_id}", headers=HEADERS, timeout=30)
        resp.raise_for_status()
        data = resp.json()["data"]
        if data["status"] == "success":
            return data
        if data["status"] == "fail":
            raise RuntimeError(data["error"])
        time.sleep(interval)
    raise TimeoutError(f"task {task_id} did not finish within {timeout}s")


# seedream-5.0-lite: 4K costs the same $0.035 as 2K, so always ask for 4K here.
task_id = create_task(
    "seedream-5.0-lite/text-to-image",
    {"prompt": "a minimalist product photo of a ceramic mug on a wooden table", "resolution": "4K"},
)
result = wait_task(task_id)
image_url = result["output"][0]["url"]
print(image_url)

En seedream-5.0-lite, resolution solo acepta 2K o 4K (no hay 1K). seedream-5.0-pro acepta 1K/2K y además requiere aspect_ratio (con valores 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9) —el esquema de entrada de cada nivel de Seedream es ligeramente distinto, así que no asumas que los campos aceptados por un modelo se trasladan a otro.

Patrón de nivel de producción

Elige el nivel de forma programática, no por costumbre. Mantén una pequeña tabla de costes junto al punto de invocación y enruta según las necesidades de presupuesto/calidad, en lugar de codificar el mismo modelo en todas partes: trata los números como una caché de la página de precios, no como la fuente de la verdad:

SEEDREAM_COST_USD = {
    ("seedream-5.0-flash", None): 0.025,
    ("seedream-5.0-lite", "2K"): 0.035,
    ("seedream-5.0-lite", "4K"): 0.035,   # same price — always prefer 4K
    ("seedream-5.0-pro", "1K"): 0.05,      # text-to-image; i2i 1K is $0.06
    ("seedream-5.0-pro", "2K"): 0.10,
}

def pick_model_for_draft_vs_final(is_final: bool) -> tuple[str, dict]:
    if not is_final:
        return "seedream-5.0-flash", {}  # $0.025, iterate freely
    return "seedream-5.0-pro", {"resolution": "2K"}  # $0.10, one shot at the end

Prefiere callbacks en lugar de sondeo ajustado. En pipelines de alto rendimiento, no llames a wait_task en bucle cada pocos segundos; en su lugar, incluye callback en la solicitud de creación:

task_id_resp = requests.post(
    f"{BASE_URL}/tasks", headers=HEADERS,
    json={
        "model": "seedream-5.0-lite/text-to-image",
        "input": {"prompt": "...", "resolution": "4K"},
        "callback": {"url": "https://yourapp.example.com/webhooks/hiapi", "when": "final"},
    },
    timeout=30,
)

Cuando la tarea alcanza un estado terminal (success o fail), tu manejador de webhook recibe una única solicitud POST, en lugar de hacer que tu worker consuma solicitudes en un bucle de sondeo. Si no puedes exponer un endpoint HTTPS público (desarrollo local, herramientas internas), el sondeo sigue siendo la opción más sencilla; cuando pases a producción real, cambia a callbacks.

Deduplica antes de crear la tarea, no después. La API de tareas factura en el momento de la creación, por lo que las solicitudes reintentadas (tiempos de espera agotados, caídas de workers, redespliegues de consumidores de cola) que reenvíen el mismo trabajo se facturarán dos veces. Antes de llamar a create_task, comprueba en tu propio almacenamiento si ya existe una tarea con clave (model, input_hash) y, si esa tarea ya está en ejecución o ha tenido éxito, omite la creación: el endpoint de tareas de hiapi no tiene deduplicación integrada, así que esto debe estar en tu código.

Gestiona explícitamente los fallos de autenticación. Una clave inválida o revocada devuelve HTTP 401 con un cuerpo de respuesta estructurado, no una página de error genérica:

{"error": {"code": "permission_denied", "type": "hiapi_error", "request_id": "..."}}

Comprueba específicamente error.code == "permission_denied" para que una clave incorrecta falle rápido en lugar de reintentar hasta agotar el tiempo de espera.

Recursos relacionados de hiapi

Preguntas frecuentes

¿Qué modelo de Seedream es más barato para borradores rápidos o iconos? seedream-5.0-flash, $0.025/imagen fijo: el nivel más barato de la plataforma, con el mismo precio para texto a imagen e imagen a imagen.

¿Solicitar 4K en lugar de 2K en Seedream 5.0 Lite cuesta más? No. seedream-5.0-lite cuesta $0.035/imagen fijo, independientemente de si resolution es 2K o 4K, así que en este nivel solicita 4K por defecto.

¿Cuánto cuesta Seedream 5.0 Pro por imagen? Se factura por niveles de resolución: texto a imagen cuesta $0.05 en 1K y $0.10 en 2K; imagen a imagen cuesta $0.06 en 1K y $0.10 en 2K. A diferencia de lite, aquí la resolución sí cambia tu factura.

Si mi trabajo se reintenta, ¿cómo evito que me cobren dos veces? La API de tareas no tiene claves de idempotencia del lado del servidor, así que deduplica en el cliente: antes de llamar a create_task, guarda una clave para (model, input_hash) y, si esa clave ya está en ejecución o ha tenido éxito, omite la creación.

¿Debo usar sondeo o callbacks de webhook? Si no puedes exponer un endpoint HTTPS público (desarrollo local, scripts), haz sondeo con GET /v1/tasks/{taskId}. Cuando pases a producción real, cambia a callback.url + when: "final": sustituye el bucle de sondeo por una notificación push por tarea.

¿Qué devuelve una clave de API inválida? HTTP 401 y {"error": {"code": "permission_denied", "type": "hiapi_error", "request_id": "..."}}. Comprueba explícitamente ese código de error en lugar de reintentar con una clave incorrecta hasta agotar el tiempo de espera.

¿Puedo usar estos precios sin una clave de API primero? No: cada llamada a /v1/tasks requiere una cabecera válida Authorization: Bearer sk-... con una clave real creada en tu consola; no hay ninguna vía sin clave ni prueba sin registro para la generación en producción.

Artículos relacionados

Ver todos los artículos →

Empieza a crear con artefactos de IA persistentes

Consigue tu API key y llama a modelos de imagen, vídeo y audio a través de una única API basada en tasks.

Leer la documentación de la API