Zmiana modelu w trakcie sesji nic nie kosztuje

· 3 min czytania

I jest to decyzja projektowa, a nie funkcja. Większość narzędzi dla agentów pisze się pod jednego dostawcę, a do pozostałych dostosowuje później. Ta kolejność brzmi jak szczegół implementacyjny. Tymczasem to sedno sprawy.

Dostosowywanie po fakcie oznacza, że zanim pojawi się drugi dostawca, założenia pierwszego już coś podtrzymują. Siedzą w magazynie rozmów, w tym, jak reprezentowane jest wywołanie narzędzia, w tym, jak parsowana jest strumieniowana odpowiedź — a to miejsca, do których rok później nikt nie pomyśli zajrzeć. Widać tylko objaw: zmiana dostawcy oznacza migrację, a migracja w środku sesji oznacza, że dostawcy się nie zmienia.

Gdzie ukrywa się założenie

Oczywistym miejscem do szukania jest wywołanie HTTP i to oczywiste miejsce jest złe. Endpointy dowolnych dwóch dostawców dzieli weekend pracy. Kosztowne jest to, co zrobiłeś z odpowiedzią.

Weźmy jeden szczegół. Większość dostawców identyfikuje wynik narzędzia po id wywołania, które go wytworzyło. Gemini identyfikuje go po nazwie funkcji. Jeśli twój magazyn rozmów przechowuje wyniki narzędzi tak, jak opisał je dostawca A, to obsługa Gemini nie jest nowym klientem HTTP — jest zmianą kształtu, w którym zapisana jest już każda transkrypcja, jaką kiedykolwiek utworzyłeś.

To cały problem w miniaturze. Żaden adapter tego nie naprawi, bo informacja została wyrzucona w chwili zapisu.

Neutralna historia

Alternatywą jest zdecydowanie, zanim powstanie pierwszy dostawca, że historia nie należy do żadnego z nich.

OHarness przechowuje transkrypcje sesji w kształcie zdefiniowanym przez silnik (packages/engine/src/core/types.ts), a nie w formacie któregokolwiek dostawcy. Wynik narzędzia niesie toolName oraz toolCallId — nie dlatego, że silnik potrzebuje obu, lecz dlatego, że Gemini potrzebuje nazwy, wszyscy pozostali potrzebują id, a forma neutralna musi dać się przełożyć na każdą z nich.

Format przesyłowy dostawcy powstaje w chwili wysłania żądania i jest odrzucany, gdy odpowiedź zostaje z powrotem wchłonięta. Nic nie jest w nim utrwalane.

Dlatego zmiana dostawcy w trakcie sesji niczego nie konwertuje. Nie dlatego, że konwersja jest szybka, lecz dlatego, że nie ma starego kształtu, z którego trzeba by konwertować.

Co to konkretnie daje

Model to coś, co ma cennik, przepustowość, limit zapytań i gorszy tydzień. Gdy to cudze decyzje, a ty masz jeden model, stają się one twoimi decyzjami. Sensem wymiennego backendu nie jest nowość — chodzi o to, by dzień, w którym dostawca zmienia warunki, był dniem, w którym możesz mieć własne zdanie.

To sprawia też, że działa nudny przypadek. Szkic robisz czymś tanim, na trudną część przełączasz się na coś drogiego, a gdy sieć szwankuje albo kod nie powinien opuszczać budynku, schodzisz do modelu na własnej maszynie. To wciąż ta sama sesja.

Część, która nie jest darmowa

Uczciwie o kompromisie: neutralny format to zobowiązanie. Każda możliwość, która różni się między dostawcami — nakład rozumowania, cache’owanie promptów, równoległe wywołania narzędzi, obsługa obrazów — musi być wyrażona jako flaga modelu, a nie zakładana na podstawie dostawcy, bo wysłanie złego kształtu kończy się błędem 400, a nie gorszą odpowiedzią. To realny koszt, ponoszony raz, w miejscu, w którym jest widoczny.

Alternatywą jest płacenie go wielokrotnie, po omacku, przez całe życie projektu.


OHarness to harness agenta open source na licencji MIT. Rozmawia natywnie z Anthropic, OpenAI i Google Gemini, z dowolnym endpointem zgodnym z OpenAI oraz z lokalnymi środowiskami uruchomieniowymi, takimi jak Ollama, LM Studio i vLLM. Dokumentacja architektury opisuje, jak warstwowość jest egzekwowana, a nie tylko zamierzona, a strona czym jest harness agenta omawia szerszy kontekst.