Varje token du skickar till ett LLM API kostar pengar. Inte mycket per token — men när din prompt inkluderar ett dataset med 50 rader användardata formaterade som JSON, betalar du för varje klammer, varje upprepat nyckelnamn, varje citationstecken. I ett dataset med 10 fält och 100 rader bränner JSON ungefär 60–70% av sina tokens på strukturellt brus. TOON byggdes för att fixa exakt detta. Den här artikeln visar hur du använder @toon-format/toon för att minska dina prompttokenantal — ibland med mer än hälften — utan att förlora någon struktur modellen behöver.

Hur LLM-tokenprissättning fungerar

Modeller som GPT-4o och Claude debiterar per inmatningstoken och per utmatningstoken. Verktyget OpenAI Tokenizer låter dig klistra in valfri text och se exakt hur många tokens det kostar. Ungefärligen 1 token ≈ 4 tecken av engelsk text — men JSONs strukturella tecken (citationstecken, kolon, klamrar) tokeniseras ofta individuellt, så JSON-tunga prompter tokeniseras sämre än vanlig prosa vid samma teckenantal. Du betalar en strukturell skatt på varje förfrågan.

För en typisk SaaS-app som kör tusentals förfrågningar per dag med strukturerad data i varje prompt adderas den skatten snabbt. Arkitekturen för stora språkmodeller innebär att modellen genuint inte behöver allt det formateringsbruset — den kan läsa strukturerad data bra utan JSONs mångsidighet, så länge formatet är otvetydigt och välförklarat.

JSON vs TOON — en konkret tokenjämförelse

Låt oss göra detta konkret. Här är ett 10-raders användardataset i JSON:

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

Det JSON-blocket tokeniseras till ungefär 310–330 tokens. Här är exakt samma data i TOON-tabellnotation:

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

TOON-versionen tokeniseras till ungefär 135–150 tokens — ungefär 55% färre. I skala är det inte ett avrundningsfel. Om du kör 10 000 sådana frågor per dag till GPT-4o-prissättning, är skillnaden mellan JSON och TOON i din prompt enbart materiell.

Tokenbesparingar skalas med rader, inte kolumner. Ju fler rader ditt dataset har, desto större vinst — eftersom TOON betalar kolumnrubrikskostnaden en gång, medan JSON betalar nyckelnamnskostnaden på varje enskild rad. En 100-raders tabell i TOON sparar ungefär samma procentandel som detta 10-raders exempel.

Installera och konvertera data i Node.js

Installera paketet från npm. Det fungerar i Node.js 18+ och moderna webbläsare:

bash
npm install @toon-format/toon

Importen är en enda destrukturering:

js
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,true

Praktiskt mönster: Hämta → Koda → Prompt → Avkoda

Arbetsflödet för att använda TOON med ett LLM API är fyra steg. Hämta dina data från valfri källa (databas, REST API, CSV-fil), koda dem till TOON, bygg din prompt och avkoda valfritt strukturerat TOON från modellens svar.

js
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);
}

Samma mönster fungerar för Anthropic Claude API — byt bara klient. Promptstrukturen och TOON-kodningen är identiska oavsett leverantör. Du kan kolla hela OpenAI API-dokumentationen för autentiseringsinställningar och modellvaldetaljer.

När det spelar störst roll

TOON lönar sig mest i dessa scenarier:

  • Stora dataset i kontext. När du lägger mer än ~20 rader strukturerad data i en prompt, sparar TOON-tabellnotation avsevärt mer tokens jämfört med JSON-arrayer av objekt.
  • Upprepade strukturerade förfrågningar. Om din applikation gör samma form av förfrågan tusentals gånger per dag (tänk: "analysera den här användarens aktivitet" med en användarpost i varje prompt), är de kumulativa besparingarna avsevärda.
  • Batchbearbetningsjobb. Skript som bearbetar tusentals poster genom ett LLM — klassificering, taggning, berikning, sammanfattning — drar enorm nytta. Färre tokens per anrop innebär snabbare genomströmning och lägre kostnad.
  • Kontextfönsterbegränsade uppgifter. När du försöker passa ett stort dataset i ett 128k kontextfönster bredvid en lång systemprompt och few-shot-exempel, spelar varje token roll. TOON låter dig passa in fler rader i samma fönster.
  • Kostnadskänsliga produktions-API:er. Hobbyprojekt på gratisplan märker det inte. Produktionsappar som betjänar betalande användare i skala absolut.

Den enda varningen: LLM:er behöver känna till formatet

TOON finns inte i något LLMs träningsdata på samma sätt som JSON. Modellen har aldrig sett en .toon-fil. Det innebär att du måste inkludera en kort formatbeskrivning i din systemprompt — annars kommer modellen antingen att avvisa inmatningen eller felparsa den. Det goda är att beskrivningen är kort och du betalar för den bara en gång per konversation eller förfrågan.

Ett minimalt tillägg till systemprompt som fungerar tillförlitligt:

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

Det blocket lägger till ungefär 60 tokens i din systemprompt — en engångskostnad som snabbt återfås på vilket dataset som helst som är större än 5–6 rader. För applikationer som gör många API-anrop med TOON-data amortiseras formatbeskrivningstokens till nära noll. Använd JSON till TOON för att konvertera dina data innan du bygger prompten, och TOON Formatter för att verifiera att det ser rätt ut.

Sammanfattning

Argumentet för TOON i LLM-arbetsflöden är enkelt: du betalar per token, strukturerad data i JSON är tokenineffektiv, och TOON är en direkt fix. Tabellnotationen ensam minskar tokenanvändningen med 50–60% på typiska radbaserade dataset. npm-paketet — @toon-format/toon — är litet, API:et är två funktioner och integrationen i ett befintligt API-anrop är ett femminutersjobb. Det enda att komma ihåg är formatbeskrivningen i din systemprompt — utan den gissar modellen. Med den får du en modell som läser dina data korrekt på hälften av tokenkostnaden. Börja med JSON till TOON för att konvertera din befintliga data, validera den med TOON Validator och använd TOON till JSON eller decode() för att konvertera strukturerade svar tillbaka när det behövs.