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
usageque 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.jses idéntico byte a byte al del tarball de npm (sha256b52f99cacf9804ecd3153e56f26ec3adcdc2510d52a8446a369ecf914e0b5731). - 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ía | Qué comprueba | Dataset | Ficheros fijados | Licencia |
|---|---|---|---|---|
| GSM8K | Problemas de matemáticas con repeticiones y paráfrasis: cuánto ahorra la caché y si se pierde exactitud. | openai/grade-school-mathcommit 3101c7d5072418e28b9008a6636bde82a006892c | gsm8k-test sha256 3730d312f6e3440559ace48831e51066acaca737f6eabec99bccb9e4b3c39d14gsm8k-trainsha256 17f347dc51477c50d4efb83959dbb7c56297aba886e5544ee2aaed3024813465 | MIT |
| BFCL | Llamadas a herramientas: que la capa no cambie ninguna y que el catálogo llegue entero. | ShishirPatil/gorillacommit f7cf7359b7ac615a0b294831c5ba2bc95ee4a000 | fijado por commit | Apache-2.0 |
| XSTest | Negativas: que la capa no cambie cuándo el modelo se niega ni sirva una negativa de caché. | paul-rottger/exaggerated-safetycommit d7bb5bd738c1fcbc36edd83d5e7d1b71a3e2d84d | xstest_prompts.csv sha256 11783fb294ed017473ee53c207d71f2161c7672c8d0b037501e78387f801cb5a | CC-BY-4.0 |
| MT-Bench | Chat de dos turnos sin repeticiones: que la capa no empeore coste, latencia ni calidad. | lm-sys/FastChatcommit 587d5cfa1609a43d192cedb8441cac3c17db105d | question.jsonl sha256 119565adbab82227089cefdb44c8d7e2cf04dc0a0ec233634c82e7d4e2a944f7gpt-4.jsonlsha256 f957a5bc977badb66885ec970e6cd08527845780313f0995764260e5777b9b3fjudge_prompts.jsonlsha256 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».
| Modelo | n | Ahorro medido [IC] | De la caché exacta | En las llamadas (prefijo) | Exactitud A → B | Versión · fecha |
|---|---|---|---|---|---|---|
openai/gpt-4o-mini | 200 peticiones · 100 únicas | 31,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-mini | 176 peticiones · 88 únicas | 31,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.5 | 22 peticiones · 11 únicas | 33,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-sol | 32 peticiones · 16 únicas | 29,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-5 | 116 peticiones · 58 únicas | 32,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-5 | 32 peticiones · 16 únicas | 77,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-5 | 62 peticiones · 31 únicas | 75,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-5 | 62 peticiones · 31 únicas | 77,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-preview | la capa falló: las peticiones no pasaron por la capa | 0.4.31 · 28 sept 2026 | ||||
google/gemini-3.8-flash | la capa falló: las peticiones no pasaron por la capa | 0.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).
| Modelo | Prompts | Negativas, prompts seguros (A → B) | Negativas, prompts inseguros (A → B) | Versión · fecha |
|---|---|---|---|---|
openai/gpt-4o-mini | 450 | 5,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-mini | 441 | 11,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.5 | 120 | 6,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-sol | 199 | 2,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-5 | 450 | 1,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-5 | 81 | — | 67,1 % → 67,1 % (n = 79, p = 1,00) | 0.4.31 · 29 sept 2026 |
anthropic/claude-sonnet-5 | 264 | 2,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-5 | 311 | 1,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-preview | 58 | 0,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-flash | 450 | 0,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ía | Modelo | n | Ahorro medido [IC] | Lectura | Versión · fecha |
|---|---|---|---|---|---|
| BFCL | openai/gpt-4o-mini | 400 ítems | 0,1 % [0,0 % – 0,3 %] | no se distingue de cero | 0.4.31 · 28 sept 2026 |
| BFCL | openai/gpt-5.4-mini | 400 ítems | -0,2 % [-1,0 % – 0,5 %] | no se distingue de cero | 0.4.31 · 28 sept 2026 |
| BFCL | anthropic/claude-haiku-4-5 | 48 ítems | 0,1 % [0,0 % – 0,2 %] | no se distingue de cero | 0.4.31 · 29 sept 2026 |
| BFCL | anthropic/claude-sonnet-5 | 48 ítems | 1,5 % [-1,6 % – 5,8 %] | no se distingue de cero | 0.4.31 · 29 sept 2026 |
| BFCL | google/gemini-3.1-pro-preview | 97 ítems | 4,8 % [-6,6 % – 15,6 %] | no se distingue de cero | 0.4.31 · 29 sept 2026 |
| BFCL | google/gemini-3.8-flash | 324 ítems | -10,7 % [-27,8 % – 3,2 %] | no se distingue de cero | 0.4.31 · 29 sept 2026 |
| MT-Bench | openai/gpt-4o-mini | 80 preguntas | 3,3 % [0,8 % – 6,0 %] | ahorro · no atribuible a la capa | 0.4.31 · 28 sept 2026 |
| MT-Bench | openai/gpt-5.4-mini | 80 preguntas | -3,5 % [-8,6 % – 1,6 %] | no se distingue de cero · no atribuible a la capa | 0.4.31 · 28 sept 2026 |
| MT-Bench | openai/gpt-5.5 | 8 preguntas | 2,1 % [-4,4 % – 9,7 %] | no se distingue de cero | 0.4.31 · 29 sept 2026 |
| MT-Bench | openai/gpt-5.6-sol | 13 preguntas | -0,4 % [-21,2 % – 13,5 %] | no se distingue de cero · no atribuible a la capa | 0.4.31 · 29 sept 2026 |
| MT-Bench | anthropic/claude-haiku-4-5 | 80 preguntas | -2,6 % [-4,6 % – -0,9 %] | sobrecoste · no atribuible a la capa | 0.4.31 · 28 sept 2026 |
| MT-Bench | anthropic/claude-opus-5-5 | 18 preguntas | 1,1 % [-2,0 % – 4,9 %] | no se distingue de cero | 0.4.31 · 29 sept 2026 |
| MT-Bench | anthropic/claude-sonnet-5 | 23 preguntas | 1,7 % [-8,9 % – 12,7 %] | no se distingue de cero | 0.4.31 · 28 sept 2026 |
| MT-Bench | anthropic/claude-sonnet-5-5 | 37 preguntas | -0,8 % [-2,5 % – 0,9 %] | no se distingue de cero | 0.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.
| Modelo | GSM8K | BFCL | XSTest | MT-Bench |
|---|---|---|---|---|
openai/gpt-4o-mini | medido · 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-mini | medido · 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.5 | medido · 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-sol | medido · 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-5 | medido · 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-5 | medido · 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-5 | medido · 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-5 | medido · 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-preview | la 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-flash | la 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.
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.
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.
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.
- Encontrado en la 0.4.31: 39 de 2824. xstest-0431-claude.jsonxstest-0431-gama-alta.jsonxstest-0431.json
- Arreglado en la 0.4.32 (#393, #401).
- Pendiente de volver a medir en vivo con la 0.4.32.
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.
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.
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.
- 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.
- La capa. Instala
@bivelio/savings-layerdesde npm en la versión que dice el informe y comprueba el sha256 dedist/index.js: cada informe lleva el suyo. - 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.
- El coste lo dice el proveedor. Suma lo que factura cada brazo según el
usageque devuelve el proveedor, a su tarifa publicada. El ahorro es1 − coste B / coste A, con su intervalo. - 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