DEV Community

Cover image for Kimi K2.6 vs Claude vs GPT-5.5: lo puse contra mis casos reales de coding y los números me sorprendieron
Juan Torchia
Juan Torchia Subscriber

Posted on • Originally published at juanchi.dev

Kimi K2.6 vs Claude vs GPT-5.5: lo puse contra mis casos reales de coding y los números me sorprendieron

Kimi K2.6 vs Claude vs GPT-5.5: lo puse contra mis casos reales de coding y los números me sorprendieron

Estaba mirando un PR que había pedido Claude Sonnet 3.7 que refactorizara — un servicio de ingesta de datos en TypeScript con tres capas de async mal encadenadas — cuando vi el thread de Hacker News sobre Kimi K2.6. El claim era directo: Kimi K2.6 le gana a Claude y a GPT-5.5 en coding benchmarks. LiveCodeBench, SWE-bench, los de siempre.

Mi primera reacción fue visceral: otra vez esto. Cada tres meses hay un modelo nuevo que "gana" los leaderboards y dos semanas después nadie lo usa en producción. Pero esta vez el thread tenía suficiente sustancia técnica como para no descartarlo de entrada. Así que hice lo que hago siempre: dejé de leer opiniones y empecé a medir.

Lo que encontré no es lo que esperaba. Y la conclusión que saqué no aparece en ningún post viral.


Kimi K2.6 benchmark coding: qué dice el leaderboard (y qué no dice)

Los números públicos que circularon en HN son reales en el sentido de que Moonshot AI los publicó y son reproducibles en sus datasets de referencia. Kimi K2.6 reporta algo cercano a 65–68% en LiveCodeBench y números competitivos en SWE-bench Verified. No los voy a citar como exactos porque los benchmarks de estos modelos se actualizan y las versiones cambian semana a semana — lo que importa es el orden de magnitud.

El problema estructural de todos estos rankings es el mismo de siempre: los benchmarks públicos no incluyen contexto de proyecto. HumanEval te da una función aislada. SWE-bench te da un issue de GitHub con su repositorio, sí, pero es un repositorio que el modelo probablemente vio en training. Ninguno te da tu código con tus convenciones, tus decisiones de arquitectura tomadas hace 18 meses por razones que ya no están documentadas en ningún lado.

Mi tesis es simple y la bancó el experimento: los benchmarks públicos mienten no porque los números sean falsos, sino porque el contexto de proyecto real es el verdadero test, y ese test no aparece en ningún leaderboard. Un modelo puede resolver LeetCode Medium en 40 segundos y al mismo tiempo no entender por qué en mi codebase UserService hereda de BaseRepository en lugar de componerlo — y ese segundo problema es el que me cuesta horas reales.


El experimento: tres tareas reales, tres modelos, números propios

Armé tres casos del trabajo de esta semana. No los elegí para favorecer a ningún modelo — los agarré del backlog real, en el orden en que aparecieron.

Configuración: Kimi K2.6 vía API (Moonshot), Claude Sonnet 3.7 vía API directa, GPT-5.5 vía OpenAI API. Mismo prompt, mismo contexto de archivos relevantes pegado manualmente, sin herramientas de agente — quería medir generación pura, no orquestación.

Caso 1: Refactor de servicio async en TypeScript

El contexto: un servicio que procesa webhooks con tres niveles de Promise.all anidados, sin manejo de errores parciales. Le di los tres archivos relevantes (~400 líneas en total) y pedí un refactor que manejara fallos individuales sin abortar el batch completo.

// Lo que tenía: Promise.all sin manejo de fallos parciales
const resultados = await Promise.all(
  eventos.map(e => procesarEvento(e))
  // Si uno falla, todos fallan — aprendí esto de mala manera en producción
);

// Lo que pedí: allSettled con logging por fallo individual
const resultados = await Promise.allSettled(
  eventos.map(e => procesarEvento(e))
);

