Att byta modell mitt i en session kostar ingenting
· 3 min läsning
Och det är ett designbeslut, inte en funktion. De flesta agentverktyg skrivs mot en leverantör och anpassas till andra i efterhand. Ordningen låter som en implementationsdetalj. Den är hela saken.
Att anpassa i efterhand betyder att den första leverantörens antaganden redan bär vikt när den andra kommer. De finns i konversationslagringen, i hur ett verktygsanrop representeras, i hur ett strömmat svar tolkas — och inget av det är ställen någon tänker på att titta ett år senare. Det du märker är bara symptomet: att byta leverantör innebär en migrering, och en migrering mitt i en session betyder att du inte byter leverantör.
Där antagandet gömmer sig
Det självklara stället att leta på är HTTP-anropet, och det självklara stället är fel. Två leverantörers endpoints skiljer sig åt med en helgs arbete. Det dyra är vad du gjorde med svaret.
Ta en detalj. De flesta leverantörer kopplar ett verktygsresultat till id:t för anropet som gav upphov till det. Gemini kopplar det till funktionens namn. Om din konversationslagring håller verktygsresultat så som leverantör A beskrev dem, är stöd för Gemini inte en ny HTTP-klient — det är en ändring av den form som varje transkript du någonsin har skrivit redan har.
Det är hela problemet i miniatyr. Det finns ingen adapter som löser det, eftersom informationen kastades bort när den skrevs.
Neutral historik
Alternativet är att bestämma, innan den första leverantören skrivs, att historiken inte tillhör någon av dem.
OHarness lagrar sessionstranskript i en form som definieras av motorn (packages/engine/src/core/types.ts), inte i någon leverantörs format. Ett verktygsresultat bär toolName såväl som toolCallId — inte för att motorn behöver båda, utan för att Gemini behöver namnet och alla andra behöver id:t, och den neutrala formen måste kunna återges i båda.
En leverantörs trådformat skapas i samma ögonblick som en förfrågan skickas och kastas när svaret har förts tillbaka in. Ingenting sparas i det.
Att byta leverantör mitt i en session konverterar alltså ingenting. Inte för att konverteringen går snabbt, utan för att det inte finns någon gammal form att konvertera från.
Vad det ger, konkret
En modell är något med prissättning, kapacitet, en anropsgräns och en dålig vecka. När det är någon annans beslut och du bara har en modell, blir de dina beslut. Poängen med en utbytbar backend är inte nyhetens behag — det är att den dag en leverantör ändrar sina villkor är en dag du kan ha en åsikt om.
Det får också det tråkiga fallet att fungera. Skissa med något billigt, byt till något dyrt för den svåra delen, gå ner till en modell på din egen dator när nätverket är dåligt eller koden inte ska lämna huset. Det är samma session.
Den del som inte är gratis
Ärligt om avvägningen: det neutrala formatet är ett åtagande. Varje förmåga som skiljer sig mellan leverantörer — resonemangsnivå, prompt-cachning, parallella verktygsanrop, bildstöd — måste uttryckas som en flagga på modellen i stället för att antas utifrån leverantören, eftersom fel form ger ett 400-fel snarare än ett sämre svar. Det är en verklig kostnad, betald en gång, på ett ställe där den syns.
Alternativet är att betala den gång på gång, i mörker, så länge projektet lever.
OHarness är en agent-harness med öppen källkod, MIT-licensierad. Den talar direkt med Anthropic, OpenAI och Google Gemini, med alla OpenAI-kompatibla endpoints och med lokala körtider som Ollama, LM Studio och vLLM. Arkitekturreferensen beskriver hur skiktningen upprätthålls i stället för att bara vara avsedd, och vad en agent-harness är tar upp den bakomliggande idén.