Jedes Token, das man an eine LLM-API sendet, kostet Geld. Nicht viel pro Token — aber wenn der Prompt einen Datensatz mit 50 Zeilen Benutzerdaten im JSON-Format enthält, bezahlt man für jede geschweifte Klammer, jeden wiederholten Schlüsselnamen, jedes Anführungszeichen. Bei einem Datensatz mit 10 Feldern und 100 Zeilen verbrennt JSON etwa 60–70% seiner Tokens durch strukturelles Rauschen. TOON wurde entwickelt, um genau das zu beheben. Dieser Artikel zeigt, wie man @toon-format/toon verwendet, um die Token-Anzahl in Prompts zu reduzieren — manchmal um mehr als die Hälfte — ohne jegliche Struktur zu verlieren, die das Modell benötigt.
Wie LLM-Token-Preisgestaltung funktioniert
Modelle wie GPT-4o und Claude berechnen Gebühren pro Eingabe-Token und pro Ausgabe-Token. Das OpenAI Tokenizer-Tool ermöglicht das Einfügen von beliebigem Text und zeigt genau, wie viele Tokens er kostet. Grob gesagt entspricht 1 Token ≈ 4 Zeichen englischen Textes — aber JSONs strukturelle Zeichen (Anführungszeichen, Doppelpunkte, geschweifte Klammern) werden oft einzeln tokenisiert, so dass JSON-lastige Prompts schlechter tokenisieren als normaler Fließtext bei gleicher Zeichenanzahl. Man zahlt bei jeder Anfrage eine strukturelle Steuer.
Für eine typische SaaS-App, die täglich Tausende von Anfragen mit strukturierten Daten in jedem Prompt ausführt, summiert sich diese Steuer schnell. Die Architektur großer Sprachmodelle bedeutet, dass das Modell all dieses Formatierungsrauschen wirklich nicht benötigt — es kann strukturierte Daten problemlos ohne JSONs Ausführlichkeit lesen, solange das Format eindeutig und gut erklärt ist.
JSON vs TOON — Ein konkreter Token-Vergleich
Machen wir das konkret. Hier ist ein 10-Zeilen-Benutzerdatensatz in JSON:
[
{ "id": 1, "username": "alice_dev", "email": "[email protected]", "plan": "pro", "active": true },
{ "id": 2, "username": "bob_writer", "email": "[email protected]", "plan": "free", "active": true },
{ "id": 3, "username": "carol_ops", "email": "[email protected]", "plan": "pro", "active": false },
{ "id": 4, "username": "dan_qa", "email": "[email protected]", "plan": "team", "active": true },
{ "id": 5, "username": "eve_design", "email": "[email protected]", "plan": "pro", "active": true },
{ "id": 6, "username": "frank_sec", "email": "[email protected]", "plan": "team", "active": true },
{ "id": 7, "username": "grace_ml", "email": "[email protected]", "plan": "pro", "active": false },
{ "id": 8, "username": "henry_be", "email": "[email protected]", "plan": "free", "active": true },
{ "id": 9, "username": "iris_fe", "email": "[email protected]", "plan": "pro", "active": true },
{ "id": 10, "username": "jack_devrel", "email": "[email protected]", "plan": "team", "active": true }
]Dieser JSON-Block tokenisiert auf ungefähr 310–330 Tokens. Hier sind exakt dieselben Daten in tabellarischer TOON-Notation:
users[10]{id,username,email,plan,active}:
1,alice_dev,[email protected],pro,true
2,bob_writer,[email protected],free,true
3,carol_ops,[email protected],pro,false
4,dan_qa,[email protected],team,true
5,eve_design,[email protected],pro,true
6,frank_sec,[email protected],team,true
7,grace_ml,[email protected],pro,false
8,henry_be,[email protected],free,true
9,iris_fe,[email protected],pro,true
10,jack_devrel,[email protected],team,trueDie TOON-Version tokenisiert auf ungefähr 135–150 Tokens — etwa 55% weniger. Im großen Maßstab ist das kein Rundungsfehler. Wenn man täglich 10.000 solcher Anfragen zum GPT-4o-Preis ausführt, ist der Unterschied zwischen JSON und TOON allein im Prompt erheblich.
Installieren und Daten in Node.js konvertieren
Das Paket von npm installieren. Es funktioniert in Node.js 18+ und modernen Browsern:
npm install @toon-format/toonDer Import ist eine einzelne Destrukturierung:
import { encode, decode } from '@toon-format/toon';
// Convert a JS array/object to TOON before sending to an LLM
const users = [
{ id: 1, username: 'alice_dev', email: '[email protected]', plan: 'pro', active: true },
{ id: 2, username: 'bob_writer', email: '[email protected]', plan: 'free', active: true },
// ... more rows
];
const toonData = encode(users, { indent: 2 });
console.log(toonData);
// users[2]{id,username,email,plan,active}:
// 1,alice_dev,[email protected],pro,true
// 2,bob_writer,[email protected],free,truePraktisches Muster: Fetch → Encode → Prompt → Decode
Der Workflow für die Verwendung von TOON mit einer LLM-API besteht aus vier Schritten. Daten aus einer beliebigen Quelle abrufen (Datenbank, REST-API, CSV-Datei), zu TOON kodieren, den Prompt erstellen und optional strukturiertes TOON aus der Antwort des Modells dekodieren.
import { encode, decode } from '@toon-format/toon';
import OpenAI from 'openai';
const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
async function analyseUsers(users) {
// Step 1: encode data to TOON
const toonData = encode(users, { indent: 2 });
// Step 2: build the prompt
const systemPrompt = [
'You analyse user datasets. Data is provided in TOON (Token-Optimised Object Notation).',
'TOON tabular format: name[count]{col1,col2,...}: followed by comma-separated rows, one per line.',
'Respond with plain prose unless asked to return data, in which case use TOON format.'
].join('\n');
const userPrompt = `Here is the user dataset:\n\n${toonData}\n\nWhich plan has the most active users?`;
// Step 3: call the API
const response = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{ role: 'system', content: systemPrompt },
{ role: 'user', content: userPrompt }
]
});
return response.choices[0].message.content;
}
// Step 4 (optional): if the model returns TOON, decode it back
const rawResponse = await analyseUsers(myUserArray);
try {
const structured = decode(rawResponse);
console.log('Structured result:', structured);
} catch {
console.log('Prose response:', rawResponse);
}Dasselbe Muster funktioniert für die Anthropic Claude API — einfach den Client austauschen. Die Prompt-Struktur und TOON-Kodierung sind unabhängig vom Anbieter identisch. Die vollständige OpenAI API-Dokumentation enthält Details zur Authentifizierungs-Einrichtung und Modellauswahl.
Wann es am meisten zählt
TOON zahlt sich in diesen Szenarien am meisten aus:
- Große Datensätze im Kontext. Immer wenn man mehr als ~20 Zeilen strukturierter Daten in einen Prompt packt, spart die tabellarische TOON-Notation im Vergleich zu JSON-Arrays von Objekten erheblich Tokens.
- Wiederholte strukturierte Abfragen. Wenn die Anwendung täglich Tausende von gleichartigen Abfragen ausführt (z.B. "analysiere die Aktivität dieses Benutzers" mit einem Benutzerdatensatz in jedem Prompt), sind die kumulierten Einsparungen erheblich.
- Batch-Verarbeitungs-Jobs. Skripte, die Tausende von Datensätzen durch ein LLM verarbeiten — Klassifizierung, Tagging, Anreicherung, Zusammenfassung — profitieren enorm. Weniger Tokens pro Aufruf bedeutet schnelleren Durchsatz und niedrigere Kosten.
- Kontextfenster-begrenzte Aufgaben. Wenn man versucht, einen großen Datensatz in ein 128k-Kontextfenster zusammen mit einem langen System-Prompt und Few-Shot-Beispielen zu bekommen, zählt jeder Token. TOON ermöglicht mehr Zeilen im selben Fenster.
- Kostenempfindliche Produktions-APIs. Hobby-Projekte im kostenlosen Tier werden es nicht bemerken. Produktions-Apps, die zahlende Nutzer in großem Maßstab bedienen, definitiv schon.
Der eine Vorbehalt: LLMs müssen das Format kennen
TOON ist nicht in den Trainingsdaten eines LLMs wie JSON. Das Modell hat noch nie eine .toon-Datei gesehen. Das bedeutet, man muss eine kurze Format-Beschreibung in den System-Prompt einbauen — sonst lehnt das Modell entweder die Eingabe ab oder parst sie falsch. Die gute Nachricht ist, dass die Beschreibung kurz ist und man sie nur einmal pro Gespräch oder Anfrage bezahlt.
Ein minimaler System-Prompt-Zusatz, der zuverlässig funktioniert:
Data is provided in TOON (Token-Optimised Object Notation).
TOON syntax:
- Objects: {key:value,key2:value2} — keys are never quoted
- Arrays: [val1,val2,val3]
- Tabular: name[rowCount]{col1,col2,...}:
rowval1,rowval2,...
rowval1,rowval2,...
Parse each row by matching values to the column headers in order.
Strings containing commas are double-quoted.Dieser Block fügt dem System-Prompt ungefähr 60 Tokens hinzu — einmalige Kosten, die bei jedem Datensatz größer als 5–6 Zeilen schnell wieder eingespart werden. Bei Anwendungen, bei denen viele API-Aufrufe mit TOON-Daten gemacht werden, werden die Format-Beschreibungs-Tokens auf nahezu null amortisiert. Verwende JSON zu TOON, um Daten vor dem Erstellen des Prompts zu konvertieren, und den TOON Formatter, um zu überprüfen, ob es korrekt aussieht.
Zusammenfassung
Das Argument für TOON in LLM-Workflows ist einfach: Man zahlt pro Token, strukturierte Daten in JSON sind token-ineffizient, und TOON ist eine direkte Lösung. Die tabellarische Notation allein reduziert die Token-Nutzung bei typischen zeilenbasierten Datensätzen um 50–60%. Das npm-Paket — @toon-format/toon — ist klein, die API hat zwei Funktionen, und die Integration in einen bestehenden API-Aufruf ist eine Fünf-Minuten-Arbeit. Das Einzige, woran man denken muss, ist die Format-Beschreibung im System-Prompt — ohne sie rät das Modell. Mit ihr erhält man ein Modell, das Daten korrekt liest bei der halben Token-Kosten. Beginne mit JSON zu TOON, um bestehende Daten zu konvertieren, validiere sie mit dem TOON Validator, und verwende TOON zu JSON oder decode(), um strukturierte Antworten zurück zu konvertieren, wenn nötig.