const fallidos = resultados
  .filter((r): r is PromiseRejectedResult => r.status === 'rejected')
  .map(r => r.reason);

if (fallidos.length > 0) {
  logger.warn(`Batch parcial: ${fallidos.length}/${resultados.length} fallaron`, { fallidos });
}
Enter fullscreen mode Exit fullscreen mode
  • Claude Sonnet 3.7: Entendió el patrón, propuso Promise.allSettled, respetó el logger que estaba definido en otro archivo del contexto. Tiempo de generación: ~8 segundos. Integración directa: sí, sin editar.
  • GPT-5.5: Solución correcta, pero usó console.error en lugar del logger del proyecto. Costo de adaptación: 2 minutos de edición manual.
  • Kimi K2.6: Solución correcta y usó el logger. Tiempo de generación: ~14 segundos. Pero introdujo un tipo BatchResult<T> genérico que no tenía precedente en el codebase — funcionalmente bien, pero rompe la consistencia de patrones del proyecto.

Ganador de uso real: Claude. No porque Kimi estuvo mal, sino porque la solución de Kimi generó una decisión de diseño implícita que no pedí.

Caso 2: Query SQL con lógica de negocio específica

Tengo una query en PostgreSQL que calcula métricas de uso ponderadas por plan. La lógica de ponderación es nuestra, no es estándar — hay comentarios en el código que explican el por qué de los coeficientes.

-- Cálculo de score ponderado por plan
-- Coeficiente 1.4 para plan PRO: decisión del 2023-09, ver issue #441
SELECT
  u.id,
  u.plan,
  ROUND(
    SUM(e.valor) * CASE u.plan
      WHEN 'PRO'   THEN 1.4
      WHEN 'BASIC' THEN 1.0
      ELSE              0.6
    END
  , 2) AS score_ponderado
FROM usuarios u
JOIN eventos e ON e.usuario_id = u.id
GROUP BY u.id, u.plan;
Enter fullscreen mode Exit fullscreen mode

Le pedí a los tres modelos que extendieran esta query para incluir una ventana temporal de 30 días y un filtro por región, respetando los coeficientes existentes.

  • Claude: Extendió correctamente, mantuvo los coeficientes, agregó el WHERE con NOW() - INTERVAL '30 days', y comentó que el coeficiente de ELSE podría necesitar revisión si se agregan planes nuevos. Ese comentario proactivo me ahorró una conversación futura.
  • GPT-5.5: Correcta, pero cambió el ROUND(..., 2) por CAST(... AS DECIMAL(10,2)) sin que yo lo pidiera. Funcionalmente equivalente, estilísticamente diferente al resto del código.
  • Kimi K2.6: Correcta, respetó todo, no hizo comentarios adicionales. La solución más "limpia" en términos de no agregar nada no pedido.

Este caso es interesante: Kimi ganó en disciplina, Claude ganó en valor agregado. Depende de qué necesitás en ese momento.

Caso 3: Debugging de un error de tipo en React + TypeScript

Un componente con un prop drilling profundo donde el tipo de un callback estaba mal inferido. Error de compilación real, 6 archivos de contexto.

Type '(id: string) => Promise<void>' is not assignable to 
type '(id: string, options?: UpdateOptions) => Promise<void>'.
Enter fullscreen mode Exit fullscreen mode
  • Claude: Identificó el origen en el tercer nivel del árbol de componentes, propuso la corrección y sugirió colapsar el prop drilling con un contexto. Correcto, aunque la sugerencia de refactor era out of scope.
  • GPT-5.5: Identificó el origen correctamente, propuso solo la corrección mínima. Sin sugerencias extra. Tiempo: ~6 segundos.
  • Kimi K2.6: Identificó el origen, pero propuso corregir el tipo en el primer componente en lugar del origen real. Funcionalmente resuelve el error de compilación, pero en el lugar equivocado arquitecturalmente.

