AI per principiantiGuida
Perché una risposta AI si interrompe a metà frase? max_tokens, la finestra di contesto e finish_reason spiegati
Una risposta AI che si interrompe a metà frase ha raggiunto un limite. Leggi finish_reason, distingui max_tokens da una finestra di contesto piena e controlla il limite di output di ogni modello.

In questa pagina
Una risposta che si interrompe a metà frase è quasi sempre stata troncata da un limite. Il modello non ha perso il filo del discorso; la richiesta è arrivata a esaurimento dello spazio. La risposta indica quale limite è stato raggiunto: leggi finish_reason. length significa che è stato raggiunto un limite. stop significa che il modello ha terminato da solo.
Tre fattori decidono quanto può essere lunga una risposta. Una volta capito quale ti ha bloccato, la correzione richiede un minuto.
Tre limiti che troncano una risposta#
max_tokensè un tetto che imposti nella richiesta. Quando la risposta lo raggiunge, la generazione si ferma, anche a metà parola. Il riferimento API di DeepSeek lo definisce come il numero massimo di token generati nel completamento.- Il limite di output del modello è il tetto per una singola risposta di quel modello. Appartiene al modello, quindi mantieni
max_tokenspari o inferiore a esso. I valori per i nostri modelli sono nella tabella qui sotto. - La finestra di contesto è lo spazio per l'intero scambio: il tuo input e la risposta insieme. Il riferimento di DeepSeek afferma che i token di input e quelli generati insieme sono limitati dalla lunghezza di contesto del modello.
Se i token sono ancora un concetto vago, inizia da What is a token in AI?. Questa pagina presuppone che tu sappia cos'è un token.
Leggi prima finish_reason#
Ogni scelta in una risposta chat porta con sé un finish_reason. Accanto, usage ti dice quanti token sono entrati e usciti.
Ecco come appare una risposta troncata accanto a una completata. La richiesta chiedeva "In una frase breve, cos'è un token?", prima con max_tokens impostato a 16, poi a 200.
Esempio illustrativo, non una risposta registrata: i tuoi conteggi e i campi aggiuntivi saranno diversi.
{
"choices": [
{
"message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usu" },
"finish_reason": "length"
}
],
"usage": { "prompt_tokens": 21, "completion_tokens": 16, "total_tokens": 37 }
}{
"choices": [
{
"message": { "role": "assistant", "content": "A token is a small piece of text that a model reads and writes, usually a word or part of a word." },
"finish_reason": "stop"
}
],
"usage": { "prompt_tokens": 21, "completion_tokens": 24, "total_tokens": 45 }
}Nella prima risposta completion_ è 16, esattamente il tetto, e il testo termina con "usu". Nella seconda il modello si è fermato a 24 token, ben sotto il tetto di 200, perché aveva finito.
Per capire cosa è successo, procedi in questo ordine:
- Guarda
finish_reason. Se èstop, la risposta è completa. Il modello ha scelto di terminare, oppure ha raggiunto una stop sequence che hai impostato. Se èlength, un limite ha troncato la risposta, e il passo successivo ti dice quale. Esistono altri valori, comecontent_filteretool_calls; nessuno dei due è un problema di lunghezza. - Confronta
completion_con iltokens max_tokensche hai inviato. Se sono uguali o quasi, hai raggiuntomax_tokens. - Se
completion_è ben sottotokens max_tokenseprompt_tokensè grande, probabilmente la finestra di contesto si è riempita. Il riferimento di DeepSeek usalengthper entrambi i casi, quindi il campo da solo non può distinguerli; il confronto del passo 2 è il modo per capirlo. La documentazione di Anthropic e Z.ai nomina il secondo caso separatamente, comemodel_. Guarda il campo nelle tue risposte per vedere quale nome ottieni.context_ window_ exceeded
Tutte e tre le descrizioni provengono dalla documentazione degli sviluppatori, verificata il 20 ottobre 2026: DeepSeek, Anthropic e Z.ai.
Scorri la tabella verso destra →
| Cosa vedi | finish_reason |
Causa | Cosa fare |
|---|---|---|---|
Troncata, completion_ uguale a max_tokens |
length |
max_tokens raggiunto |
Aumenta max_tokens, oppure chiedi la risposta in parti |
Troncata, completion_ molto sotto max_tokens, input lungo |
length (o model_ in alcune API) |
Finestra di contesto piena | Accorcia l'input o la cronologia, oppure scegli un modello con una finestra più grande |
| Completa ma più corta di quanto volevi | stop |
Il modello ha finito, oppure è scattata una stop sequence | Chiedi più dettagli; controlla il parametro stop |
| Nessun testo, o un rifiuto | content_filter |
La risposta è stata filtrata | Riformula la richiesta |
| Nessun testo, una richiesta di tool invece | tool_calls |
Il modello vuole chiamare un tool | Esegui il tool e invia indietro il risultato |
Correzione 1: aumenta max_tokens#
La causa più comune è anche la più facile da correggere. Imposta max_tokens tu stesso, così sai quale tetto si applica. Non contare sul valore predefinito.
from openai import OpenAI
client = OpenAI(base_url="https://api.cheaptokens.dev/v1", api_key="YOUR_API_KEY")
resp = client.chat.completions.create(
model="deepseek-ai/DeepSeek-V4-Flash-0731",
messages=[{"role": "user", "content": "Write a detailed guide to setting up a home network."}],
max_tokens=16000, # example value: stay at or below the model's output limit
)
choice = resp.choices[0]
print(choice.finish_reason, resp.usage.completion_tokens)Questo mostra la forma della chiamata. La chiave va inserita come YOUR_API_KEY qui; tieni una chiave reale fuori dal codice che condividi.
Aumentare il numero aiuta solo fino al limite del modello stesso. Ecco i limiti su CheapTokens, verificati il 20 ottobre 2026 rispetto alla lista dei modelli CheapTokens:
Scorri la tabella verso destra →
| Modello | ID modello | Output massimo per risposta | Contesto |
|---|---|---|---|
| DeepSeek-V4-Flash (0731) | deepseek- |
32.768 token | 380K |
| GLM-5.3-Flash | zai- |
8.192 token | 390K |
| MiniMax-M2.7 | MiniMaxAI/ |
8.192 token | 200K |
Gli sviluppatori pubblicano i propri limiti per le proprie API. Z.ai, ad esempio, elenca fino a 128K di output per la serie GLM-5. Quelli non sono i limiti di GLM-5.3-Flash su CheapTokens, che è di 8.192 token per risposta. Per qualsiasi cosa costruisci su CheapTokens, usa la tabella qui sopra.
Correzione 2: quando la finestra di contesto è piena#
In una chat, l'intera cronologia viene inviata di nuovo con ogni messaggio, quindi l'input cresce a ogni turno. La finestra di contesto deve contenere quella cronologia più la nuova risposta. Se la sola cronologia ne occupa quasi tutta, resta quasi nessuno spazio per una risposta.
Queste finestre sono grandi, e una domanda breve non le riempirà. Le chat lunghe e i documenti incollati sì. Cosa aiuta:
- Inizia una nuova chat per un nuovo compito invece di continuare una vecchia.
- Chiedi al modello di riassumere la conversazione finora, e porta avanti solo il riassunto.
- Taglia i vecchi messaggi e gli allegati di cui non hai più bisogno.
- Se l'input stesso è enorme, scegli il modello con la finestra più grande. Tra i nostri è GLM-5.3-Flash con 390K. Il suo limite di output è di 8.192 token, quindi chiedi un risultato lungo in parti.
Correzione 3: ottieni una risposta lunga in parti#
Quando la risposta che vuoi è più lunga del limite di output del modello, nessuna impostazione la farà stare in una sola risposta. Chiedila a pezzi: quando finish_reason è length, invia indietro la risposta parziale e chiedi al modello di continuare.
messages = [{"role": "user", "content": "Write a detailed guide to setting up a home network."}]
parts = []
for _ in range(4): # example limit: at most 4 rounds
resp = client.chat.completions.create(
model="zai-org/GLM-5.3-Flash",
messages=messages,
max_tokens=8000, # example value: below this model's output limit
)
choice = resp.choices[0]
parts.append(choice.message.content)
if choice.finish_reason != "length":
break
messages.append({"role": "assistant", "content": choice.message.content})
messages.append({"role": "user", "content": "Continue exactly where you stopped. Don't repeat anything."})
text = "".join(parts)Stessa avvertenza: un esempio del pattern, non un'esecuzione registrata. Leggi le giunture tra le parti. A volte un modello ripete una frase o ricomincia un elenco nel punto di congiunzione.
Ogni round reinvia tutto quanto finora come input, e ogni token di output viene fatturato. Una risposta lunga costa più di una breve. Ecco una risposta di ottomila token su 2.000 token di input, che sta in ogni modello della tabella:
| Modello | Input $/1M | Output $/1M | Costo | OpenRouter |
|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.00036 | $0.00069 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.00083 | $0.0013 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.0013 | $0.0102 |
2000 token di input e 8000 token di output in totale. I prezzi per 1M di token sono attuali e cambiano insieme alle nostre tariffe; la colonna OpenRouter mostra i prezzi di riferimento per lo stesso carico di lavoro.
Quando finish_reason è stop#
stop significa che il modello ha concluso la risposta. Se l'ha conclusa prima di quanto volevi, non è un problema di limite e un max_tokens più grande non cambia nulla. Di' cosa vuoi: la lunghezza, le sezioni, il livello di dettaglio. Controlla anche se la richiesta imposta un parametro stop; una stop sequence che compare nella risposta la termina sul posto.
Scegliere un modello in base alla lunghezza della risposta#
Parti dalla risposta che ti serve. Se sta in 8.192 token, MiniMax-M2.7 (MiniMaxAI/) la gestisce su CheapTokens. Il suo output costa meno del prezzo di riferimento di OpenRouter, ed è fatturato a $0.15 (per 1M token di output). Il prezzo è lo stesso a qualsiasi ora, non ci sono ore di punta, e l'API è compatibile con OpenAI e Anthropic.
Ecco il listino prezzi attuale per ogni modello:
| Modello | Contesto | Input $/1M | Output $/1M | OpenRouter in | OpenRouter out |
|---|---|---|---|---|---|
| GLM-5.3-Flash reasoning | 390K | $0.02 | $0.04 | $0.0413 | $0.0758 |
| DeepSeek-V4-Flash | 380K | $0.015 | $0.10 | $0.0475 | $0.1568 |
| MiniMax-M2.7 | 180K | $0.05 | $0.15 | $0.30 | $1.20 |
Prezzi in USD per 1M di token. Le cifre di OpenRouter sono mostrate a scopo di confronto e potrebbero variare.
Se non hai ancora inviato una richiesta, Your first API request with CheapTokens ti guida passo passo. Per cos'è un token e perché input e output sono conteggiati separatamente, vedi What is a token in AI?.
Endpoint, ID dei modelli e limiti per ogni modello sono nella CheapTokens docs.



