KennisbankAI

Overstappen op een OpenAI-compatibele API: wat er echt verandert

9 oktober 20267 min leestijd

De belofte van een OpenAI-compatibele API is eenvoudig: wijzig de base_url, wijzig de modelnaam, en je applicatie praat met een ander model. Dat klopt, voor de eerste aanroep. De API-vorm is inmiddels de standaard waar bijna elk open model achter zit, ook de modellen op onze inference-omgeving. De misvatting is dat compatibel op de API-laag hetzelfde is als uitwisselbaar in gedrag. Het eerste is een kwestie van twee regels; het tweede is werk. Dit artikel gaat over waar de grens ligt.

Wat er echt verandert in de code

De officiële client-library en de meeste frameworks die erop bouwen, accepteren een eigen endpoint. In Python komt een overstap hierop neer:

import os
from openai import OpenAI

client = OpenAI(
    base_url=os.environ["INFERENCE_BASE_URL"],  # voorheen de standaard van OpenAI
    api_key=os.environ["INFERENCE_API_KEY"],
)

response = client.chat.completions.create(
    model=os.environ.get("INFERENCE_MODEL", "mistral-small-3.2-24b"),
    messages=[
        {"role": "system", "content": "Je antwoordt kort en in het Nederlands."},
        {"role": "user", "content": "Vat deze storingsmelding samen: ..."},
    ],
    temperature=0.2,
)

print(response.choices[0].message.content)

Endpoint, sleutel en modelnaam staan hier in configuratie, niet in de code. Dat is het eerste wat je bij een overstap regelt, want het is ook wat je de volgende keer weer nodig hebt. Wie base_url letterlijk in een service heeft staan, maakt van elke modelwissel een release.

/v1/chat/completions is het endpoint dat de serving-stack van bijna elk open model aanbiedt. Streaming, een systeemprompt, temperature en max_tokens werken zoals je gewend bent. Tot zover de twee regels.

Waar de compatibiliteit ophoudt

Compatibel betekent: dezelfde vorm van request en response. Het betekent niet dat elke parameter iets doet, of hetzelfde doet.

  • Modelspecifieke parameters — opties die aan één leverancier hangen, zoals een instelling voor hoeveel een model mag "nadenken", bepaalde output-formaten of velden voor opgeslagen conversaties, worden door een ander model genegeerd of geweigerd. Een genegeerde parameter is de vervelendste van de twee: je krijgt antwoord, maar niet het antwoord dat je dacht te configureren.
  • Contextvenster — elk model heeft een eigen maximum aan tokens per gesprek, en de serving-stack kan dat verder begrenzen om geheugen vrij te houden voor meer gelijktijdige gebruikers. Een pipeline die een heel document in één prompt stopt, moet opnieuw worden doorgemeten tegen het nieuwe maximum.
  • Tokenizer — elk model telt anders. Nederlands kost ruwweg 1,3 tot 1,6 tokens per woord, afhankelijk van de tokenizer. Een limiet die je in tokens hebt vastgelegd, betekent bij het nieuwe model een ander aantal woorden.
  • Tool calling — het formaat is gestandaardiseerd; de kwaliteit niet. Of een model de juiste functie kiest, de argumenten correct vult en niet zelf een functie verzint, verschilt per model en per formulering van je tool-definities. Dit is de plek waar overstappers het vaakst stuklopen.
  • Gestructureerde output — JSON-modus bestaat bij de meeste open modellen, maar hoe strikt een schema wordt afgedwongen, hangt af van de serving-stack. Valideer de output zelf, ook als je dat eerder niet hoefde.

Geen van deze punten is een reden om niet over te stappen. Het zijn de punten die je op je lijst zet voordat je het doet.

Je prompts herijken

Een systeemprompt die maanden is bijgeschaafd op één model, is op dat model afgestemd, niet op de taak. Een ander model leest dezelfde instructies anders: het is korter of langer van stof, houdt zich strakker of losser aan het gevraagde formaat, en reageert anders op dezelfde temperature.

