Me equivoqué sobre GLM-5.2 y sus effort levels
Retractación (2026-06-20). La primera versión de este post se titulaba “GLM-5.2 y el mito de los effort levels: cuando la API miente” y defendía que
reasoning_effortno existía en la API de Z.AI. Era falso. Lo dejo abajo reescrito como lo que realmente pasó: me equivoqué, y la forma en que me equivoqué es más instructiva que mi conclusión original.
Hace unos días configuré GLM-5.2 en mi agente de coding. La prensa decía que tenía dos niveles de razonamiento — High y Max — y Z.ai recomendaba Max para programar. Quería confirmar que el parámetro funcionaba antes de cablearlo.
Tras una tarde de pruebas escribí, con confianza: “el parámetro no existe, la API miente, todo es on/off binario”. Lo documenté. Escribí un post. Lo di por cerrado.
Estaba equivocado. Y lo interesante no es el modelo, es cómo llegué a estar tan seguro de algo falso.
La evidencia que me convenció (y por qué era insuficiente)
Para demostrar que reasoning_effort no hacía nada, hice lo correcto: el mismo prompt, variando el parámetro, midiendo los tokens de razonamiento.
| Parámetro | reasoning_tokens (media) |
|---|---|
reasoning_effort: "high" |
304 |
reasoning_effort: "max" |
259 |
thinking.level: "high" |
220 |
thinking.level: "max" |
294 |
Los números eran ruido: la variabilidad entre repeticiones idénticas (126–337 tokens) era mayor que la diferencia entre high y max. De ahí concluí: “no hay efecto, el parámetro es cosmético”.
El error no fue el test. El test era inconcluso. El error fue convertir “inconcluso” en “irrefutable: no existe”. Faltaba la evidencia que de verdad zanjaba la cuestión, y la busqué donde tocaba: la spec formal.
La spec que me dio la “prueba” final (y estaba obsoleta)
Fui a docs.z.ai/openapi.json, la spec machine-readable de Z.AI, y busqué:
'effort' aparece: 0 veces
'reasoning_effort' aparece: 0 veces
Cero. Asumí que era la prueba definitiva: si no está en el contrato formal, no existe. Escribí el post con la tesis cerrada.
Salvo por un detalle que no miré: esa spec tampoco listaba glm-5.2 en el enum de modelos. Se detenía en glm-5.1. La spec era anterior a GLM-5.2. Estaba mirando el contrato de la versión previa y concluyendo cosas sobre la versión actual. Mi “prueba irrefutable” era un documento obsoleto.
Lo que la doc oficial realmente dice
Días después llegó a mis manos la página Core Parameters de Z.AI, actualizada. Ahí estaba, en negro sobre blanco:
reasoning_effort: Controla el nivel de razonamiento cuando el chain-of-thought está activo. Solo GLM-5.2 y superiores. Valores:max(default),xhigh,high,medium,low,minimal,none.none/minimal: el modelo salta el thinking.low/medium: se mapean ahigh.xhigh: se mapea amax.
El parámetro sí existe, está documentado, y tiene un mapeo server-side encima. Mi tesis entera se desmoronaba con esa sola página.
El re-test honesto
Repetí las pruebas, esta vez bien diseñadas: problema con trampa (propenso a error, no trivial), max_tokens amplio, varios intentos por nivel. Resultado:
| effort | reasoning_tokens | ¿correcto? |
|---|---|---|
none |
0 | ❌ erróneo (dio “-10%”; lo correcto era -41,7%) |
high |
~1127 | ✅ correcto |
max |
~1160 | ✅ correcto |
Dos cosas reales salieron de aquí:
- El thinking de verdad ayuda. Con
none(off) el modelo se equivoca en problemas difíciles; con razonamiento, acierta. No es decorativo. highvsmaxsiguen siendo indistinguibles en mi test (Δ=33 tokens, σ=130). La doc los distingue y Z.ai recomiendamaxpara tareas multi-step complejas, así que no afirmo que sean idénticos — la diferencia probablemente se vea en sesiones de programación largas, no en un acertijo de un disparo. Mi test no la medía. Queda abierto.
El punto clave: la diferencia on/off (none vs el resto) es real y útil. La granularidad high/max es plausible pero no probada en mi setup.
La segunda retractación (sí, me equivoqué dos veces)
Como si una no bastara, el post original tenía otra afirmación categórica: que usar el “formato OpenAI puro” en mi agente “rompía el modo apagado”, porque sin enviar thinking.type el modelo razonaría siempre. Lo presenté como hecho.
Lo probé esta semana. reasoning_effort=none enviado solo, sin objeto thinking ninguno → 0 tokens de razonamiento. Z.AI honra none para apagar el thinking aunque no le envíes thinking.type. Mi afirmación era falsa también.
Dos afirmaciones categóricas, dos falsas. No es casualidad: ambas venían del mismo defecto metodológico.
La lección (la de verdad)
Mi error no fue técnico. Fue de epistemología de la evidencia. Tres fallos concretos:
1. Tratar “inconcluso” como “refutado”. Mi primer test mostraba ruido, no ausencia de efecto. “No puedo medir la diferencia” no es “la diferencia no existe”. La diferencia entre no encontrar evidencia y encontrar evidencia de ausencia es enorme, y la crucé sin pensarlo.
2. Sobreponderar una sola fuente sin chequear su vigencia. La spec OpenAPI era la “prueba definitiva” — salvo que estaba obsoleta. Una fuente autoritativa no es válida por ser autoritativa; lo es por estar actualizada. No comprobé que la spec cubriera GLM-5.2. Si lo hubiera hecho (el enum de modelos no lo listaba), habría visto la señal de alarma.
3. Declarar “irrefutable” con demasiada confianza. Escribí “conclusión irrefutable” sobre un test de dos repeticiones en un problema trivial. La confianza no debería medir lo orgulloso que estoy del análisis, sino cuántas formas independientes tendría que estar equivocándome para que la conclusión cayera. Una sola doc actualizada bastó para tirarla.
La regla que me anoto: antes de escribir “X no existe / X no funciona”, busca tres evidencias independientes a favor de que sí, y no las descartes por no encajar. Lo opuesto a la confirmation bias no es escepticismo; es buscar activamente la evidencia que te contradiga.
Y de paso, ¿compensa GLM frente a GPT?
(El benchmark sí sigue siendo válido — eso no toqué en la retractación.)
El mismo task de código en ambos, razonamiento apagado y encendido:
| Modelo | Modo | Latencia | Throughput |
|---|---|---|---|
| GLM-5.2 | thinking on | 32.5s | 64 tok/s |
| GPT-5.4 | effort high | 10.3s | 81 tok/s |
GPT es ~3× más rápido y genera tokens más rápido. GLM “se lo toma más en serio” por respuesta (más tokens de razonamiento, más output). Caveats: single-shots, infra distinta, no medí corrección. Si priorizas velocidad de iteración, GPT; si priorizas profundidad por turno y no te importa esperar, GLM.
Y el detalle que ahora sé con certeza: la diferencia entre effort low y high en GPT sí es real y medible (17→364 reasoning tokens, sube monótona). En GLM-5.2 también es controlable — ahora documentado —, aunque mi test de un disparo no supo distinguir high de max.
Epílogo
GLM-5.2 es un modelo excelente y su API no me mintió. Fui yo quien le mintió a la documentación: escribí “no existe” donde debí escribir “no lo sé medir”, y “irrefutable” donde debí escribir “pendiente de más evidencia”.
La próxima vez que vaya a declarar que algo no funciona, me preguntaré: ¿he buscado de verdad la evidencia de que sí funciona, o solo la que confirma que no?
Eso es todo. Me equivoqué. Lo dejo escrito para que el próximo yo — o cualquiera que lea esto — no repita el atajo.