HiAPI
Blogue

Tutorial

Otimização de custos da API Seedream: como reduzir o custo de geração de imagens no hiapi

Oct 8, 2026
Otimização de custos da API Seedream: como reduzir o custo de geração de imagens no hiapi

O Seedream é oferecido no hiapi em quatro níveis distintos — seedream-5.0-flash, seedream-5.0-lite, seedream-5.0-pro e o mais antigo seedream-4.5 — e cada nível é cobrado de forma diferente. Escolher o nível errado ou a resolução errada pode fazer você pagar de 2 a 4 vezes mais por imagem sem qualquer ganho visível de qualidade. Este guia mostra a estrutura real de preços de cada nível e apresenta um modelo de código executável para chamar o modelo de menor custo que atende aos seus requisitos.

O que você vai construir e pré-requisitos

Você vai construir um pequeno cliente Python que cria tarefas de imagem do Seedream por meio da API de tarefas unificada do hiapi, aguarda o resultado e escolhe conscientemente a combinação de resolução/modelo, em vez de copiar e colar os valores padrão dos tutoriais. Primeiro, obtenha uma chave de API no seu console do hiapi — cada requisição abaixo a envia no formato Authorization: Bearer sk-....

A estrutura de preços que você vai otimizar

Preço atual por imagem (verifique sempre a página de preços em tempo real antes de entrar em produção, pois as tarifas mudam):

  • seedream-5.0-flash — US$ 0,025 fixo por imagem, com o mesmo preço para texto-para-imagem e imagem-para-imagem. O nível mais barato da plataforma; ideal para rascunhos, miniaturas e qualquer cenário em que você regenere várias vezes antes de escolher o resultado final.
  • seedream-5.0-lite — US$ 0,035 fixo por imagem e, crucialmente, o preço é o mesmo independentemente de você renderizar em 2K ou 4K. Neste nível, nunca há motivo do ponto de vista de custo para solicitar 2K — 4K é um upgrade gratuito.
  • seedream-4.5 (legado) — US$ 0,045 fixo por imagem em ambos os endpoints.
  • seedream-5.0-pro — cobrado por faixa de resolução, não de forma fixa: texto-para-imagem custa US$ 0,05 em 1K e US$ 0,10 em 2K; imagem-para-imagem custa US$ 0,06 em 1K e US$ 0,10 em 2K. Neste nível, a resolução é para onde seu orçamento realmente vai — um rascunho em 1K custa cerca de metade de uma renderização final em 2K.

Essa assimetria é o cerne de toda a otimização: o lite recompensa solicitar resolução mais alta (gratuitamente), enquanto o pro penaliza a resolução mais alta (o custo praticamente dobra). Trate-os de forma diferente no código de chamada, em vez de codificar a mesma resolução fixa em todos os lugares.

Exemplo mínimo executável

Toda chamada ao Seedream passa pelo mesmo endpoint assíncrono de tarefas: crie com POST /v1/tasks e depois consulte GET /v1/tasks/{taskId} ou receba um callback via webhook. Os IDs de modelo são simples — sem prefixo models/ ou de fornecedor.

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)

O resolution em seedream-5.0-lite aceita apenas 2K ou 4K (não há 1K). Já seedream-5.0-pro aceita 1K/2K e exige adicionalmente aspect_ratio (com valores 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9) — o esquema de entrada de cada nível do Seedream é ligeiramente diferente, então não presuma que os campos aceitos por um modelo valem para outro.

Modelo de nível de produção

Escolha o nível programaticamente, não por hábito. Mantenha uma pequena tabela de custos junto ao ponto de chamada, faça o roteamento com base na necessidade de orçamento/qualidade, em vez de codificar o mesmo modelo fixo em todos os lugares — trate os números como um cache da página de preços, não como fonte da verdade:

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

Prefira callbacks em vez de polling apertado. Em pipelines de alta vazão, não chame wait_task em loop a cada poucos segundos; em vez disso, inclua callback na requisição de criação:

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,
)

Quando a tarefa atinge um estado terminal (success ou fail), seu handler de webhook recebe um único POST, em vez de deixar seu worker consumir requisições em um loop de polling. Se você não consegue expor um endpoint HTTPS público (desenvolvimento local, ferramentas internas), o polling continua sendo a opção mais simples — assim que estiver rodando em escala real, migre para callbacks.

Deduplique antes de criar a tarefa, não depois. A API de tarefas cobra no momento da criação, então requisições repetidas (timeout, queda do worker, reimplantação do consumidor de fila) que reenviam o mesmo job são cobradas duas vezes. Antes de chamar create_task, verifique no seu próprio armazenamento se já existe uma tarefa com chave (model, input_hash); se essa tarefa estiver em execução ou já tiver sido concluída com sucesso, pule a criação — o endpoint de tarefas do hiapi não tem deduplicação embutida, então isso precisa ficar no seu código.

Trate falhas de autenticação explicitamente. Uma chave inválida ou revogada retorna HTTP 401 com um corpo de resposta estruturado, não uma página de erro genérica:

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

Verifique especificamente error.code == "permission_denied", para que uma chave ruim falhe rapidamente em vez de repetir até o timeout.

Recursos relacionados do hiapi

Perguntas frequentes

Qual modelo Seedream é mais barato para rascunhos rápidos ou ícones? seedream-5.0-flash, US$ 0,025 fixo por imagem — o nível mais barato da plataforma, com o mesmo preço para texto-para-imagem e imagem-para-imagem.

Solicitar 4K em vez de 2K no Seedream 5.0 Lite é mais caro? Não. seedream-5.0-lite custa US$ 0,035 fixo por imagem, seja resolution 2K ou 4K, então neste nível solicite 4K por padrão.

Quanto custa o Seedream 5.0 Pro por imagem? Cobrado por faixa de resolução: texto-para-imagem custa US$ 0,05 em 1K e US$ 0,10 em 2K; imagem-para-imagem custa US$ 0,06 em 1K e US$ 0,10 em 2K. Diferentemente do lite, aqui a resolução realmente altera sua conta.

Se meu job for repetido, como evitar ser cobrado duas vezes? A API de tarefas não tem chave de idempotência no servidor, então deduplique no cliente: antes de chamar create_task, armazene uma chave para (model, input_hash); se essa chave já estiver em execução ou tiver sido concluída com sucesso, pule a criação.

Devo usar polling ou callback via webhook? Se você não consegue expor um endpoint HTTPS público (desenvolvimento local, scripts), faça polling em GET /v1/tasks/{taskId}. Assim que estiver rodando em escala real, migre para callback.url + when: "final" — ele substitui o loop de polling por uma notificação push por tarefa.

O que uma chave de API inválida retorna? HTTP 401 e {"error": {"code": "permission_denied", "type": "hiapi_error", "request_id": "..."}}. Verifique explicitamente esse código de erro, em vez de repetir com uma chave ruim até o timeout.

Posso usar esses preços sem uma chave de API primeiro? Não — cada chamada a /v1/tasks exige um cabeçalho válido Authorization: Bearer sk-... de uma chave real criada no seu console; não há caminho sem chave ou teste sem cadastro para geração em produção.

Artigos relacionados

Ver todos os artigos →

Comece a criar com artefactos de IA persistentes

Obtenha a sua chave de API e chame modelos de imagem, vídeo e áudio através de uma única API baseada em tasks.

Ler a documentação da API