Resumen General
El sistema se basa en tres componentes principales:
1. Detección de Intención
Analiza cada mensaje del usuario con OpenAI para determinar si existe una intención de registro, modificación, cancelación o consulta.
es_registro confidence2. Gestión de Estado
Mantiene el contexto de la conversación a través de variables persistentes que controlan el flujo activo.
captura_en_progreso lead_pendiente_confirmacion3. Clasificación de Flujo
Determina el tipo de proceso basándose en las instrucciones personalizadas (b_template) y el contexto de la conversación.
flow_type specialized_flowVariables de Estado
Variables que controlan el comportamiento del chatbot y determinan el flujo activo:
BooleanValores:
true- Usuario quiere registrar informaciónfalse- Consulta normal o conversación
StringValores posibles:
lead_capture- Captura de datos en progresofacturacion- Proceso de facturacióncotizacion- Proceso de cotizaciónlead_confirmed- Registro confirmadogeneric- Flujo genérico
BooleanDetección: Analiza el b_template con OpenAI buscando:
- Menciones de "FACTURACIÓN", "INVOICE", "Sales_Header"
- Menciones de "COTIZACIÓN", "QUOTE"
- Queries SQL específicas
BooleanComportamiento:
- Activa cuando
es_registro = true - Desactiva detección de confirmaciones
- Fuerza interpretación como datos de captura
BooleanEstados siguientes:
- Confirmación →
lead_confirmed - Corrección →
lead_correction - Cancelación → Limpia estado
BooleanEfecto:
- Previene reactivación del flujo de captura
- Permite nuevos registros solo si usuario inicia explícitamente
- Guarda
last_created_idpara referencias futuras
BooleanActivado por:
- API Integration detecta necesidad de datos
- Detección de confirmación de contacto
- Comandos explícitos de "actualizar" o "registrar"
StringValores:
create- Crear nuevo registro (default)update- Modificar registro existentedelete- Eliminar registroread- Consultar registro
Tipos de Flujo (flow_type)
Clasificación detallada de todos los estados de flujo que el sistema puede retornar:
Flujos de Captura
lead_capture_initiated
Cuándo: API Integration detecta intención de modificar/actualizar pero faltan datos necesarios.
Comportamiento: Activa forzar_captura_leads = true para el siguiente mensaje.
{
"flow_type": "lead_capture_initiated",
"metadata": {
"api_target": "api_cotizaciones",
"operation": "update",
"resource_id": "123"
}
}
lead_capture
Cuándo: Bot está solicitando campos de forma secuencial. Todavía faltan campos obligatorios.
Variable de control: captura_en_progreso = true
{
"flow_type": "lead_capture",
"metadata": {
"datos_capturados": {"nombre": "Juan", "email": "juan@email.com"},
"campos_faltantes": ["telefono", "empresa"]
}
}
lead_validation_error
Cuándo: Usuario confirmó pero los datos no pasan la validación de la API.
Comportamiento: Limpia estado de confirmación, solicita corrección de campos específicos.
{
"flow_type": "lead_validation_error",
"metadata": {
"validation_errors": [
{"field": "email", "error": "Formato inválido"},
{"field": "telefono", "error": "Debe contener 8 dígitos"}
]
}
}
lead_validation_error_pre_confirmation
Cuándo: Validación falla ANTES de mostrar confirmación (durante captura).
Comportamiento: Mantiene captura_en_progreso = true, solicita corrección inmediata.
{
"flow_type": "lead_validation_error_pre_confirmation",
"metadata": {
"validation_errors": [{"field": "email", "error": "Email ya existe"}]
}
}
Flujos de Confirmación
lead_confirmation_request
Cuándo: Todos los campos obligatorios fueron capturados. Bot solicita confirmación al usuario.
Variable de control: lead_pendiente_confirmacion = true
{
"flow_type": "lead_confirmation_request",
"metadata": {
"datos_capturados": {
"nombre": "Juan Pérez",
"email": "juan@email.com",
"telefono": "62141994",
"empresa": "TechCorp"
},
"pendiente_confirmacion": true
}
}
lead_confirmed
Cuándo: Usuario confirmó los datos y el registro fue exitoso (BD local + API externa).
Estado final: registro_completado = true
{
"flow_type": "lead_confirmed",
"metadata": {
"registered_id": "CTZ-2024-001",
"api_response": "success",
"resource_type": "cotizacion"
}
}
lead_correction
Cuándo: Usuario solicitó corregir datos después de la confirmación.
Comportamiento: Mantiene lead_pendiente_confirmacion = true, permite corrección de campos.
{
"flow_type": "lead_correction",
"metadata": {
"datos_anteriores": {...},
"campo_a_corregir": "telefono"
}
}
Flujos de Error
lead_api_error
Cuándo: La API externa retornó un error controlado (400, 404, 422, etc.).
Comportamiento: Muestra error al usuario, NO limpia estado (permite retry).
{
"flow_type": "lead_api_error",
"metadata": {
"api_error": "Customer not found",
"status_code": 404,
"api_name": "api_cotizaciones"
}
}
lead_api_exception
Cuándo: Excepción no controlada al llamar la API (timeout, connection error, etc.).
Comportamiento: Muestra error genérico, mantiene datos en estado para retry.
{
"flow_type": "lead_api_exception",
"metadata": {
"exception": "Connection timeout",
"api_name": "api_cotizaciones"
}
}
Flujos Especializados
Detección de Flujo Especializado
El análisis se realiza en detectar_intencion_registro() cuando b_template tiene más de 200 caracteres:
// Prompt de análisis enviado a OpenAI
Analiza estas instrucciones personalizadas (B_TEMPLATE) y determina:
1. ¿Definen un flujo de negocio ESPECIALIZADO?
2. ¿O es un flujo GENÉRICO de captura de leads?
CRITERIOS:
- Si menciona "FACTURACIÓN", "INVOICE", "Sales_Header", SQL queries → specialized (facturacion)
- Si menciona "COTIZACIÓN", "QUOTE", SQL de cotizaciones → specialized (cotizacion)
- Si solo pide nombre/email/teléfono sin proceso específico → generic (lead_capture)
Respuesta JSON:
{
"is_specialized_flow": true/false,
"flow_type": "facturacion|cotizacion|orden|lead_capture|generic",
"confidence": 0.0-1.0,
"reasoning": "Explicación"
}
Ejemplo: Flujo de Facturación
Configuración
es_registro = FALSE
flow_type = "facturacion"
specialized_flow = TRUE
confidence = 0.95
¿Por qué es_registro = FALSE?
Porque el análisis inteligente detectó que NO es un flujo genérico de lead capture. El b_template define un proceso especializado de facturación que requiere:
- Inserción directa en base de datos MySQL
- Múltiples tablas (Sales_Header, Sales_Lines)
- Lógica de negocio específica (auto-generación de IDs, cálculos, etc.)
- NO usar APIs externas de leads
Comportamiento del Sistema
Cuando specialized_flow = true y flow_type = "facturacion":
- El sistema NO activa lead_capture tradicional
- Delega extracción de datos a instrucciones del b_template
- Cuando usuario confirma → llama
database_service.execute_database_operations() - DatabaseService ejecuta INSERT directo en BD usando instrucciones IA
- Retorna
flow_type = "facturacion"en metadata
Ejemplo: Flujo de Cotización
Configuración
es_registro = TRUE
flow_type = "lead_capture"
specialized_flow = FALSE
confidence = 0.85
¿Por qué es_registro = TRUE?
Porque las cotizaciones usan el flujo genérico de lead capture con validación de API externa. No requiere INSERT directo en BD.
Comparación: Facturación vs Cotización
| Característica | Facturación | Cotización |
|---|---|---|
| es_registro | FALSE |
TRUE |
| specialized_flow | TRUE |
FALSE |
| flow_type | "facturacion" |
"lead_capture" |
| Destino de datos | INSERT directo MySQL | POST a API REST |
| Validación | Lógica en DatabaseService | Schema de API config |
| Control de captura | Instrucciones en b_template | api_config fields + capture_order |
Ciclo de Vida Completo
Flujo Normal (Lead Capture)
registro_completado = TRUE
Flujo Especializado (Facturación)
flow_type = "facturacion"
invoice_created = TRUE
Ejemplos Prácticos
Ejemplo 1: Cotización Normal
Ejemplo 2: Facturación (Flujo Especializado)
Ejemplo 3: Corrección de Datos
Ejemplo 4: Validación con Error
Ejemplo 5: Cancelación de Proceso
Tabla Resumen de Estados
| flow_type | es_registro | specialized_flow | Descripción |
|---|---|---|---|
lead_capture |
TRUE |
FALSE |
Captura genérica en progreso |
lead_confirmation_request |
TRUE |
FALSE |
Esperando confirmación del usuario |
lead_confirmed |
TRUE |
FALSE/TRUE |
Registro completado exitosamente |
lead_correction |
TRUE |
FALSE |
Usuario corrigiendo datos |
lead_validation_error |
TRUE |
FALSE |
Error de validación post-confirmación |
lead_api_error |
TRUE |
FALSE |
Error de API externa |
facturacion |
FALSE |
TRUE |
Flujo especializado de facturación |
cotizacion |
FALSE/TRUE |
TRUE/FALSE |
Depende si usa API o INSERT directo |
generic |
FALSE |
FALSE |
Flujo normal sin especialización |
Decisiones Inteligentes del Sistema
1. Análisis de B_Template
Antes de activar lead capture, el sistema analiza el b_template con OpenAI para determinar si es un flujo especializado.
- Confianza >= 0.7 → Marca
specialized_flow = TRUE - Retorna inmediatamente
es_registro = FALSE - Evita activar lead capture genérico innecesariamente
2. Persistencia de Contexto
El sistema mantiene contexto entre mensajes usando el estado persistent:
lead_operation_type- Tipo de operación CRUDlead_api_config_name- API seleccionadaupdate_resource_id- ID del recurso a modificarcampos_capturados- Datos ya capturados
3. Prevención de Bucles
Para evitar reactivación infinita de flujos:
- No reinicia captura si
registro_completado = TRUE - Limpia
forzar_captura_leadsdespués de usar - Respeta
pendiente_confirmacionpara no re-detectar operaciones
4. Auto-Recuperación de Errores
En caso de fallos, el sistema mantiene el estado para permitir retry:
- API error → Mantiene
lead_datos_temporales - Validación error → Mantiene
captura_en_progreso - Usuario puede corregir sin reiniciar desde cero