Ganador claro: GPT-5.5 en este caso. Solución correcta, mínima, rápida.


Los errores que ningún benchmark captura

Hay algo que me quedó dando vueltas después de correr estos tres casos, y tiene que ver con algo que mencioné cuando analicé el supply chain attack sobre mis dependencias de ML: la diferencia entre una herramienta que funciona en aislamiento y una que funciona integrada en un sistema real.

Los tres modelos resuelven correctamente cuando el problema es autocontenido. La divergencia aparece en dos dimensiones que ningún leaderboard mide:

1. Disciplina contextual: ¿El modelo respeta las decisiones de diseño preexistentes aunque no sean las "mejores" académicamente? Kimi introdujo el tipo genérico en el Caso 1 porque es una buena práctica general — pero rompe la consistencia del proyecto. Claude a veces sugiere refactors no pedidos. GPT-5.5 fue el más disciplinado en los tres casos.

2. Latencia bajo contexto largo: Con 400+ líneas de contexto, Kimi fue consistentemente ~6 segundos más lento que GPT-5.5 y ~4 segundos más lento que Claude en mis mediciones informales. No es un problema crítico, pero en un flujo de trabajo donde mandás 20-30 queries por hora, suma.

Esto me recuerda algo que aprendí en el cyber café a los 14 años: cuando se caía la red a las 11pm con el local lleno, no importaba qué router tenía mejor throughput teórico. Importaba cuál arrancaba más rápido después de un reset y cuál me daba información útil sobre el punto de falla. Los benchmarks de throughput no capturaban eso. Los benchmarks de LLM tampoco capturan la latencia bajo presión real ni la disciplina contextual.

También conecta con lo que observé al auditar mis propios prompts de producción: los modelos se comportan distinto cuando el prompt tiene contexto denso versus cuando es un problema limpio. Kimi K2.6 parece optimizado para el segundo caso.


Los errores comunes al leer estos comparativos

"Ganó en SWE-bench, entonces es mejor para mi proyecto": SWE-bench usa repositorios públicos. Si el modelo fue entrenado después de la fecha de creación del repo, hay contaminación de datos posible. Nunca vas a saber exactamente cuánto.

"Los números son de esta semana, entonces son actuales": Los modelos que se comparan en HN suelen ser versiones que ya llevan semanas en API. Kimi K2.6, Claude Sonnet 3.7 y GPT-5.5 tienen fechas de corte de conocimiento distintas y versiones de API que se actualizan sin changelog claro. Lo que medís hoy puede no ser lo que medís en tres semanas.

"Más barato = peor": Kimi K2.6 tiene pricing significativamente más bajo que Claude y GPT-5.5 en los tiers de API que usé. En los Casos 1 y 2, la calidad era comparable. El costo por token no es un proxy confiable de calidad en coding.

"Claude siempre gana porque es el más usado": En mis tres casos, GPT-5.5 ganó uno limpiamente. El sesgo de confirmación es real — si usás Claude todos los días, le vas a dar más contexto implícito en cómo formulás los prompts.

Esto también aplica a cómo leemos noticias de infraestructura. Cuando analicé las vulnerabilidades del kernel Linux sobre mi stack Ubuntu/Railway, el problema no era el CVE público sino el gap entre el anuncio y el parche real en producción. Con los LLM benchmarks pasa lo mismo: el número público y el impacto real en tu flujo tienen un gap que solo medís vos.


FAQ: Kimi K2.6 benchmark coding

¿Kimi K2.6 realmente supera a Claude y GPT-5.5 en coding?
En benchmarks públicos como LiveCodeBench, los números reportados son competitivos. En mi experimento con código de proyecto real, el resultado fue mixto: Kimi ganó en disciplina de no agregar noise en un caso, perdió en identificación de origen en debugging y fue comparable en refactor. "Superar" depende completamente del tipo de tarea y del contexto que le das.

