TOON: El formato que reduce tus tokens y mejora tus LLMs

TOON: El formato que reduce tus tokens y mejora tus LLMs

3 min de lectura

TOON (Token-Oriented Object Notation) es un formato de codificación compacto y legible para humanos, diseñado específicamente para enviar datos estructurados a modelos de lenguaje grande (LLMs) con hasta un 40% menos de tokens que JSON estándar.

Una capa de traducción entre tu código y los LLMs

TOON (Token-Oriented Object Notation) es un formato de codificación compacto y legible, diseñado específicamente para enviar datos estructurados a modelos de lenguaje grande. Es la respuesta a un problema concreto: JSON es verboso, y la verbosidad cuesta tokens. Los tokens cuestan dinero.

Piensa en TOON como un traductor: sigues usando JSON en tu código como siempre, pero cuando necesitas pasarle datos a un LLM, los conviertes a TOON para hacerlo de forma más eficiente. El modelo lee la estructura igual de bien — o mejor — y tú pagas hasta un 40% menos.

"Usa JSON programáticamente, codifícalo como TOON para los LLMs." — Documentación oficial de TOON


El mismo dato. Menos tokens.

Para ver la diferencia en la práctica, considera este dataset de excursiones:

En JSON (235 tokens):

{
  "context": {
    "task": "Our favorite hikes together",
    "location": "Boulder",
    "season": "spring_2025"
  },
  "friends": ["ana", "luis", "sam"],
  "hikes": [
    {
      "id": 1, "name": "Blue Lake Trail",
      "distanceKm": 7.5, "elevationGain": 320,
      "companion": "ana", "wasSunny": true
    },
    {
      "id": 2, "name": "Ridge Overlook",
      "distanceKm": 9.2, "elevationGain": 540,
      "companion": "luis", "wasSunny": false
    },
    {
      "id": 3, "name": "Wildflower Loop",
      "distanceKm": 5.1, "elevationGain": 180,
      "companion": "sam", "wasSunny": true
    }
  ]
}

En TOON (106 tokens — 55% menos):

context:
  task: Our favorite hikes together
  location: Boulder
  season: spring_2025
friends[3]: ana,luis,sam
hikes[3]{id,name,distanceKm,elevationGain,companion,wasSunny}:
  1,Blue Lake Trail,7.5,320,ana,true
  2,Ridge Overlook,9.2,540,luis,false
  3,Wildflower Loop,5.1,180,sam,true

El truco está en que TOON declara los campos una sola vez y transmite los valores como filas. Con datasets de decenas o cientos de registros, el ahorro es enorme.


Características principales

Eficiente en tokens. Declara los campos una sola vez y transmite los valores como filas. Compacidad similar a CSV pero con estructura explícita.

Round-trip lossless. decode(encode(x)) siempre es igual a x. Cero pérdida de datos. Listo para producción.

Guardarraíles para LLMs. Los [N] de longitud y los {campos} explícitos ayudan al modelo a seguir el esquema y detectar truncaciones.

Multi-lenguaje. Implementaciones estables en TypeScript, Python, Rust, Java, Swift y Julia. Comunidad activa en Go, C#, PHP, Ruby y más.


Tres estilos. Un formato.

TOON elige automáticamente el estilo más compacto según el tipo de dato:

Tipo de dato Estilo Ejemplo
Objeto anidado Indentación YAML context:\n key: value
Arreglo de primitivos Inline friends[3]: a,b,c
Arreglo uniforme de objetos Tabla CSV items[2]{id,name}:\n 1,Alice\n 2,Bob

La sintaxis completa en acción:

# Objeto anidado → indentación tipo YAML
context:
  task: Our favorite hikes
  location: Boulder

# Arreglo de primitivos → inline
friends[3]: ana,luis,sam

# Arreglo uniforme de objetos → tabla tipo CSV
hikes[3]{id,name,distanceKm,wasSunny}:
  1,Blue Lake Trail,7.5,true
  2,Ridge Overlook,9.2,false
  3,Wildflower Loop,5.1,true

Para usar TOON desde TypeScript:

import { encode, decode } from '@toon-format/toon'

// JSON → TOON (para el prompt)
const toon = encode(data)

// TOON → JSON (de vuelta a tu app)
const original = decode(toon, { strict: true })

Instalación: npm install @toon-format/toon

También disponible en Python, Rust, Java, Go, Swift, PHP, Ruby y más.


Ecosistema

TOON cuenta con implementaciones oficiales en TypeScript, Python, Rust, Java, Swift y Julia (todas en estado stable), y ports de la comunidad en Go, .NET y Dart (en desarrollo activo).

