Torna al blog

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.

Di CheapTokens TeamPubblicato il Aggiornato il 7 min di lettura

Copertina scura con il logo cheaptokens: le parole max_tokens, finish_reason e length in riquadri, e il titolo “Risposta troncata a metà frase?”
In questa pagina
  1. Tre limiti che troncano una risposta
  2. Leggi prima finish_reason
  3. Correzione 1: aumenta max_tokens
  4. Correzione 2: quando la finestra di contesto è piena
  5. Correzione 3: ottieni una risposta lunga in parti
  6. Quando finish_reason è stop
  7. Scegliere un modello in base alla lunghezza della risposta

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_tokens pari 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.

json
{
  "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 }
}
json
{
  "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_tokens è 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:

  1. 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, come content_filter e tool_calls; nessuno dei due è un problema di lunghezza.
  2. Confronta completion_tokens con il max_tokens che hai inviato. Se sono uguali o quasi, hai raggiunto max_tokens.
  3. Se completion_tokens è ben sotto max_tokens e prompt_tokens è grande, probabilmente la finestra di contesto si è riempita. Il riferimento di DeepSeek usa length per 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, come model_context_window_exceeded. Guarda il campo nelle tue risposte per vedere quale nome ottieni.

Tutte e tre le descrizioni provengono dalla documentazione degli sviluppatori, verificata il 20 ottobre 2026: DeepSeek, Anthropic e Z.ai.

Cosa vedi finish_reason Causa Cosa fare
Troncata, completion_tokens uguale a max_tokens length max_tokens raggiunto Aumenta max_tokens, oppure chiedi la risposta in parti
Troncata, completion_tokens molto sotto max_tokens, input lungo length (o model_context_window_exceeded 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.

python
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:

Modello ID modello Output massimo per risposta Contesto
DeepSeek-V4-Flash (0731) deepseek-ai/DeepSeek-V4-Flash-0731 32.768 token 380K
GLM-5.3-Flash zai-org/GLM-5.3-Flash 8.192 token 390K
MiniMax-M2.7 MiniMaxAI/MiniMax-M2.7 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.

python
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 Costo OpenRouter
GLM-5.3-Flash $0.00036 $0.00069
DeepSeek-V4-Flash $0.00083 $0.0013
MiniMax-M2.7 $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/MiniMax-M2.7) 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.