¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Fijar la versión de un modelo

Después de esta lección: Puedo evitar que un modelo cambie bajo una función.

Lección de 60 min6 comandosLaboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

Por qué un modelo no debe cambiar solo

Fijar la versión de un modelo es nombrar la versión exacta que usa una función. Un nombre que siempre significa «la más nueva» no fija nada.

Importa porque una función que el lunes iba bien puede cambiar el martes sin que tú toques nada. Una versión fijada y una comprobación de cada configuración frenan el cambio que nadie eligió.

Al final de esta lección

Nota

Puedo evitar que un modelo cambie bajo una función.

Palabras clave

PalabraQué significaEjemplo
Fijarnombrar una versión exacta
Aliasun nombre que apunta a una versión que puede moversechat-latest
Configuraciónel archivo que dice qué modelo usa una función
Aviso de retiradaun aviso de que una versión dejará de funcionar
Día de retiradael día en que una versión deja de responder

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un alias puede moverse, una versión no

Una configuración nombra el modelo al que llama una función. Si dice chat-latest, el proveedor decide qué significa. Un día apunta a una versión nueva.

Si dice chat-v3, significa solo esa versión. La función cambia cuando editas la configuración y no antes.

Ejemplo resuelto: cinco nombres

Nombre en la configuración¿Fijado?Motivo
chat-v3SíAcaba en v y un número entero
chat-v10SíDiez es un número entero
chat-latestNoLatest es una palabra, no un número
chatNoNo tiene versión
chat-v2bNoEl 2b no es un número entero

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error frecuente

Advertencia

Mucha gente cree que fijar basta para siempre. Una versión fijada también termina: el proveedor la retira un día fijo. Fijar te da tiempo para pasar a otra a tu ritmo, pero solo si actúas antes del día de retirada.

Un aviso te da un día para cambiar

Un aviso de retirada nombra una versión y su día de retirada. Los días que quedan son ese día menos hoy.

Elige una ventana de aviso, por ejemplo 30 días. Dentro de ella, la función está por retirar: planifica el cambio ya. Desde el día de retirada, ya ha fallado.

Ejemplo resuelto: hoy es el día 100

VersiónDía de retiradaDías que quedanEstado con ventana de 30 días
chat-v190-10Retirada
chat-v212525Por retirar
chat-v4300200ok
chat-v5sin avisoningunook

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Escribe el ayudante del modelo, parte 1

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const base = process.env.AI_URL || \"http://ai:4000\";' '// Los tokens de una respuesta, o null si no trae ninguno.' 'function count(data, name) {' '  return data.usage && typeof data.usage[name] === \"number\" ? data.usage[name] : null;' '}' > model.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe el ayudante del modelo, parte 2

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function ask(messages, sample, max) {' '  try {' '    const res = await fetch(base + \"/v1/chat/completions\", {' '      method: \"POST\",' '      headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' '      body: JSON.stringify({ model: \"lab\", messages: messages, max_tokens: max || 100 }),' '      signal: AbortSignal.timeout(30000),' '    });' '    if (res.ok === false) throw new Error(\"estado \" + res.status);' '    const d = await res.json();' '    return { text: d.choices[0].message.content, inTokens: count(d, \"prompt_tokens\"), outTokens: count(d, \"completion_tokens\"), recorded: false };' '  } catch (error) {' '    console.log(\"Muestra grabada: ningún modelo respondió (\" + error.message + \").\");' '    return { text: sample, inTokens: null, outTokens: null, recorded: true };' '  }' '}' 'module.exports = { ask };' >> model.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe el comprobador de versiones, parte 1

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { ask } = require(\"./model\");' 'const today = 100;' 'const configs = [' '  { feature: \"resumen\", model: \"chat-v3\" },' '  { feature: \"busqueda\", model: \"chat-latest\" },' '  { feature: \"triaje\", model: \"chat-v2\" },' '  { feature: \"etiquetas\", model: \"chat-v1\" },' '  { feature: \"borrador\", model: \"chat\" },' '];' 'const notices = { \"chat-v2\": 125, \"chat-v1\": 90 };' > pin.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe el comprobador de versiones, parte 2

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function pinned(model) {' '  const tail = model.split(\"-\").pop();' '  const rest = tail.slice(1);' '  return tail.length > 1 && tail[0] === \"v\" && String(Number(rest)) === rest;' '}' 'function status(c) {' '  if (pinned(c.model) === false) return \"SIN FIJAR\";' '  const end = notices[c.model];' '  if (end === undefined) return \"ok\";' '  if (end <= today) return \"RETIRADA\";' '  return end - today <= 30 ? \"SE RETIRA en \" + (end - today) + \" días\" : \"ok\";' '}' >> pin.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Escribe el comprobador de versiones, parte 3

Comando
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' '  let bad = 0;' '  configs.forEach(function (c) {' '    const s = status(c);' '    if (s > \"ok\" || s < \"ok\") bad = bad + 1;' '    console.log(c.feature + \" \" + c.model + \": \" + s);' '  });' '  console.log(\"necesitan trabajo: \" + bad + \" de \" + configs.length);' '  const q = \"En una frase corta, ¿por qué conviene fijar un modelo a una versión?\";' '  const sample = \"Una versión fijada no puede cambiar bajo la función, así que tú decides cuándo pasar a otra.\";' '  const reply = await ask([{ role: \"user\", content: q }], sample, 60);' '  console.log(\"el modelo dijo: \" + reply.text);' '}' 'main();' >> pin.js"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejecuta el comprobador de versiones

Comando
docker exec -w /home/node/project agent node pin.js

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lo que imprime el comprobador

LíneaQué muestra
resumen chat-v3: okFijado y sin aviso
busqueda chat-latest: SIN FIJARUn alias, así que puede moverse
triaje chat-v2: SE RETIRA en 25 díasFijado, pero el final se acerca
etiquetas chat-v1: RETIRADAPasó su día de retirada
borrador chat: SIN FIJARNo tiene versión
necesitan trabajo: 4 de 5Contado con reglas, no con un modelo
el modelo dijo: ...Una frase del laboratorio. Una muestra grabada si ningún modelo responde

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Sobre este laboratorio y su código: Laboratorio de agente de programación con IA: usa opencode para explicar y corregir código, y comprueba su trabajo

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.