AI per principiantiGuida
Perché una chat AI lunga costa di più: l'API reinvia la cronologia
Ogni nuovo messaggio in una chat AI reinvia tutta la cronologia, quindi l'input cresce a ogni turno. Guarda l'aritmetica e 3 modi per tenere basso il costo.

In questa pagina
I primi messaggi di una chat costano poco. Il cinquantesimo messaggio costa sensibilmente più del decimo, anche se hai digitato la stessa quantità di testo. Nulla è rotto: è così che funzionano le API di chat.
La risposta breve#
Un modello non ricorda le tue richieste precedenti. La documentazione di OpenAI lo dice chiaramente: "ogni richiesta di generazione di testo è indipendente e stateless", e per una conversazione multi-turno includi i messaggi precedenti e la risposta precedente del modello nella richiesta successiva. La Messages API di Anthropic descrive lo stesso schema: conversazioni multi-turno stateless, in cui i turni precedenti vengono passati nel parametro messages.
Quindi la finestra di chat che vedi in un'app è un'illusione costruita dall'app. Dietro, ogni nuovo messaggio è una richiesta nuova che trasporta l'intera conversazione fino a quel momento. Paghi i token di input a ogni richiesta, e la cronologia fa parte di quell'input. Se i termini sono nuovi per te, leggi prima Cos'è un token e Token di input vs output.
OpenAI esplicita il lato della fatturazione per le sue catene di risposte: tutti i token di input precedenti nella catena vengono fatturati come token di input. Lo stesso principio vale per qualsiasi API in cui invii tu stesso la cronologia: ciò che invii è ciò che viene contato.
Un esempio con numeri inventati#
I numeri qui sotto sono un esempio didattico, non una misurazione. Supponi che ciascuno dei tuoi messaggi sia di circa 200 token e ciascuna risposta di circa 300 token. Uno scambio completato aggiunge 500 token alla cronologia.
Scorri la tabella verso destra →
| Turno | Cronologia precedente reinviata | Nuovo messaggio | Input di questa richiesta | Output |
|---|---|---|---|---|
| 1 | 0 | 200 | 200 | 300 |
| 5 | 500 × 4 = 2.000 | 200 | 2.200 | 300 |
| 10 | 500 × 9 = 4.500 | 200 | 4.700 | 300 |
| 20 | 500 × 19 = 9.500 | 200 | 9.700 | 300 |
La risposta resta della stessa lunghezza, ma l'input del turno 20 è quasi cinquanta volte l'input del turno 1. L'output non cresce; l'input sì.
Ora il totale per una chat di 20 turni. La cronologia viene reinviata 0, 1, 2 ... 19 volte a seconda degli scambi, che è una semplice somma:
- Vecchi scambi reinviati: 500 × 190 = 95.000 token (190 è 0 + 1 + 2 + ... + 19).
- Nuovi messaggi: 200 × 20 = 4.000 token.
- Input totale per la chat: 95.000 + 4.000 = 99.000 token.
- Output totale: 300 × 20 = 6.000 token.
Se il modello ricordasse tutto gratis, l'input sarebbe solo 200 × 20 = 4.000 token. Il resto è la cronologia che viene reinviata. Raddoppiare il numero di turni non raddoppia il costo della cronologia, lo quadruplica all'incirca, perché la somma cresce con il quadrato del numero di turni.
Quanto costa ai prezzi attuali#
Ecco la stessa chat di 20 turni (99.000 input, 6.000 output) ai prezzi attuali. La tabella è live e si aggiorna quando cambiano le tariffe; l'ultima colonna è il prezzo di riferimento di OpenRouter per confronto.
| Modello | Input $/1M | Output $/1M | Costo | OpenRouter |
|---|---|---|---|---|
| GLM-5.3-Flash | $0.02 | $0.04 | $0.0022 | $0.0045 |
| DeepSeek-V4-Flash | $0.015 | $0.10 | $0.0021 | $0.0056 |
| MiniMax-M2.7 | $0.05 | $0.15 | $0.0059 | $0.0369 |
99.000 token di input e 6000 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.
Per un controllo rapido in testo: su MiniMax-M2.7 questa intera conversazione costa $0.0059. Per una chat come questa, dove domina l'input, conta soprattutto il prezzo dell'input: su MiniMax-M2.7 è più economico del prezzo di riferimento di OpenRouter. Per 1M di token, MiniMax-M2.7 è $0.05 per l'input e $0.15 per l'output.
Tre modi per tenerlo basso#
1. Inizia una nuova chat quando cambia l'argomento#
La cronologia più economica è quella vuota. Se hai finito di fare debug di una funzione e ora vuoi una ricetta, una nuova chat invia 200 token invece di 9.700. In un'app è un pulsante; nel codice è history = []. Fallo ogni volta che il contesto precedente non aiuta più la domanda successiva.
2. Taglia la cronologia#
Mantieni solo gli ultimi messaggi e scarta il resto. Supponi di tenere gli ultimi tre scambi, così la cronologia non supera mai 500 × 3 = 1.500 token:
- I turni 1-3 crescono normalmente: 0 + 500 + 1.000 = 1.500 token di cronologia.
- I turni 4-20 portano ciascuno i 1.500 massimi: 1.500 × 17 = 25.500 token.
- Totale cronologia: 1.500 + 25.500 = 27.000 token, più 4.000 di nuovi messaggi = 31.000 token di input.
Sono 31.000 invece di 99.000 per gli stessi 20 turni, e su MiniMax-M2.7 arrivano a $0.0025. Il prezzo del taglio è che il modello dimentica la parte iniziale della chat, quindi tieni il system prompt e i fatti che non deve perdere fuori dalla parte tagliata.
3. Sostituisci i vecchi turni con un riassunto#
Quando la cronologia diventa lunga, chiedi una volta al modello di riassumerla, poi continua con il riassunto invece del testo completo. Nell'esempio sopra, nove scambi sono 4.500 token; un riassunto di circa 300 token porta avanti i punti principali. Paghi una richiesta in più per scrivere il riassunto, e ogni richiesta successiva è più leggera. Questo conserva più significato del semplice taglio, al costo di un po' di dettaglio.
La finestra di contesto è un limite separato: fissa quanti token può contenere una richiesta, risposta inclusa. La cronologia prima o poi toccherà quel tetto; Perché una risposta AI si interrompe a metà frase? lo spiega.
Vederlo nel tuo codice#
La risposta contiene un oggetto usage, così puoi osservare la crescita da solo. Questo è un esempio: sostituisci la chiave e prendi l'id del modello dalla documentazione di CheapTokens, perché gli id differiscono tra i provider.
from openai import OpenAI
client = OpenAI(base_url='https://api.cheaptokens.dev/v1', api_key='YOUR_KEY')
system = {'role': 'system', 'content': 'You are a helpful assistant.'}
history = []
KEEP = 7 # new message + last 3 exchanges (6 messages); None keeps everything
def ask(text):
history.append({'role': 'user', 'content': text})
r = client.chat.completions.create(
model='MODEL_ID_FROM_DOCS',
messages=[system] + (history[-KEEP:] if KEEP else history),
)
answer = r.choices[0].message.content
history.append({'role': 'assistant', 'content': answer})
print(r.usage.prompt_tokens, r.usage.completion_tokens)
return answerChiama ask() più volte di seguito e stampa prompt_tokens: con KEEP = None sale a ogni turno, con KEEP = 7 si stabilizza. Per gli agenti che iterano su molti passaggi lo stesso effetto vale per ogni passaggio; Come stimare il costo di un agente AI mostra come pianificarlo nel budget.
Dove eseguire chat lunghe#
I dialoghi lunghi e i loop degli agenti sono esattamente i carichi di lavoro in cui domina il volume di input, quindi contano sia una grande finestra di contesto sia lo spazio per risposte lunghe:
- MiniMax-M2.7: contesto 180K, fino a 8.192 token per risposta, input e output entrambi più economici del prezzo di riferimento di OpenRouter.
- DeepSeek-V4-Flash: contesto 380K, fino a 32.768 token per risposta, output più economico del prezzo di riferimento di OpenRouter.
CheapTokens ha un unico saldo per tutti i modelli, un prezzo fisso per modello senza ore di punta, e un'API compatibile con OpenAI Chat Completions e Anthropic Messages, quindi il codice sopra funziona cambiando la base URL. Ricarica il saldo e invia la tua prima richiesta seguendo La tua prima richiesta API con CheapTokens.



