Savings Layer forma parte de la plataforma BiVelio
Banco público · reproducible

Nuestro banco A/B, abierto. Mídenos.

Publicamos cada tirada: cuatro baterías con datasets públicos, 10 modelos, y los dos brazos medidos con el contador de uso del propio proveedor. Cada cifra lleva su n, su intervalo y su fecha. Lo que no ahorra también está aquí.

baterías
4
modelos probados
10
modelos con alguna medición
10
informes en vivo
15
última tirada
29 sept 2026

Qué se mide y cómo

  • Dos brazos, la misma petición. A va directa al proveedor, sin la capa; B pasa por la capa con su configuración por defecto. Mismo prompt, mismo muestreo y mismo tope de salida.
  • El coste lo cuenta el proveedor. Cada brazo se valora con el usage que devuelve el API en cada llamada, al precio de lista. El ahorro es 1 − coste(B) / coste(A) de la misma tirada, no lo que la capa dice de sí misma.
  • Intervalos al 95 %. Los calcula cada arnés (remuestreo por familias de preguntas, Wilson en las tasas de negativa). Un intervalo que cruza el cero es un «no se distingue de cero», y así lo decimos.
  • El paquete, el que se instala. El brazo B corre el fuente de la etiqueta 0.4.31; su dist/index.js es idéntico byte a byte al del tarball de npm (sha256 b52f99cacf9804ecd3153e56f26ec3adcdc2510d52a8446a369ecf914e0b5731).
  • Sin atajos. Cada arnés vigila los hosts a los que habla y lleva un tope de gasto por modelo escrito en código. Un modelo que no se pudo medir sale como «no medido», con su motivo.

Cuatro baterías, datasets públicos fijados

BateríaQué compruebaDatasetFicheros fijadosLicencia
GSM8KProblemas de matemáticas con repeticiones y paráfrasis: cuánto ahorra la caché y si se pierde exactitud.openai/grade-school-mathcommit 3101c7d5072418e28b9008a6636bde82a006892cgsm8k-test
sha256 3730d312f6e3440559ace48831e51066acaca737f6eabec99bccb9e4b3c39d14
gsm8k-train
sha256 17f347dc51477c50d4efb83959dbb7c56297aba886e5544ee2aaed3024813465
MIT
BFCLLlamadas a herramientas: que la capa no cambie ninguna y que el catálogo llegue entero.ShishirPatil/gorillacommit f7cf7359b7ac615a0b294831c5ba2bc95ee4a000fijado por commitApache-2.0
XSTestNegativas: que la capa no cambie cuándo el modelo se niega ni sirva una negativa de caché.paul-rottger/exaggerated-safetycommit d7bb5bd738c1fcbc36edd83d5e7d1b71a3e2d84dxstest_prompts.csv
sha256 11783fb294ed017473ee53c207d71f2161c7672c8d0b037501e78387f801cb5a
CC-BY-4.0
MT-BenchChat de dos turnos sin repeticiones: que la capa no empeore coste, latencia ni calidad.lm-sys/FastChatcommit 587d5cfa1609a43d192cedb8441cac3c17db105dquestion.jsonl
sha256 119565adbab82227089cefdb44c8d7e2cf04dc0a0ec233634c82e7d4e2a944f7
gpt-4.jsonl
sha256 f957a5bc977badb66885ec970e6cd08527845780313f0995764260e5777b9b3f
judge_prompts.jsonl
sha256 fd283293406d024f44c174b094ef48031d0687a4682fd3a56b29b138f80281b6
Apache-2.0

Ahorro medido por modelo

GSM8K, con un flujo de peticiones en el que un 30 % son repeticiones exactas y un 20 % paráfrasis. Es la batería con tráfico repetido: tu ahorro depende de cuánto se repita el tuyo. Sin repeticiones, mira «Lo que no ahorra».