¿Vale la pena migrar a Kimi K2.6 si ya uso Claude o GPT-5.5?
No como migración completa. Vale la pena tenerlo como alternativa para tareas de generación limpia donde no importa la consistencia con un codebase existente. Para trabajo con contexto de proyecto denso, Claude y GPT-5.5 mostraron mejor adherencia a patrones preexistentes en mis pruebas.

¿Los benchmarks públicos de LLM son confiables para tomar decisiones de herramienta?
Son útiles como filtro inicial — si un modelo no llega a cierto umbral en HumanEval, probablemente no vale la pena ni probarlo. Pero para decidir qué usar en producción, el único benchmark que importa es el que corré sobre tu propio código con tus propios casos.

¿Cuál es el costo de API de Kimi K2.6 comparado con Claude y GPT-5.5?
Al momento de escribir esto, Kimi K2.6 tiene un pricing notablemente más bajo por token que Claude Sonnet 3.7 y GPT-5.5. Si el volumen es alto y los casos son de generación relativamente limpia, el diferencial de costo puede justificar la integración. Los precios cambian frecuentemente — verificá en las páginas oficiales antes de proyectar costos.

¿La latencia de Kimi K2.6 es un problema real en flujos de desarrollo?
En mis mediciones informales, ~6-14 segundos para respuestas con contexto mediano. No es bloqueante para uso casual, pero si trabajás en un flujo donde el modelo es parte de un loop de iteración rápida (generar → revisar → refinar → generar), la diferencia se siente. Claude y GPT-5.5 fueron más rápidos en mis casos.

¿Tiene sentido correr los tres modelos en paralelo para el mismo problema?
Lo hice para este post y fue útil para entender las diferencias. En el trabajo diario, no — el overhead de comparar tres respuestas consume más tiempo del que ahorrás. Mi enfoque es: tengo un modelo primario (Claude para contexto denso), uno de respaldo (GPT-5.5 para debugging puntual) y Kimi K2.6 como experimento para casos de generación limpia donde el costo importa.


Conclusión: el hype no está equivocado, pero la pregunta sí

Kimi K2.6 es un modelo serio. No es marketing vacío y los números de leaderboard no son inventados. Pero el debate de "quién gana" está mal planteado desde el título — incluyendo el mío, que lo usé a propósito para que llegues hasta acá.

La pregunta real no es "¿cuál modelo gana en coding?" sino "¿cuál modelo entiende mi código específico, mis convenciones y las decisiones que tomé hace 18 meses por razones que ya no están en ningún README?". Esa pregunta no tiene una respuesta de leaderboard.

Lo que bancó el experimento: en tareas con contexto de proyecto real y denso, la consistencia arquitectural importa más que el score en HumanEval. GPT-5.5 fue el más disciplinado en no agregar decisiones de diseño no pedidas. Claude fue el más útil cuando necesitaba valor agregado proactivo. Kimi K2.6 fue competitivo en calidad y significativamente más barato — con la caveat de que en debugging complejo erró el origen.

¿Cambié mi stack después de esto? No. Seguí con Claude como primario. Pero agregué Kimi K2.6 a la rotación para casos específicos, especialmente generación de código greenfield donde el contexto del proyecto es mínimo. Eso es lo más honesto que puedo decir.

Lo que no voy a hacer es proclamar un ganador universal. Eso es lo que hacen los posts virales. Este no es ese post — es el seguimiento que no te da el thread de HN.

También lo que no me cierra de todo este debate: cuando analicé el impacto real de un DDoS sobre mi stack en Railway, la conclusión fue que los números públicos de "uptime garantizado" no dicen nada sobre el comportamiento bajo carga real en mi contexto específico. Los benchmarks de LLM tienen exactamente el mismo problema. El número existe. El contexto que lo hace relevante para vos, no.


Fuente original: Hacker News


Este artículo fue publicado originalmente en juanchi.dev

Top comments (0)