Knowledge-Optimized Data Architecture
Formato de datos y toolkit completo para comunicacion eficiente con LLMs. Codifica, plantilla, parsea y valida datos estructurados usando 50%+ menos tokens que JSON.
Enviar datos a un LLM en JSON desperdicia tokens en llaves, comillas y redundancia. SLIM resuelve esto con un formato compacto + un pipeline completo:
| Feature | JSON | YAML | CSV | SLIM |
|---|---|---|---|---|
| Token-efficient | No | Medio | Si | Si |
| Datos anidados | Si | Si | No | Si |
| Datos tabulares | Verbose | Verbose | Si | Si |
Directivas (@context, @budget) |
No | No | No | Si |
| Multi-tenant | No | No | No | Si |
| Streaming | No | No | Si | Si |
JSON (112 chars, ~28 tokens):
{"store":"Downtown Store","items":[{"id":1,"name":"Burger","price":1200},{"id":2,"name":"Salad","price":900}]}SLIM (82 chars, ~21 tokens -- 25% menos):
store: Downtown Store
items[2]{id,name,price}:
- 1, Burger, 1200
- 2, Salad, 900
Con datasets reales de produccion, SLIM logra 52-64% de ahorro vs JSON formateado y 28-35% vs JSON compacto.
# Core library
npm install @slim-format/core
# CLI (opcional)
npm install -g @slim-format/cliimport { encode, decode } from '@slim-format/core'
const data = {
products: [
{ id: 1, name: 'Burger', price: 8500 },
{ id: 2, name: 'Salad', price: 6200 },
],
sales: { total: 1250000, tickets: 87 },
}
// JSON -> SLIM
const slim = encode(data)
// products[2]{id,name,price}:
// - 1, Burger, 8500
// - 2, Salad, 6200
// sales:
// total: 1250000
// tickets: 87
// SLIM -> JSON
const restored = decode(slim)
// Lossless round-trip: restored === dataSLIM soporta directivas de metadata que ningun otro formato tiene:
const slim = encode(data, {
directives: {
context: { tenant: 'store_alpha', env: 'prod' },
budget: { tokens: 2000 },
priority: { high: 'sales', low: 'history' },
},
})
// @context tenant=store_alpha env=prod
// @budget tokens=2000
// @priority high=sales low=history
//
// products[2]{id,name,price}:
// - 1, Burger, 8500
// ...Compone prompts con datos SLIM, budget inteligente y multi-tenant:
import { SlimTemplate } from '@slim-format/core'
const template = SlimTemplate.define(`
@template sales-analysis
@model claude-sonnet
@budget tokens=4000
# Rol
Sos un analista de negocio retail.
# Datos de ventas
{{data:sales | priority=high}}
# Catalogo actual
{{data:products | priority=medium}}
# Pregunta
{{input:query}}
`)
const prompt = template.render({
data: { sales: salesData, products: productsData },
input: { query: 'Cual fue el producto mas rentable hoy?' },
})
prompt.text // String listo para enviar al LLM
prompt.tokenCount // Tokens estimados
prompt.truncated // Que se trunco por budget y por queSi el prompt supera el @budget, SLIM trunca secciones de menor prioridad primero, sin cortar datos a mitad de fila.
Parsea y valida respuestas del LLM con schemas tipados:
import { SlimSchema, slimParse, slimParseWithRetry } from '@slim-format/core'
const schema = SlimSchema.define({
top_product: { type: 'string', required: true },
amount: { type: 'number', required: true },
recommendations: { type: 'array', items: { type: 'string' }, maxItems: 5 },
})
// Modo strict
const result = slimParse(llmResponse, schema, 'strict')
if (result.ok) {
console.log(result.data) // Tipado
}
// Con retry automatico via LLM
const result = await slimParseWithRetry(llmResponse, schema, {
llm: claudeClient,
maxRetries: 2,
strategy: 'correct', // Reenvia errores al LLM para que corrija
includeErrors: true,
})4 modos de parsing:
| Modo | Descripcion |
|---|---|
strict |
Rechaza si no matchea el schema exacto |
coerce |
Intenta castear tipos ("42" -> 42) |
partial |
Acepta respuestas incompletas |
correct |
Retry automatico con correccion via LLM |
import Anthropic from '@anthropic-ai/sdk'
import { encode } from '@slim-format/core'
const client = new Anthropic()
const sales = await fetchSales() // Tu data
const slimPayload = encode(sales, {
directives: { context: { tenant: 'store_alpha', date: '2026-04-07' } },
})
const response = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [
{
role: 'user',
content: `Analiza estas ventas y dame el producto mas rentable:\n\n${slimPayload}`,
},
],
})import { GoogleGenerativeAI } from '@google/generative-ai'
import { encode, decode } from '@slim-format/core'
const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY!)
const model = genAI.getGenerativeModel({ model: 'gemini-2.5-flash' })
// Encodear data de inventario a SLIM antes de enviarla
const inventory = [
{ sku: 'WDG-001', product: 'Widget Standard', quantity: 45, minimum: 20 },
{ sku: 'GAD-003', product: 'Gadget Pro', quantity: 12, minimum: 15 },
{ sku: 'ACC-002', product: 'Accessory Pack', quantity: 8, minimum: 25 },
]
const slimData = encode({ inventory })
// inventory[3]{sku,product,quantity,minimum}:
// - WDG-001, Widget Standard, 45, 20
// - GAD-003, Gadget Pro, 12, 15
// - ACC-002, Accessory Pack, 8, 25
const result = await model.generateContent(
`Dado este inventario, que productos necesitan reposicion urgente?\n\n${slimData}`
)
console.log(result.response.text())
// "Accessory Pack (8 unidades, minimo 25) necesita reposicion urgente.
// Gadget Pro (12 unidades, minimo 15) esta proximo al limite."Por que SLIM con Gemini? Gemini cobra por token de input. Enviando
inventorycomo JSON pretty-printed serian ~85 tokens. Con SLIM son ~40. En un pipeline que hace 10,000 llamadas/dia, eso son 450,000 tokens menos por dia.
import { SlimTemplate } from '@slim-format/core'
const template = SlimTemplate.define(`
@template inventory-restock
@model gemini-2.5-flash
@budget tokens=2000
# Rol
Sos un gestor de inventario para una tienda retail.
# Stock actual
{{data:inventory | priority=high}}
# Historial de consumo
{{data:history | priority=low}}
# Instruccion
{{input:query}}
`)
const prompt = template.render({
data: { inventory: inventoryData, history: historyData },
input: { query: 'Genera una orden de compra para los proximos 3 dias' },
})
// Si el prompt excede 2000 tokens, SLIM trunca "history" (priority=low) primero
const result = await model.generateContent(prompt.text)import OpenAI from 'openai'
import { encode } from '@slim-format/core'
const openai = new OpenAI()
const slimData = encode(orders) // Cualquier data estructurada
const completion = await openai.chat.completions.create({
model: 'gpt-4o',
messages: [
{ role: 'system', content: 'Responde en espanol. Los datos vienen en formato SLIM.' },
{ role: 'user', content: `Resumi los pedidos del dia:\n\n${slimData}` },
],
})# Encode JSON a SLIM
echo '{"name":"Leo","age":30}' | slim
# name: Leo
# age: 30
# Decode SLIM a JSON
echo 'name: Leo\nage: 30' | slim --decode
# Con estadisticas de tokens
slim encode data.json --stats
# Con directivas
slim encode data.json --context tenant=store_alpha --budget 2000
# Pipe desde curl -- comprimi una API response antes de pasarla a un LLM
curl -s https://api.example.com/products | slim --stats
# Comparar tamanos: JSON vs SLIM
slim encode data.json --stats
# Characters: 380 (vs 860 JSON) — 55.8% reduction
# Est. tokens: 95 (vs 215 JSON) — 55.8% reductionCasos de uso reales organizados por dominio. Cada ejemplo muestra el output SLIM, la comparativa de tokens contra JSON y validacion del schema de respuesta del LLM.
# TypeScript
npx tsx examples/<archivo>.ts
# Python
python examples/<archivo>.py| Archivo | Descripcion | Ahorro estimado |
|---|---|---|
server-monitoring.ts |
8 servidores en produccion → deteccion de anomalias, correlacion con deploys, plan de accion | ~58% |
code-review.ts |
Diff de PR + reglas del equipo → review automatico con veredicto APROBADO / CAMBIOS / RECHAZADO | ~52% |
| Archivo | Descripcion | Ahorro estimado |
|---|---|---|
hr-screening.py |
5 CVs + requisitos del puesto → ranking con puntaje y justificacion por candidato | ~61% |
medical-assistant.py |
Historia clinica completa → alertas de interaccion medicamentosa y chequeos preventivos | ~54% |
legal-assistant.ts |
5 expedientes + plazos procesales → agenda legal con alertas de vencimiento y cruce con feriados | ~57% |
| Archivo | Descripcion | Ahorro estimado |
|---|---|---|
secretary-assistant.ts |
Agenda del dia + tareas + perfil del jefe → briefing ejecutivo de inicio de jornada | ~55% |
telecom-support.py |
Perfil del cliente + consumo + historial de tickets → asistente en tiempo real para agente de call center | ~56% |
logistics-fleet.ts |
7 repartidores + 7 pedidos en tiempo real → dispatch inteligente con reasignaciones y alertas de SLA | ~59% |
| Archivo | Descripcion | Ahorro estimado |
|---|---|---|
real-estate.ts |
5 propiedades + perfil del comprador → match con puntaje y justificacion para cada opcion | ~58% |
school-report.py |
Notas + asistencia + observaciones docentes → reporte trimestral personalizado para padres | ~59% |
ecommerce-recommendations.py |
Historial de compras + catalogo de 10 productos → recomendaciones personalizadas con razon de cada una | ~60% |
| Archivo | Descripcion |
|---|---|
basic-encode.ts |
Encode y decode de un objeto simple con comparativa de caracteres |
template-budget.ts |
Sistema de templates con presupuesto de tokens y truncado automatico |
schema-validate.py |
Validacion de schema en modos strict y coerce |
SLIM incluye un suite de benchmarks con datasets reales:
cd benchmarks
pnpm benchmark:tokensResultados tipicos:
| Dataset | JSON (pretty) | JSON (compact) | YAML | SLIM | Ahorro vs JSON |
|---|---|---|---|---|---|
| retail/products | 215 tok | 155 tok | 145 tok | 95 tok | 56% |
| retail/sales | 275 tok | 195 tok | 180 tok | 123 tok | 55% |
| retail/inventory | 230 tok | 163 tok | 150 tok | 100 tok | 57% |
| generic/ecommerce | 288 tok | 205 tok | 190 tok | 130 tok | 55% |
| generic/server-logs | 245 tok | 175 tok | 163 tok | 108 tok | 56% |
El dashboard (dashboard/index.html) es una pagina interactiva con Chart.js que permite visualizar los resultados de los benchmarks de un vistazo. Incluye:
- Summary cards -- Metricas clave: cantidad de datasets, ahorro promedio vs JSON pretty (55%), ahorro vs JSON compact (35%), y formatos comparados.
- Graficos de barras por dataset -- Cada dataset tiene su propio chart comparando tokens estimados entre JSON (pretty), JSON (compact), YAML, SLIM y SLIM (folded). Las barras SLIM se destacan en azul.
- Tabla detallada -- Todos los resultados con caracteres, tokens estimados, lineas y porcentaje de ahorro vs JSON pretty.
Para abrirlo:
open dashboard/index.html # macOS
xdg-open dashboard/index.html # Linux
start dashboard/index.html # WindowsEl dashboard usa tema dark (#0f172a) y es util para presentar el caso de negocio de SLIM: cuantos tokens (y dinero) se ahorran al migrar de JSON a SLIM en pipelines de LLM.
SLIM incluye un SDK Python (slim-format) pensado para MCP servers y cualquier pipeline Python que envie datos a LLMs. Zero dependencies, Python 3.10+.
cd slim-python
pip install .
# O en modo desarrollo
pip install ".[dev]"from slim import encode, decode
data = {
"inventory": [
{"sku": "WDG-001", "product": "Widget Standard", "quantity": 45, "minimum": 20},
{"sku": "GAD-003", "product": "Gadget Pro", "quantity": 12, "minimum": 15},
]
}
# Python dict -> SLIM (50%+ menos tokens que JSON)
slim_text = encode(data)
# inventory[2]{sku,product,quantity,minimum}:
# - WDG-001, Widget Standard, 45, 20
# - GAD-003, Gadget Pro, 12, 15
# SLIM -> Python dict (lossless round-trip)
restored = decode(slim_text)
assert restored == datafrom slim import encode
from mcp.server import Server
server = Server("my-mcp")
@server.tool()
async def get_inventory(ctx):
"""Devuelve inventario en formato SLIM -- 50%+ menos tokens que JSON."""
inventory = await db.query("SELECT sku, product, quantity, minimum FROM inventory")
return encode(
{"inventory": inventory},
directives={"context": {"tenant": "store_alpha", "date": "2026-04-07"}},
)
# @context tenant=store_alpha date=2026-04-07
#
# inventory[N]{sku,product,quantity,minimum}:
# - WDG-001, Widget Standard, 45, 20
# - ...from slim import SlimSchema
schema = SlimSchema.define({
"top_product": {"type": "string", "required": True},
"amount": {"type": "number", "required": True},
"recommendations": {"type": "array", "items": {"type": "string"}, "maxItems": 5},
})
# Modo strict -- rechaza si no matchea
result = schema.validate(llm_response)
if result.ok:
print(result.data)
# Modo coerce -- castea tipos ("42" -> 42)
result = schema.validate(llm_response, mode="coerce")
# Modo partial -- acepta respuestas incompletas
result = schema.validate(llm_response, mode="partial")from slim import encode
# Key folding: aplana objetos de una sola key
encode({"sales": {"today": {"total": 100}}}, key_folding="safe")
# sales.today.total: 100
# Delimitador alternativo
encode({"ids": [1, 2, 3]}, delimiter="|")
# ids[3]: 1|2|3
# Indent personalizado
encode({"a": {"b": 1}}, indent=4)
# a:
# b: 1cd slim-python
pip install ".[dev]"
pytest tests/ -v # 82 testsslim/
├── packages/
│ ├── core/ # @slim-format/core (TypeScript)
│ │ └── src/
│ │ ├── format/ # Encode/Decode (Phase 1)
│ │ ├── template/ # Templates con budget (Phase 2)
│ │ └── parse/ # Schema validation + retry (Phase 3)
│ └── cli/ # @slim-format/cli
├── slim-python/ # Python SDK (slim-format)
│ ├── slim/ # encode, decode, schema
│ └── tests/ # 82 tests
├── benchmarks/ # Token efficiency suite
└── dashboard/ # Visualizacion de resultados
Tech stack:
- TypeScript: pnpm workspaces, tsdown, Vitest, Chart.js
- Python: setuptools, pytest, zero runtime dependencies
git clone https://github.com/alvarezleonardo/SLIM.git
cd SLIM
# TypeScript
pnpm install
pnpm run build
pnpm run test # 175 tests
# Python
cd slim-python
pip install ".[dev]"
pytest tests/ -v # 82 testsMIT
Desarrollado por Leonardo Alvarez — GitHub