ModelonAhorro medido [IC]De la caché exactaEn las llamadas (prefijo)Exactitud A → BVersión · fecha
openai/gpt-4o-mini200 peticiones · 100 únicas31,5 % [25,7 % – 36,7 %]0,0124 US$0,0006 US$95,0 % → 96,1 %Δ +1,1 pp [0,0, +2,8]0.4.31 · 28 sept 2026
openai/gpt-5.4-mini176 peticiones · 88 únicas31,7 % [25,6 % – 37,6 %]0,0734 US$0,0003 US$95,6 % → 93,7 %Δ -1,9 pp [-5,0, 0,0]0.4.31 · 28 sept 2026
openai/gpt-5.522 peticiones · 11 únicas33,4 % [6,8 % – 53,8 %]0,0790 US$-0,0023 US$100,0 % → 100,0 %Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 sept 2026
openai/gpt-5.6-sol32 peticiones · 16 únicas29,2 % [9,5 % – 46,8 %]0,0252 US$-0,0003 US$100,0 % → 100,0 %Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 sept 2026
anthropic/claude-haiku-4-5116 peticiones · 58 únicas32,2 % [23,6 % – 40,2 %]0,0773 US$0,0002 US$99,0 % → 99,0 %Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 sept 2026
anthropic/claude-opus-5-532 peticiones · 16 únicas77,2 % [67,1 % – 83,9 %]0,0974 US$0,1391 US$100,0 % → 100,0 %Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 sept 2026
anthropic/claude-sonnet-562 peticiones · 31 únicas75,1 % [69,3 % – 79,6 %]0,1054 US$0,1313 US$100,0 % → 100,0 %Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 sept 2026
anthropic/claude-sonnet-5-562 peticiones · 31 únicas77,5 % [72,0 % – 81,7 %]0,0924 US$0,1289 US$100,0 % → 100,0 %Δ 0,0 pp [0,0, 0,0]0.4.31 · 28 sept 2026
google/gemini-3.1-pro-previewla capa falló: las peticiones no pasaron por la capa0.4.31 · 28 sept 2026
google/gemini-3.8-flashla capa falló: las peticiones no pasaron por la capa0.4.31 · 28 sept 2026

Origen del ahorro, posición a posición: «de la caché exacta» es lo que A pagó en las peticiones que la capa sirvió sin llamar al proveedor; «en las llamadas» es la diferencia en las que sí llegaron, sobre todo caché de prefijo del proveedor (más algo de variación de la salida). Las dos suman el ahorro total.

La exactitud se mide sobre las preguntas con respuesta publicada; las variantes con una cifra cambiada solo sirven para comprobar que la capa no entrega la respuesta de otra pregunta.

Garantías, contadas

La capa nunca cambió una llamada a herramientas

0 llamadas alteradas en 1325 comparaciones de BFCL, 6 modelos, desde la 0.4.31. Si la capa falla (un error en B que A no tuvo), no cuenta aquí: está en «Fallos que el banco encontró».

Ninguna respuesta de otra pregunta desde la 0.4.31

0 de 198 variantes (la misma pregunta con otro número, y por tanto otra respuesta) servidas con la respuesta de otra pregunta, en 8 modelos en vivo y en todas las configuraciones de caché medidas.

Réplica sin red del split de test entero de GSM8K: 0 en 5813 peticiones, en cada una de las 5 configuraciones de caché.

La misma tasa de negativas, con y sin la capa

XSTest, 10 modelos medidos: ninguna diferencia A/B por debajo de p = 0,05 (McNemar, prompts pareados). La capa entregó sin alterar el texto de 4668 respuestas (0 alteradas).

