So zählen Sie Tokens und schätzen LLM-API-Kosten ab
LLM-Tokens präzise zählen und API-Kosten mit den Tokenizern von OpenAI, Claude, Gemini und Llama schätzen, plus Tipps zu Kontextfenster und Abrechnung.
Um Tokens genau zu zählen, führen Sie den vollständigen Request-Body durch den Tokenizer des Modells, das Sie tatsächlich aufrufen. Schätzen Sie die Kosten dann als (input_tokens ÷ 1.000.000) × input_rate + (output_tokens ÷ 1.000.000) × output_rate, wobei die aktuellen Preise von der Pricing-Seite des Anbieters stammen.
Niemand rechnet das im Vorfeld aus. Das Thema kommt an dem Morgen auf, an dem die Rechnung eintrifft, oder an dem Nachmittag, an dem eine lange Konversation echten Nutzern Context-Window-Fehler entgegenwirft – und plötzlich ist „Wie viele Tokens sind das?” die einzige Frage, die zählt. Unangenehm daran: Ein Token ist kein Wort, die Anzahl hängt vom Modell ab, und die Hälfte dessen, was Ihnen in Rechnung gestellt wird, taucht in Ihrem Prompt-String überhaupt nicht auf.
Dieser Artikel liefert Ihnen die wiederholbare Methode: wann eine grobe Schätzung genügt, wie Sie pro Anbieter eine exakte Zählung erhalten, was tatsächlich abgerechnet wird und wie Sie aus Zählungen eine Kostenprognose machen, die eine Preisänderung übersteht.
Die wichtigsten Erkenntnisse
- Zählen Sie Tokens mit dem Tokenizer des Modells, das Sie aufrufen: tiktoken für OpenAI,
messages.countTokensfür Claude,countTokensfür Gemini und der modelleigene Hugging-Face-Tokenizer für Llama. - Heuristiken wie Zeichen ÷ 4 sind für die Kapazitätsplanung akzeptabel, aber nie für die Abrechnung; sie versagen bei Code, JSON, nicht englischen Texten und Emoji.
- Der abgerechnete Prompt ist der vollständige Request-Body – inklusive System-Prompt, Rollenrahmen, Tool-Schemas und erneut gesendetem Konversationsverlauf – nicht nur die Nachricht des Nutzers.
- Input-Token-Zählungen sind deterministisch, Output-Zählungen nicht: Erheben Sie 50–200 echte Requests, planen Sie die Kosten anhand der mittleren Output-Länge und setzen Sie
max_tokensanhand des p95-Werts. - Die geschätzten Kosten pro Request betragen (input_tokens ÷ 1 Mio.) × input_rate + (output_tokens ÷ 1 Mio.) × output_rate, wobei die Preise live von der Pricing-Seite des Anbieters gelesen werden.
Warum ist ein Token kein Wort?
Ein Token ist eine modellspezifische Texteinheit, die von einem Subword-Tokenizer erzeugt wird, und sie entspricht weder Wörtern noch Zeichen. Tokenizer, die auf Byte Pair Encoding aufbauen – wie OpenAIs tiktoken – fassen häufig auftretende Zeichenfolgen zu einzelnen Tokens zusammen und zerlegen seltene Wörter in mehrere Teile. Das Wort „idempotency” wird unter cl100k_base, dem Encoding der GPT-4-Ära, zu vier Tokens kodiert („id”, „emp”, „ot”, „ency”) und unter o200k_base, dem Encoding aktueller OpenAI-Modelle, zu drei („id”, „empot”, „ency”).
Der letzte Punkt ist für die Abrechnung entscheidend: Die Zerlegung ist modellspezifisch. Derselbe Satz ergibt unter den Tokenizern von GPT, Claude, Gemini und Llama unterschiedliche Zählungen, weil jeder auf anderen Daten mit einem anderen Vokabular trainiert wurde. Jede Zählung mit dem falschen Tokenizer ist eine Vermutung.
Wann genügt eine grobe Schätzung?
Für englische Prosa kommen Sie mit Zeichen ÷ 4 oder Wörter × 1,33 nah genug heran, um eine Datenbankspalte zu dimensionieren oder eine Kapazitätsplanung zu skizzieren. Nutzen Sie Heuristiken für die Kapazitätsplanung, niemals für Abrechnung oder Entscheidungen rund um das Context Window.
Die Heuristiken versagen genau dort, wo der Produktionsverkehr stattfindet: bei Code, JSON, nicht englischen Texten und Emoji. Strukturierte Payloads tokenisieren entlang von Satzzeichen- und Whitespace-Mustern, die die Zeichenzählung ignoriert, und ein einzelnes Emoji kann sich auf mehrere Tokens ausdehnen – Zeichen ÷ 4 unterschätzt emoji-lastige Strings daher massiv. Unterschiede zwischen Tokenizern, die bei englischer Prosa moderat bleiben, wachsen bei Code und strukturierten Daten deutlich an – und genau diese Inhalte sendet ein Summarizer oder Agent.
Welcher LLM-Token-Counter liefert eine exakte Zählung?
Das Prinzip passt in eine Zeile: Zählen Sie mit dem Tokenizer, der zum aufgerufenen Modell gehört. Die Wege je Anbieter:
| Anbieter | Weg zur exakten Zählung |
|---|---|
| OpenAI | tiktoken, oder js-tiktoken in Node- und Edge-Runtimes |
| Anthropic | der Count-Tokens-Endpoint, client.messages.countTokens() im TypeScript-SDK |
| Gemini | ai.models.countTokens() im @google/genai-SDK |
| Llama und andere offene Modelle | der modelleigene, auf Hugging Face veröffentlichte Tokenizer |
In JavaScript ist js-tiktoken ein reiner JS-Port: Es gibt kein WASM-Binary zu laden und keinen Speicher manuell freizugeben, und Sie können ein einzelnes Encoding einbinden statt des gesamten Sets, was das Bundle klein hält:
import { Tiktoken } from "js-tiktoken/lite";
import o200k_base from "js-tiktoken/ranks/o200k_base";
const enc = new Tiktoken(o200k_base);
const count = enc.encode("Summarise this ticket thread for support.").length;
Anthropics Endpoint ist kostenlos aufrufbar und unterliegt lediglich eigenen Rate Limits – es gibt also keine Kostenausrede dafür, Claude-Zählungen mit dem Tokenizer eines anderen Anbieters zu approximieren. Behandeln Sie das Ergebnis als maßgebliche Pre-Flight-Zählung, nicht als exakte: Anthropic dokumentiert sie als Schätzung, und der abgerechnete Wert stammt aus den Usage-Feldern der Response. Tokenizer ändern sich zudem zwischen Modellgenerationen innerhalb eines Anbieters. Anthropics Dokumentation zum Token-Counting weist Claude 4.7 und neuer einem neueren Tokenizer zu, der aus demselben Text rund 30 Prozent mehr Tokens macht als frühere Claude-Modelle – die genaue Differenz hängt von Ihren Inhalten ab. Eine alte Zählung lässt sich nicht übertragen; erheben Sie eine neue für das Modell, das Sie tatsächlich aufrufen. Und wenn Sie einfach nur die Zahl brauchen, ohne ein SDK zu verdrahten, fügen Sie den Prompt in einen LLM-Token-Counter ein, der GPT, Claude, Gemini und Llama abdeckt.
Warum stimmt meine Zählung nicht mit der Rechnung überein?
Der abgerechnete Prompt ist der vollständige Request-Body, nicht der String, den Sie geschrieben haben. Rollenrahmen, der System-Prompt, Tool- und Function-Schemas sowie Trennzeichen pro Nachricht fügen alle Tokens hinzu – deshalb unterschätzt die Zählung nur der Nutzernachricht immer. Eine einzelne Tool-Definition kann jedem Request, der sie mitführt, hunderte Input-Tokens hinzufügen.
Der Konversationsverlauf ist der Multiplikator. Ein Chat-Feature sendet in jedem Turn den gesamten Verlauf erneut, sodass der Input jedes Turns alle vorherigen Turns enthält und die Kosten pro Konversation überproportional mit der Konversationslänge wachsen. Die Lösung fürs Zählen ist einfach: Stellen Sie das exakte messages-Array, den System-Prompt und die Tools zusammen, die Sie senden werden, und zählen Sie genau das. Anthropics Count-Tokens-Endpoint nimmt dieselbe Payload an, die Sie zum Erstellen der Nachricht gesendet hätten – Tool-Definitionen inklusive –, sodass Sie den zusammengestellten Request direkt durchreichen können.
Wie mache ich aus Token-Zählungen eine Kostenschätzung?
Die geschätzten Kosten pro Request sind eine Zeile Arithmetik, symbolisch gehalten:
cost = (input_tokens / 1_000_000) * input_rate + (output_tokens / 1_000_000) * output_rate
Wo Anbieter Prompt Caching unterstützen, werden gecachte Input-Tokens zu einem separaten, niedrigeren cached_input_rate abgerechnet. Die Preise pro Modell ändern sich im Wochenrhythmus, deshalb sind hier keine Raten abgedruckt. Behandeln Sie Raten als injizierte Konfiguration in Ihrem Code, lesen Sie die aktuellen Werte von der Pricing-Seite des Anbieters und nutzen Sie einen LLM-Kostenrechner, um aktuelle Zahlen modellübergreifend zu vergleichen.
Zwei Tatsachen prägen jede Schätzung. Erstens: Output-Tokens haben bei den großen Anbietern in der Regel eine deutlich höhere Rate als Input-Tokens, sodass die Antwortlänge oft die Kosten dominiert. Zweitens: Input-Zählungen sind deterministisch, Output-Zählungen nicht – derselbe Request zählt eingehend immer gleich, aber was zurückkommt, variiert mit dem Sampling. Messen Sie den Output empirisch. Führen Sie 50–200 repräsentative Requests aus, planen Sie die Kosten anhand der mittleren Output-Länge und setzen Sie max_tokens anhand des 95. Perzentils, damit legitime Antworten nicht abgeschnitten werden, ausufernde Generierungen aber begrenzt bleiben.
Wie erkenne ich, dass ein Prompt ins Context Window passt?
Input-Tokens plus erwartete Output-Tokens müssen in das Context Window des Modells passen, sonst schlägt der Aufruf komplett fehl oder die Antwort wird abgeschnitten. Die Pre-Flight-Prüfung gehört in Ihren Request-Wrapper: Budgetieren Sie das Window über System-Kontext, Konversationsverlauf und Output-Reserve, zählen Sie den zusammengestellten Request und kürzen Sie den Verlauf vor dem Senden statt nach einem Fehler. Ein Context-Window-Checker sagt Ihnen, ob ein bestimmter Prompt in ein bestimmtes Modell passt, ohne dass Sie Fenstergrößen auswendig lernen müssen, die sich mit jedem Release ändern.
Die Platzierung im Wrapper ist wichtig, weil eine Überschreitung für Nutzer sichtbar ist: eine abgeschnittene Antwort oder ein Fehler mitten im Stream – und der Reflex des Nutzers ist der Retry, sodass ein Token-Budget-Bug doppelt abgerechnet wird. Session Replays von LLM-gestützten Features machen genau diese Retry-Schleife sichtbar, lange bevor sie auf einer monatlich geprüften Rechnung auftaucht.
Was in Produktion geloggt werden sollte
Die Methode ist stabil, auch wenn die Preise es nicht sind: Zählen Sie den zusammengestellten Request mit dem Tokenizer des aufrufenden Modells, erheben Sie echten Traffic, um Ihre Output-Verteilung kennenzulernen, und halten Sie Raten als Konfiguration, die Sie von Pricing-Seiten aktualisieren. Schließen Sie dann in der Produktion den Kreis. Jeder größere Anbieter gibt die tatsächlichen Token-Zahlen in den Usage-Feldern der Response zurück, etwa Anthropics usage.input_tokens und Geminis usageMetadata – wobei Geminis neuere Interactions API, noch in Beta, usage mit total_input_tokens und total_output_tokens zurückgibt. Loggen Sie sie ab Tag eins pro Request; das Erfassen ist trivial, das Rekonstruieren nach der überraschenden Rechnung ist es nicht.
FAQs
Kann ich tiktoken verwenden, um Tokens für Claude- oder Gemini-Modelle zu zählen?
Nein. Der Tokenizer jedes Anbieters hat sein eigenes Vokabular, daher ist eine tiktoken-Zählung nur für OpenAI-Modelle gültig und kann bei derselben Eingabe für Claude oder Gemini erheblich abweichen. Nutzen Sie für Claude Anthropics Count-Tokens-Endpoint, der kostenlos aufrufbar ist, für Gemini die countTokens-Methode im @google/genai-SDK und für offene Modelle wie Llama den auf Hugging Face veröffentlichten Tokenizer.
Was ist der Unterschied zwischen den npm-Paketen tiktoken und js-tiktoken?
tiktoken ist ein WASM-Binding: Es lädt ein kompiliertes Binary und erfordert den Aufruf von free(), um den Speicher des Encoders wieder freizugeben. js-tiktoken ist ein reiner JavaScript-Port mit camelCase-Methoden (getEncoding, encodingForModel), ohne WASM-Binary und ohne manuelle Speicherverwaltung – das macht es zur sichereren Wahl für Edge- und Serverless-Runtimes. Der Import einer einzelnen Encoding-Rank-Datei hält die Bundle-Größe klein.
Melden Streaming-Responses weiterhin die Token-Nutzung?
Ja, aber nicht überall standardmäßig. Setzen Sie bei OpenAI Chat Completions stream_options mit include_usage auf true, dann streamt die API einen zusätzlichen Abschluss-Chunk, dessen usage-Feld den gesamten Request abdeckt und dessen choices-Array leer ist. Anthropic streamt die Nutzung automatisch: Das message_start-Event trägt input_tokens, die message_delta-Events tragen kumulative output_tokens. Loggen Sie diese Felder, anstatt gestreamte Chunks selbst zu zählen.
Welches tiktoken-Encoding sollte ich für welches OpenAI-Modell verwenden?
Verwenden Sie o200k_base für aktuelle OpenAI-Modelle wie gpt-4o und neuer, und cl100k_base nur für Modelle der GPT-4-Ära. Die beiden Encodings zerlegen Text unterschiedlich, daher lässt sich eine Zählung unter dem einen nicht auf das andere übertragen. Bei gegebener Modell-ID wählt encodingForModel in js-tiktoken das passende Encoding für Sie aus, was verhindert, dass Sie beim Modellwechsel auf ein falsches Encoding festgelegt bleiben.