La documentation des formats adore les exemples jouets — trois lignes, noms fictifs, cinq colonnes. C'est bien pour apprendre la syntaxe, mais ça ne dit pas si un format gère les formes que vous rencontrez vraiment au travail. Cet article évite les jouets. Voici les patterns de données qui reviennent constamment dans le vrai développement backend — catalogues de produits, journaux d'audit, tableaux de métriques, objets de configuration, transactions financières — montrés en JSON et TOON côte à côte, pour que vous voyiez exactement ce que vous économisez et où TOON justifie son existence. Toutes les données sont réalistes ; pas de foo, bar ou noms de substitution. Pour des informations sur le format lui-même, voir le guide de syntaxe TOON.

Catalogue de produits e-commerce

Un tableau de produits est probablement la chose la plus courante que les développeurs envoient à un LLM — "classifiez ces articles", "trouvez le moins cher dans chaque catégorie", "signalez tout ce qui est en rupture de stock avec un prix supérieur à 50$". Voici une tranche de catalogue réaliste en JSON d'abord :

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

Maintenant le même catalogue en TOON. Les en-têtes de colonnes sont déclarés une fois ; chaque ligne ne contient que des valeurs :

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
Les six en-têtes de colonnes en TOON sont écrits exactement une fois. En JSON ils se répètent sur chaque ligne. À la ligne 3, l'en-tête a déjà amorti son coût en économies de tokens — et sur un catalogue de 200 lignes la différence est dramatique. Utilisez le tokeniseur OpenAI pour vérifier les économies avec vos propres données.

Journal d'activité utilisateur / d'audit

Les journaux d'audit sont exactement le type de données qu'on alimenterait à un LLM avec un prompt comme "résumez ce que cet utilisateur a fait dans la dernière heure" ou "signalez les schémas d'accès suspects". Ils sont à haut volume, répétitifs, et les noms de colonnes sont identiques sur chaque ligne. Les pistes d'audit ont aussi tendance à être la première chose qui fait exploser votre fenêtre de contexte quand vous les collez en JSON. Voici un journal réaliste de 9 lignes en 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

Le JSON équivalent répéterait "userId", "action", "resourceId", "resourceType", "timestamp" et "ip" sur les neuf lignes — 54 répétitions de clés pour six noms de champs. En TOON ils apparaissent exactement une fois. Pour les journaux d'audit avec des centaines d'entrées, c'est la différence entre faire rentrer les données dans votre prompt et ne pas pouvoir.

Données de métriques / limite de débit API

Les métriques opérationnelles — percentiles de latence, taux d'erreur, débit — sont un autre candidat naturel pour TOON. Les données sont à dominante numérique et parfaitement tabulaires. Vous pourriez envoyer ceci à un LLM pour demander "quels endpoints ont une latence p99 supérieure à 500ms ?" ou "où le taux d'erreur est-il en hausse ?" C'est la forme de données que vous verriez généralement sortir d'un pipeline de métriques Node.js ou d'un scrape Prometheus :

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

Le LLM peut immédiatement répondre aux questions sur ce tableau sans aucune surcharge de contexte. Notez que /api/v2/search et /api/v2/checkout se démarquent tous deux avec un p99 élevé et des taux d'erreur élevés — exactement le type de pattern qu'un LLM peut faire remonter instantanément quand vous présentez les données proprement.

Objet de configuration imbriqué

TOON gère plus que les données tabulaires. Pour les objets structurés — le genre de chose que vous trouveriez dans la configuration runtime d'une app — TOON utilise une notation d'objet en ligne avec une structure imbriquée. Pensez-y comme un pendant des formats de sérialisation comme TOML ou YAML, mais plus léger. Voici une configuration d'app réaliste montrant les paramètres serveur, de base de données et les flags de fonctionnalités :

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

