Tutorial
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 en2Kcomo en4K. En este nivel nunca hay motivo, desde el punto de vista del coste, para solicitar2K:4Kes 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 en1Ky $0.10 en2K; imagen a imagen cuesta $0.06 en1Ky $0.10 en2K. En este nivel la resolución es donde realmente se va tu presupuesto: un borrador en1Kcuesta aproximadamente la mitad que un render final en2K.
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
- Precios — tarifas actuales de cada modelo; considera cualquier cifra de este artículo como una instantánea, no una garantía.
- Consola de claves de API — crea y rota claves.
- Páginas de modelo Seedream 5.0 Lite — texto a imagen e imagen a imagen.
- Páginas de modelo Seedream 5.0 Pro — texto a imagen e imagen a imagen.
- Página de modelo Seedream 5.0 Flash.
- Referencia de la API de tareas asíncronas — contrato completo de creación/consulta/callback.
- Documentación de autenticación — formato de claves y requisitos de cabeceras.
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 →-
Tutorial
Cómo llamar a hailuo-2.3-fast/image-to-video a través de la API de HiAPI: práctica con curl y Python
La primera solicitud ejecutable del nivel rápido y de bajo coste de imagen a vídeo: del ID del modelo a la descarga del MP4
-
Tutorial
Cómo llamar a hailuo-2.3/text-to-video mediante la API de HiAPI: curl, Python y ejemplos de solicitud ejecutables
-
Tutorial
Uso de Kandinsky 6.0 Pro texto a video en HiAPI: tutorial con curl y Python
Demostración práctica centrada en la solicitud: construir la llamada de prompt a clip de video, enviar la solicitud, sondear el estado de finalización y descargar el resultado