HiAPI
Blog

Tutoriale

Ottimizzazione dei costi dell'API Seedream: come ridurre i costi di generazione delle immagini su hiapi

Oct 8, 2026
Ottimizzazione dei costi dell'API Seedream: come ridurre i costi di generazione delle immagini su hiapi

Seedream è disponibile su hiapi in quattro livelli distinti — seedream-5.0-flash, seedream-5.0-lite, seedream-5.0-pro e il legacy seedream-4.5 — e ciascun livello ha un modello di fatturazione diverso. Scegliere il livello sbagliato o la risoluzione sbagliata può farti pagare da 2 a 4 volte di più per immagine senza alcun miglioramento visibile della qualità. Questa guida mostra la struttura tariffaria effettiva di ogni livello e fornisce un esempio di codice funzionante per chiamare il modello di costo minimo che soddisfa i tuoi requisiti.

Cosa costruirai e prerequisiti

Costruirai un piccolo client Python che crea un'attività immagine Seedream tramite l'API unificata delle attività di hiapi, attende il risultato e sceglie consapevolmente la combinazione risoluzione/modello invece di copiare i valori predefiniti incollati dai tutorial. Per prima cosa, ottieni una chiave API dalla tua console hiapi — ogni richiesta qui sotto la invia come Authorization: Bearer sk-....

La struttura tariffaria che devi ottimizzare

Prezzi attuali per immagine (verifica sempre la pagina dei prezzi in tempo reale prima di andare in produzione, poiché le tariffe cambiano):

  • seedream-5.0-flash — tariffa unica di $0.025/immagine, stesso prezzo per testo-immagine e immagine-immagine. Il livello più economico della piattaforma; ideale per bozze, miniature e qualsiasi scenario in cui rigenererai più volte prima di scegliere il risultato finale.
  • seedream-5.0-lite — tariffa unica di $0.035/immagine e, cosa fondamentale, il prezzo è lo stesso indipendentemente dal fatto che tu esegua il rendering in 2K o 4K. A questo livello non c'è mai motivo, dal punto di vista dei costi, di richiedere 2K — 4K è un upgrade gratuito.
  • seedream-4.5 (legacy) — tariffa unica di $0.045/immagine per entrambi gli endpoint.
  • seedream-5.0-pro — a fasce per risoluzione, non a tariffa unica: testo-immagine costa $0.05 in 1K e $0.10 in 2K; immagine-immagine costa $0.06 in 1K e $0.10 in 2K. A questo livello la risoluzione è dove va davvero il tuo budget — una bozza in 1K costa circa la metà di un rendering finale in 2K.

Questa asimmetria è l'intero punto dell'ottimizzazione: lite premia le richieste a risoluzione più alta (gratis), pro penalizza le risoluzioni più alte (costo quasi raddoppiato). Trattali in modo diverso nel codice di chiamata, invece di codificare ovunque la stessa risoluzione.

Esempio minimo funzionante

Ogni chiamata Seedream passa per lo stesso endpoint asincrono delle attività: crea con POST /v1/tasks, poi esegui il polling di GET /v1/tasks/{taskId} o ricevi un callback webhook. Gli ID dei modelli sono nudi — senza prefisso models/ o del fornitore.

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)

resolution su seedream-5.0-lite accetta solo 2K o 4K (non esiste 1K). seedream-5.0-pro invece accetta 1K/2K e richiede inoltre aspect_ratio (uno tra 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9) — lo schema di input di ogni livello Seedream è leggermente diverso, quindi non dare per scontato che i campi accettati da un modello valgano anche per un altro.

Modello per la produzione

Scegli il livello in modo programmatico, non per abitudine. Mantieni una piccola tabella dei costi accanto al punto di chiamata e instrada in base ai requisiti di budget/qualità, invece di codificare ovunque lo stesso modello — considera i numeri come una cache della pagina dei prezzi, non come fonte di verità:

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

Preferisci i callback al polling serrato. In pipeline ad alto throughput, invece di chiamare wait_task in loop ogni pochi secondi, aggiungi callback alla richiesta di creazione:

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 l'attività raggiunge lo stato terminale (success o fail), il tuo gestore webhook riceve un POST, invece di far consumare richieste al tuo worker in un ciclo di polling. Se non puoi esporre un endpoint HTTPS pubblico (sviluppo locale, strumenti interni), il polling resta la scelta più semplice — una volta in esecuzione a scala reale, passa ai callback.

Deduplica prima di creare l'attività, non dopo. L'API delle attività fattura alla creazione, quindi le richieste ritentate (timeout, crash del worker, ridistribuzione del consumer della coda) che inviano di nuovo lo stesso job vengono addebitate due volte. Prima di chiamare create_task, verifica nel tuo storage se esiste già un'attività con chiave (model, input_hash) e, se quel task è già in esecuzione o ha avuto successo, salta la creazione — l'endpoint delle attività di hiapi non ha deduplicazione integrata, quindi deve stare nel tuo codice.

Gestisci esplicitamente gli errori di autenticazione. Una chiave non valida o revocata restituisce HTTP 401 con un corpo di risposta strutturato, non una pagina di errore generica:

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

Controlla specificamente error.code == "permission_denied", così una chiave errata fallisce rapidamente invece di ritentare fino al timeout.

Risorse hiapi correlate

Domande frequenti

Qual è il modello Seedream più economico per bozze rapide o icone? seedream-5.0-flash, tariffa unica di $0.025/immagine — il livello più economico della piattaforma, stesso prezzo per testo-immagine e immagine-immagine.

Richiedere 4K invece di 2K su Seedream 5.0 Lite costa di più? No. seedream-5.0-lite ha una tariffa unica di $0.035/immagine indipendentemente dal fatto che resolution sia 2K o 4K, quindi a questo livello richiedi 4K per impostazione predefinita.

Quanto costa Seedream 5.0 Pro per immagine? A fasce per risoluzione: testo-immagine costa $0.05 in 1K e $0.10 in 2K; immagine-immagine costa $0.06 in 1K e $0.10 in 2K. A differenza di lite, qui la risoluzione cambia davvero la fattura.

Come evito di essere addebitato due volte se il mio job viene ritentato? L'API delle attività non ha chiavi di idempotenza lato server, quindi deduplica sul client: prima di chiamare create_task memorizza una chiave per (model, input_hash) e, se quella chiave è già in esecuzione o ha avuto successo, salta la creazione.

Devo fare polling o usare i callback webhook? Se non puoi esporre un endpoint HTTPS pubblico (sviluppo locale, script), fai polling di GET /v1/tasks/{taskId}. Una volta in esecuzione a scala reale, passa a callback.url + when: "final" — sostituisce il ciclo di polling con una notifica push per ogni attività.

Cosa restituisce una chiave API non valida? HTTP 401 e {"error": {"code": "permission_denied", "type": "hiapi_error", "request_id": "..."}}. Controlla esplicitamente quel codice di errore, invece di ritentare con una chiave errata fino al timeout.

Posso usare questi prezzi senza una chiave API? No — ogni chiamata a /v1/tasks richiede un header Authorization: Bearer sk-... valido con una chiave reale creata nella tua console; la generazione in produzione non ha percorsi senza chiave o prove senza registrazione.

Inizia a creare con artefatti IA persistenti

Ottieni la tua chiave API e chiama modelli di immagini, video e audio tramite un'unica API basata sui task.

Leggi la documentazione API