Cambiare modello a metà sessione non costa nulla

· 3 min di lettura

Ed è una scelta di progettazione, non una funzionalità. La maggior parte degli strumenti per agenti nasce attorno a un solo fornitore e viene adattata agli altri in un secondo momento. L'ordine sembra un dettaglio di implementazione. È tutto.

Adattare dopo significa che, quando arriva il secondo fornitore, le ipotesi del primo sono già portanti. Stanno nell'archivio delle conversazioni, nel modo in cui è rappresentata una chiamata di strumenti, nel modo in cui viene analizzata una risposta in streaming — e nessuno di questi è un posto in cui qualcuno pensa di guardare un anno dopo. Ciò che noti è solo il sintomo: cambiare fornitore significa una migrazione, e una migrazione a metà sessione significa che il fornitore non lo cambi.

Dove si nasconde l'ipotesi

Il posto ovvio in cui guardare è la chiamata HTTP, e il posto ovvio è quello sbagliato. Gli endpoint di due fornitori qualsiasi distano un weekend di lavoro. La parte costosa è quello che hai fatto con la risposta.

Prendi un dettaglio. La maggior parte dei fornitori indicizza il risultato di uno strumento con l'id della chiamata che lo ha prodotto. Gemini lo indicizza con il nome della funzione. Se il tuo archivio delle conversazioni conserva i risultati degli strumenti come li descriveva il fornitore A, supportare Gemini non è un nuovo client HTTP: è un cambiamento della forma in cui si trova già ogni trascrizione che tu abbia mai scritto.

È l'intero problema in miniatura. Non esiste un adattatore che lo risolva, perché l'informazione è stata scartata al momento della scrittura.

Una cronologia neutrale

L'alternativa è decidere, prima di scrivere il primo provider, che la cronologia non appartiene a nessuno di loro.

OHarness salva le trascrizioni delle sessioni in una forma definita dal motore (packages/engine/src/core/types.ts), non nel formato di un fornitore. Il risultato di uno strumento porta toolName oltre a toolCallId — non perché il motore abbia bisogno di entrambi, ma perché a Gemini serve il nome e a tutti gli altri l'id, e la forma neutrale deve potersi tradurre nell'uno o nell'altro.

Il formato di trasmissione di un fornitore viene prodotto nel momento in cui parte una richiesta e scartato quando la risposta viene reintegrata. Nulla viene conservato in quel formato.

Quindi cambiare fornitore a metà sessione non converte nulla. Non perché la conversione sia veloce, ma perché non esiste una vecchia forma da cui convertire.

Cosa ottieni, in concreto

Un modello è una cosa con un prezzo, una capacità, un limite di frequenza e una brutta settimana. Quando queste sono decisioni di qualcun altro e hai un solo modello, diventano decisioni tue. Il senso di un backend sostituibile non è la novità: è che il giorno in cui un fornitore cambia le sue condizioni è un giorno su cui puoi avere un'opinione.

Fa funzionare anche il caso noioso. Fai la bozza con qualcosa di economico, passa a qualcosa di costoso per la parte difficile, scendi a un modello sulla tua macchina quando la rete è scarsa o il codice non deve uscire dall'edificio. È la stessa sessione.

La parte che non è gratis

Onestà sul compromesso: il formato neutrale è un impegno. Ogni capacità che varia tra fornitori — sforzo di ragionamento, prompt caching, chiamate di strumenti in parallelo, supporto per le immagini — va espressa come flag sul modello invece di essere dedotta dal provider, perché inviare la forma sbagliata produce un 400, non una risposta degradata. È un costo reale, pagato una volta, in un posto in cui è visibile.

L'alternativa è pagarlo più volte, al buio, per tutta la vita del progetto.


OHarness è un harness per agenti open source, con licenza MIT. Parla in modo nativo con Anthropic, OpenAI e Google Gemini, con qualsiasi endpoint compatibile con OpenAI e con runtime locali come Ollama, LM Studio e vLLM. Il riferimento sull'architettura descrive come la stratificazione venga imposta e non solo dichiarata, e cos'è un harness per agenti tratta l'idea di fondo.