Sesión 5 · Planeación
Construye un plan estructurado
Define goal y reason con Zod y pide al modelo un objeto de pasos antes de resolver la misión.
Qué aprenderás
- Distinguir text de output con esquema.
- Crear buildPlan y tipar su tracer.
- Permitir de 2 a 15 pasos sin confundir estructura con corrección.
Referencias de código
Índice de esta lección
Paso 1
Organiza las tres fases
withPlanning construye un plan, analiza sus pasos secuencialmente e integra los resultados al final. En esta clase completamos la primera fase.
La ejecución del ejemplo consiste en llamadas de análisis sobre un escenario ficticio. No lleva a cabo capturas ni acciones externas.
1. buildPlan → pasos ordenados2. ejecutar cada paso → resultados parciales3. síntesis → propuesta finalQué deberías observar
Puedes localizar cada fase del flujo.
Paso 2
Define el objeto esperado
Cada paso contiene goal y reason. Zod comprueba tipos, campos y límites; el modelo aún puede proponer un paso incorrecto.
La grabación empieza con un máximo de 5 y después lo amplía a 15. El laboratorio incorpora el límite final desde el inicio para no comprimir un ejercicio de siete capturas en cinco elementos obligatorios.
import { z } from "zod"; export const planSchema = z.object({ steps: z.array(z.object({ goal: z.string().min(1).describe("Qué resuelve este paso, en una frase"), reason: z.string().min(1).describe("Por qué es necesario y por qué va en esta posición"), })).min(2).max(15).describe("Pasos ordenados; cada paso resuelve una sola tarea"),});export type PlanStep = z.infer<typeof planSchema>["steps"][number];Qué deberías observar
El resultado tendrá entre 2 y 15 pasos con objetivo y justificación.
Paso 3
Pide output, no solo texto
generateText permite configurar Output.object({ schema: planSchema }). Extrae output y retorna output.steps; no intentes recorrer un Markdown como si fuera ese arreglo.
Si el proveedor o modelo no admite la salida estructurada elegida, o el resultado no cumple el esquema, la generación puede fallar. Lee el error antes de intentar continuar con un plan inexistente.
import { generateText, Output } from "ai";import { createTracer, model } from "../../helpers/index.js";import { planSchema } from "./context.js"; export async function buildPlan(mission: string, tracer: ReturnType<typeof createTracer>) { const { output } = await generateText({ model, prompt: mission, instructions: "Eres un estratega. No resuelvas todavía el operativo. Responde en español. Descompón la tarea en pasos ordenados que usen los resultados anteriores.", output: Output.object({ schema: planSchema }), onStepEnd: tracer.onStepFinish, }); return output.steps;}Qué deberías observar
buildPlan devuelve pasos que cumplen la forma definida.
Paso 4
Revisa antes de ejecutar
Las instrucciones piden planear y no resolver todavía. reason es una explicación visible de la posición del paso, no una prueba de que la estrategia sea correcta.
Imprimir los pasos ayuda a detectar acciones fuera de orden o restricciones omitidas. Que el JSON sea válido no implica que Mirror Master vaya primero ni que las horas estén bien.
const tracer = createTracer("con-planificación");const steps = await buildPlan(buildMission(false), tracer);console.table(steps);Qué deberías observar
Puedes inspeccionar el plan sin confundir validación de formato con evaluación del problema.
Ahora te toca
Prueba la idea por tu cuenta
Propón un objeto de dos pasos con goal y reason. Explica una condición que Zod comprueba y una regla de captura que este esquema no garantiza.
Necesito una pista
El esquema limita cantidad y texto, pero no contiene la lógica de especialidades.
Comparar con una solución
Zod comprueba que steps sea un arreglo de 2 a 15 objetos con goal y reason no vacíos. No comprueba el orden de capturas, compatibilidad ni jornadas del escenario.
Antes de seguir
Comprueba lo que aprendiste
No es una nota. Es una pausa para comprobar que la idea quedó clara.
¿Terminaste la práctica?
Haz el ejercicio y comprueba tus respuestas antes de marcar la lección como completada.