Vorige maand kreeg ik een klus: een team dat een SaaS-ticketsysteem bouwt helpen bij het opzetten van een prototype voor intelligente klantenservice, dat binnen een week moest werken, en waarbij de antwoordkwaliteit van DeepSeek, Qwen, Doubao en GPT-4o horizontaal vergeleken moest worden. Hun hele bedrijfsvoering draait op Tencent Cloud CVM, met containers op TKE, dus alle aanroepen moesten vanuit de cloud worden gedaan. Ik dacht in eerste instantie: hoe moeilijk kan het zijn om een API aan te sluiten? Maar na een week bleken er meer valkuilen te zijn dan ik had gedacht.
Eerst een conclusie: Als je Tencent Cloud-business meer dan twee grote modellen moet aansluiten, schrijf dan niet direct tegen de officiële SDK's van elke aanbieder, maar bouw eerst een AI API-aggregatielaag. Dat is geen luiheid, dat is je leven redden. Hieronder vertel ik het in de volgorde waarin ik de valkuilen tegenkwam.
Key-beheer: hardcode geen 6 Keys in omgevingsvariabelen
Wat ik de eerste dag deed was behoorlijk dom: ik stopte de Keys van alle vier de platforms in de omgevingsvariabelen van de CVM, en de code las ze direct via os.environ. Dat werkte prima, maar diezelfde middag ging het mis: een tester wilde een Qwen Key vervangen voor een stresstest, ik wijzigde de configuratie en herstartte de container, en daarbij herstartte ik ook de productie-instantie.
Het probleem was dat Keys en bedrijfsconfiguratie door elkaar liepen, zonder centraal beheer. Later bracht ik alle Keys onder in een aparte configuratiedienst, getagd op twee dimensies: "platform + doel", bijvoorbeeld deepseek-prod, qwen-test. De aanroeper krijgt alleen een logische naam en raakt de echte Key niet aan. Nadat dit klaar was, hoefde ik voor het wisselen van een Key niet meer aan de bedrijfscode te komen en ook niet de bedrijfscontainer te herstarten.
Als je dit niet zelf wilt onderhouden, is een aggregatieplatform gemakkelijker. In ons project gebruikten we later token8341: met één Key kun je GPT-4o, Claude, Gemini, DeepSeek, Qwen, ERNIE, Doubao en andere populaire modellen aanroepen. Key-rotatie en quotumbeheer zitten aan de platformkant, en de service op Tencent Cloud hoeft maar één credential te onderhouden. Dit is vooral handig voor scenario's zoals multi-model vergelijkingstests, want het scheelt vier sets authenticatielogica.
SDK-compatibiliteit: vier aanbieders, vier manieren van schrijven, onderhoudskosten exploderen
De tweede dag begon ik met het schrijven van de aanroepcode, en dat was het echt vervelende deel. DeepSeek en GPT-4o zijn beide compatibel met de OpenAI SDK; je wijzigt de base_url en kunt wisselen, dat deel liep soepel. Maar de SDK van Qwen gebruikt andere parameternamen, de authenticatie van Doubao gaat via AK/SK-signaturen in plaats van Bearer Token, en de interface van ERNIE heeft weer zijn eigen authenticatieproces.
Het symptoom was heel concreet: ik schreef één uniforme chat-functie, maar die zat vol if-constructies: if platform == 'doubao' dan deze tak, elif platform == 'qwen' dan die tak. De functie groeide naar 200 regels en de testdekking kwam nog steeds niet omhoog.
De oplossing was het introduceren van een AI API-gateway voor protocolconversie. De gateway biedt intern één OpenAI-compatibele interface aan en vertaalt extern verzoeken naar het formaat dat elke aanbieder begrijpt. Zo heeft de bedrijfscode maar één SDK, en voor een nieuw model hoeft alleen aan de gateway-kant een adapter te worden toegevoegd, zonder wijzigingen aan de bedrijfskant. We hebben zelf een versie gebouwd, maar ontdekten later dat een bestaande aggregatieservice sneller is. Platformen zoals token8341 doen precies dit: compatibel met de OpenAI SDK, één regel base_url wijzigen en je kunt van model wisselen.
Streaming output: SSE-formaten verschillen echt per aanbieder
De derde dag werkte ik aan streaming output; de frontend moest teken voor teken tonen. Het SSE-protocol zelf is standaard, maar de structuur van het data-veld verschilt per aanbieder. Bij OpenAI-achtige aanbieders bevat de delta een content-veld, Qwen gebruikt een andere veldnaam, en Doubao voegt af en toe een heartbeat-pakket midden in de stream toe; de frontend krijgt een lege delta en geeft direct een fout.
Het symptoom was dat de frontend af en toe bleef hangen, of plotseling een lege berichtbel verscheen. Na lang zoeken bleek het te komen doordat het heartbeat-pakket niet werd gefilterd.
De uniforme aanpak is normalisatie op de gateway-laag: alle streaming-antwoorden van alle platformen omzetten naar het OpenAI chunk-formaat, heartbeat-pakketten gewoon weggooien, en aan de bedrijfskant slechts één structuur verwerken. Doe je dit niet, dan moet de frontend vier sets parsing-logica schrijven, en bij elke wijziging huil je.
Foutafhandeling: als de ene partij een timeout heeft, moet er automatisch gewisseld kunnen worden
De vierde dag deed ik stresstests; DeepSeek had af en toe een timeout en het hele gesprek liep vast. In een scenario als intelligente klantenservice sluit de gebruiker de pagina basically als er binnen drie seconden geen reactie komt; je kunt niet blijven wachten.
Ik voegde een degradatielaag toe: als de hoofdmodelaanroep niet binnen de ingestelde drempel terugkomt, automatisch overschakelen naar een reservemodel, en deze mislukking vastleggen. De sleutel hier is dat degradatie onmerkbaar moet zijn; de gebruiker mag de overschakeling niet merken. Voor grote-model-routing hebben aggregatieplatformen meestal ingebouwde failover. Uit onze tests bleek de automatische omschakeling van token8341 redelijk stabiel: bij een timeout van het hoofdmodel wordt stil overgeschakeld naar een alternatief, zonder dat de bedrijfscode retry-logica hoeft te schrijven.
Een waarschuwing: schakel niet blindelings terug. Je moet onderscheid maken tussen een netwerktimeout en een fout die het model zelf teruggeeft. Bij het eerste kun je wisselen, bij het tweede is wisselen zinloos en verspil je alleen Tokens.
Kostenmonitoring: als Token-verbruik niet wordt samengebracht, kloppen de cijfers aan het einde van de maand niet
De laatste dag deed ik kostenstatistieken en ontdekte dat de facturen van de vier platformen vier aparte facturen waren, nog in verschillende formaten ook: sommige rekenen per Token, andere per aanroep, en ze zijn totaal niet horizontaal te vergelijken. Toen de baas vroeg "welk model heeft de beste prijs-kwaliteitverhouding", kon ik geen uniform cijfer geven.
De oplossing is uniforme administratie op de gateway-laag: bij elke aanroep modelnaam, input-Tokens, output-Tokens en looptijd vastleggen, in één tabel. Zo kun je rapporten maken per dag, per model en per bedrijfslijn. Aggregatieplatformen hebben meestal een ingebouwd gebruiksdashboard; onder een pay-as-you-go-model is kostenaggregatie een stuk eenvoudiger. Vergeleken daarmee is bij de route van bulkinkoop plus kostenverlaging door groene energie de kosten per Token inderdaad iets lager dan bij directe aankoop via de officiële kanalen, wat cruciaal is voor klantenservice-scenario's met groot volume.
Een paar lessen na een week
Bij het aansluiten van grote modellen op Tencent Cloud gaat het nooit om "hoe krijg ik één model aan de praat", maar om "hoe laat ik zes modellen als één persoon werken". Key-beheer, protocolcompatibiliteit, streaming-normalisatie, foutdegradatie en kostenaggregatie: als één van deze vijf dingen niet goed is gedaan, overleeft het prototype de stresstest niet.
Een aggregatielaag bouwen is de meest kosteneffectieve keuze. Zelf schrijven kan, een bestaande AI API-aggregatieservice gebruiken kan ook; het belangrijkste is dat de bedrijfscode niet direct wordt geconfronteerd met de verschillen tussen zes leveranciers. Platformen zoals SiliconFlow richten zich juist op groene rekenkracht en prioriteit voor binnenlandse modellen; containers op Tencent Cloud kunnen ze direct aanroepen, en de netwerklatentie is een stuk lager dan via een overzeese tussenstap. Dat was een van de redenen waarom we er uiteindelijk voor kozen.
Op de dag dat het prototype klaar was, zei de tester iets dat me bijbleef: "Het blijkt dat grote modellen aansluiten niet betekent API's aansluiten, maar een governance-systeem aansluiten." Dat klopt.
Auteur: Chen Jingxing
Publicatiedatum: 6 oktober 2026