Format-Dokumentation liebt Spielzeugbeispiele — drei Zeilen, falsche Namen, fünf Spalten. Das ist in Ordnung, um die Syntax zu lernen, sagt aber nicht, ob ein Format die Formen verarbeitet, mit denen man tatsächlich bei der Arbeit zu tun hat. Dieser Artikel überspringt die Spielzeuge. Im Folgenden sind die Datenmuster, die in der realen Backend-Entwicklung ständig auftauchen — Produktkataloge, Audit-Logs, Metriktabellen, Konfigurationsobjekte, Finanztransaktionen — in JSON und TOON nebeneinander gezeigt, damit man genau sehen kann, was man einspart und wo TOON seinen Platz hat. Alle Daten sind realistisch; kein foo, bar oder Platzhalternamen weit und breit. Für Hintergrundinformationen zum Format selbst, sieh den TOON Syntax-Leitfaden.
E-Commerce-Produktkatalog
Ein Produkt-Array ist wahrscheinlich das Einzelne, das Entwickler am häufigsten an ein LLM senden — "klassifiziere diese Artikel", "finde den günstigsten in jeder Kategorie", "markiere alles, was nicht vorrätig ist und über 50€ kostet". Hier ist ein realistischer Katalogausschnitt zuerst in JSON:
[
{"id":"PRD-1041","name":"Logitech MX Master 3S","sku":"LOG-MX3S-GRY","price":99.99,"inStock":true,"category":"Peripherals"},
{"id":"PRD-1042","name":"Samsung 970 EVO Plus 1TB","sku":"SAM-970P-1TB","price":89.99,"inStock":true,"category":"Storage"},
{"id":"PRD-1043","name":"Keychron K2 Pro","sku":"KEY-K2P-BLK","price":119.99,"inStock":false,"category":"Peripherals"},
{"id":"PRD-1044","name":"Elgato Stream Deck MK.2","sku":"ELG-SD-MK2","price":149.99,"inStock":true,"category":"Streaming"},
{"id":"PRD-1045","name":"WD Blue 2TB HDD","sku":"WD-BLU-2TB","price":54.99,"inStock":true,"category":"Storage"},
{"id":"PRD-1046","name":"Razer DeathAdder V3","sku":"RZR-DAV3-BLK","price":69.99,"inStock":true,"category":"Peripherals"},
{"id":"PRD-1047","name":"Focusrite Scarlett Solo","sku":"FOC-SC-SOLO","price":119.99,"inStock":false,"category":"Audio"}
]Jetzt derselbe Katalog in TOON. Spalten-Header werden einmal deklariert; jede Zeile besteht nur aus Werten:
products[7]{id,name,sku,price,inStock,category}:
PRD-1041,Logitech MX Master 3S,LOG-MX3S-GRY,99.99,true,Peripherals
PRD-1042,Samsung 970 EVO Plus 1TB,SAM-970P-1TB,89.99,true,Storage
PRD-1043,Keychron K2 Pro,KEY-K2P-BLK,119.99,false,Peripherals
PRD-1044,Elgato Stream Deck MK.2,ELG-SD-MK2,149.99,true,Streaming
PRD-1045,WD Blue 2TB HDD,WD-BLU-2TB,54.99,true,Storage
PRD-1046,Razer DeathAdder V3,RZR-DAV3-BLK,69.99,true,Peripherals
PRD-1047,Focusrite Scarlett Solo,FOC-SC-SOLO,119.99,false,AudioBenutzeraktivität / Audit-Log
Audit-Logs sind genau die Art von Daten, die man einem LLM mit einem Prompt wie "fasse zusammen, was dieser Benutzer in der letzten Stunde getan hat" oder "markiere verdächtige Zugriffsmuster" übergeben würde. Sie sind hochvolumig, repetitiv, und die Spaltennamen sind in jeder Zeile identisch. Audit-Trails sind auch in der Regel das Erste, das das Kontextfenster sprengt, wenn man sie als JSON einfügt. Hier ist ein realistisches 9-Zeilen-Log in TOON:
auditLog[9]{userId,action,resourceId,resourceType,timestamp,ip}:
U-8821,LOGIN,,session,2024-11-14T08:02:11Z,203.0.113.47
U-8821,VIEW,DOC-4490,document,2024-11-14T08:03:44Z,203.0.113.47
U-8821,DOWNLOAD,DOC-4490,document,2024-11-14T08:03:51Z,203.0.113.47
U-8821,VIEW,DOC-4491,document,2024-11-14T08:05:02Z,203.0.113.47
U-8821,EDIT,DOC-4491,document,2024-11-14T08:07:39Z,203.0.113.47
U-8821,SHARE,DOC-4491,document,2024-11-14T08:08:12Z,203.0.113.47
U-8821,VIEW,USR-0055,user_profile,2024-11-14T08:09:58Z,203.0.113.47
U-8821,VIEW,USR-0056,user_profile,2024-11-14T08:10:03Z,203.0.113.47
U-8821,LOGOUT,,session,2024-11-14T08:11:22Z,203.0.113.47Das entsprechende JSON würde "userId", "action", "resourceId", "resourceType", "timestamp" und "ip" in allen neun Zeilen wiederholen — 54 Schlüsselwiederholungen für sechs Feldnamen. In TOON erscheinen sie genau einmal. Bei Audit-Logs mit Hunderten von Einträgen ist das der Unterschied zwischen dem Einpassen der Daten in den Prompt und dem Scheitern daran.
API-Rate-Limit / Metrikdaten
Betriebsmetriken — Latenz-Perzentile, Fehlerraten, Durchsatz — sind eine weitere natürliche Anwendung für TOON. Die Daten sind zahlenlastig und perfekt tabellarisch. Man könnte dies an ein LLM senden mit der Frage "welche Endpunkte haben p99-Latenz über 500ms?" oder "wo steigt die Fehlerrate an?" Das ist die Datenform, die man typischerweise aus einer Node.js-Metriken-Pipeline oder einem Prometheus-Scrape bekommt:
apiMetrics[8]{endpoint,method,p50ms,p99ms,errorRate,callsPerDay}:
/api/v2/products,GET,42,118,0.002,84200
/api/v2/products/:id,GET,38,95,0.001,31500
/api/v2/orders,POST,210,880,0.015,4800
/api/v2/orders/:id,GET,55,201,0.003,19200
/api/v2/cart,PUT,95,430,0.008,22100
/api/v2/search,GET,310,1240,0.021,61000
/api/v2/users/:id,GET,29,88,0.001,9700
/api/v2/checkout,POST,540,2100,0.034,3200Das LLM kann sofort Fragen zu dieser Tabelle beantworten, ohne Kontext-Overhead. Beachte, dass /api/v2/search und /api/v2/checkout beide mit hohem p99 und erhöhten Fehlerraten herausstechen — genau die Art von Muster, die ein LLM sofort identifizieren kann, wenn die Daten klar präsentiert werden.
Verschachteltes Konfigurationsobjekt
TOON verarbeitet mehr als tabellarische Daten. Für strukturierte Objekte — die Art von Ding, das man in der Laufzeitkonfiguration einer App findet — verwendet TOON eine Inline-Objektnotation mit verschachtelter Struktur. Denke daran als Gegenstück zu Serialisierungsformaten wie TOML oder YAML, aber schlanker. Hier ist eine realistische App-Konfiguration mit Server-Einstellungen, Datenbankeinstellungen und Feature-Flags:
{
"server": {
"host": "0.0.0.0",
"port": 8080,
"tlsEnabled": true,
"requestTimeoutMs": 30000
},
"database": {
"host": "db.internal.example.com",
"port": 5432,
"name": "commerce_prod",
"poolSize": 20,
"sslRequired": true
},
"features": {
"newCheckoutFlow": true,
"recommendationEngine": false,
"darkMode": true,
"betaDashboard": false
}
}Dieselbe Konfiguration in TOON-Objektnotation — Schlüssel sind ohne Anführungszeichen, Verschachtelung verwendet Inline-Klammern:
{
server:{host:0.0.0.0,port:8080,tlsEnabled:true,requestTimeoutMs:30000},
database:{host:db.internal.example.com,port:5432,name:commerce_prod,poolSize:20,sslRequired:true},
features:{newCheckoutFlow:true,recommendationEngine:false,darkMode:true,betaDashboard:false}
}database-Block ist host:db.internal.example.com so in Ordnung — keine Anführungszeichen nötig, da der Wert weder ein Komma noch einen Doppelpunkt enthält. Wenn ein Wert ein Komma oder einen Doppelpunkt enthält, in doppelte Anführungszeichen setzen: dsn:"host:5432,sslmode=require".Finanztransaktionen
Finanzdaten sind ein weiterer hochwertiger LLM-Anwendungsfall: Betrugserkennungshinweise, Abgleichsprüfungen, Kategorisierung. Die Mischung aus String-IDs, numerischen Beträgen, Währungscodes, Status-Enums und Zeitstempeln passt sauber in TOONs tabellarisches Format. Hier ist ein realistischer Transaktionsausschnitt:
transactions[9]{txId,amount,currency,from,to,status,timestamp}:
TXN-88201,1250.00,GBP,ACC-1041,ACC-2209,settled,2024-11-14T09:15:00Z
TXN-88202,89.99,USD,ACC-3301,ACC-0047,settled,2024-11-14T09:16:34Z
TXN-88203,4500.00,EUR,ACC-2001,ACC-5512,pending,2024-11-14T09:18:02Z
TXN-88204,22.50,USD,ACC-0099,ACC-3301,settled,2024-11-14T09:21:47Z
TXN-88205,750.00,GBP,ACC-5512,ACC-1041,failed,2024-11-14T09:25:10Z
TXN-88206,12000.00,USD,ACC-7700,ACC-2001,pending,2024-11-14T09:28:55Z
TXN-88207,310.00,EUR,ACC-1041,ACC-0099,settled,2024-11-14T09:31:22Z
TXN-88208,55.00,USD,ACC-3301,ACC-7700,settled,2024-11-14T09:33:40Z
TXN-88209,8900.00,GBP,ACC-2209,ACC-5512,flagged,2024-11-14T09:37:15ZFüge dies in einen Prompt zusammen mit "markiere alle Transaktionen über £5.000 oder mit Status flagged oder failed" ein, und das Modell antwortet in Sekunden. Die TOON-Darstellung ist kompakt genug, dass man problemlos mehrere Hundert Zeilen in einem einzigen Prompt unterbringen kann, ohne Kontextlimits der meisten Modelle zu erreichen.
Tabellarische und Objektdaten in einem Dokument kombinieren
Hier ist etwas, das weder JSON noch CSV sauber handhabt: ein Dokument, das sowohl einen Metadaten-Header (ein einzelnes Konfigurationsobjekt) als auch eine Datentabelle im selben Payload hat. Denke an einen Bericht mit einem Kontextblock oben — wer ihn erstellt hat, welchen Zeitraum er abdeckt, welche Filter angewendet wurden — gefolgt von den eigentlichen Datenzeilen. In JSON müsste man alles in ein Umschlagsobjekt mit einem "meta"-Schlüssel und einem "rows"-Schlüssel verpacken, was eine weitere Verschachtelungsebene hinzufügt. CSV kann es gar nicht. TOON behandelt es nativ:
{report:weekly_sales,generatedAt:2024-11-14T10:00:00Z,region:EMEA,currency:EUR,generatedBy:analytics-service}
salesByRep[6]{repId,repName,deals,revenue,avgDealSize,quota}:
REP-101,Marta Kowalski,14,84200.00,6014.28,75000
REP-102,James Okafor,11,61500.00,5590.90,75000
REP-103,Yuki Tanaka,18,102400.00,5688.88,90000
REP-104,Sofia Andersen,9,47800.00,5311.11,75000
REP-105,Liam Byrne,16,93100.00,5818.75,90000
REP-106,Priya Nair,21,118600.00,5647.61,100000Die erste Zeile ist ein TOON-Objekt — die Berichtsmetadaten. Die Leerzeile trennt sie vom darauf folgenden tabellarischen Abschnitt. Ein einziger decode()-Aufruf von @toon-format/toon gibt beides zurück. Man kann dieses gesamte Dokument mit einer Frage wie "welche Vertreter sind auf dem Weg, ihre Quote zu erreichen?" an ein LLM senden, und es hat alles, was es braucht: den Berichtskontext und die Daten in einem kompakten Payload.
Das npm-Paket verwenden
Alle diese Beispiele können programmatisch kodiert und dekodiert werden. Das @toon-format/toon-Paket ist die Referenzimplementierung. In jedem Node.js- oder Browser-Projekt installieren:
npm install @toon-format/toonDann die Daten vor dem Senden an eine LLM-API kodieren und die Antwort auf dem Rückweg dekodieren:
import { encode, decode } from '@toon-format/toon';
const transactions = [
{ txId: 'TXN-88201', amount: 1250.00, currency: 'GBP', from: 'ACC-1041', to: 'ACC-2209', status: 'settled', timestamp: '2024-11-14T09:15:00Z' },
{ txId: 'TXN-88202', amount: 89.99, currency: 'USD', from: 'ACC-3301', to: 'ACC-0047', status: 'settled', timestamp: '2024-11-14T09:16:34Z' },
// ...more rows
];
// Compact TOON string — send this to your LLM prompt
const toonPayload = encode(transactions);
// When the LLM returns TOON, decode back to a JS array
const decoded = decode(toonPayload);
console.log(decoded[0].status); // "settled"Zusammenfassung
Die obigen Muster — Produktkataloge, Audit-Logs, Metriktabellen, Konfigurationsobjekte, Finanzdaten, gemischte Header+Tabellen-Dokumente — decken die überwiegende Mehrheit strukturierter Daten ab, die Entwickler tatsächlich an LLMs senden. TOON verarbeitet alle gut, und die Token-Einsparungen sind in jedem Fall erheblich. Die Kernregel ist einfach: JSON wiederholt Schlüsselnamen in jeder Zeile; TOON nicht. Für tabellarische Datenserialisierung, die in ein LLM-Kontextfenster geht, ist diese Wiederholung reiner Overhead.
Um vorhandenes JSON in TOON zu konvertieren, verwende den JSON-zu-TOON-Konverter. Um nach einer LLM-TOON-Rückgabe in die andere Richtung zu gehen, verwende den TOON-zu-JSON-Konverter. Der TOON Formatter bereinigt und validiert TOON-Strings, und der TOON Validator erkennt Syntaxfehler, bevor sie die Pipeline erreichen. Das npm-Paket @toon-format/toon übernimmt Kodierung und Dekodierung in zwei Codezeilen — alle obigen Beispiele funktionieren direkt.