La même configuration en notation d'objet TOON — les clés ne sont pas entre guillemets, l'imbrication utilise des accolades en ligne :

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}
}
La syntaxe d'objet TOON ne met pas les clés entre guillemets sauf si une valeur contient une virgule ou un deux-points. Dans le bloc database ci-dessus, host:db.internal.example.com est parfaitement valide tel quel — pas de guillemets nécessaires car la valeur ne contient ni l'un ni l'autre. Si une valeur contient une virgule ou un deux-points, entourez-la de guillemets doubles : dsn:"host:5432,sslmode=require".

Transactions financières

Les données financières sont un autre cas d'utilisation LLM à haute valeur : indications de détection de fraude, vérifications de rapprochement, catégorisation. Le mélange d'IDs de chaînes, de montants numériques, de codes de devise, d'énumérations de statut et d'horodatages se mappe proprement au format tabulaire de TOON. Voici une tranche de transaction réaliste :

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

Collez ceci dans un prompt à côté de "signalez toutes les transactions au-dessus de £5 000 ou avec le statut flagged ou failed" et le modèle répondra en secondes. La représentation TOON est suffisamment compacte pour que vous puissiez confortablement faire rentrer plusieurs centaines de lignes dans un seul prompt sans atteindre les limites de contexte sur la plupart des modèles.

Combiner données tabulaires et objet dans un même document

Voici quelque chose que ni JSON ni CSV ne gèrent proprement : un document qui a à la fois un en-tête de métadonnées (un seul objet de configuration) et un tableau de données dans la même charge utile. Pensez à un rapport avec un bloc de contexte en haut — qui l'a généré, quelle période il couvre, quels filtres ont été appliqués — suivi des lignes de données réelles. En JSON, vous devriez envelopper tout dans un objet envelope avec une clé "meta" et une clé "rows", ce qui ajoute une autre couche d'imbrication. CSV ne peut pas le faire du tout. TOON le gère nativement :

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

La première ligne est un objet TOON — les métadonnées du rapport. La ligne vide le sépare de la section tabulaire qui suit. Un seul appel decode() de @toon-format/toon retourne les deux. Vous pouvez envoyer ce document entier à un LLM avec une question comme "quels représentants sont en bonne voie pour atteindre leur quota ?" et il a tout ce dont il a besoin : le contexte du rapport et les données, dans une charge utile compacte.

Ce format mixte est particulièrement puissant pour les pipelines LLM. Plutôt que de construire une enveloppe JSON avec des clés imbriquées, vous écrivez un objet d'en-tête plat + une table nommée. Le modèle le lit naturellement, et votre code pour le générer est trivial. Utilisez le convertisseur JSON vers TOON pour transformer les charges utiles JSON existantes, ou le formateur TOON pour nettoyer et valider le TOON écrit à la main.

Utilisation du package npm

Tous ces exemples peuvent être encodés et décodés programmatiquement. Le @toon-format/toon package est l'implémentation de référence. Installez-le dans tout projet Node.js ou navigateur :

bash
npm install @toon-format/toon

Puis encodez vos données avant de les envoyer à une API LLM, et décodez la réponse au retour :

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"

En résumé

Les patterns ci-dessus — catalogues de produits, journaux d'audit, tableaux de métriques, objets de configuration, données financières, documents mixtes en-tête+tableau — couvrent la grande majorité des données structurées que les développeurs envoient réellement aux LLMs. TOON les gère tous bien, et les économies de tokens sont significatives dans chaque cas. La règle centrale est simple : JSON répète les noms de clés sur chaque ligne ; TOON ne le fait pas. Pour la sérialisation de données tabulaires qui va dans une fenêtre de contexte LLM, cette répétition est du pur gaspillage.

Pour convertir du JSON existant en TOON, utilisez le convertisseur JSON vers TOON. Pour aller dans l'autre sens après qu'un LLM retourne du TOON, utilisez le convertisseur TOON vers JSON. Le formateur TOON nettoie et valide les chaînes TOON, et le validateur TOON détectera les erreurs de syntaxe avant qu'elles n'atteignent votre pipeline. Le package npm @toon-format/toon gère l'encodage et le décodage en deux lignes de code — tous les exemples ci-dessus fonctionnent directement.