Tasa de negativa por modelo, sin la capa (A) y con ella (B), sobre los mismos prompts.
ModeloPromptsNegativas, prompts seguros (A → B)Negativas, prompts inseguros (A → B)Versión · fecha
openai/gpt-4o-mini4505,2 % → 5,2 % (n = 250, p = 1,00)81,5 % → 81,5 % (n = 200, p = 1,00)0.4.31 · 28 sept 2026
openai/gpt-5.4-mini44111,0 % → 9,8 % (n = 245, p = 0,63)87,2 % → 86,7 % (n = 196, p = 1,00)0.4.31 · 28 sept 2026
openai/gpt-5.51206,3 % → 4,7 % (n = 64, p = 1,00)80,0 % → 80,0 % (n = 55, p = 1,00)0.4.31 · 29 sept 2026
openai/gpt-5.6-sol1992,7 % → 2,7 % (n = 111, p = 1,00)75,6 % → 76,7 % (n = 86, p = 1,00)0.4.31 · 29 sept 2026
anthropic/claude-haiku-4-54501,6 % → 2,0 % (n = 250, p = 1,00)42,5 % → 42,5 % (n = 200, p = 1,00)0.4.31 · 29 sept 2026
anthropic/claude-opus-5-581—67,1 % → 67,1 % (n = 79, p = 1,00)0.4.31 · 29 sept 2026
anthropic/claude-sonnet-52642,7 % → 2,0 % (n = 147, p = 1,00)68,4 % → 71,8 % (n = 117, p = 0,34)0.4.31 · 29 sept 2026
anthropic/claude-sonnet-5-53111,5 % → 0,0 % (n = 135, p = 0,50)64,3 % → 65,3 % (n = 98, p = 1,00)0.4.31 · 29 sept 2026
google/gemini-3.1-pro-preview580,0 % → 0,0 % (n = 32, p = 1,00)80,8 % → 84,6 % (n = 26, p = 1,00)0.4.31 · 29 sept 2026
google/gemini-3.8-flash4500,4 % → 0,4 % (n = 249, p = 1,00)67,8 % → 66,8 % (n = 199, p = 0,73)0.4.31 · 29 sept 2026

Lo que no ahorra

Sin repeticiones, el ahorro es ≈ 0 %. Lo publicamos igual, porque es lo que vas a ver si tu tráfico no se repite.

MT-Bench es chat de dos turnos con una capa nueva por pregunta: no hay nada que la caché pueda reutilizar y el prompt casi nunca llega al mínimo que el proveedor exige para cachear un prefijo. En BFCL cada llamada a herramientas es distinta. Lo que miden estas dos baterías es que la capa no empeore nada; la diferencia de coste que queda es ruido de la salida del modelo, no la capa.

BateríaModelonAhorro medido [IC]LecturaVersión · fecha
BFCLopenai/gpt-4o-mini400 ítems0,1 % [0,0 % – 0,3 %]no se distingue de cero0.4.31 · 28 sept 2026
BFCLopenai/gpt-5.4-mini400 ítems-0,2 % [-1,0 % – 0,5 %]no se distingue de cero0.4.31 · 28 sept 2026
BFCLanthropic/claude-haiku-4-548 ítems0,1 % [0,0 % – 0,2 %]no se distingue de cero0.4.31 · 29 sept 2026
BFCLanthropic/claude-sonnet-548 ítems1,5 % [-1,6 % – 5,8 %]no se distingue de cero0.4.31 · 29 sept 2026
BFCLgoogle/gemini-3.1-pro-preview97 ítems4,8 % [-6,6 % – 15,6 %]no se distingue de cero0.4.31 · 29 sept 2026
BFCLgoogle/gemini-3.8-flash324 ítems-10,7 % [-27,8 % – 3,2 %]no se distingue de cero0.4.31 · 29 sept 2026
MT-Benchopenai/gpt-4o-mini80 preguntas3,3 % [0,8 % – 6,0 %]ahorro · no atribuible a la capa0.4.31 · 28 sept 2026
MT-Benchopenai/gpt-5.4-mini80 preguntas-3,5 % [-8,6 % – 1,6 %]no se distingue de cero · no atribuible a la capa0.4.31 · 28 sept 2026
MT-Benchopenai/gpt-5.58 preguntas2,1 % [-4,4 % – 9,7 %]no se distingue de cero0.4.31 · 29 sept 2026
MT-Benchopenai/gpt-5.6-sol13 preguntas-0,4 % [-21,2 % – 13,5 %]no se distingue de cero · no atribuible a la capa0.4.31 · 29 sept 2026
MT-Benchanthropic/claude-haiku-4-580 preguntas-2,6 % [-4,6 % – -0,9 %]sobrecoste · no atribuible a la capa0.4.31 · 28 sept 2026
MT-Benchanthropic/claude-opus-5-518 preguntas1,1 % [-2,0 % – 4,9 %]no se distingue de cero0.4.31 · 29 sept 2026
MT-Benchanthropic/claude-sonnet-523 preguntas1,7 % [-8,9 % – 12,7 %]no se distingue de cero0.4.31 · 28 sept 2026
MT-Benchanthropic/claude-sonnet-5-537 preguntas-0,8 % [-2,5 % – 0,9 %]no se distingue de cero0.4.31 · 29 sept 2026

