Especificación
sustituye a JSON Schema · prompts a mano
Gramática EBNF, 15 códigos de error estables y protocolo de extensión. La norma se escribe antes que el código y decide cuando las implementaciones difieren.
Declaras el contrato de tu dominio una vez. mini-format genera la instrucción, valida cada línea de la respuesta y devuelve registros tipados — o un error con código, línea y campo. Hasta 49 % menos tokens que JSON compacto en registros anchos.
Instalar mini-format 1.0
git clone https://github.com/LiveLinDev/mini-format && pip install -e mini-format
git clone https://github.com/LiveLinDev/mini-format && cd mini-format/ts && npm test
Instalación desde el repositorio. La publicación en PyPI y npm está prevista en el plan de tareas; hasta entonces el repositorio es la única fuente.
Después sigue la guía de inicio →1000 registros · coste relativo a mini-format · menos es mejor
Cada barra es lo que cuesta ese formato comparado con mini-format. Más corta, más barata: por debajo de 1,00× gasta menos que mini-format; por encima, más.
1000 registros · coste relativo a mini-format · menos es mejor
Cada barra es lo que cuesta ese formato comparado con mini-format. Más corta, más barata: por debajo de 1,00× gasta menos que mini-format; por encima, más.
1000 registros · coste relativo a mini-format · menos es mejor
Cada barra es lo que cuesta ese formato comparado con mini-format. Más corta, más barata: por debajo de 1,00× gasta menos que mini-format; por encima, más.
| Formato | 5 campos | 20 campos | 50 campos |
|---|---|---|---|
| mini-format | 1,00 | 1,00 | 1,00 |
| CSV | 0,97 | 0,96 | 0,92 |
| TOON | 1,03 | 0,99 | 0,94 |
| JSON compacto | 1,68 | 1,88 | 1,97 |
| YAML | 1,93 | 2,18 | 2,26 |
| JSON indentado | 2,75 | 2,72 | 2,87 |
| XML | 3,33 | 3,28 | 3,50 |
Integrado en
mini validate y parse() entran en un proyecto Python o Node ya existente. No cambias de proveedor de modelo ni de framework.
sustituye a JSON Schema · prompts a mano
Gramática EBNF, 15 códigos de error estables y protocolo de extensión. La norma se escribe antes que el código y decide cuando las implementaciones difieren.
sustituye a regex · json.loads · try/except
Python y TypeScript, escritas por separado desde la misma norma. Parser, serializador, modo tolerante, bloque de prompt y lector en streaming.
sustituye a jq · scripts de validación
Nueve comandos: validar, diagnosticar, convertir en ambos sentidos, generar el prompt, contar tokens, comprobar familias y crear una nueva.
sustituye a pruebas por implementación
303 casos independientes del lenguaje, con expectativas escritas desde la norma y nunca calculadas ejecutando el código. Python y TypeScript pasan 303/303.
Un minuto con mini-format
Declarar, instruir, llamar, validar, reparar y usar con la misma herramienta. Cada paso es un comando real; la salida está abreviada. Pulsa uno, o solo mira.
En preparación
Lo que está en borrador y todavía no forma parte del componente publicado. Se marca aquí para que nadie lo dé por hecho.
git -C mini-format pullSIMA
a.Plataforma de microaprendizaje. El modelo devuelve ítems con Bloom, parámetros IRT y metadatos CAT en una línea por ítem; el parser valida y descarta solo los rechazados.
Familia a →Integración 2
Reservado para un sistema ajeno al equipo que integre la biblioteca. La ranura queda vacía a propósito hasta que exista.
Contribuir →Integración 3
Misma regla: ningún testimonio se publica sin una integración real detrás.
Contribuir →Integración
No es un servicio ni un framework: es una biblioteca. Cargas el registro de familias, pides el bloque de prompt con spec_block(), llamas a tu proveedor como siempre y pasas la respuesta por parse().
from minifmt import Registry, parse, spec_block
reg = Registry.load() # descubre forks/*/contract.json
c = reg.get("a")
def generar_items(tema):
respuesta = cliente.completar(sistema=spec_block(c, lang="es"), usuario=tema)
doc = parse(respuesta, c, strict=False) # tolerante: acumula errores
return doc.records, doc.errors # válidos tipados, rechazados con códigoJSON repite el nombre de cada campo en cada objeto. mini-format lo declara una vez en la cabecera. El coste de los nombres crece como O(W·N) en JSON y como O(W) aquí.
registro estrecho
registro típico de negocio
registro ancho
Ahorro frente a JSON compacto · escala lineal, origen en 0 %, máximo del eje 50 % · 1000 registros · tokenizador o200k_base · mediana de 5 documentos por celda · datos sintéticos deterministas (semilla 20260915). La curva satura cerca de 32 campos. reproducir →
La ventaja en tokens existe frente a formatos que repiten claves. Frente a los tabulares sobre datos planos no la hay, y empeora con el ancho. Se publica igual.
| Frente a | 3 campos | 12 | 20 | 50 | Lectura |
|---|---|---|---|---|---|
| XML | 67,2 % | 69,3 % | 69,5 % | 71,4 % | Ventaja máxima, crece con el ancho |
| JSON indentado | 60,0 % | 62,8 % | 63,2 % | 65,2 % | El caso más común en prompts reales |
| YAML | 46,5 % | 51,8 % | 54,2 % | 55,8 % | Ventaja sólida y creciente |
| JSON compacto | 32,2 % | 44,2 % | 46,7 % | 49,3 % | Cifra de referencia del proyecto |
| TOON (datos planos) | 7,4 % | −2,7 % | −1,5 % | −6,2 % | Sobre datos anidados la ventaja es de 42,7 % (V1) |
| CSV | −0,0 % | −5,2 % | −4,4 % | −8,2 % | Pierde. CSV no tipa ni valida |
Mediana de 5 documentos por celda · 1000 registros · o200k_base · negativo = mini-format consume más. Frente a CSV y TOON la comparación es solo de tamaño: ninguno expresa tipos, enumeraciones ni versiones, ni produce diagnósticos con código y línea. reproducir → · metodología
Los separadores no se segmentan igual en todos los vocabularios. Mismos 14 dominios, lote de 10, frente a JSON compacto.
vocabulario de 50k
IC95 [26,8 % · 31,5 %] · k=14
vocabulario de 100k
IC95 [29,1 % · 33,5 %] · k=14
vocabulario de 200k
IC95 [31,5 % · 35,5 %] · k=14
Escala lineal, origen en 0 %, máximo del eje 36 %: la diferencia es real pero pequeña — 3,9 puntos entre el vocabulario más antiguo y el más reciente. Los tres pertenecen a la misma familia; falta medir uno de un modelo abierto. reproducir →
Interfaz
from minifmt import Registry, parse, dumps, spec_block, roundtrip_ok
reg = Registry.load() # descubre forks/*/contract.json
c = reg.get("log")
instruccion = spec_block(c, lang="es") # bloque para el prompt de sistema
doc = parse(respuesta, c, strict=False) # tolerante: no lanza, acumula
doc.records # registros válidos, ya tipados
for e in doc.errors: # MiniError: code, line, field, message
print(e)
texto = dumps(doc.to_canonical(), c) # canónico -> .mini
assert roundtrip_ok(doc.to_canonical(), c)import { Registry, parse, dumps, specBlock } from './src/index.ts';
const reg = Registry.load(); // descubre ../forks/*/contract.json
const c = reg.get('log');
const lenient = parse(texto, c, { strict: false });
lenient.records; // registros válidos
lenient.errors; // MiniError[] con code, line, field, message
lenient.invalidLines(); // líneas rechazadas: las que hay que regenerar
lenient.missingRecords; // n − líneas recibidas
lenient.diagnostics(); // mismas claves que la referencia Pythonimport { createReader } from './src/index.ts';
const reader = createReader(c, { // strict: false por defecto
onRecord: ({ record, line, index }) => mostrar(record),
onError: (e) => console.warn(String(e)),
});
for await (const token of respuestaDelModelo) reader.push(token);
const res = reader.end();
res.missing; // registros que faltan respecto de n
res.truncated; // se cortó: incompleto o menos líneas que n
res.terminated; // el flujo terminó en salto de líneamini forks # lista las familias
mini validate respuesta.mini # estricto: sale con 1 si hay errores
mini diagnose respuesta.mini # tolerante: informe JSON con líneas a regenerar
mini to-json respuesta.mini | jq . # .mini -> JSON canónico
mini from-json datos.json --contract log # JSON canónico -> .mini
mini prompt log --lang es # bloque de especificación para el modelo
mini tokens respuesta.mini --enc o200k_base # tokens y bytes, con el tokenizador declarado
mini check-forks # invariantes + fixtures de ida y vuelta
mini new-fork quiz2 --from a --add "nivel:enum{facil|dificil}"$ python conformance/run_python.py
303 casos · 303 pasan · 0 fallan
$ cd ts && npm test
conformance.test.ts · 303/303
# las expectativas salen de la norma y de los fixtures publicados,
# nunca se calculan ejecutando la implementación$ mini new-fork quiz2 --from a --add "feedback:str" "level:enum{easy|hard}"
$ mini check-forks
# cinco invariantes mantienen toda familia analizable por construcción:
# I1 una línea = un registro I4 campos nuevos solo al final
# I2 prefijo y n obligatorios I5 los fixtures hacen ida y vuelta
# I3 el núcleo heredado no cambia (cambio incompatible => prefijo nuevo)Cada familia conserva el núcleo, añade campos al final y mantiene cinco invariantes verificables. Una familia es un archivo de datos, no código.
aítems de evaluación: opción múltiple, Bloom, IRT 3PL, CAT
qquiz formativo: extiende a con feedback, pista y objetivo
cardtarjetas de repaso espaciado
sumsegmentos de resumen de microlección
maparistas de mapas conceptuales
rcriterios de rúbrica analítica
sítems de encuesta Likert
codeejercicios de programación con pruebas
tccasos de prueba de software
ushistorias de usuario con criterios de aceptación
logeventos e incidentes de servicios
neranotaciones de entidades nombradas
catfichas de catálogo de productos
clsclasificación de texto multietiqueta
Playground
Se ejecuta entero en tu navegador con el port JavaScript de la referencia. Sin servidor, sin cuenta.
Abrir el playgroundComparativa
| Capacidad | mini-format | JSON | CSV | TOON |
|---|---|---|---|---|
| Menos tokens que JSON compacto | ✓ | — | ✓ | ✓ |
| Tipos declarados en el contrato | ✓ | parcial | ✗ | parcial |
| Error con código, línea y campo | ✓ | parcial | ✗ | ✗ |
| Códigos de error estables en la norma | 15 | ✗ | ✗ | ✗ |
| Recuperación ante truncamiento | ✓ | ✗ | ✓ | parcial |
| Reparación selectiva por línea | ✓ | ✗ | ✗ | ✗ |
| Lectura en streaming, registro a registro | ✓ | parcial | ✓ | ✗ |
| Suite de conformidad publicada | 303 | ✓ | ✗ | ✗ |
| Dos implementaciones independientes | ✓ | ✓ | ✓ | parcial |
| Listas con elemento marcado | ✓ | ✗ | ✗ | ✗ |
| Compatibilidad hacia adelante declarada | 1.1 | ✗ | ✗ | ✗ |
| Anidamiento arbitrario | ✗ | ✓ | ✗ | ✓ |
| Lectura directa sin contrato | parcial | ✓ | parcial | ✓ |
| Soporte nativo en APIs de proveedores | ✗ | ✓ | ✗ | ✗ |
Las cuatro últimas filas son limitaciones reconocidas: la compatibilidad hacia adelante está en borrador (1.1), no hay anidamiento arbitrario (SPEC §12), hace falta el contrato para leer, y ningún proveedor lo genera de forma nativa.
Clonar, validar el primer documento y comparar tokens en menos de cinco minutos.
mini validate forks/a/fixtures/valid.miniDocumentación · Especificación 1.0 · Índice de errores · Playground