Torna al blog

Ottimizzazione dei costiGuida

Routing dei modelli per ridurre il costo API: prima il modello economico, poi escalation

Invia le richieste facili a un modello economico ed escala solo quelle difficili. Scopri il costo misto di 10.000 richieste al 10%, 30% e 50% di escalation, più un breve router Python.

Di CheapTokens TeamPubblicato il 7 min di lettura

Copertina: una richiesta va prima a un modello economico e viene escalata a un secondo modello solo quando è bloccata
In questa pagina
  1. Quali delle tue richieste sono facili?
  2. Quanto costano 10.000 richieste: cascata vs router
  3. Un router in Python: due chiamate e un controllo
  4. Verifica te stesso
  5. Dove andare dopo

Il routing può ridurre la bolletta quando il primo passaggio del modello economico costa molto meno del secondo modello e poche richieste vengono escalate: invia ogni richiesta prima al modello economico e reinvia solo quelle difficili a un secondo modello. Se risparmi davvero dipende dalla percentuale di richieste che escalation. Di seguito l'aritmetica per 10.000 richieste al 10%, 30% e 50%, e una funzione Python che puoi incollare nel tuo progetto.

Il pattern non è nuovo. Il post di ingegneria di Anthropic "Building effective agents" (19 dicembre 2024) lo chiama workflow di routing: le domande comuni e facili vanno a un modello più piccolo ed economico, quelle insolite e difficili a uno più capace. Il post non riporta prezzi, quindi i numeri qui sono nostri, sui prezzi live di CheapTokens.

Quali delle tue richieste sono facili?#

Il routing funziona solo se sai dire, in una regola, cosa significa "difficile". Non a sensazione, ma in una regola che il codice può verificare. Scegli il caso più vicino al tuo:

Scegli il tuo caso

Scegli il tuo caso

Chatbot di supporto

La maggior parte dei ticket sono FAQ brevi: dov'è il mio ordine, come reimposto una password. Alcuni richiedono una risposta lunga e accurata. Facile: il primo modello risponde e non replica UNSURE. Difficile: dice UNSURE, o la risposta è troncata (finish_reason è length).

Pipeline di documenti

Ogni documento passa prima per l'estrazione. Facile: il risultato si analizza come JSON valido con tutti i campi richiesti. Difficile: l'analisi fallisce o un campo è vuoto. Solo quei documenti vengono rieseguiti sul secondo modello.

Agente di coding

Le modifiche semplici vanno al modello economico. Escala un passo quando lo stesso passo è fallito due volte di fila, o quando la risposta è stata troncata (finish_reason è length).

Non escalare su "il modello sembra incerto" a meno che tu non gli abbia detto come dirlo. Un'istruzione di una riga ("rispondi esattamente UNSURE se non puoi rispondere") trasforma una sensazione in qualcosa che if può leggere.

Quanto costano 10.000 richieste: cascata vs router#

Supponiamo che tu gestisca un bot di supporto con 10.000 richieste al mese. Una richiesta media è di 800 token in input e 300 token in output. Queste sono ipotesi; sostituiscile con le tue da usage (il nostro articolo sul conteggio dei token mostra dove leggerle).

Ci sono due modi per cablare il routing, e fatturano diversamente:

  • Cascata. Ogni richiesta va al modello economico. Una quota p fallisce il controllo e viene inviata di nuovo al secondo modello. Quelle richieste vengono pagate due volte: costo = N × [economico + p × secondo].
  • Router. Una piccola chiamata di classificazione decide in anticipo. Le facili vanno al modello economico, le difficili direttamente al secondo: costo = N × [(1 − p) × economico + p × secondo], più il classificatore su ogni richiesta.

Useremo la cascata, perché non richiede un classificatore ed è la più facile da iniziare. Il primo passaggio è GLM-5.3-Flash (zai-org/GLM-5.3-Flash, contesto 390K, fino a 8.192 token di output). Il secondo passaggio è DeepSeek-V4-Flash release 0731 (deepseek-ai/DeepSeek-V4-Flash-0731, contesto 380K, fino a 32.768 token di output), così una risposta che non stava in 8.192 token ha spazio per finire. Entrambi costano meno di OpenRouter in totale, con input e output contati insieme; la tabella live qui sotto mostra la colonna OpenRouter accanto alla nostra.

Il primo passaggio copre sempre tutte le 10.000 richieste: 8.000.000 di input e 3.000.000 di output. Il secondo passaggio copre solo la quota escalata. L'ultima colonna è l'alternativa: tutte le 10.000 richieste direttamente sul secondo modello.

Quota escalata Token del secondo passaggio (in / out) Primo passaggio, tutte le 10.000 Secondo passaggio, solo escalate Tutto sul secondo modello, tutte le 10.000
10% 800.000 / 300.000 $0.28 $0.042 $0.42
30% 2.400.000 / 900.000 $0.28 $0.126 $0.42
50% 4.000.000 / 1.500.000 $0.28 $0.21 $0.42

Somma le colonne del primo e del secondo passaggio in ogni riga per ottenere il mese della cascata, poi confronta quella somma con l'ultima colonna. Il primo passaggio è un costo fisso, e solo il secondo passaggio cresce con p. È tutta qui la storia di una cascata: più escalation, più ti avvicini a pagare il lavoro due volte.

Ecco lo stesso carico per ogni modello contemporaneamente, così puoi vedere dove si collocano le opzioni a modello singolo:

