Tutoriale
Gli URL di output di HiAPI sono scaduti? Scarica entro 7 giorni oppure attiva l'archiviazione persistente
Perché i link di output delle attività smettono di funzionare, cosa significa expireAt e due soluzioni: scaricare subito oppure conservare i file su HiAPI con l'archiviazione persistente.
TL;DR
- I link di output restituiti da
POST /v1/taskssono temporanei: vengono eliminati circa 7 giorni dopo il completamento dell'attività. Il campoexpireAtsu ogni output indica il momento esatto di scadenza in secondi Unix. - Una volta scaduto, il link non è recuperabile. Interrogare di nuovo l'attività restituisce lo stesso link, mentre rieseguire l'attività comporta un nuovo addebito.
- Due soluzioni: scaricare il file subito dopo il successo dell'attività, oppure conservarlo su HiAPI con
"storage": "persistent"($0,05 per GB al mese). Puoi anche passare all'archiviazione persistente in qualsiasi momento prima della scadenza dell'output temporaneo.
Come appare un'attività completata
Ecco un esempio reale di dettaglio attività restituito da GET https://api.hiapi.ai/v1/tasks/{taskId}:
{
"code": 200,
"message": "success",
"data": {
"taskId": "tk-hiapi-01M59F0HVM9QSCYPDT4BHABD3K",
"model": "grok-imagine/text-to-image",
"status": "success",
"created": 1792392841,
"completed": 1792392863,
"storage": "temp",
"output": [
{
"type": "image",
"url": "https://temp.hiapi.ai/.../01M59F0HVM9QSCYPDT4BHABD3K-0.png",
"expireAt": 1792997663
}
]
}
}
storage: "temp"è il livello predefinito.expireAtmenocompletedequivale a 604.800 secondi, esattamente 7 giorni. Abbiamo controllato quattro attività (due immagini e due video) e tutte e quattro avevano una finestra di conservazione di 7 giorni.statuspassa in sequenza daqueuedahandlingearchiving, per terminare insuccessofail. Solo questi ultimi due sono stati finali.
Perché i link smettono di funzionare "all'improvviso"
- Si salva il link invece del file. Una riga di database, un campo CMS o una pagina Notion contengono l'URL di
temp.hiapi.ai: per la prima settimana funziona, poi nessuno riesce più ad aprirlo. - I file vengono recuperati troppo tardi. Una coda recupera i risultati dopo alcuni giorni, quando
expireAtè già passato. - Le attività batch saltano il passaggio di caricamento. I log sembrano a posto, ma dopo una settimana i file non ci sono più.
- L'output di un'attività viene usato come input di quella successiva. Oggi funziona, ma se la seconda attività viene rieseguita dopo la scadenza del link fallirà.
Soluzione 1: scaricare nello stesso percorso di codice
# pip install requests; export HIAPI_KEY=your-key first
import os, time, requests
API = "https://api.hiapi.ai/v1/tasks"
H = {"Authorization": f"Bearer {os.environ['HIAPI_KEY']}"}
def run_and_save(model, inp, path, timeout_s=600):
r = requests.post(API, json={"model": model, "input": inp}, headers=H, timeout=30).json()
if r.get("code") != 200:
raise RuntimeError(r)
task_id = r["data"]["taskId"] # store this before polling
deadline = time.time() + timeout_s
while time.time() < deadline:
d = requests.get(f"{API}/{task_id}", headers=H, timeout=30).json()["data"]
if d["status"] == "success":
out = d["output"][0]
with open(path, "wb") as f: # or upload to S3 / R2 here
f.write(requests.get(out["url"], timeout=120).content)
return task_id, out["expireAt"]
if d["status"] == "fail":
raise RuntimeError(d.get("error"))
time.sleep(3)
raise TimeoutError(task_id)
run_and_save("z-image", {"prompt": "a red ceramic teapot on a wooden table", "aspect_ratio": "1:1"},
"teapot.png")
Salva nel database il tuo URL di archiviazione, non il link di HiAPI. Se il processo va in crash dopo l'invio, interroga di nuovo il taskId salvato invece di creare una nuova attività: entro 7 giorni il file è ancora lì.
Soluzione 2: conservare gli output su HiAPI
Se non vuoi gestire un tuo sistema di archiviazione, puoi chiedere a HiAPI di conservare i file:
curl -s -X POST https://api.hiapi.ai/v1/tasks \
-H "Authorization: Bearer $HIAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "z-image",
"storage": "persistent",
"input": {"prompt": "a red ceramic teapot on a wooden table", "aspect_ratio": "1:1"}
}'
storage va al livello superiore, allo stesso livello di model, non dentro input. Controlla data.storage nel dettaglio dell'attività: se il saldo è insufficiente o hai superato il limite di archiviazione, l'output torna silenziosamente a temp e l'attività risulta comunque completata con successo.
Hai già degli output temporanei che vuoi conservare? Esegui l'upgrade prima che scadano. Recupera i loro id con GET /v1/storages, poi:
curl -s -X POST https://api.hiapi.ai/v1/storages/promote \
-H "Authorization: Bearer $HIAPI_KEY" \
-H "Content-Type: application/json" \
-d '["90216", "90215"]'
Ogni chiamata accetta al massimo 50 id. La risposta elenca gli id accepted e rejected, con il motivo per ogni id rifiutato, ad esempio cap_exceeded. L'upgrade avviene in background; i file mantengono il percorso originale e vengono migrati al dominio persistente. Puoi eseguire l'upgrade anche da Dashboard → Storage.
temp (predefinito) |
persistent |
|
|---|---|---|
| Durata di conservazione | Circa 7 giorni | Fino alla tua eliminazione |
| Costo | Gratuito | $0,05 per GB al mese, con fatturazione giornaliera |
| Download | Gratuito | Gratuito |
| Limite di dimensione | Nessuno | 100 GB per account per impostazione predefinita |
Esempio di costo: conservare 5 GB per un mese costa $0,25; 50 GB costano $2,50. Dopo aver eliminato i file con POST /v1/storages/delete, la fatturazione si interrompe dal giorno successivo. I file persistenti non possono tornare all'archiviazione temporanea.
Se il saldo non è sufficiente a coprire i costi di archiviazione per 3 giorni consecutivi, i file persistenti entrano in un periodo di tolleranza di 7 giorni e riceverai un'email. Ricaricando il saldo i file restano conservati; se alla fine del periodo di tolleranza non hai ancora ricaricato, i file verranno eliminati.
Quale soluzione usare
- Hai già S3, R2 o una CDN: usa la soluzione 1. Scarica una volta, poi servi i file dalla tua archiviazione.
- Vuoi che i link restino validi senza gestire un tuo sistema di archiviazione: usa la soluzione 2, impostando
"storage": "persistent". - Devi conservare solo pochi risultati: lascia tutti gli output in
tempe fai l'upgrade solo di quelli da conservare.
FAQ
Per quanto tempo restano validi i link di output?
Circa 7 giorni dopo il completamento dell'attività. Il momento esatto è indicato nell'expireAt di ogni output (secondi Unix).
Interrogando di nuovo l'attività si ottiene un nuovo link?
No. GET /v1/tasks/{taskId} restituisce lo stesso link. Dopo la scadenza, il file non c'è più a meno che tu non abbia eseguito l'upgrade.
Rieseguire l'attività comporta un costo?
Sì. Una nuova attività viene addebitata di nuovo, quindi salvare i file fin dalla prima volta è la scelta più conveniente.
I link di output sono pubblici?
Sì. Chiunque abbia l'URL può scaricare il file, ma il percorso è casuale e impossibile da indovinare. Al momento non sono disponibili link firmati o privati.
L'archiviazione persistente vale anche per i video?
Sì. Ogni file immagine, video e audio che conservi contribuisce alla dimensione di archiviazione.
Per la documentazione completa, consulta la documentazione su Output Storage e la documentazione sul dettaglio delle attività.
Articoli correlati
Vedi tutti gli articoli →-
Tutoriale
Come chiamare hailuo-2.3-fast/image-to-video tramite l'API HiAPI: pratica con curl e Python
La prima richiesta funzionante per il livello image-to-video veloce ed economico — dall'ID del modello al download di un MP4
-
Tutoriale
Come chiamare hailuo-2.3/text-to-video tramite l'API HiAPI: curl, Python ed esempi di richiesta eseguibili
-
Tutoriale
Utilizzare Kandinsky 6.0 Pro su HiAPI per la generazione di video da testo: tutorial con curl e Python
Dimostrazione pratica guidata dalla richiesta: costruire la chiamata da prompt a clip video, inviare la richiesta, monitorare lo stato di completamento e scaricare il risultato