Formatdokumentation elsker legetøjseksempler — tre rækker, falske navne, fem kolonner. Det er fint for at lære syntaksen, men det fortæller dig ikke, om et format håndterer de former, du faktisk beskæftiger dig med på arbejdet. Denne artikel springer over legetøjet. Nedenfor er de datamønstre, der konstant dukker op i reel backend-udvikling — produktkataloger, revisionslogge, metriktabeller, konfigurationsobjekter, finansielle transaktioner — vist i både JSON og TOON side om side, så du kan se præcis, hvad du sparer, og hvor TOON tjener sin plads. Alle data er realistiske; ingen foo, bar eller pladsholder-navne i sigte. For baggrund om selve formatet, se TOON-syntaksguiden.

E-handels produktkatalog

Et produktarray er sandsynligvis det mest almindelige, udviklere sender til en LLM — "klassificér disse elementer", "find den billigste i hver kategori", "markér alt, der er udsolgt, med en pris over $50". Her er et realistisk katalog-udsnit i JSON først:

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"}
]

Nu det samme katalog i TOON. Kolonnehoveder erklæres én gang; hver række er blot værdier:

text
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,Audio
De seks kolonnehoveder i TOON skrives præcis én gang. I JSON gentages de på hver række. Ved række 3 har headeren allerede betalt for sig selv i tokenbesparelser — og på et 200-rækkers katalog er forskellen dramatisk. Brug OpenAI-tokenizeren til at verificere besparelserne for dine egne data.

Brugeraktivitet / revisionslog

Revisionslogge er præcis den slags data, du ville sende til en LLM med en prompt som "opsummér, hvad denne bruger gjorde i den sidste time" eller "markér mistænkelige adgangsmønstre". De er høj-volume, repetitive, og kolonnenavnene er identiske på hver række. Revisionsspor er også det første, der sprænger dit kontekstvindue, når du indsætter dem som JSON. Her er en realistisk 9-rækkers log i TOON:

text
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.47

Den tilsvarende JSON ville gentage "userId", "action", "resourceId", "resourceType", "timestamp" og "ip" på alle ni rækker — 54 nøglegentagelser for seks feltnavne. I TOON fremgår de præcis én gang. For revisionslogge med hundredvis af poster er det forskellen mellem at passe dataene i din prompt og ikke at gøre det.

API-hastighedsbegrænsning / metriktdata

Driftsmålinger — latens-percentiler, fejlrater, gennemstrømning — er en anden naturlig pasform til TOON. Dataene er taltunge og perfekt tabelformede. Du kan sende dette til en LLM for at spørge "hvilke endepunkter har p99-latens over 500ms?" eller "hvor stiger fejlraten?" Dette er formen på data, du typisk ville se komme ud af en Node.js-målingsrørledning eller en Prometheus-skrab:

text
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,3200

LLM'en kan straks besvare spørgsmål om denne tabel uden nogen kontekst-overhead. Bemærk, at /api/v2/search og /api/v2/checkout begge skiller sig ud med høj p99 og forhøjede fejlrater — præcis den slags mønster, som en LLM kan identificere øjeblikkeligt når du præsenterer dataene klart.

Indlejret konfigurationsobjekt

TOON håndterer mere end tabeldata. For strukturerede objekter — den slags ting du ville finde i en apps runtime-konfiguration — bruger TOON en inline-objektnotation med indlejret struktur. Tænk på dette som et modstykke til serialiseringsformater som TOML eller YAML, men slankere. Her er en realistisk appkonfiguration, der viser serverindstillinger, databaseindstillinger og funktionsflags:

json
{
  "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
  }
}

Den samme konfiguration i TOON-objektnotation — nøgler er ikke citeret, indlejring bruger inline-parenteser:

