Mentalidad de tu Bot
La mentalidad (mindset) es el núcleo de tu bot de IA. Define quién es, qué sabe hacer, qué límites tiene y cómo debe comportarse en cada interacción.
Conceptos clave
Un mindset es una clase que implementa la interfaz IMindset y está decorada con @mindset(). El framework usa esta clase para construir el system prompt que se envía al modelo de lenguaje antes de cada respuesta.
Interfaz IMindset
import { IMindset, IMindsetIdentity, IMindsetModels } from '@wabot-dev/framework'
export interface IMindset { context(): Promise<string> // Descripción del contexto de la app identity(): Promise<IMindsetIdentity> // Quién es tu bot skills(): Promise<string> // Qué sabe hacer limits(): Promise<string> // Qué NO debe hacer workflow(): Promise<string> // Cómo debe actuar paso a paso models(): Promise<IMindsetModels> // Qué modelos de IA usar}Todos los métodos son async, por lo que pueden hacer consultas a base de datos, leer variables de entorno o llamar servicios externos para construir sus respuestas.
Decorador @mindset()
El decorador @mindset() registra tu clase como un mindset válido. Opcionalmente recibe una lista de modules — clases con funciones que el LLM puede invocar durante la conversación (ver Agrega funcionalidades externas):
import { mindset, IMindset } from '@wabot-dev/framework'
@mindset()export class MiBotMindset implements IMindset { // Implementación...}
// Con módulos:@mindset({ modules: [MiModulo1, MiModulo2] })export class MiBotConModulos implements IMindset { // Implementación...}@mindset() aplica @injectable() por ti. No agregues @singleton(): los
mindsets tienen alcance de chat y el runner construye uno por conversación.
context
El método context() retorna un texto libre que describe el propósito de tu aplicación. Se inyecta directamente en el system prompt del modelo, dándole una visión general de para qué sirve la app y a quién atiende.
Es el lugar indicado para incluir información que el bot debe conocer siempre: descripción del negocio, catálogo de productos, datos del cliente activo, etc.
Como el método es async, puedes consultar información dinámica de la base de datos o de otros servicios:
// Contexto estático — describe la aplicaciónasync context(): Promise<string> { return ` Eres el asistente de soporte de TechFlow, una empresa de software B2B que vende herramientas de analítica para equipos de marketing.
Nuestros productos principales son: - TechFlow Analytics: dashboards de métricas en tiempo real - TechFlow Reports: generación automatizada de reportes mensuales - TechFlow Integrations: conectores con Google Ads, Meta Ads y HubSpot
Atendemos a empresas medianas y grandes en Latinoamérica. El equipo de ventas opera de lunes a viernes, 9 AM a 6 PM (GMT-5). `}// Contexto dinámico — personalizado por usuario/sesiónasync context(): Promise<string> { const config = await this.configRepository.getActive() return ` Eres el asistente de ${config.businessName}. Horario de atención: ${config.businessHours}. Productos disponibles: ${config.productList.join(', ')}. `}identity
La identidad define la personalidad y el estilo de comunicación de tu bot. Una identidad clara hace que el bot sea consistente: siempre el mismo tono, nombre y estilo, sin importar el tema de la conversación.
async identity(): Promise<IMindsetIdentity> { return { name: 'Sofía', language: 'Español', personality: 'Amable, clara y orientada a resolver problemas rápidamente', emotions: 'Empática con los usuarios frustrados, entusiasta cuando encuentra soluciones', }}Propiedades de IMindsetIdentity:
| Propiedad | Tipo | Requerido | Descripción |
|---|---|---|---|
name | string | Sí | Nombre con el que el bot se presenta |
language | string | Sí | Idioma principal del bot (ej: 'Español', 'English') |
personality | string | No | Descripción del carácter y estilo de comunicación |
emotions | string | No | Cómo el bot maneja emociones en distintos contextos |
models
El método models() define qué modelo de IA usa el bot para generar respuestas. Puedes configurar distintos tipos de modelos para distintas capacidades.
Configuración básica
Devuelve un objeto donde cada clave es un tipo de modelo y su valor es un array de opciones. El framework intenta los modelos en orden hasta que uno funcione:
async models(): Promise<IMindsetModels> { return { llm: [ { provider: 'anthropic', model: 'claude-sonnet-4-6' }, ] }}Tipos de modelos disponibles
| Clave | Uso |
|---|---|
llm | Chat de texto — el tipo más común |
visionLlm | Análisis de imágenes (con fallback a llm si no se configura) |
audioLlm | Procesamiento de audio |
speechToText | Transcripción de voz a texto |
textToSpeech | Síntesis de voz |
imageGen | Generación de imágenes |
embedding | Embeddings vectoriales |
Proveedores y modelos recomendados
Anthropic (Claude)
async models(): Promise<IMindsetModels> { return { llm: [ { provider: 'anthropic', model: 'claude-sonnet-4-6' }, // Equilibrio velocidad/calidad { provider: 'anthropic', model: 'claude-haiku-4-5-20251001' }, // Más rápido y económico ] }}OpenAI (GPT)
async models(): Promise<IMindsetModels> { return { llm: [ { provider: 'openai', model: 'gpt-4o' }, // Mayor capacidad { provider: 'openai', model: 'gpt-4o-mini' }, // Más rápido y económico ] }}Google (Gemini)
async models(): Promise<IMindsetModels> { return { llm: [ { provider: 'google', model: 'gemini-2.5-flash' }, // Rápido y gratuito en tier básico { provider: 'google', model: 'gemini-2.5-pro' }, // Mayor capacidad de razonamiento ] }}OpenRouter (multi-proveedor)
OpenRouter permite acceder a decenas de modelos con una sola API key:
async models(): Promise<IMindsetModels> { return { llm: [ { provider: 'openrouter', model: 'anthropic/claude-sonnet-4-5' }, { provider: 'openrouter', model: 'openai/gpt-4o' }, { provider: 'openrouter', model: 'google/gemini-2.5-flash' }, ] }}Configurar modelos de visión
Si tu bot necesita analizar imágenes que los usuarios le envíen, configura visionLlm. Si no lo configuras, el framework usa llm como fallback:
async models(): Promise<IMindsetModels> { return { llm: [ { provider: 'anthropic', model: 'claude-haiku-4-5-20251001' }, ], visionLlm: [ { provider: 'anthropic', model: 'claude-sonnet-4-6' }, // Modelos con capacidad de visión ] }}Múltiples proveedores como fallback
Puedes listar modelos de distintos proveedores. El framework intenta el primero y, si falla, usa el siguiente:
async models(): Promise<IMindsetModels> { return { llm: [ { provider: 'anthropic', model: 'claude-sonnet-4-6' }, { provider: 'openai', model: 'gpt-4o' }, // Fallback si Anthropic falla { provider: 'google', model: 'gemini-2.5-flash' }, // Segundo fallback ] }}skills
Las habilidades describen qué sabe y puede hacer tu bot. Cuanto más detalladas, mejor será la calidad de las respuestas. El LLM usa este texto para entender su rol y su dominio de conocimiento.
// Bot de soporte técnicoasync skills(): Promise<string> { return ` Eres experto en diagnosticar problemas técnicos de software: errores de instalación, problemas de configuración, fallas de red y comportamientos inesperados.
Sabes cómo guiar a usuarios no técnicos paso a paso, usando lenguaje simple y verificando en cada paso que el usuario entendió y completó la instrucción.
Conoces en profundidad los productos de TechFlow: su arquitectura, sus requisitos del sistema y los problemas más comunes reportados por clientes.
Sabes escalar tickets al equipo humano cuando el problema supera tu capacidad de resolución, documentando claramente el diagnóstico previo. `}// Bot de reservas de restauranteasync skills(): Promise<string> { return ` Conoces el menú completo del restaurante, incluyendo ingredientes, alérgenos y opciones vegetarianas/veganas.
Sabes gestionar reservas: consultar disponibilidad, crear nuevas reservas, modificar horarios y cancelar cuando el cliente lo solicita.
Puedes dar recomendaciones de platos según las preferencias del cliente (ocasión especial, dieta, presupuesto).
Sabes manejar solicitudes especiales como arreglos florales, pastel de cumpleaños o configuraciones de mesa para grupos grandes. `}limits
Los límites definen qué no puede hacer el bot. Son restricciones absolutas que el modelo respetará siempre, independientemente de cómo el usuario formule su mensaje.
// Bot de soporte técnicoasync limits(): Promise<string> { return ` No puedes acceder ni modificar datos de clientes directamente en la base de datos.
No puedes procesar reembolsos ni aplicar créditos sin que un agente humano apruebe la solicitud primero.
No puedes dar información sobre contratos, precios especiales o negociaciones comerciales — eso corresponde al equipo de ventas.
No debes recomendar soluciones que impliquen desinstalar o modificar el sistema operativo del cliente sin que un ingeniero senior lo revise primero. `}// Bot de reservas de restauranteasync limits(): Promise<string> { return ` No puedes confirmar reservas para grupos de más de 15 personas sin aprobación del gerente.
No puedes ofrecer descuentos ni cortesías — esas decisiones las toma el equipo presencial.
No aceptes pagos ni datos de tarjetas de crédito a través del chat.
No hagas promesas sobre tiempos de preparación o calidad de platos específicos que no puedas garantizar. `}workflow
El workflow es el guión paso a paso que sigue el bot para lograr su objetivo. Define en qué orden actúa, cuándo usar tools, cómo manejar situaciones específicas y cuál es su misión principal.
Un workflow bien escrito transforma un bot genérico en un asistente especializado con un proceso claro.
// Bot de soporte técnicoasync workflow(): Promise<string> { return ` - Preséntate como Sofía, la asistente de soporte de TechFlow.
- Tu misión es resolver el problema técnico del usuario en el menor tiempo posible.
- Al recibir el primer mensaje, identifica de qué producto se trata (Analytics, Reports o Integrations) y crea un ticket usando la tool correspondiente.
- Haz preguntas de diagnóstico una a la vez, no varias juntas: ¿Qué versión del producto estás usando? ¿Desde cuándo ocurre el problema? ¿Puedes compartir el mensaje de error exacto?
- Antes de sugerir cualquier solución, registra el diagnóstico en el ticket usando la tool de actualización.
- Si el problema tiene solución conocida, guía al usuario paso a paso y confirma al final que el problema quedó resuelto.
- Si no puedes resolver el problema en 3 intentos, escala al equipo usando la tool de escalamiento y comunica al usuario el número de ticket y el tiempo estimado de respuesta (24h hábiles). `}// Bot de reservas de restauranteasync workflow(): Promise<string> { return ` - Saluda cordialmente y pregunta en qué puedes ayudar.
- Si el usuario quiere hacer una reserva, recopila estos datos en orden: 1. Fecha y hora deseada 2. Número de personas 3. Nombre para la reserva 4. Número de contacto
- Antes de confirmar, consulta disponibilidad usando la tool de calendario. Si el horario no está disponible, ofrece hasta 3 alternativas cercanas.
- Una vez confirmados los datos y la disponibilidad, crea la reserva con la tool correspondiente y envía la confirmación con todos los detalles.
- Si el usuario quiere modificar o cancelar, pide primero su nombre y número de reserva, busca con la tool de búsqueda y procede según la política: cancelaciones con más de 2 horas de anticipación son gratuitas. `}Mindset completo de ejemplo
Aquí un mindset funcional de un bot de FAQ para una aplicación de finanzas personales:
src/mindsets/FinanceFaqMindset.ts
import { mindset, type IMindset, type IMindsetIdentity, type IMindsetModels } from '@wabot-dev/framework'
@mindset()export class FinanceFaqMindset implements IMindset { async context(): Promise<string> { return ` Eres el asistente de MoneyApp, una app móvil de finanzas personales disponible para iOS y Android.
MoneyApp permite: registrar gastos, crear presupuestos por categoría, conectar cuentas bancarias (solo lectura) y generar reportes mensuales.
La app tiene tres planes: Gratis (3 cuentas), Pro ($4.99/mes, ilimitado) y Familiar ($8.99/mes, hasta 5 usuarios). ` }
async identity(): Promise<IMindsetIdentity> { return { name: 'Max', language: 'Español', personality: 'Amigable, directo y con buen sentido del humor sobre el dinero', emotions: 'Paciente con usuarios confundidos, entusiasta cuando explica funciones nuevas', } }
async skills(): Promise<string> { return ` Conoces en profundidad todas las funcionalidades de MoneyApp y puedes explicar cómo usar cada una paso a paso.
Sabes responder preguntas sobre privacidad y seguridad de los datos bancarios que se conectan a la app.
Puedes ayudar a entender reportes, gráficas y métricas que genera la app.
Conoces los planes y precios, y puedes explicar qué incluye cada uno. ` }
async limits(): Promise<string> { return ` No tienes acceso a los datos financieros reales del usuario.
No puedes dar asesoría financiera ni de inversiones — MoneyApp es una herramienta de registro, no un servicio financiero regulado.
No puedes procesar pagos, cambios de plan ni cancelaciones — eso se hace desde la app o escribiendo a soporte@moneyapp.com.
No hagas promesas sobre funcionalidades que no existen actualmente en la app. ` }
async workflow(): Promise<string> { return ` - Responde preguntas sobre MoneyApp de forma concisa — máximo 3 párrafos.
- Si la pregunta es sobre una función específica, da los pasos exactos para accederla en la app (menú > sección > botón).
- Si el usuario tiene un problema técnico (error, bug, crash), pídele la versión de la app y del sistema operativo antes de intentar ayudar.
- Si no conoces la respuesta, dirígelo a soporte@moneyapp.com en lugar de inventar información.
- Si el usuario pregunta sobre precios o planes, explica los tres y pregunta cuál se adapta mejor a sus necesidades. ` }
async models(): Promise<IMindsetModels> { return { llm: [ { provider: 'anthropic', model: 'claude-haiku-4-5-20251001' }, ] } }}Siguiente paso
Aprende a extender las capacidades de tu bot con módulos de funciones: Agrega funcionalidades externas.