Además hay soporte comunitario para PHP, Ruby, Kotlin, C#, Elixir, Clojure, Scala, R y más.


Caso de uso 1: Filtrado de logs con Claude

Tienes logs de eventos y quieres pedirle a Claude que filtre solo los errores. Este flujo de 4 pasos muestra exactamente cómo funciona TOON en un pipeline real.

Paso 1 — Los logs llegan como JSON:

[
  { "id": 1, "level": "error", "message": "Connection timeout", "ts": "10:00" },
  { "id": 2, "level": "warn",  "message": "Slow query",         "ts": "10:05" },
  { "id": 3, "level": "info",  "message": "User login",         "ts": "10:10" },
  { "id": 4, "level": "error", "message": "Database error",     "ts": "10:15" }
]

Paso 2 — Conviertes a TOON con una línea:

import { encode } from '@toon-format/toon'

const toon = encode({ events: logs })
// events[4]{id,level,message,ts}:
//   1,error,Connection timeout,10:00
//   2,warn,Slow query,10:05
//   3,info,User login,10:10
//   4,error,Database error,10:15

Paso 3 — Envías el prompt a Claude:

System logs in TOON format:

```toon
events[4]{id,level,message,ts}:
  1,error,Connection timeout,10:00
  2,warn,Slow query,10:05
  3,info,User login,10:10
  4,error,Database error,10:15

Task: Return ONLY error-level events as TOON. Use the same format. Adjust [N] to match row count.


**Paso 4 — Validas la respuesta con strict mode:**

```typescript
import { decode } from '@toon-format/toon'

// Respuesta de Claude:
// events[2]{id,level,message,ts}:
//   1,error,Connection timeout,10:00
//   4,error,Database error,10:15

const result = decode(modelResponse, { strict: true })
// ✓ Validado: [N]=2, conteo de campos correcto
console.log(result.events) // [{id:1,...}, {id:4,...}]

Caso de uso 2: Pipeline de análisis con Claude Code

Conectas tu base de datos, codificas los datos en TOON, envías a Claude para análisis y recibes el resultado estructurado de vuelta:

import { encode, decode } from '@toon-format/toon'
import Anthropic from '@anthropic-ai/sdk'

const client = new Anthropic()

// 1. Tus datos vienen como JSON de la base de datos
const users = await fetchUsersFromDatabase()

// 2. Conviertes a TOON → mucho más compacto para el prompt
const toonData = encode({ users })

// 3. Prompt con el bloque TOON embebido
const prompt = `
Analiza el siguiente dataset de usuarios en formato TOON:

\`\`\`toon
${toonData}
\`\`\`

Identifica usuarios sin login en los últimos 30 días.
Devuelve el resultado como TOON con el mismo esquema.
`

// 4. Envías a Claude
const response = await client.messages.create({
  model: 'claude-opus-4-6',
  max_tokens: 1024,
  messages: [{ role: 'user', content: prompt }],
})

// 5. Decodificas y validas la respuesta
const toonBlock = extractToonBlock(response.content[0].text)
const result = decode(toonBlock, { strict: true })

console.log('Usuarios para re-engagement:', result.users)

Tip: Claude Code tiene visibilidad de todo tu proyecto. Puedes pedirle directamente: "Encuentra todos los scripts que envían JSON a la API de Anthropic y optimízalos para usar TOON con @toon-format/toon." Claude Code instalará la dependencia, reemplazará la serialización y añadirá validación con modo estricto — sin que tengas que tocar cada archivo manualmente.


¿Cuándo usar TOON?

Úsalo cuando…

  • Tienes arreglos uniformes de objetos (misma estructura en cada fila)
  • Tus prompts incluyen datasets de decenas a miles de registros
  • El costo por token importa en pipelines frecuentes
  • Quieres que el modelo genere datos estructurados de vuelta
  • Trabajas con APIs que tienen rate limits o budgets de tokens ajustados

Evítalo cuando…

  • Las estructuras son profundamente anidadas y no uniformes (mejor JSON compacto)
  • El pipeline ya está establecido y el ROI no justifica el cambio
  • Los datos son puramente planos (CSV directo es más compacto aún)
  • La latencia es crítica (mide primero en tu entorno)
  • Tu equipo no está familiarizado y no hay tiempo para onboarding

Pruébalo hoy

La forma más rápida de experimentar es el Playground online: pega tu JSON y ve la conversión a TOON en tiempo real con el conteo de tokens comparado.

npm install @toon-format/toon