text
{
  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}
}
TOONs objektsyntaks citerer ikke nøgler, medmindre en værdi indeholder et komma eller kolon. I database-blokken ovenfor er host:db.internal.example.com fint som det er — ingen anførselstegn nødvendig, fordi værdien ikke indeholder nogen af dem. Hvis en værdi gør indeholder et komma eller kolon, omgiv det med dobbelte anførselstegn: dsn:"host:5432,sslmode=require".

Finansielle transaktioner

Finansielle data er en anden høj-værdi LLM-use case: svindelsignaler, afstemningskontroller, kategorisering. Blandingen af streng-ID'er, numeriske beløb, valutakoder, status-enums og tidsstempler kortlægger rent til TOONs tabelformat. Her er et realistisk transaktionsudsnit:

text
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:15Z

Indsæt dette i en prompt ved siden af "markér alle transaktioner over £5.000 eller med status flagged eller failed", og modellen vil svare på sekunder. TOON-repræsentationen er kompakt nok til, at du komfortabelt ville passe flere hundrede rækker i en enkelt prompt uden at ramme kontekstgrænser på de fleste modeller.

Kombination af tabeldata og objektdata i ét dokument

Her er noget, som hverken JSON eller CSV håndterer klart: et dokument, der har både en metadata-header (et enkelt konfigurationsobjekt) og en datatabel i den samme payload. Tænk på en rapport med en kontekstblok øverst — hvem der genererede den, hvilken tidsperiode den dækker, hvilke filtre der blev anvendt — efterfulgt af de faktiske datarækker. I JSON ville du skulle omgive alt i et konvolutsobjekt med en "meta"-nøgle og en "rows"-nøgle, hvilket tilføjer endnu et niveau af indlejring. CSV kan slet ikke gøre det. TOON håndterer det naturligt:

text
{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,100000

Den første linje er et TOON-objekt — rapportens metadata. Den tomme linje adskiller det fra den tabelsektion, der følger. Et enkelt decode()-kald fra @toon-format/toon returnerer begge dele. Du kan sende dette hele dokument til en LLM med et spørgsmål som "hvilke repræsentanter er på vej til at ramme kvoten?" og den har alt, hvad den har brug for: rapport-konteksten og dataene, i én kompakt payload.

Dette blandede format er særligt kraftfuldt til LLM-rørledninger. I stedet for at bygge et JSON-konvolut med indlejrede nøgler, skriver du et fladt headerobjekt + en navngivet tabel. Modellen læser det naturligt, og din kode til at generere det er triviel. Brug JSON til TOON-konverteren til at transformere eksisterende JSON-payloads, eller TOON Formatter til at rydde op og validere håndskrevet TOON.

Brug af npm-pakken

Alle disse eksempler kan kodes og afkodes programmatisk. @toon-format/toon-pakken er referenceimplementeringen. Installer den i ethvert Node.js- eller browser-projekt:

bash
npm install @toon-format/toon

Kode derefter dine data, inden du sender dem til en LLM API, og afkod svaret på vej tilbage:

ts
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"

Opsummering

Mønstrene ovenfor — produktkataloger, revisionslogge, metriktabeller, konfigurationsobjekter, finansielle data, blandede header+tabel-dokumenter — dækker langt størstedelen af de strukturerede data, udviklere faktisk sender til LLM'er. TOON håndterer dem alle godt, og tokenbesparelserne er betydelige i alle tilfælde. Kernereglen er simpel: JSON gentager nøglenavne på hver række; TOON gør det ikke. For tabelformet dataserialisering, der skal ind i et LLM-kontekstvindue, er den gentagelse rent spild.

Brug JSON til TOON-konverteren til at konvertere eksisterende JSON til TOON. Brug TOON til JSON-konverteren den anden vej, efter en LLM returnerer TOON. TOON Formatter renser og validerer TOON-strenge, og TOON Validator fanger syntaksfejl, inden de når din rørledning. npm-pakken @toon-format/toon håndterer kodning og afkodning på to kodelinjer — alle ovenstående eksempler virker ud af boksen.