Byg en AI API Billing Ledger: Offerér, reserver, afregn og afstem hvert modelkald
Et praktisk faktureringskontrolmønster for multi-model gateways: estimer omkostninger før en anmodning, reserver lejerbudget, normaliser udbyderbrug, afregn faktiske gebyrer og afstem fakturaer uden at stole på rå udbydersvar alene.
Kundevendt AI API-fakturering kan ikke være en månedlig eksport af rå udbyderbrug. Hvis en gateway eksponerer flere modeller for lejere, teams eller partnere, skal fakturering besvare et sværere spørgsmål, før fakturaen eksisterer: Skal denne anmodning tillades lige nu, og hvordan vil dens omkostninger blive forklaret senere?
Det praktiske mønster er en faktureringsbog med fire faser: citer, reserver, afregner og afstem. Angiv de sandsynlige omkostninger før anmodningen. Reserver tilstrækkeligt lejerbudget til at dække det tilladte værste tilfælde. Afregn de faktiske omkostninger, når brugen er kendt. Afstem gateway-reskontroen med udbydersideposter, så fakturaer forbliver forsvarlige.
Denne artikel beskriver kontrolsløjfen for en multi-model API-gateway. Det er nyttigt, om gatewayen fakturerer interne teams, forudbetalte kunder, bureaukunder eller downstream-partnere.
Faktureringsproblemet: udbyderbrug er ikke en kundefaktura
Faktum: store AI-udbydere afslører ikke én universel token-tæller eller én universel pris. OpenAI udgiver priser pr. model med separate input-, cachelagrede input- og outputtokenhastigheder. OpenAI-prompt-caching rapporterer cachelagret tokenbrug i API-svarbrugsfeltet. Antropiske dokumenter adskiller tællere for normale input-tokens, cache-oprettelse-input-tokens, cache-læse-input-tokens og output-tokens. Gemini-priser skelner mellem input, output og andre tokenkategorier, herunder modalitetsspecifik brug, såsom lydtokens.
Det betyder, at en gateway ikke kan fakturere sikkert ved at gange total_tokens med én pris. Den har brug for udbyderspecifikke adaptere bag et udbyderneutralt faktureringsskema.
Problemet bliver mere synligt i disse situationer:
- Forudbetalte kreditter: gatewayen skal afvise anmodninger, før lejeren bruger under nul.
- Partneropmærkninger: Partneren har brug for sin egen kundevendte faktura, ikke en kopi af udbyderens regning.
- Streaming: svaret begynder, før den endelige tokenbrug er kendt.
- Prompt caching: cachelagret input kan være billigere end ikke-cachelagret input, men kun hvis det måles separat.
- Begrundelse og brug af værktøj: nogle modeller viser yderligere brugsdimensioner, skjulte outputklasser eller medieenheder.
- Udbyderprisændringer: En faktura fra sidste måned skal stadig være reproducerbar efter ændring af en prisliste.
Anbefaling: Behandl fakturering som en finansiel hovedbog, der kun kan tilføjes, ikke som en dashboard-forespørgsel over anmodningslogfiler.
Kernearkitekturen
En pålidelig faktureringsarkitektur har seks komponenter:
- Lejerkonto: kunde, arbejdsområde, forhandlerklient eller internt omkostningscenter.
- Priskorttjeneste: versionerede priser for udbyder, model, faktureringsklasse, valuta og opmærkningsregel.
- Estimator: beregner et preflight-tilbud fra anmodningsparametre og modelpolitik.
- Reservationsbog: opbevarer budgettet, før udbyderopkaldet starter.
- Brugsnormalisering: konverterer udbyderspecifikke brugsfelter til interne faktureringsenheder.
- Afregnings- og afstemningsjob: færdiggør debiteringer og sammenlign dem med optegnelser på udbydersiden.
Kontrolflowet ser således ud:
klientanmodning
-> godkend lejer og nøgle
-> vælg model og priskortversion
-> estimeret input og max outputomkostninger
-> reservere lejersaldo
-> opkaldsudbyder
-> normaliser returneret brug
-> afregne faktiske omkostninger
-> frigiv ubrugt reservation
-> udsende faktura-klar finanshændelse
Det vigtige designvalg er, at anmodningen ikke blot overholdes. Det er økonomisk kontrolleret før og efter udførelse.
Trin 1: Giv tilbud før udbyderens opkald
Et præflight-tilbud skal være pessimistisk nok til at håndhæve budgetter, men forklareligt nok til at vise til kunder eller partnere.
Input inkluderer normalt:
- lejer-id og faktureringsplan;
- API-nøgle-id eller projekt-id;
- udbyder og model-id, efter at routingregler er anvendt;
- estimerede ikke-cachelagrede inputtokens;
- kendt cache-input-kvalificering, hvis tilgængelig;
max_tokens,max_output_tokenseller tilsvarende output cap;- værktøj, billede, lyd eller andre modalitetsparametre;
- regel for partneropmærkning, rabat eller forhandlerprissætning;
- valuta- og afrundingspolitik.
En simpel citatformel til tekstgenerering kan være:
estimated_cost =
estimated_uncached_input_tokens * input_rate
+ estimated_cached_input_tokens * cached_input_rate
+ max_output_tokens * output_rate+ request_fee
+ partner_markup
Anbefaling: Når den endelige outputlængde er ukendt, skal du reservere mod det konfigurerede maksimale output. Hvis applikationen lader outputloftet være ubegrænset, bør gatewayen anvende en lejer eller modelstandard. Budgethåndhævelse kan ikke være deterministisk, hvis der ikke er et maksimalt ansvar.
Dette kan afvise nogle anmodninger, der ville have været billige i praksis. Det er afvejningen. For forudbetalte systemer er den mere sikre standard pessimistisk reservation med ubrugte midler frigivet efter afregning. For fakturerede virksomhedskunder kan teams tillade bløde overskridelser og bruge tilbuddet primært til advarsler.
Trin 2: reserver lejerbudget
Reserveringen beskytter lejerkontoen mod at bruge mere end den tilladte saldo. Det skal være atomart: enten lykkes reservationen, og udbyderens opkald kan starte, eller anmodningen afvises, før der påløber nogen udbyderomkostninger.
En reservationspost kan omfatte:
Brug korte reservationsudløb for netværksfejl og klientafbrydelser. Et oprydningsjob bør frigive udløbne reservationer, der aldrig nåede forlig. Frigiv dog ikke en reservation, blot fordi klienten afbrød forbindelsen; udbyderens opkald kan stadig afsluttes og medføre omkostninger. Spor udbyderanmodningstilstand separat.
Anbefaling: Gør reservationen idempotent med anmodnings-id eller idempotensnøgle. Genforsøg fra klienter, gateways eller medarbejdere bør ikke skabe flere budgettilbageholdelser for den samme logiske anmodning.
Trin 3: Normaliser udbyderbrug
Udbydersvar bør konverteres til et lille internt skema. Hold det stabilt, selvom udbydere tilføjer nye brugsfelter.
Et praktisk normaliseret brugsskema:
Dette skema er med vilje ikke identisk med nogen udbyders svar. Den fanger de faktureringsdimensioner, som fakturaer har brug for, samtidig med at den bevarer flugtluger for udbyderspecifikke enheder.
Cachede tokens har brug for deres egen linje
Faktum: prompt-caching kan prissættes anderledes end ikke-cache-input. Hvis cachede tokens flettes til samlede input-tokens, kan kunden blive overopkrævet, eller gatewayen kan undervurdere udbyderens omkostninger. Cachelagt input skal vises som sin egen faktureringsklasse i både hovedbogen og fakturaen.
Cacheskrivning og cachelæsning er ikke altid det samme
Nogle udbydere skelner mellem oprettelse af cache-poster og læsning fra cache. Normalizeren bør ikke antage, at cachelagret input altid betyder én faktureringssats. Hvis en udbyder har cache-write-tokens og cache-read-tokens, skal du kortlægge dem separat eller bevare dem som udbyder-specifikke underenheder.
Ræsonnering og skjult output kræver en politik
Nogle modeller afslører ræsonnement-relateret brug eller skjulte outputtællere. Hvis udbyderen fakturerer for disse enheder, skal gatewayen beslutte, om de skal vises direkte, rulle dem ind i en outputkategori eller angive dem som en separat fakturalinje.
Anbefaling: Kundevendte fakturaer skal bruge almindeligt sprog. For eksempel: "reasoning output tokens" er tydeligere end et råt udbyderfeltnavn. Hold råfelter tilgængelige for revision, men tving ikke alle kunder til at forstå udbyderens interne oplysninger.
Trin 4: afregn faktiske omkostninger
Afregning konverterer normaliseret brug til endelige finansposteringer. Den skal kun være vedhæftet og henvise til den priskortversion, der er brugt til anmodningen.
En afgjort begivenhed kan se sådan ud:
Hvis anmodningen var reserveret til 0,032100 og afregnet til 0,010500, frigiver finansen 0,021600 tilbage til tilgængelig saldo.
Anbefaling: Genberegn aldrig gamle fakturalinjer fra den aktuelle pristabel. Gem uforanderlige priskortversioner og vedhæft versions-id'et til hver tilbuds-, reservations- og afregningsbegivenhed. Ellers kan en faktura blive umulig at reproducere, efter at en udbyder har opdateret modelpriserne.
Streaming-anmodninger: reserver først, afgør senere
Streaming komplicerer fakturering, fordi brugeren begynder at modtage output, før gatewayen kender den endelige brug. Svaret er ikke at springe forhåndstjek over. Gatewayen skal reserveres, før strømmen åbnes.
Brug denne arbejdsgang:
- Estimer inputtokens og maksimale outputomkostninger.
- Reserver lejerbudget.
- Åbn udbyderstrømmen.
- Videresend bidder til klienten.
- Fang endelig brug, når udbyderen sender den, eller når en opfølgende brugsregistrering er tilgængelig.
- Afregn de faktiske omkostninger, og frigiv ubrugt reservation.
Hvis endelig brug ikke er tilgængelig, skal du markere afregningen som estimeret i stedet for at lade som om, den er nøjagtig:
"usage_source": "gateway_estimate",
"er_estimeret": sandt,
"reconciliation_status": "afventer"
Anbefaling: Daglig afstemning bør prioritere estimerede streaminghændelser, mislykkede anmodninger, timeouts og genforsøg. Dette er de områder, der med størst sandsynlighed vil skabe varians mellem gateway-registreringer og udbyderfakturaer.
Priskortversionering og opmærkningsregler
Et priskort skal være et versionsobjekt, ikke et regneark, der kan ændres.
Minimum felter:
- udbyder;
- model-id;
- faktureringsklasse;
- enhed, såsom token, anmodning, billede, lydsekund eller værktøjsenhed;
- enhedspris;
- valuta;
- effektive start- og sluttidsstempler;
- afrundingspolitik;
- lejerplan eller partnermarkeringsregel;
- kildehenvisning og godkendelsesmetadata.
Markeringsregler skal være eksplicitte. For eksempel:
- Omkostninger plus: udbyderomkostninger plus 20 %.
- Fast detailhandel: Lejer betaler en fast tokenpris uanset udbyderens pris.
- Tier: først 10 millioner tokens med én sats, derefter en lavere sats.
- Inkluderede kreditter: forbrug brænder en månedlig godtgørelse ned, før fakturering for overskud starter.
Afvejning: versionering af priskort tilføjer operationelt arbejde, men det forhindrer, at fakturatvister bliver til arkæologi. En kundesupportmedarbejder bør være i stand til at forklare, hvorfor en anmodning den 3. august blev faktureret til en bestemt takst uden at tjekke dagens udbyderpriser.
Adskil faktureringshovedbogen fra analytics
Analytik og fakturering har forskellige tolerancer. Analytics kan aggregeres, forsinkes, samples eller korrigeres. Fakturering skal være fuldstændig, idempotent, reviderbar og kan forklares.
Brug analytics til spørgsmål som:
- Hvilke hold bruger flest tokens?
- Hvilke modeller vokser hurtigst?
- Hvor kan prompt-caching reducere omkostningerne?
- Hvilke nøgler producerer usædvanligt dyre anmodninger?
Brug faktureringshovedbogen til spørgsmål som:
- Blev denne anmodning godkendt i forhold til lejerens saldo?
- Hvilken priskortversion gav denne debitering?
- Blev ubrugt reservation frigivet?
- Samsvarer kundefakturaen med afregnet brug?
- Samler brug af gateway på udbydersiden?
Faktum: OpenTelemetry GenAI semantiske konventioner inkluderer tokenbrugsattributter såsom input- og outputtokens. Det er nyttigt for observerbarhed og sammenføjning af spor til omkostningsbegivenheder. Men telemetriattributter er ikke en erstatning for takstkort, reservationer, afregning, afrunding og fakturatilstand.
Daglig afstemningsarbejdsgang
Afstemning sammenligner gatewayens afregnet hovedbog med brug på udbydersiden. Målet er ikke perfekt enighed på alle mellemområder. Målet er at opdage materialevariationer tidligt nok til at korrigere fakturaer, prislister eller adaptere.
Et praktisk dagligt arbejde:
- Gruppér gateway-ledger-hændelser efter udbyder, model, lejer eller API-nøgle, faktureringsklasse og UTC-dag.
- Hent brug på udbydersiden grupperet efter tilgængelige dimensioner, såsom API-nøgle-id, model og dag.
- Normaliser udbydereksporter gennem den samme adapterkode, der bruges til anmodningssvar, hvor det er muligt.
- Sammenlign mængder og omkostninger efter faktureringsklasse.
- Flagafvigelse over tærskler, såsom 0,5 % mængdeforskel eller enhver stor absolut omkostningsforskel.
- Klassificer afvigelsesårsager: streamingestimater, genforsøg, mislykkede anmodninger, cacheregnskab, modelaliasændringer, forsinkede udbyderregistreringer eller manglende anmodnings-id'er.
- Opret justeringsbegivenheder i stedet for at redigere gamle afregningsbegivenheder.
Anbefaling: Brug udbyder-API-nøgler pr. lejer, hvor det er operationelt muligt, fordi det forenkler afstemning. Hvis det skaber for meget overhead til nøgleadministration, skal du kortlægge interne lejer-id'er til udbyderens metadata, hvor de understøttes, og beholde en pålidelig anmodnings-id-bro.
Fakturalinjer kan kunderne forstå
En kundevendt faktura bør ikke afspejle udbyderen JSON. Det skal forklare regningen i stabile forretningsbetingelser.
Nyttige fakturakolonner:
- datointerval;
- lejer-, projekt- eller API-nøgleetiket;
- model eller modelprofil;
- anmodningsantal;
- ikke-cachede inputtokens;
- cachede inputtokens;
- outputtokens;
- medie- eller værktøjsenheder, hvis relevant;
- rabatter, kreditter eller markeringer;
- samlet beløb og valuta.
For partnere skal du kun inkludere både engrosomkostninger og detailpriser, hvis forretningsmodellen kræver det. Mange forhandlerfakturaer bør kun vise detailforbrug, mens partnerdashboards kan vise margen separat.
Afvejning: Et samlet fakturaskema forbedrer læsbarheden, men udbyderspecifikke faktureringsoplysninger har stadig brug for escape-luger. Hold fakturalinjer enkle som standard, og giv en eksport til avancerede kunder, der har brug for detaljerede revisionsfelter.
Implementeringstjekliste
Før lancering
- Definer normaliserede faktureringsklasser for alle understøttede udbydere.
- Opret uforanderlige priskortversioner med ikrafttrædelsesdatoer.
- Kræv output caps eller anvend gateway-standarder.
- Implementer atomreservationer med idempotensnøgler.
- Indstil afrundingsregler for hver valuta.
- Beslut, hvordan cachelagrede tokens, begrundelsestokens, medieenheder og anmodningsgebyrer skal faktureres.
- Test genforsøg, timeouts, klientafbrydelser og udbyderfejl.
- Byg en mekanisme for justering af hændelser i stedet for at redigere afgjorte hændelser.
Under håndtering af anmodning
- Godkend lejer og nøgle.
- Løs den endelige model efter routing og fallback-politik.
- Vælg den korrekte priskortversion.
- Angiv værst tænkelige omkostninger.
- Reserver saldo eller afvis anmodningen.
- Optag udbyderens anmodnings-id, når det er tilgængeligt.
- Normaliser brugen fra svaret.
- Afregn, frigiv ubrugt reservation, og udsend fakturaklare begivenheder.
Efter anmodningshåndtering
- Kør daglig afstemning efter udbyder, nøgle, model, faktureringsklasse og dag.
- Gennemgå estimerede streamingafregninger.
- Flag modelbrug med manglende takstkortindtastninger.
- Overvåg varians forårsaget af cache-token-regnskab.
- Generer forhåndsvisning af kundefakturaer før den endelige fakturering.
Forudsigelser at planlægge efter
Forudsigelse: AI API-fakturering bliver mere multidimensionel, ikke mindre. Tokenklasser, cacheklasser, medieenheder, værktøjsudførelse og ræsonnement-relaterede tællere vil sandsynligvis blive ved med at udvide sig, efterhånden som modellens muligheder ændres.
Forudsigelse: kunder vil forvente brugsforklaringer på anmodnings-, nøgle-, projekt- og fakturaniveau. En månedlig sum uden sporbare linjeposter vil være utilstrækkelig for teams, der videresælger API-adgang eller håndhæver forudbetalte budgetter.
Forudsigelse: gateways, der allerede adskiller tilbud, reservation, afregning og afstemning, vil tilpasse sig hurtigere til nye prismodeller, fordi de kan tilføje faktureringsklasser uden at omskrive hele fakturasystemet.
Aktiv konklusion
Hvis du eksponerer flere AI-udbydere gennem én gateway, skal du bygge faktureringsregnskabet, før faktureringstvister fremtvinger problemet. Start med fire garantier:
- Hver fakturerbar anmodning modtager et forhåndstilbud.
- Enhver forudbetalt eller begrænset lejer har et budget reserveret, før udbyderopkaldet starter.
- Hvert udbydersvar er normaliseret til stabile faktureringsklasser.
- Hver faktura kan afstemmes mod udbydersiden og den nøjagtige priskortversion, der blev brugt på det tidspunkt.
Denne kontrolsløjfe gør unified AI API-fakturering forståelig for kunder, håndhæves for forudbetalte kreditter, fleksibel for partnermarkeringer og reviderbar, når udbyderens priser eller brugsformater ændres.