Estado por modelo y batería

Cada celda enseña la tirada de la versión más alta de la capa. Si un modelo no se pudo medir, se dice por qué, en vez de dejar el hueco.

ModeloGSM8KBFCLXSTestMT-Bench
openai/gpt-4o-minimedido · n = 200
0.4.31 · 28 sept 2026
medido · n = 400
0.4.31 · 28 sept 2026
medido · n = 450
0.4.31 · 28 sept 2026
medido · n = 80
0.4.31 · 28 sept 2026
openai/gpt-5.4-minimedido · n = 176
0.4.31 · 28 sept 2026
medido · n = 400
0.4.31 · 28 sept 2026
medido · n = 441
0.4.31 · 28 sept 2026
medido · n = 80
0.4.31 · 28 sept 2026
openai/gpt-5.5medido · n = 22
0.4.31 · 28 sept 2026
no medido: tope de gasto agotado
0.4.31 · 29 sept 2026
medido · n = 120
0.4.31 · 29 sept 2026
medido · n = 8
0.4.31 · 29 sept 2026
openai/gpt-5.6-solmedido · n = 32
0.4.31 · 28 sept 2026
no medido: el proveedor rechazó la petición en los dos brazos
0.4.31 · 29 sept 2026
medido · n = 199
0.4.31 · 29 sept 2026
medido · n = 13
0.4.31 · 29 sept 2026
anthropic/claude-haiku-4-5medido · n = 116
0.4.31 · 28 sept 2026
medido · n = 48
0.4.31 · 29 sept 2026
medido · n = 450
0.4.31 · 29 sept 2026
medido · n = 80
0.4.31 · 28 sept 2026
anthropic/claude-opus-5-5medido · n = 32
0.4.31 · 28 sept 2026
no medido: tope de gasto agotado
0.4.31 · 29 sept 2026
medido · n = 81
0.4.31 · 29 sept 2026
medido · n = 18
0.4.31 · 29 sept 2026
anthropic/claude-sonnet-5medido · n = 62
0.4.31 · 28 sept 2026
medido · n = 48
0.4.31 · 29 sept 2026
medido · n = 264
0.4.31 · 29 sept 2026
medido · n = 23
0.4.31 · 28 sept 2026
anthropic/claude-sonnet-5-5medido · n = 62
0.4.31 · 28 sept 2026
no medido: tope de gasto agotado
0.4.31 · 29 sept 2026
medido · n = 311
0.4.31 · 29 sept 2026
medido · n = 37
0.4.31 · 29 sept 2026
google/gemini-3.1-pro-previewla capa falló: las peticiones no pasaron por la capa
0.4.31 · 28 sept 2026
medido · n = 97
0.4.31 · 29 sept 2026
medido · n = 58
0.4.31 · 29 sept 2026
no medido: cuota del proveedor agotada
0.4.31 · 29 sept 2026
google/gemini-3.8-flashla capa falló: las peticiones no pasaron por la capa
0.4.31 · 28 sept 2026
medido · n = 324
0.4.31 · 29 sept 2026
medido · n = 450
0.4.31 · 29 sept 2026
la capa falló: las peticiones no pasaron por la capa
0.4.31 · 29 sept 2026

Fallos que el banco encontró

