Cómo migrar tu bot a la versión 3 de Microsoft Bot Framework

Recientemente se ha liberado la nueva versión de Microsoft Bot Framework, la cual viene con un montón de mejoras, muchas de ellas basadas en el feedback de los desarrolladores, que han estado jugando con la plataforma estos últimos meses. Para revisar todo lo que se ha cambiado y se ha incluido puedes echar un vistazo a este enlace.

En este post, quiero mostrarte de forma rápida como pasar de la versión 1 a la 3 con un ejemplo súper sencillo donde se ve qué piezas deben cambiarse por otras de forma rápida.

Antes de nada, si ya tenías tu bot registrado en la plataforma debes actualizar el mismo a través de la sección Edit.

Botv1 - Edit
Botv1 – Edit

En el apartado Configuration aparece una sección para la Version 3 que te permite actualizar el registro.

MS Bot Fw - Configuration - Version 1.0 and 3.0
MS Bot Fw – Configuration – Version 1.0 and 3.0

Cambiar a la versión 3.0 es bastante sencillo. Como Messaging endpoint debes añadir el mismo que añadiste en el apartado 1.0 y el Microsoft App ID puede que ya te aparezca si ya habías enlazado tu bot con el canal Skype. De no ser así, a través del botón que aparece justo debajo podrás generar este ID y su correspondiente password.

Una vez hecho esto, vamos a ver cuáles son los cambios en tu código:

var restify = require('restify'),
    builder = require('botbuilder'),
    // v1 - LUIS dialog = new builder.LuisDialog('LUIS_MODEL_URL');

    recognizer = new builder.LuisRecognizer('LUIS_MODEL_URL'), //v3
    intents = new builder.IntentDialog({ recognizers: [recognizer] }); //v3

//v1
// var bot = new builder.BotConnectorBot({
//     appId: 'appId',
//     appSecret: 'appSecret'
// });

//v3
var connector = new builder.ChatConnector({
    appId: 'appId',
    appPassword: 'appPassword'
});

var bot = new builder.UniversalBot(connector); //v3

// v1 - bot.add('/', dialog);
bot.dialog('/', intents); // v3

// v1
// dialog.on('Greetings', function (session, args, next) {
//     session.send('Hello World!');
//     console.log(args);
// });

// dialog.onDefault(function (session, args, next) {
//     session.send('onDefault');
//     console.log(args);
// });

intents.matches('Greetings', function (session, args, next) { //v3
    session.send('Hello World!');    
});

intents.onDefault(function (session, args, next) { //v3
    session.send('onDefault');
    console.log(args);
});

intents.onBegin(function (session, args, next) { //v3
    session.send('onBegin');
    console.log(args);
});


var server = restify.createServer();

// v1 - server.post('/api/messages', bot.listen());

server.post('/api/messages', connector.listen()); //v3

server.listen(process.env.port || 9080, function () {
    console.log('server up and running');
});
  1. La forma de instanciar tu modelo de LUIS cambia de LuisDialog a dos objetos: LuisRecognizer que se encarga de instanciar un modelo de LUIS, lo cual significa que ahora puedes tener diferentes modelos asociados a tu bot, e IntentDialog que se encarga de generar el diálogo con todos los modelos de LUIS que tengas.
  2. BotConnectorBot se reemplaza por ChatConnector y ConsoleConnector, en el caso de que quieras hablar con tu bot a través de la consola. Estas clases no generan el bot como tal, como ocurría con BotConnectorBot, sino que desacopla el conector del bot en sí, pudiendo ser intercambiable de una forma más sencilla. El bot se genera a través de builder.UniversalBot que recibe el conector elegido como parámetro.
  3. bot.add ya no se utiliza como mecanismo de asociación de dialogos al bot. A partir de ahora debes utilizar bot.dialog al que se le asigna la variable intents que tiene asociado todos los modelos de LUIS.
  4. dialog.on  se sustituye por intents.matches que es el objeto que contiene todos los modelos y es capaz de reconocer la intención del usuario.
  5. En el método server.post ya no utilizamos bot.listen para permanecer a la escucha sino que utilizamos connector.listen.

La versión de botbuilder en el momento de escribir este post es la 3.1.1

¡Saludos!