# GLM-5.3-Flash desde cero: qué hace y cómo usarlo con Node.js

**URL:** <https://www.yodev.dev/t/glm-5-3-flash-desde-cero-que-hace-y-como-usarlo-con-node-js/5824>\
**Category:** Community\
**Tags:** llm, ai-data-sci\
**Created:** [30 Octubre, 2026 10:28 UTC](https://www.yodev.dev/t/glm-5-3-flash-desde-cero-que-hace-y-como-usarlo-con-node-js/5824 "2026-10-30T10:28:48Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![xiaoying\_zhou](https://yyz1.discourse-cdn.com/flex009/user_avatar/www.yodev.dev/xiaoying_zhou/32/2522_2.png) [@xiaoying\_zhou](https://www.yodev.dev/u/xiaoying_zhou)\
**Post date:** [30 Octubre, 2026 10:28 UTC](https://www.yodev.dev/t/glm-5-3-flash-desde-cero-que-hace-y-como-usarlo-con-node-js/5824/1 "2026-10-30T10:28:48Z")

</div>

GLM-5.3-Flash es un modelo de la familia GLM de Zhipu. La [documentación oficial de Z.ai](https://docs.z.ai/guides/vlm/glm-5.3-flash) presenta Flash y FlashX como modelos multimodales para trabajar con imágenes, código y documentos. Para alguien que quiere empezar, eso abre varias posibilidades: ordenar datos de una imagen, estudiar un problema o preparar código para una herramienta pequeña.

Lo probé mediante Crazyrouter el 30 de octubre de 2026 con tres tareas: una tabla de inscripciones, un ejercicio de probabilidad y una página para repartir gastos. La tabla y el ejercicio coincidieron con referencias calculadas por separado. La página necesitó una segunda solicitud porque la primera dejó el código incompleto. Voy a partir de esos resultados y dejar un ejemplo que se puede ejecutar sin instalar un SDK.

## **Antes de conectar: modelo, API y herramientas son piezas distintas**

El identificador que utilicé fue `glm-5.3-flash`. FlashX no forma parte de estas pruebas. [GLM-5.3](https://docs.z.ai/guides/llm/glm-5.3) tiene documentación propia, con entrada y salida de texto; no conviene atribuirle automáticamente las características de Flash ni trasladar resultados entre nombres parecidos.

La salida de Flash es texto. Puede ser una explicación, una tabla o un programa. Para guardar archivos, ejecutar ese programa o actuar sobre una interfaz, hace falta un entorno que lleve a cabo esas acciones.

 ![Fragmento de la página oficial de BigModel sobre trabajo con documentos y herramientas](https://canada1.discourse-cdn.com/flex009/uploads/inovacon/original/2X/b/bc5f82404f2bb3819240790218935607c1d5109d.png)

_Recorte de una captura real de BigModel, con el texto chino original. Describe tareas documentales que implican el uso de herramientas. Es información del proveedor, no una demostración de que todos esos formatos se hayan probado aquí._

En mis solicitudes envié texto y una imagen PNG. No probé video ni otros formatos de documentos, y el modelo no recibió herramientas externas. Ejecuté el código de sus respuestas después, como una comprobación separada.

## **Primera llamada: dos archivos y un comando**

La API permite que un programa envíe una tarea al servicio y reciba la respuesta. El ejemplo utiliza un script local; no necesitas descargar los pesos del modelo ni desarrollar una web para seguirlo.

También puedes acceder mediante las API oficiales de BigModel o Z.ai. Aquí uso Crazyrouter porque fue el servicio de las pruebas. La clave, la dirección y la configuración deben corresponder al mismo proveedor.

Si después quieres explorar otras opciones para generar código, tienes el [directorio de modelos de programación de Crazyrouter](https://crazyrouter.com/en/models/task/coding). Es una lista general, no una ficha exclusiva de Flash. El script selecciona el modelo por su ID exacto: `glm-5.3-flash`.

### **Prepara Node.js y la clave**

Instala Node.js 22 o una versión posterior y comprueba la instalación con `node --version`. Crea una clave en la sección de gestión de tokens API de Crazyrouter. Si restringes los modelos disponibles para esa clave, incluye `glm-5.3-flash`.

Crea una carpeta y guarda únicamente la clave en `api-key.txt`. No subas ese archivo a un repositorio público ni lo incluyas en una captura. En la misma carpeta, guarda el código siguiente como `glm-flash-es.cjs`.

**Este ejemplo plantea el ejercicio en español. Las pruebas originales utilizaron chino simplificado; no hice una llamada adicional con esta versión española.** La construcción de la solicitud y el manejo de respuestas se comprobaron localmente. Los resultados del artículo pertenecen a las llamadas originales y no evalúan la calidad del español.

```auto
'use strict';
const fs = require('node:fs');
const path = require('node:path');
​
async function main() {
  const key = fs.readFileSync(path.join(__dirname, 'api-key.txt'), 'utf8').trim();
  if (!key || /\s/.test(key)) throw new Error('Invalid key file');
  const request = {
    model: 'glm-5.3-flash',
    messages: [
      {
        role: 'system',
        content: "Responde a partir de las condiciones del problema. Distingue los cálculos, las suposiciones y la información desconocida. No afirmes haber ejecutado código que no hayas ejecutado."
      },
      {
        role: 'user',
        content: "La caja A contiene 4 bolas rojas y 2 azules; la caja B, 2 rojas y 4 azules. Se elige A con probabilidad 1/3 y B con probabilidad 2/3. Después se extraen 3 bolas, en orden y sin reemplazo, de la misma caja elegida. Se sabe que al menos una de las dos primeras bolas fue roja. Calcula la probabilidad condicional de que la tercera sea roja y la probabilidad posterior de haber elegido la caja A. Da fracciones exactas, el razonamiento paso a paso y los errores habituales. Incluye un programa Node.js que compruebe las respuestas enumerando exactamente las extracciones ordenadas y distinguiendo cada bola física. No sustituyas la enumeración por una simulación aleatoria ni afirmes haber ejecutado el código."
      }
    ],
    max_tokens: 24000,
    stream: false
  };
  const response = await fetch('https://api.crazyrouter.com/v1/chat/completions', {
    method: 'POST',
    redirect: 'error',
    signal: AbortSignal.timeout(720000),
    headers: { Authorization: 'Bearer ' + key, 'Content-Type': 'application/json' },
    body: JSON.stringify(request)
  });
  if (!response.ok) {
    console.error('La solicitud falló. Estado HTTP: ' + response.status);
    process.exitCode = 1;
    return;
  }
  const data = await response.json();
  const choice = data.choices?.[0];
  const redact = value => String(value).split(key).join('[redacted]');
  console.log('Motivo de finalización: ' + redact(choice?.finish_reason || 'no indicado'));
  const answer = choice?.message?.content;
  if (typeof answer !== 'string' || !answer.trim()) {
    console.error('La respuesta está vacía. Revisa el límite de salida y los parámetros admitidos.');
    process.exitCode = 1;
    return;
  }
  console.log(redact(answer));
}
main().catch(() => {
  console.error('No se pudo completar la solicitud. Revisa el archivo local, la conexión y la configuración. No se muestran detalles sensibles del error.');
  process.exitCode = 1;
});

```

### **Ejecuta el script y mira qué terminó realmente**

Abre una terminal en esa carpeta y ejecuta:

```auto
node glm-flash-es.cjs

```

En Windows puedes escribir `powershell` en la barra de direcciones de la carpeta abierta en el Explorador y pulsar Enter. Asegúrate de que el archivo no se haya guardado como `glm-flash-es.cjs.txt`. No necesitas paquetes adicionales.

El comando envía una solicitud API real. Como utiliza `stream: false`, espera la respuesta completa antes de mostrarla. Imprime el motivo de finalización y el contenido; no ejecuta automáticamente el código que el modelo pueda devolver.

Un HTTP 401 indica que debes revisar la validez de la clave y el servicio que la emitió. Si falla la lectura del archivo, comprueba el nombre y la ubicación. Si no hay contenido o aparece `finish_reason: length`, revisa la respuesta y el límite de salida antes de repetir. HTTP 200 confirma el éxito de la solicitud a ese nivel, pero no demuestra que el resultado esté completo o sea correcto.

En un cliente compatible con OpenAI, la Base URL es `https://api.crazyrouter.com/v1`. El script usa el endpoint completo, que añade `/chat/completions`. El [índice de documentación de la API](https://docs.crazyrouter.com/llms.txt) permite localizar otros formatos. Este ejemplo envía texto; para la prueba visual utilicé un bloque `image_url`.

## **Por qué elegí un ejercicio de probabilidad para el ejemplo**

En la caja A hay cuatro bolas rojas y dos azules; en B, dos rojas y cuatro azules. Se elige A con probabilidad 1/3 y B con 2/3. Se extraen tres bolas de la misma caja, en orden y sin reemplazo. Se sabe que al menos una de las dos primeras fue roja. Hay que calcular la probabilidad de que la tercera sea roja y la probabilidad posterior de haber elegido A.

En la solicitud original, GLM-5.3-Flash obtuvo **13/32** y **7/16** , respectivamente. El razonamiento también coincidió con la solución independiente. Son valores útiles para comparar cuando ejecutes el ejemplo, aunque la respuesta en español debe revisarse por sí misma.

Antes de enviar el problema preparé una enumeración exacta de las extracciones. Si cada bola se distingue de las demás, hay 6 × 5 × 4 = 120 secuencias por caja. Después ejecuté también el programa JavaScript que devolvió el modelo: calculaba fracciones exactas mediante `BigInt` y produjo los mismos valores.

Este caso sirve para aprender porque la información nueva cambia la probabilidad de haber elegido cada caja. Además, sacar una bola modifica la composición para el siguiente turno. Una explicación que trate las tres extracciones como independientes ya no está resolviendo el problema planteado. Pedir los pasos y contrastarlos tiene más utilidad que quedarse únicamente con la fracción final.

Es una prueba con un problema concreto, no una medida general de fiabilidad matemática.

## **Pasar de una imagen a datos que puedas utilizar**

La tarea visual partía de una tabla ficticia de doce filas. Había identificadores repetidos con actualizaciones, cancelaciones, pagos parciales y reembolsos. Pedí conservar el registro más reciente de cada ID, excluir las cancelaciones del conjunto activo y separar pagos y devoluciones. No incluí la solución de referencia en el prompt.

 ![Tabla ficticia de inscripciones utilizada como entrada real de la prueba visual](https://canada1.discourse-cdn.com/flex009/uploads/inovacon/original/2X/7/7851de945ced44829060d8946a04c602a3e614d0.png)

_La imagen original enviada al modelo, en chino simplificado. Las columnas son ID, categoría, importe total de la inscripción, importe pagado, devolución, estado y hora de actualización. Los datos son inventados para la prueba. Los importes se mantienen en yuanes, sin conversión a euros ni a otra moneda._

Envié el PNG como una Data URL Base64 dentro de `image_url`. La respuesta conservó nueve registros actualizados. Los campos comparados coincidieron con la imagen y los diez indicadores agregados con el cálculo independiente. Quedaron siete inscripciones activas: importe total a cobrar 720, cobro neto de devoluciones 580 y diferencia pendiente 140. Las canceladas sumaban, por separado, 200 pagados y 80 devueltos.

El modelo destacó A004, cancelada sin una devolución registrada, y A006, con pago parcial. No inventó una política de reembolso. Sin conocer esa política ni el motivo de cancelación, una observación sobre los datos no permite decidir por sí sola qué devolución corresponde.

Para una lista de un curso o una actividad, pediría conservar los IDs en la respuesta y mostrar qué filas entraron en cada total. Así se puede seguir el resultado hasta su origen. Si luego se incorpora a un programa, el cálculo sobre los datos revisados puede hacerse con funciones convencionales. Esa es una propuesta de uso, no una segunda integración que haya probado aquí.

El alcance es una sola imagen nítida. No medí el comportamiento con fotos borrosas, celdas combinadas ni documentos de varias páginas.

## **El HTML apareció completo en el segundo intento**

La tarea de programación pedía un archivo HTML autónomo y utilizable sin conexión para compartir gastos. Debía permitir añadir, renombrar y quitar participantes, elegir a quién afectaba cada gasto, editarlo, borrarlo y restablecer los datos.

La regla de reparto usaba enteros en la unidad monetaria mínima. El resto debía asignarse según el orden de las personas en pantalla. Por ejemplo, 100,00 entre tres se divide en 33,34; 33,33 y 33,33. Con 0,01, el reparto es 0,01; 0 y 0. Redondear cada parte por separado no debía alterar el total.

El primer intento terminó con HTTP 200 y `finish_reason: length`, dejando código sin completar. El límite era de 32.000 tokens; dentro de ese uso se registraron 25.707 tokens de razonamiento. Por tanto, los 32.000 no estaban disponibles exclusivamente para el HTML visible.

Mantuve el prompt y el mensaje de sistema, y cambié solo `max_tokens` a 48.000. La segunda respuesta terminó con `stop` y contenía el HTML completo. No lo completé ni corregí manualmente antes de comprobarlo.

El script completo pasó la comprobación de sintaxis. Ejecuté sin cambios sus funciones de cálculo y validación en Node.js: pasaron 40 comprobaciones, una de ellas con 132 combinaciones de importes y participantes. Incluían conservar el total, repartir el resto en orden, respetar participantes seleccionados, rechazar importes inválidos e impedir eliminar al único participante de un gasto.

**No comprobé la interfaz en un navegador real.** No hay un resultado de prueba para el diseño visual, los botones, la edición, el borrado y el restablecimiento desde la pantalla. Lo que obtuve fue código completo con la parte de cálculo verificada; para considerar lista la herramienta falta recorrer esas acciones.

Tampoco basta este segundo intento para afirmar que aumentar el límite siempre arregla un corte: se generó una respuesta nueva y no se repitió una serie suficiente para aislar ese efecto.

## **Una forma concreta de empezar a usarlo**

La serie original fue de **tres tareas independientes y cuatro solicitudes** , el 30 de octubre de 2026. Todas usaron `glm-5.3-flash` en `https://api.crazyrouter.com/v1/chat/completions`, sin streaming. Los límites fueron 16.000 tokens para la imagen, 24.000 para probabilidad y 32.000 y 48.000 para HTML. No fijé expresamente `temperature`, `top_p` ni `reasoning_effort`.

Empezaría con algo cuyo resultado puedas juzgar: una tabla pequeña con reglas claras, un ejercicio con una solución comprobable o una función aislada. Si el objetivo acaba siendo una aplicación, añade después el recorrido de uso completo. En estas pruebas, leer datos, explicar un cálculo y producir código exigieron formas distintas de comprobación; conocer esa diferencia ayuda a escoger la siguiente tarea sin atribuir al modelo resultados que todavía no has visto.
