false ]); exit; } // Obtener mensaje enviado desde JS // trim() elimina espacios innecesarios $mensaje = trim($_POST['mensaje'] ?? ''); // Validar mensaje vacío if (empty($mensaje)) { echo json_encode([ 'success' => false ]); exit; } // Limitar longitud máxima del mensaje para evitar abuso o consumo excesivo de tokens if (mb_strlen($mensaje) > 500) { echo json_encode([ 'success' => false, 'error' => 'La consulta es demasiado larga.' ]); exit; } // Inicializar historial del chat en sesión si aún no existe if (!isset($_SESSION['chat_historial'])) { $_SESSION['chat_historial'] = []; } // Detectar automáticamente el módulo relacionado con la consulta $modulo = detectarModulo($mensaje); // Cache estática para evitar leer archivos en cada consulta static $docsCache = []; // Cargar documentación general solamente una vez if (!isset($docsCache['general'])) { $docsCache['general'] = file_get_contents( __DIR__ . '/../docs/general.txt' ); } // Cargar documentación específica del módulo detectado if (!isset($docsCache[$modulo])) { $rutaModulo = __DIR__ . "/../docs/{$modulo}.txt"; // Verificar si existe el archivo if (file_exists($rutaModulo)) { $docsCache[$modulo] = file_get_contents($rutaModulo); } else { // Si no existe, guardar vacío $docsCache[$modulo] = ''; } } // Unir documentación general + documentación específica del módulo $contexto = $docsCache['general'] . "\n\n" . $docsCache[$modulo]; // Prompt del sistema // Define comportamiento y restricciones de la IA $systemPrompt = " Sos el asistente interno del sistema ByteCenter. Tu función es ayudar a operadores y administradores utilizando únicamente la documentación proporcionada. REGLAS IMPORTANTES: - Respondé únicamente usando información presente en la documentación. - No inventes funcionalidades, botones, módulos, pantallas, acciones, permisos ni procesos. - No asumas comportamientos típicos de otros sistemas. - Si el usuario consulta sobre una funcionalidad del sistema que no aparece documentada, indicá brevemente que no encontraste información específica sobre esa funcionalidad. - Nunca completes información faltante usando suposiciones. - Cuando exista un procedimiento documentado, explicalo paso a paso. - Utilizá exactamente los nombres de botones, módulos y acciones documentadas. - La documentación puede contener símbolos como: #, ##, ###, *, ** - Esos símbolos son únicamente separadores internos de títulos y subtítulos. - Nunca escribas esos símbolos en la respuesta. - Respondé siempre en texto plano. - No uses markdown. - No uses encabezados markdown. - No uses listas markdown. - Para enumerar pasos, utilizá solamente: 1. 2. 3. - Mantené respuestas claras, naturales y breves. EJEMPLOS DE RESPUESTAS INCORRECTAS: - 'Exportar clientes' - 'Venta rápida' - 'Dashboard' - 'Panel avanzado' - 'Modo express' - 'CSV' - 'Métricas automáticas' DOCUMENTACIÓN: $contexto "; // Recuperar últimos mensajes para mantener contexto conversacional $historial = array_slice( $_SESSION['chat_historial'], -10 ); // Array final enviado a la IA $messages = []; // Primer mensaje: prompt del sistema $messages[] = [ 'role' => 'system', 'content' => $systemPrompt ]; // Agregar historial previo foreach ($historial as $msg) { $messages[] = $msg; } // Agregar mensaje actual del usuario $messages[] = [ 'role' => 'user', 'content' => $mensaje ]; // Consultar API $resultado = consultarChatbot($messages); // Validar errores if (!$resultado['success']) { echo json_encode([ 'success' => false, 'error' => $resultado['error'] ]); exit; } // Obtener contenido de respuesta $respuesta = $resultado['content']; // Guardar mensaje usuario $_SESSION['chat_historial'][] = [ 'role' => 'user', 'content' => $mensaje ]; // Guardar respuesta IA $_SESSION['chat_historial'][] = [ 'role' => 'assistant', 'content' => $respuesta ]; // Limitar tamaño del historial para evitar exceso de tokens $_SESSION['chat_historial'] = array_slice( $_SESSION['chat_historial'], -20 ); // Respuesta final al frontend (JSON) echo json_encode([ 'success' => true, 'respuesta' => $respuesta ]); exit; } }