Ejercicio: IA como complemento, no como cerebro
Objetivo
Construir la red de seguridad que rodea a una IA en el bot del minimarket: extraer su respuesta, validarla, no dejarla inventar productos ni precios, decidir cuándo usarla y estimar su costo. Todo sin llamar a ningún proveedor: las funciones trabajan con el texto que devolvería la IA, así que las pruebas son gratis y repetibles.
Cómo se trabaja
La parte A es una investigación y una práctica con el proveedor que prefieras (opcional: necesita cuenta y a veces tarjeta). La parte B son seis funciones de JavaScript puro que se comprueban en esta página. Imagina que la IA recibió el mensaje del cliente y se le pidió responder solo con un JSON como este: {"intencion": "pedir_producto", "producto_id": "arroz", "confianza": 0.9}.
Las intenciones permitidas son pedir_producto, consultar_horario, consultar_delivery y hablar_con_persona. Cualquier otra cosa debe tratarse como desconocida.
💡 Reto extra
Escribe decidirCamino(intencionReglas, claseIA): si las reglas ya entendieron (intencionReglas distinta de "desconocida") devuelve "reglas" sin consultar a la IA; si no, devuelve "ia" cuando la clasificación sea válida y "humano" cuando también la IA dé "desconocida". Esa función es el corazón del diseño «reglas primero, IA de respaldo».
Pasos
Marca cada paso a medida que lo completes. Tu avance se guarda en este navegador.
💡 Pista 1: Primer objeto JSON
Busca la primera { y la última } con indexOf y lastIndexOf, corta ese fragmento y pásalo por JSON.parse dentro de un try/catch. Así funciona aunque haya texto o un bloque de código alrededor.
💡 Pista 2: Detectar precios
Una expresión regular como /s\/\s*\d|\d+([.,]\d+)?\s*soles/i cubre S/ 5, S/5.50 y 5 soles. Cuidado con el \ de S/ dentro de la expresión.
💡 Pista 3: Costo por millón de tokens
Si un precio es «por millón de tokens», el costo es tokens / 1000000 * precio. Suma entrada y salida, y multiplica por las llamadas.
🔎 Comprueba tu trabajo
Pega tu código y pulsa Comprobar. La revisión ocurre en tu navegador; nada se envía a ningún sitio. Cada punto en rojo incluye una pista. Pega solo el JavaScript, sin las etiquetas <script>.
✅ Ver una solución posible
Intenta resolverlo antes de mirar. Tu versión puede ser distinta y también correcta.
function extraerJSON(texto) {
const t = String(texto == null ? "" : texto);
const a = t.indexOf("{");
const b = t.lastIndexOf("}");
if (a === -1 || b <= a) return null;
try {
const obj = JSON.parse(t.slice(a, b + 1));
return obj && typeof obj === "object" ? obj : null;
} catch (e) {
return null;
}
}
function validarClasificacion(obj, permitidas, umbral) {
if (!obj || typeof obj !== "object") return "desconocida";
if (!permitidas.includes(obj.intencion)) return "desconocida";
if (typeof obj.confianza !== "number" || obj.confianza < umbral) return "desconocida";
return obj.intencion;
}
function productoDelCatalogo(id, productos) {
if (typeof id !== "string") return null;
return productos.find((p) => p.id === id) || null;
}
function textoPrecio(producto) {
return producto.nombre + " cuesta S/ " + producto.precio.toFixed(2) + ".";
}
function contienePrecio(texto) {
return /s\/\s*\d|\d+([.,]\d+)?\s*soles/i.test(String(texto));
}
function costoEstimado(llamadas, tokensEntrada, tokensSalida, precioEntradaPorMillon, precioSalidaPorMillon) {
const porLlamada = (tokensEntrada / 1e6) * precioEntradaPorMillon + (tokensSalida / 1e6) * precioSalidaPorMillon;
return porLlamada * llamadas;
}