El banco no está para salir bien en la foto: está para encontrar los fallos antes que tú. Estos los encontró él, con la versión en la que aparecieron y la que los arregla.

  1. La caché semántica sin calibrar servía la respuesta de otra pregunta 0.4.30 → 0.4.31

    Con la caché semántica sin calibrar, una variante con otro número («three baskets» frente a «two baskets») podía recibir la respuesta de la pregunta original. Contado sobre las variantes de GSM8K.

    • Encontrado en la 0.4.30: 15 de 111. gsm8k.json
    • Arreglado en la 0.4.31 (#383).
    • Verificado en vivo con la 0.4.31: 0 de 198.
  2. La capa recortaba el catálogo de herramientas sin señal para hacerlo 0.4.30 → 0.4.31

    En conversaciones de varios turnos, el brazo B enviaba menos herramientas que el A aunque nada indicaba cuáles sobraban. Contado sobre las conversaciones multi-turno de BFCL.

    • Encontrado en la 0.4.30: 20 de 20. bfcl.json
    • Arreglado en la 0.4.31 (#382).
    • Verificado en vivo con la 0.4.31: 0 de 83.
  3. Algunas negativas escritas como texto se guardaban en caché 0.4.31 → 0.4.32

    Una negativa que el modelo escribe como texto (sin la señal del API) podía guardarse en caché, repetirse y acreditarse como ahorro. Contado en prompts de XSTest.

  4. Un filtro de contenido de Gemini se cacheaba como respuesta 0.4.31 → 0.4.32

    Gemini señala su filtro con un motivo de parada propio que la capa no reconocía como negativa, así que podía cachearlo y repetirlo. Contado en prompts de XSTest.

    • Encontrado en la 0.4.31: 6 de 508. xstest-0431-gama-alta.json
    • Arreglado en la 0.4.32 (#402).
    • Pendiente de volver a medir en vivo con la 0.4.32.
  5. Gemini no pasaba por la capa 0.4.31 → 0.4.32

    La capa enviaba un campo propio del API de OpenAI a cualquier endpoint compatible, y Gemini lo rechaza: todas las peticiones del brazo B fallaban. Contado en peticiones de GSM8K.

    • Encontrado en la 0.4.31: 504 de 504. gsm8k-0431-gama-alta.json
    • Arreglado en la 0.4.32 (#402).
    • Pendiente de volver a medir en vivo con la 0.4.32.
  6. Con Gemini 3, el segundo turno con herramientas fallaba 0.4.31 → 0.4.32

    La capa no devolvía la firma de pensamiento que Gemini 3 exige en cada llamada a herramientas, así que el turno siguiente se rechazaba. Contado en continuaciones multi-turno de BFCL.

    • Encontrado en la 0.4.31: 50 de 50. bfcl-0431-gama-alta.json
    • Arreglado en la 0.4.32 (#402).
    • Pendiente de volver a medir en vivo con la 0.4.32.

Cómo reproducirlo

El código del banco todavía no es público; el método sí, y cabe en cinco pasos. Con tus propias claves de proveedor puedes repetirlo y comparar cifra a cifra con nuestros informes.

  1. El dataset. Descarga cada dataset público en el commit de la tabla de arriba y comprueba el sha256 de cada fichero antes de usarlo. Si no cuadra, no es el mismo dataset.
  2. La capa. Instala @bivelio/savings-layer desde npm en la versión que dice el informe y comprueba el sha256 de dist/index.js: cada informe lleva el suyo.
  3. Dos brazos por prompt. A va directo al proveedor; B manda el mismo prompt, al mismo modelo y con el mismo tope de salida, a través de la capa con su configuración por defecto. Una parte de los prompts se repite o se parafrasea, como en el tráfico real, y el orden A/B se sortea.
  4. El coste lo dice el proveedor. Suma lo que factura cada brazo según el usage que devuelve el proveedor, a su tarifa publicada. El ahorro es 1 − coste B / coste A, con su intervalo.
  5. La calidad, en la misma tirada. Puntúa igual las respuestas de los dos brazos (respuesta exacta en GSM8K, llamada a herramienta en BFCL, negativa o no en XSTest, juez en MT-Bench) y compáralas con el informe JSON de la misma batería y versión.

Los informes

Cada tirada deja un informe JSON con su diseño, sus limitaciones y cada llamada medida: usage, coste por brazo y clasificación de la respuesta. Se sirven desde esta web.

Los informes se sirven tal como los escribió el banco, con una excepción: se quitan los datos del entorno de quien midió (rutas de disco, correos). De XSTest no se publica el texto de ninguna respuesta, solo su clasificación.

Mídenos tú

Una medición independiente vale más que la nuestra. El código del banco no es público todavía: si quieres repetir la medición, o medir la capa con tu propio arnés o con tu tráfico, escríbenos y te damos lo que necesites para hacerlo.

Escríbenos a support@bivelio.com

Escribir un correo