Código abiertoPublicado

booking-agent

Agenda de citas por chat: el asistente busca y aparta el horario, la persona lo confirma con un botón y PostgreSQL hace imposible la doble reserva.

Reservas conversacionales en .NET 10 con Claude Haiku 5.5: herramientas acotadas que el asistente no puede usar para confirmar, holds con vencimiento, recordatorios por un outbox, identificación con código por correo y un panel en vivo con el porqué de cada reserva.

Rol:
Diseño y desarrollo
Año:
2026
conversaciones de evaluación que terminan como se esperaba
28/28
reservas confirmadas o canceladas por el asistente
0
pedidos simultáneos por el mismo horario: solo uno lo obtiene
1 de 50
de costo del modelo por conversación
USD 0,0024

Demo

75 segundos con Claude Haiku 5.5: el cliente reserva en el chat a la izquierda y la cita aparece al instante en el panel de la clínica a la derecha.

El problema

Clínicas y salones pierden horas al teléfono agendando citas. Un chatbot que reserva solo cambia ese problema por otros: dobles reservas, citas que nadie pidió y respuestas inventadas. El objetivo era un asistente útil que no pudiera hacer daño: que entienda "el lunes en la mañana", busque en la agenda real y deje la decisión final en manos del cliente.

Restricciones

  • El asistente nunca confirma ni cancela: propone, y la persona actúa con un botón
  • Cero dobles reservas, aunque cincuenta personas pidan el mismo horario a la vez
  • Fechas relativas en español resueltas en el servidor, en la zona horaria del negocio
  • Avisos y recordatorios que nunca se pierden ni anuncian algo que no se guardó
  • Costo por conversación visible, con topes por conversación y por día

Cómo funciona

  1. Ocho herramientas, cada una un adaptador delgado sobre un caso de uso que también usa el formulario: el asistente no puede hacer nada que el formulario no permita, y una prueba de arquitectura lo hace cumplir.
  2. Apartar un horario lo bloquea cinco minutos en PostgreSQL con una restricción de exclusión sobre rangos de tiempo. El token de confirmación va a la tarjeta del chat, nunca al modelo.
  3. Los avisos se escriben en un outbox en la misma transacción que la reserva, y un despachador los envía por correo y a una bandeja en la app, con reintentos.
  4. El cliente se identifica con un código de 6 dígitos por correo para ver, mover o cancelar sus citas; la sesión vive en una cookie HttpOnly.
  5. Cada cambio de reserva se anuncia por SignalR, y el panel de la clínica recarga la semana al instante. Cada reserva hecha por el asistente muestra su conversación y sus pasos, con tokens y costo.

Decisiones clave

La persona confirma, no el asistente

Que un modelo decida si "sí, pero…" significa sí es un riesgo y un costo. Un botón con un token de un solo uso es determinístico.

Costo de la decisión: Quien escribe "sí" igual tiene que tocar el botón: el asistente se lo recuerda.

La doble reserva la impide PostgreSQL

Comprobar y después insertar pierde la carrera; una restricción de exclusión no, venga la reserva del chat, del formulario o de un error.

Costo de la decisión: Los guardados de un mismo profesional van en fila, con un candado de transacción.

Evaluado como software, sobre la base de datos

28 conversaciones guionadas se puntúan con lo que queda guardado, no con lo que dice el asistente: así se ve si apartó la hora correcta y si cambió algo que no debía.

Costo de la decisión: Una corrida con el modelo real cuesta unos USD 0,07, así que se lanza a mano; en CI corre un oráculo gratuito.

Resultados

  • Con Claude Haiku 5.5, las 28 conversaciones de evaluación terminan como se esperaba: reservas, conflictos, cambios, cancelaciones e intentos de manipulación.
  • Ninguna reserva confirmada ni cancelada por el asistente, y ningún horario apartado que antes no ofreciera la agenda.
  • Cincuenta pedidos simultáneos del mismo horario: uno lo obtiene y los otros 49 reciben los horarios libres más cercanos, en alrededor de un segundo.
  • La primera corrida sacó 0,76: las transcripciones mostraron que "mañana" no se resolvía en un contenedor sin datos de cultura. Se corrigió y quedó cubierto por las pruebas.
  • Un test de punta a punta con Playwright recorre chat, panel en vivo, código por correo y cancelación en cada push, sin API key y sin costo.

Tecnologías

  • .NET 10
  • C#
  • PostgreSQL
  • NodaTime
  • SignalR
  • Aspire
  • Claude Haiku 5.5
  • Next.js
  • TypeScript
  • Playwright