Un agente de IA que entiende, sugiere, calcula el total exacto y manda el ticket a cocina — 24/7, en español de México. Cambia una línea de config y el mismo motor atiende una inmobiliaria.
No es una maqueta ni un video. Es un agente de verdad: lee el mensaje, decide qué hacer, usa herramientas para consultar precios reales y guardar el pedido, y responde — solo, paso a paso. Compruébalo tú mismo con los enlaces de abajo.
Corriendo en producción en Railway. Cada respuesta es una llamada real — nada está grabado.
Claude (sonnet-4-6) decide en tiempo real qué herramienta usar y cómo responder.
Postgres en vivo. El menú, el inventario y cada pedido se leen y se guardan en la base de datos — no archivos estáticos.
Claude API · Postgres (Railway) · WhatsApp (Twilio + Meta). El tablero y el chat corren sobre lo mismo.
Cada mensaje de WhatsApp recorre el mismo camino. El runtime, los adaptadores de canal y el bus de eventos son idénticos para cualquier negocio — un negocio es solo un archivo de config.
"3 de pastor con todo y un agua" → interpreta intención, cantidad y modificadores.
Las herramientas resuelven precios, promos y extras. El modelo nunca suma.
Confirma, asigna folio y emite un ticket JSON listo para cocina/POS.
Cada pedido y lead se guarda en Postgres y aparece en el tablero por SSE.
Una conversación real: el agente llama herramientas, aterriza el total exacto y suelta el ticket. Prueba el flip — el mismo motor cambia de taquería a inmobiliaria.
Cambiar de negocio no toca el motor: es un config.json distinto (persona + reglas + qué herramientas + qué catálogo). Ese es el modelo white-label — un backend que mantienes una vez.
Ve este mismo motor a fondo, del lado inmobiliario (Casa Nova Inmobiliaria), en nuestro demo CDMX AgentEl modelo decide, turno por turno, qué herramientas llamar y con qué argumentos, ve los resultados y decide el siguiente paso — hasta dar la respuesta final. El código nunca guioniza la conversación.
// El modelo ve las herramientas y decide. Loop hasta la respuesta final.
for (let step = 0; step < MAX_STEPS; step++) {
const resp = await claude.messages.create({
model, system, messages, tools, // ← catálogo de tools
});
messages.push({ role:"assistant", content: resp.content });
const calls = resp.content.filter(b => b.type==="tool_use");
if (resp.stop_reason !== "tool_use") break; // ← listo → responde
for (const c of calls) {
const result = runTool(c.name, c.input); // ← precios, totales, 86, folio
results.push({ type:"tool_result", tool_use_id:c.id, content:result });
}
messages.push({ role:"user", content: results }); // ← devuelve y repite
}
Claude emite bloques tool_use con argumentos. Nuestro código los ejecuta — el modelo nunca toca la base de datos ni inventa precios.
Cada tool_result se re-inyecta y el modelo vuelve a decidir. El loop corre hasta 6 pasos por turno.
Se cambia el tool pack y el prompt según la config. agent.ts es idéntico para la taquería y la inmobiliaria.
Entiende el antojo, sugiere el upsell correcto, sabe cuándo confirmar. Maneja la ambigüedad humana.
Precios, totales, disponibilidad (86), folios. Deterministas y probados — por eso el total siempre cuadra.
Funciones puras con firma JSON-Schema. El pack se elige por config — restaurante o bienes raíces.
TypeScript nativo en Node 22, un solo runtime, desplegado en Railway con auto-deploy y Postgres administrado.
Enlaces directos al backend real en Railway. Datos reales, generados por el agente.