De enige manier om dat zichtbaar te maken is een evaluatieset: een paar dozijn echte prompts uit je toepassing met het antwoord dat je goed vindt. Draai die tegen het oude en het nieuwe model, naast elkaar, voordat je iets in productie zet. Zonder die set is "het werkt" een gevoel; met die set is het een getal. Dezelfde set gebruik je bij elke volgende modelwissel, en ook bij een nieuwe versie van hetzelfde model.

Dit is ook het moment om naar je prompts in het Nederlands te kijken. Hoe goed een model Nederlands kan, verschilt sterk; welke open modellen daarin uitblinken, staat in open modellen kiezen.

Bouw de weg terug meteen in

De reden om over te stappen is vaak dat je ergens wég wilt: van een leverancier buiten de EU, van een prijsmodel, van een API die zonder overleg verandert. Die reden geldt na de overstap net zo hard voor de nieuwe leverancier. Een overstap die je lock-in verplaatst in plaats van opheft, is maar half werk.

Drie dingen maken de weg terug kort:

  • Configuratie buiten de code — endpoint, sleutel en modelnaam als omgevingsvariabelen of secrets, nooit in de broncode.
  • Open gewichten onder een open-sourcelicentie — een model dat je bij ons draait onder Apache 2.0, kun je ook ergens anders draaien, inclusief op eigen hardware. Dat is het verschil met een gesloten model achter een API.
  • Je evaluatieset bewaren — die is je bewijs dat de volgende omgeving het ook doet.

De wetgever helpt een handje. Onder de Data Act moeten overstapkosten en egress-tarieven voor clouddiensten vanaf 12 januari 2027 nul zijn. Dat regelt de rekening bij vertrek; de technische uitwisselbaarheid regel je zelf, met de drie punten hierboven.

Overstappen naar Xyphen IT

Onze inference-API is OpenAI-compatibel en draait open modellen met een herkomstlabel; de endpoints, de ondersteunde parameters en de modellijst staan op de technische pagina. Wie zijn applicatie naast het model wil zetten, in plaats van erover het internet, kan dat met GPU-colocatie of gewone colocatie in hetzelfde datacenter, verbonden via een privé-VRF op onze EVPN-fabric. Bouwen we de applicatie zelf, dan zit de configuratie-discipline hierboven erin vanaf de eerste commit; dat is hoe we bij softwareontwikkeling werken.

Wil je weten wat jouw overstap aan werk is? Neem contact op of vraag een voorstel aan; stuur je evaluatieset mee, dan draaien we die tegen de modellen die we aanbieden.

Veelgestelde vragen

Veelgestelde vragen

Moet ik een andere client-library installeren?

Nee. De officiële OpenAI-client, en de meeste frameworks die erop bouwen, accepteren een eigen base_url. Je wijzigt het endpoint en de API-sleutel, kiest een andere modelnaam, en de rest van je code blijft staan. Wel wil je de endpoint-URL en de sleutel in configuratie zetten in plaats van in de code, zodat de volgende overstap geen release is.

Werkt tool calling hetzelfde op een open model?

Het formaat wel; de kwaliteit niet per se. Een open model geeft dezelfde JSON-structuur terug, maar of het de juiste functie kiest met de juiste argumenten verschilt per model en per promptformulering. Test je tool-definities daarom tegen het nieuwe model voordat je de overstap doorzet.

Hoe voorkom ik dat ik straks aan de nieuwe leverancier vastzit?

Door dezelfde discipline aan te houden die je voor de overstap hebt gebruikt. Houd endpoint, sleutel en modelnaam in configuratie, bewaar je evaluatieset en kies een model met open gewichten en een open-sourcelicentie. Dan kun je het elders draaien, inclusief bij jezelf.

Antwoord niet gevonden?

Stel je vraag direct aan een engineer — we reageren doorgaans binnen één werkdag.