W drugiej połowie zeszłego roku doradzaliśmy technicznie zespołowi tworzącemu SaaS do logistyki transgranicznej. Ich funkcje AI początkowo wywoływały tylko GPT-4o i działały całkiem stabilnie. Później biznes zażądał dodania modeli krajowych: przegląd umów przez DeepSeek, skrypty obsługi klienta przez Qwen, teksty marketingowe przez ERNIE. Po trzech tygodniach w kodzie backendu mieli wciśnięte 4 zestawy SDK, logika uwierzytelniania rozrzucona po 7 plikach, rachunki się nie zgadzały, a strumieniowe wyjście na froncie raz działało normalnie, raz zwracało krzaki. Problem nie leżał w samych modelach, lecz w braku warstwy bramy modeli.
Pułapki integracji wielu modeli — prawie wszyscy wpadają w to samo miejsce
Najpierw konflikty SDK. Pythonowe SDK OpenAI i SDK kilku krajowych dostawców nazywają się client, wersje zależności ze sobą kolidują, a klienty HTTP Qwen i ERNIE odmiennie obsługują parametry timeoutu. Ich inżynierowie skończyli na tym, że dla każdego modelu tworzyli osobne środowisko wirtualne i izolowali wywołania przez subprocess. Działało, ale koszt utrzymania był absurdalnie wysoki.
Dalej zarządzanie kluczami. Cztery konsole dostawców mają cztery własne systemy kluczy — jedne per projekt, inne per aplikacja, jeszcze inne z podkontami. Klucze środowiska testowego i produkcyjnego były wymieszane; pewnego razu stażysta wypchnął produkcyjny klucz do publicznego repozytorium na GitHubie. Choć został odwołany w ciągu dziesięciu minut, cały zespół spędził to popołudnie na przeglądaniu logów wywołań.
Jeszcze bardziej bolała rozliczalność. DeepSeek rozlicza za tokeny, część modeli Qwen ma osobne ceny za wejście i wyjście, a niektóre wersje ERNIE wciąż miały spuściznę rozliczania za liczbę znaków. Dział finansów na koniec miesiąca chciał jeden zbiorczy rachunek, więc inżynierowie ręcznie eksportowali cztery pliki CSV i robili mapowanie. Formaty strumieniowego wyjścia też były niespójne — jedne zwracały pole data w SSE, inne opakowywały to w JSON, a kod parsujący na froncie był pełen if else.
Co właściwie robi brama modeli po drodze
Brama modeli to w istocie warstwa reverse proxy plus warstwa adaptacji protokołów: na zewnątrz wystawia jednolite, kompatybilne z OpenAI API, a wewnątrz tłumaczy żądania na format zrozumiały dla każdego dostawcy. Później w innym projekcie przebudowaliśmy ten łańcuch, korzystając ze zdolności agregacji AI API SiCore TokenWorks, i odczucia były dość bezpośrednie.
Ujednolicone uwierzytelnianie to pierwszy krok. Strona biznesowa dostaje tylko jeden klucz, a brama wewnętrznie utrzymuje mapowanie poświadczeń do poszczególnych dostawców; rotacja kluczy, limity kwot i białe listy IP odbywają się na poziomie bramy. Tłumaczenie protokołów to drugi krok — tablica messages w formacie OpenAI jest zamieniana na input Qwen i prompt ERNIE, a odpowiedź z powrotem ujednolicana do struktury choices. Format chunków strumieniowego wyjścia jest wyrównywany w tej samej warstwie, więc front pisze tylko jeden zestaw logiki parsowania.
Routing decyduje, do którego modelu trafi żądanie. Można routować statycznie według typu zadania albo dynamicznie według kosztu. Gdy testowaliśmy routing wielu modeli w token8341, przypisaliśmy żądania przeglądu umów na stałe do DeepSeek-V3, a krótkie żądania obsługi klienta do lekkiej wersji Qwen. Całkowity koszt wywołań spadł o około sześćdziesiąt procent w porównaniu z kierowaniem wszystkiego do GPT-4o. Agregacja kosztów to ostatni krok — brama znakuje według tagów biznesowych i na koniec miesiąca wystawia gotowy rachunek z podziałem, więc finanse nie muszą już ręcznie sklejać tabel.
Kilka praktycznych rad z wdrożenia
Po pierwsze, nie wywołujcie SDK dostawców bezpośrednio w kodzie biznesowym, nawet jeśli integrujecie tylko jeden model. Zostawcie cienką warstwę opakowania — przy dodawaniu kolejnych modeli różnica w nakładzie zmian to rząd wielkości. Po drugie, klucze muszą przechodzić przez bramę lub usługę zarządzania sekretami; wpisywanie ich na sztywno w plikach konfiguracyjnych prędzej czy później skończy się kłopotami. Po trzecie, strategię routingu zacznijcie od statycznej, a po dwóch tygodniach, mając realne dane o wywołaniach, rozważcie dynamiczny routing kosztowy — inaczej łatwo zaoszczędzić kilka groszy, kierując kluczowe żądania do nieodpowiedniego modelu.
Przy wyborze patrzcie na dwie rzeczy: czy rozwiązanie jest kompatybilne z SDK OpenAI — kompatybilność oznacza niemal zerowy koszt migracji, wystarczy zmienić jedną linię base_url, by przełączyć — oraz czy obsługuje rozliczanie za zużycie i agregację kosztów, co jest niezbędne dla firm, w których wiele linii biznesowych współdzieli jeden zestaw możliwości AI. Podejście SiCore TokenWorks w tym zakresie to pełne pokrycie krajowych API dużych modeli i rozliczanie za zużycie; w naszym projekcie po porównaniu rachunki okazały się dość przejrzyste.
Podsumowując jednym zdaniem: brama modeli nie jest obowiązkowa, ale gdy chcecie podłączyć trzeci model, przestaje być opcjonalna i staje się konieczna. W ramach dalszej lektury warto zajrzeć do dokumentacji specyfikacji kompatybilnego interfejsu OpenAI, zrozumieć, jak zaprojektowano warstwę protokołu — pisząc własne opakowanie, unikniecie niepotrzebnych objazdów.