Home → Assistenza

Il modello restituisce una stringa vuota ma ti viene comunque addebitato

Su un modello di ragionamento, max_tokens limita insieme i token di ragionamento e l'output visibile. Se la catena di pensiero consuma tutto il budget, ricevi un 200 valido con il campo content vuoto, e paghi ogni token di ragionamento.

Cosa vedi

Perché succede

I modelli di ragionamento emettono due tipi di token di output: la catena interna e la risposta che vedi. La fatturazione li conta entrambi. max_tokens li limita entrambi. Un valore generoso per un modello senza ragionamento può essere consumato del tutto prima del primo carattere visibile.

Il fallimento è silenzioso per progettazione. L'API ha fatto ciò che le era stato chiesto: ha generato fino al limite e poi si è fermata. finish_reason: "length" è l'unico indizio, ed è facile non notarlo quando il tuo codice legge choices[0].message.content e trova un'innocua stringa vuota.

Ci siamo imbattuti in questo in uno strumento interno di valutazione dei documenti. max_tokens era impostato a 2500: andava bene per il modello precedente, ma era nettamente insufficiente quando il modello ha iniziato a ragionare prima di rispondere. Per un po' il sintomo è sembrato un proxy rotto, perché le richieste riuscivano, la latenza era normale e il costo era reale. A tradirlo è stata la fattura: addebiti senza alcun testo corrispondente.

Verifica se la causa è questa

Guarda finish_reason e il conteggio dei token, non solo il contenuto:

curl -s 'YOUR_BASE_URL/chat/completions' \
  -H 'Authorization: Bearer YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"model":"YOUR_MODEL","max_tokens":64,
       "messages":[{"role":"user","content":"What is 17 * 23? Answer with the number only."}]}' \
  | python3 -m json.tool

"finish_reason": "length" insieme a un content vuoto e a un conteggio di token di output diverso da zero è la firma. Riesegui con max_tokens a 4000 e lo stesso prompt otterrà risposta.

Come risolvere

  1. Metti in budget il ragionamento, non solo la rispostaUn modello di ragionamento ha bisogno di spazio per entrambi. Se vuoi una risposta da 200 token, lasciare 2000 token di margine non è eccessivo — la catena è spesso diverse volte più lunga della risposta.
  2. Tratta finish_reason: length come un errore nel tuo codiceNon lasciar passare in silenzio una stringa vuota. Crea un ramo: ritenta con un budget maggiore o fallisci in modo evidente. Questo singolo controllo trasforma un mistero in una riga di log.
  3. Verifica se il modello supporta un budget di ragionamento separatoAlcuni espongono un parametro dedicato, così la risposta visibile ha una sua quota. Dove esiste, usalo invece di indovinare un unico numero combinato.
  4. Confronta con un modello senza ragionamento prima di incolpare la reteSe la stessa richiesta restituisce testo con un modello senza ragionamento, il trasporto funziona e il problema è il budget.
Ogni richiesta su APICLAN mostra nel log di utilizzo i token di input, output e ragionamento, così una risposta vuota con un addebito reale è visibile invece che misteriosa. Il comportamento di ciascun modello è documentato nelle pagine dei prezzi.

Articoli correlati

Unexpected token '<' quando chiami un'API compatibile con OpenAI401 invalid API key: quando la chiave sembra giusta ma continua a fallire

Ultima verifica: 2026-10-01. Scritto a partire da problemi diagnosticati su un gateway compatibile con OpenAI in produzione, non raccolto da altri siti.