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 :
[
{"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 :
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,AudioJournal 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 :
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.47Le 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 :
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,3200Le 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 :
{
"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 :
{
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 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 :
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:15ZCollez 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 :
{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,100000La 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.
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 :
npm install @toon-format/toonPuis encodez vos données avant de les envoyer à une API LLM, et décodez la réponse au retour :
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.