Pensavo di essere stato furbo. Avevo scritto una funzione helper che riservava esattamente il trenta per cento della finestra di contesto come budget di pensiero per la nostra pipeline AI. Era pulita, prevedibile e funzionava magnificamente su Opus 4.5. Poi sono passato a Opus 4.8 e ogni singola richiesta è fallita con un errore 400. I miei calcoli accurati sui token si erano trasformati in spazzatura da una notte all'altra.
Il vecchio schema era semplice. Impostavi un valore budget_tokens e il modello razionava il suo pensiero per rientrare in quel limite. Se fornivo un contesto da 128K, il mio codice ritagliava circa 38.000 token per il ragionamento e lasciava il resto per la risposta. Mi sembrava un approccio responsabile. Come mantenere un'auto sotto il limite di velocità.
Quel modello è sparito. Le nuove versioni come Opus 4.7 e 4.8 utilizzano il pensiero adattivo. Non si sceglie più un numero. Al suo posto, si passa un livello di sforzo (effort). Sembra solo un cambio di nome, ma i due controlli non potrebbero essere più diversi. budget_tokens stabiliva un tetto massimo rigido su quanto il modello fosse autorizzato a pensare. L'effort controlla come il modello pensa e agisce fin dall'inizio. Uno è il contatore di una pompa di benzina. L'altro è la mappa del motore.
Mappare l'effort al lavoro reale
Quando il controllo è cambiato, la mia vecchia intuizione ha smesso di funzionare. Ho dovuto imparare di nuovo cosa acquista effettivamente ogni impostazione. Ho eseguito dei test sul nostro traffico interno per capire dove si colloca ogni livello di effort nella pratica.
La classificazione e l'instradamento dovrebbero quasi sempre utilizzare un effort low. Questi compiti sono decisioni rapide. Questa è una richiesta di rimborso o una domanda commerciale? Questa voce di log necessita di un'escalation? Non serve un monologo. Un effort basso mantiene bassa la latenza e rende il costo quasi irrilevante.
La maggior parte del traffico delle app, ovvero il lavoro quotidiano di riassunti, riscritture, risposte di supporto ed estrazione di contenuti, si adatta a un effort da medium a high. Questo è il punto di equilibrio. Il modello ha abbastanza spazio per risolvere ambiguità reali senza sprecare token in un compito che non richiede una catena di pensiero estesa.
Il coding e i loop agentici richiedono un effort xhigh. È qui che gli errori si accumulano. Se il modello scrive un piano errato al primo turno di un loop di tool-calling, passerà i successivi tre passaggi a riparare il danno. O peggio, chiamerà gli strumenti sbagliati, allucinerà parametri e lascerà l'utente a fissare un workflow interrotto. Un ragionamento migliore all'inizio previene questa spirale.
I task critici dovrebbero ricevere l'effort max. Non usarlo per tutto. Riservalo per i momenti in cui una risposta errata costa più di qualsiasi bolletta per i token. Riconciliazioni finanziarie, controlli di sicurezza, decisioni architettoniche e triage medico sono i casi ideali. Se un errore significa che un essere umano deve districare il caos per ore, paga per il pensiero extra.
La sorpresa dei costi
Ecco la parte che ha mandato in frantumi il mio modello mentale. Presupponevo che l'effort massimo avrebbe sempre fatto lievitare i costi. In un singolo turno, succede. La traccia di ragionamento è più lunga. Ma nei task agentici multi-step, il costo totale spesso è diminuito.
Il modello pianifica meglio al primo tentativo. Effettua meno chiamate di strumenti. Impedisce a se stesso di vagare in vicoli ciechi. Ho osservato un agente di estrazione dati che normalmente richiedeva cinque scambi avanti e indietro finire in due, perché il modello aveva abbastanza spazio di ragionamento per analizzare correttamente lo schema all'inizio. Quando misuri il costo, guarda il completamento del lavoro, non la singola richiesta. Un budget di pensiero più ampio per ogni passaggio può significare meno passaggi complessivi.
Come migrare senza rompere tutto il resto
Se hai ancora budget_tokens nel tuo codice, ecco il percorso esatto per uscirne. Non saltare i passaggi tre e cinque. Io l'ho fatto, e mi è costato un pomeriggio di debugging.
Cerca budget_tokens nel tuo codice. Ogni istanza deve essere rimossa. Questo parametro è obsoleto sui nuovi modelli e causerà un errore 400.
Sostituisci l'oggetto budget con un blocco di thinking adattivo. Usa thinking: { type: "adaptive" }.
Aggiungi output_config con un livello di effort esplicito per ogni chiamata. Non lasciarlo a un default globale se il tuo traffico è misto. Il tuo endpoint di classificazione leggero non dovrebbe ereditare accidentalmente la stessa impostazione di effort del tuo agente di coding. Sii esplicito nel punto in cui effettui la chiamata.
Elimina il tuo helper per il calcolo del budget. Lo so. Probabilmente ha dei test unitari. Anche il mio li aveva. Ma ora è un peso morto. La piattaforma non vuole i tuoi calcoli sui token. Il modello gestisce il proprio ritmo.
Rimuovi temperature, top_p e top_k. Su Opus 4.7 e 4.8, questi parametri di campionamento genereranno errori 400. La piattaforma li ha rimossi da questa generazione. I tuoi vecchi trucchi per la regolazione della temperatura non sono applicabili qui, e lasciarli attivi comprometterà silenziosamente la tua migrazione.
Testa ogni modello individualmente. Opus 4.5 e 4.8 sono mondi diversi. Una configurazione che funziona su uno non funzionerà necessariamente sull'altro. Se supporti più versioni, crea dei rami nella tua logica o trattale come backend separati.
Risolvere il blocco dell'interfaccia utente
C'è un comportamento dello streaming che confonderà i tuoi utenti se non lo gestisci. Sui nuovi modelli, i blocchi di pensiero vengono trasmessi via streaming, ma il testo è vuoto per impostazione predefinita. Nella tua interfaccia, questo sembrerà una lunga e imbarazzante pausa senza alcun progresso visibile. Gli utenti penseranno che l'app si sia bloccata.
Per risolvere il problema, passa thinking: { type: "adaptive", display: "summarized" }. Questo ti permetterà di avere un indicatore di progresso visibile senza scaricare l'intero flusso di pensieri grezzi nella finestra della chat. Il tuo frontend rimarrà reattivo e i tuoi utenti sapranno che sta succedendo qualcosa "sotto il cofano".
La vera lezione
Ho costruito un intero livello di astrazione sopra un parametro che il fornitore non aveva mai intenzione di mantenere a lungo. Ho racchiuso le loro impostazioni nella mia logica perché pensavo di comprendere il compromesso meglio della piattaforma. Non era così. Il "thinking" adattivo è una soluzione migliore perché il modello decide effettivamente quando ha bisogno di ragionare intensamente e quando può procedere senza sforzo. Il mio codebase ora è più piccolo. I risultati sono diventati più precisi. A volte, la mossa ingegneristica corretta è eliminare il codice troppo astuto e lasciare che la piattaforma faccia il suo lavoro.
Se vuoi leggere le note di migrazione originali, puoi trovarle qui. Per ulteriori discussioni pratiche come questa, unisciti alla community di GyaanSetu AI su Telegram.
