Skip to content

Referencia: Módulos de Mindset

@mindsetModule(config?)

Decorador de clase. Marca una clase como módulo de funciones invocables por el LLM.

import { mindsetModule } from '@wabot-dev/framework'
OpciónTipoDescripción
language?stringIdioma de las descripciones internas del módulo.
@mindsetModule()
export class ReservasModule { }

La clase se vuelve inyectable automáticamente. Puede recibir dependencias vía constructor (repositorios, servicios, Chat, etc.).


@description(texto)

Decorador de método o propiedad. Registra metadatos que el LLM usa para decidir cuándo llamar la función y qué datos extraer de la conversación.

import { description } from '@wabot-dev/framework'

En métodos del módulo — describe cuándo invocar la función:

@mindsetModule()
export class ReservasModule {
@description(`
Crea una reserva cuando el usuario proporciona fecha, hora y número de personas.
Llamar solo después de confirmar disponibilidad.
`)
async crearReserva(req: CrearReservaReq) {
// implementación
}
}

En propiedades de la clase request — describe qué dato debe extraer el LLM de la conversación:

export class CrearReservaReq {
@isString()
@isNotEmpty()
@description('Fecha de la reserva en formato YYYY-MM-DD extraída de la conversación.')
fecha: string = ''
}

Clases de request

Cada método del módulo puede recibir cero o un parámetro (la clase request). El framework valida los datos recibidos del LLM antes de invocar el método.

Reglas:

  • Cada propiedad debe tener exactamente un decorador de tipo (@isString, @isNumber, @isBoolean, @isDate, @isArray, @isModel).
  • Cada propiedad debe tener @description().
  • Las propiedades deben tener valor por defecto (= '', = 0, = false, etc.).
  • Si una propiedad puede ser omitida por el LLM, agrega @isOptional().
import { description, isString, isNumber, isBoolean, isDate, isOptional, isNotEmpty, min, max, isIn } from '@wabot-dev/framework'
export class CrearReservaReq {
@isString()
@isNotEmpty()
@description('Fecha en formato YYYY-MM-DD.')
fecha: string = ''
@isString()
@isNotEmpty()
@description("Hora en formato HH:MM (24h), ej: '20:00'.")
hora: string = ''
@isNumber()
@min(1)
@max(20)
@description('Número de personas para la reserva.')
personas: number = 1
@isString()
@isOptional()
@description('Ocasión especial si el usuario la mencionó: cumpleaños, aniversario, etc.')
ocasion: string = ''
@isBoolean()
@isOptional()
@description('true si el usuario solicitó mesa exterior.')
exterior: boolean = false
}

Registrar módulos en un mindset

Los módulos se declaran en el decorador @mindset():

import { mindset, Mindset } from '@wabot-dev/framework'
import { ReservasModule } from '@/modules/ReservasModule'
import { MenuModule } from '@/modules/MenuModule'
@mindset({ modules: [ReservasModule, MenuModule] })
export class RestauranteMindset extends Mindset implements IMindset { }

Valor de retorno de las funciones

Las funciones del módulo pueden retornar cualquier valor serializable. El LLM recibe el resultado como JSON para continuar la conversación.

@description('Busca disponibilidad para una fecha y hora.')
async verificarDisponibilidad(req: VerificarReq) {
const disponible = await this.repo.checkSlot(req.fecha, req.hora)
return {
disponible,
alternativas: disponible ? [] : await this.repo.getAlternatives(req.fecha),
}
// El LLM recibe: { disponible: false, alternativas: ['19:00', '21:30'] }
}

Si la función lanza un error, el LLM recibe el mensaje del error y puede informar al usuario.