Modello Per richiesta 10.000 richieste OpenRouter, 10.000 richieste
GLM-5.3-Flash $0.000028 $0.28 $0.517
DeepSeek-V4-Flash $0.000042 $0.42 $0.98
MiniMax-M2.7 $0.000085 $0.85 $10.20

800 token di input e 300 token di output per richiesta. 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 una cascata non conviene? Quando il primo passaggio più la quota escalata costa più che inviare tutto al secondo modello. In simboli: economico + p × secondo < secondo, il che significa p < 1 − economico/secondo. Per questa coppia, il primo passaggio costa una quota notevole del prezzo del secondo modello su questo carico, quindi il guadagno di una cascata si riduce, e con un'alta quota di escalation scompare. Al 50% la cascata può perdere contro l'invio di tutte le 10.000 richieste al secondo modello, quindi controlla la somma dei due passaggi rispetto all'ultima colonna prima di impegnarti. Il rapporto dipende dal tuo mix di input/output, perché i due modelli prezzano i due lati diversamente, quindi leggilo dalla tua riga.

La variante router aggiunge una cosa: il classificatore. Supponiamo che legga 300 token di input e risponda in 5 token sul modello economico, per richiesta. Per 10.000 richieste sono 3.000.000 di input e 50.000 di output, ovvero $0.062 al mese in più. Confronta questa riga con la quota p della colonna del primo passaggio (10%, 30% o 50% di essa): è ciò che la cascata spreca eseguendo il primo passaggio su richieste che poi escalano. Se la riga del classificatore è maggiore, la cascata è l'inizio più economico; se è minore, un router risparmia di più.

Prova i tuoi numeri prima di costruire qualsiasi cosa:

Calcolatore di costi

Un mese di un bot di supporto, tutto su un modello

Token di input per richiesta: 800 · Token di output per richiesta: 300 · Richieste al giorno: 10.000

ModelloAl giornoAl mese
GLM-5.3-Flash$0.28$8.40
DeepSeek-V4-Flash$0.42$12.60
MiniMax-M2.7$0.85$25.50

Cambia runs con il tuo volume e leggi il totale per ogni modello. Poi usa la tabella sopra per vedere quanto aggiungerebbe un secondo passaggio.

Un router in Python: due chiamate e un controllo#

Entrambi i modelli stanno dietro un unico base URL compatibile OpenAI e un unico saldo, quindi il routing non richiede un secondo account o chiave. Il codice sotto è un esempio: i numeri al suo interno (max_tokens, la regola UNSURE) sono da tarare. La seconda chiamata riceve un max_tokens più alto, così una risposta troncata a 600 token può finire. Base URL, id dei modelli e il resto sono nella documentazione di CheapTokens.

python
import os
from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)

CHEAP = 'zai-org/GLM-5.3-Flash'
SECOND = 'deepseek-ai/DeepSeek-V4-Flash-0731'
SYSTEM = 'Answer briefly. If you cannot answer well, reply exactly UNSURE.'


def ask(model, question, max_tokens):
    r = client.chat.completions.create(
        model=model,
        max_tokens=max_tokens,
        messages=[
            {'role': 'system', 'content': SYSTEM},
            {'role': 'user', 'content': question},
        ],
    )
    choice = r.choices[0]
    return choice.message.content or '', choice.finish_reason


def needs_escalation(text, finish_reason):
    return finish_reason == 'length' or not text.strip() or 'UNSURE' in text


def answer(question):
    text, why = ask(CHEAP, question, 600)
    if needs_escalation(text, why):
        text, why = ask(SECOND, question, 4000)
        if 'UNSURE' in text:
            text = 'Sorry, I could not answer this one.'
    return text
Il flusso di routing: richiesta, modello economico, controllo, secondo modello, risposta
La cascata: il secondo modello vede solo le richieste che hanno fallito il controllo

Tre abitudini rendono questo onesto e non solo economico:

  • Conta le escalation. Registra quanto spesso scatta needs_escalation. Quella è la tua p, ed è il numero che decide se la cascata conviene.
  • Scegli il secondo modello sul tuo set di test. Prendi 50 richieste difficili dai tuoi log, eseguile su entrambi i modelli e tieni il secondo solo se corregge quelle che il primo ha mancato. Il suo vantaggio documentato è il limite di risposta di 32.768 token, e il tuo set mostra se è il vantaggio che ti serve.
  • Invia la stessa richiesta, non una più lunga. Se incolli la risposta fallita nella seconda chiamata, la paghi come input. Inizia il secondo passaggio pulito a meno che la prima risposta non sia un contesto davvero utile.
Una richiesta escalata: il primo modello risponde UNSURE, la seconda chiamata restituisce la risposta
Una richiesta attraverso il router: prima e dopo il controllo

Verifica te stesso#

Verifica rapida

In una cascata, il 30% delle richieste fallisce il controllo sul primo modello. Quanto costano quelle richieste?

Mostra risposta

Risposta: Il prezzo del primo modello più il prezzo del secondo modello

La prima chiamata è già fatturata quando getti via la sua risposta. Le richieste escalate pagano due volte, ed è per questo che la quota p decide tutto.

Dove andare dopo#

Se non sei sicuro di quale modello debba fare il primo passaggio, MiniMax-M2.7 vs DeepSeek-V4-Flash li confronta per attività. Per una vista per attività invece che per token, vedi prezzo per 1M token vs costo per attività, e per loop con molti passaggi, come stimare il costo di un agente AI. I prezzi live per ogni modello sono sulla pagina dei prezzi, e le pagine dei modelli sono DeepSeek e GLM.