Porter un Slack Bolt pour l’application JavaScript vers Teams

Ce guide vous aidera à porter sur Teams un boulon de mou existant pour une application JavaScript.

Introduction

Semblable à Slack Bolt, le SDK Teams est conçu pour s’interfacer avec les API principales de Teams pour la création d’applications conversationnelles. Les deux SDK fournissent des abstractions pour gérer les événements entrants, les messages et les interactions, ainsi que pour renvoyer des réponses aux utilisateurs. Si vous disposez déjà d’un bot Slack, les concepts doivent vous sembler familiers.

Il existe toutefois quelques différences essentielles, telles que l’installation d’applications. Dans Slack, les applications sont installées dans les espaces de travail via OAuth, tandis que dans Teams, elles sont installées via l’App Store Teams. En outre, les applications Teams peuvent être installées personnellement par des utilisateurs individuels ou dans des étendues collaboratives telles que des conversations de groupe, des canaux et des réunions.

Examinons quelques similitudes et différences entre les concepts de Slack et de Teams :

Concept Teams Slack
Installation Installé via le magasin d’applications sur une base par étendue Installé via OAuth vers Workspace
Démarrage rapide Nouveaux projets créés via l’interface de ligne de commande du développeur Teams Nouveaux projets créés via l’interface de ligne de commande Slack.
Manifeste d'application Créez et inscrivez un agent et son manifeste d’application avec l’interface de ligne de commande Teams pour les développeurs. Créé via JSON, YAML ou une page de gestion des applications.
Point de terminaison de messagerie Définir dans le portail Développeur Teams configuration du bot ou la ressource Azure AI Bot Service. Défini dans le manifeste de l’application Slack.
Authentification d’application L’inscription de l’application Entra est autorisée lors de l’installation de l’application Teams. Le SDK Teams récupère le jeton d’application Entra en interne lors de l’envoi de messages. Les fonctionnalités principales de l’application, comme la messagerie, utilisent ce type d’authentification en interne dans le Kit de développement logiciel (SDK). L’application stocke le jeton de bot Slack une fois que l’utilisateur autorise les étendues déléguées par l’application (par exemple,incoming-webhook,commands). Les fonctionnalités principales de l’application, comme la messagerie, utilisent ce type d’authentification en interne dans le Kit de développement logiciel (SDK).
Authentification utilisateur pour les API REST Les jetons User Entra peuvent être obtenus à l’aide de l’authentification unique Teams. Les API REST Graph sont intégrées au SDK Teams. Les jetons sont stockés et actualisés par le service de jeton Azure Bot. Les jetons de marge utilisateur peuvent être obtenus à l’aide d’OAuth 2.0. Les API REST de Slack sont intégrées à Slack Bolt. Les jetons doivent être stockés et actualisés par l’application.
Authentification auprès de services externes Obtenez des jetons d’accès utilisateur pour des services externes à l’aide d’OAuth 2.0. Les jetons sont stockés et actualisés par le service de jeton Azure Bot. Les utilisateurs s’authentifient auprès de services externes à l’aide d’OAuth 2.0, peut-être via la liaison de compte (voir ci-dessous). Les jetons doivent être stockés et actualisés par l’application.
Association de comptes Activity event include Activity.from.id, qui est l’ID d’objet AAD de l’utilisateur. Si vous authentifiez votre service externe avec OAuth 2.0, ces comptes sont implicitement liés via le service de jeton Azure, mais vous pouvez également suivre un flux similaire à celui recommandé par Slack. Slack vous recommande de suivre leur guide Liaison de comptes entre services .
Cartes Éléments d’interface utilisateur enrichis dans les messages à l’aide de cartes adaptatives. Éléments d’interface utilisateur enrichis dans les messages à l’aide de Block Kit.
Files Les Files peuvent être joints ou téléchargés à l’aide des API Graph SharePoint/OneDrive. Les Files peuvent être joints ou téléchargés via les API de fichiers de Slack.
Messages privés dans les conversations de groupe Messages ciblés Messages éphémères.
Commandes Slash Commandes Slash, déclarées dans le manifeste de l’application et rendues détectables via un menu de saisie semi-automatique. Les commandes peuvent être envoyées en tant que messages ciblés privés ou visibles par tous les utilisateurs dans une conversation via @mention. Les commandes sont envoyées sous forme de messages : écoutez les commandes avec un app.message gestionnaire, via app.message('/command') ou app.message(regexp). Slack Bolt dispose d’un gestionnaire dédié app.command pour les commandes dans le manifeste de l’application Slack. Les commandes de barre oblique ne sont pas affichées aux autres utilisateurs dans des contextes de collaboration.
Flux de travail Teams s’intègre à Power Automate pour les flux de travail. Les flux de travail ne sont pas un composant du SDK Teams. Les flux de travail Slack sont intégrés à Slack Bolt.
Boîtes de dialogue de l’interface utilisateur Les cartes adaptatives peuvent inclure des actions qui ouvrent des boîtes de dialogue d’interface utilisateur avec un site web intégré ou une autre carte adaptative. Les boîtes de dialogue doivent être ouvertes via une action de carte adaptative et ne peuvent donc pas être ouvertes directement via une commande barre oblique. Les modales de l’interface utilisateur du kit de blocs peuvent être ouvertes par le biais de commandes slash (à l’aide de) ou d’actions client.views.opende kit de blocage.
Stratégie IA Teams dispose de fonctionnalités natives IA uniques pour des éléments tels que les commentaires des utilisateurs, les étiquettes générées par l’IA, les suggestions d’invite, la diffusion en continu et les citations. Nous proposons également un cours facultatif ChatPrompt pour simplifier l’intégration des LLM dans votre bot. Tirez parti de la recherche ancrée via le API Graph de récupération Microsoft 365 Copilot. Les fonctionnalités d’IA sont généralement conçues pour être utilisées dans n’importe quel type de conversation. Slack dispose d’une classe dédiée Assistant aux interactions d’IA dans une vue dédiée du panneau latéral de l’agent, ce qui diffère de la stratégie de Teams qui consiste à utiliser des modèles d’interaction de bot existants. Peut toujours utiliser l’IA dans d’autres types de conversation à l’aide des API de bot standard. Peut utiliser l’API d’accès aux données Slack pour la recherche ancrée .
Commentaires des utilisateurs d’IA Les boutons de commentaires des utilisateurs sont rendus nativement dans Teams avec des API dédiées pour la gestion des commentaires. Une fois que l’utilisateur a donné des commentaires positifs ou négatifs, un modal est ouvert dans lequel des informations supplémentaires (par exemple, une réponse en texte brut) peuvent être capturées. Slack utilise un type d’élément de kit de blocs dédié feedback_buttons pour app.action('feedback') joindre les commentaires des utilisateurs (positifs ou négatifs) aux messages.

Inscrire un agent Teams

Tout d’abord, suivez le guide de démarrage rapide pour inscrire un nouvel agent Teams, afin de pouvoir l’utiliser à partir de Teams dès que vous avez ajouté l’implémentation du Kit de développement logiciel (SDK) Teams à votre application existante.

Installer le SDK Teams

Installez le Kit de développement logiciel (SDK) Teams dans votre projet Slack Bolt :

npm install @microsoft/teams.apps

Copier la configuration de l’authentification

Copiez les paramètres du fichier créé par l’interface de ligne de .env commande du développeur Teams dans l’application de démarrage rapide vers votre implémentation Slack Bolt. Ces paramètres sont des informations d’identification permettant d’authentifier une application SDK Teams afin qu’elle puisse communiquer avec Teams.

Initialiser le runtime

Ajoutez ou remplacez du code dans votre implémentation pour démarrer le runtime d’application du kit de développement logiciel (SDK) Teams à l’aide de la App classe. C’est l’équivalent de la classe de App Slack Bolt.

import { App } from '@microsoft/teams.apps';

const app = new App();

app.start(process.env.PORT || 3978).catch(console.error);

Ajouter des gestionnaires de messages

Dans Slack, il existe des gestionnaires de messages pour les événements avec différents sous-types (par exemple, un sous-type non défini est un message normal, event.subtype == 'file_share' est un message de partage de fichiers, etc.). Dans Teams, il existe différents Activity gestionnaires pour différents types d’événements qui sont énumérés via l’énumération ActivityTypes (par exemple, app.activity(ActivityTypes.Message)), certains Activity types ayant des API adaptées dans le SDK (par exemple, app.message). Ces concepts sont à peu près similaires, bien que les conventions de nommage et la syntaxe diffèrent.

// triggers when user sends "hi" or "@bot hi"
app.message("hi", async ({ send, activity }) => {
    await send(`Hello, ${activity.from.name}!`);
});
// listen for ANY message to be received
app.on('message', async ({ send, activity }) => {
    // echo back users request
    await send(`you said: ${activity.text}`);
});

Convertir l’utilisation du kit de blocs en cartes adaptatives

Pour inclure une interface utilisateur enrichie dans les messages envoyés par votre agent, les cartes adaptatives de Teams sont équivalentes au kit de blocage de Slack.

import { Card, TextBlock } from '@microsoft/teams.cards';

app.message('/card', async ({ send }) => {
    await send(
        new Card(new TextBlock('Hello, world!', { wrap: true, isSubtle: false }))
            .withOptions({
                width: 'Full',
            })
    );
});

Implémenter l’authentification utilisateur

Il existe deux principaux types d’authentification utilisateur pour Teams et Slack : l’authentification pour les API REST Slack & Graph et l’authentification pour les services externes. Jetons un coup d’œil à chacun d’entre eux tour à tour.

API REST déléguées par l’utilisateur

Dans Slack, si vous souhaitez utiliser des API REST de Slack qui nécessitent des étendues déléguées par l’utilisateur, vous devez implémenter un flux d’installation OAuth 2.0 dans votre application pour obtenir et stocker des jetons utilisateur Slack, même si l’application a déjà été installée par un autre utilisateur. Dans Teams, vous pouvez tirer parti de l’authentification unique Teams pour obtenir des jetons utilisateur Entra pour appeler des API REST Graph. Le SDK Teams s’intègre à Teams SSO et à Azure Bot Token Service pour gérer automatiquement l’acquisition, le stockage et l’actualisation des jetons.

Tout d’abord, suivez les instructions du guide Authentification unique Teams. Ensuite, configurez l’authentification dans votre code.

const app = new App({
    // ... rest of App config
    oauth: {
        // The key here should match the OAuth Connection setting
        // defined in your Azure Bot resource.
        defaultConnectionName: 'graph',
    },
});

app.message('me', async ({ signin, userGraph, send }) => {
    if (!await signin()) {
        return;
    }
    const me = await userGraph.call(endpoints.me.get);
    await send(JSON.stringify(me));
});

Authentification utilisateur pour les services externes

Dans Slack, vous pouvez accéder à des services externes en implémentant un flux de liaison de compte à l’aide d’OAuth 2.0, comme indiqué ici. Dans Teams, vous pouvez accéder à des services externes en implémentant un flux OAuth 2.0, avec le service de jeton Bot Azure qui gère l’acquisition, le stockage et l’actualisation des jetons.

Tout d’abord, configurez vos paramètres de connexion OAuth 2.0 dans le portail Azure pour votre ressource Azure Bot.

Capture d’écran montrant les paramètres de connexion OAuth personnalisés d’Azure Bot.

Ensuite, ajoutez le code d’authentification à votre application pour obtenir le jeton utilisateur approprié et appeler votre service externe.

import
{ App } from '@microsoft/teams.apps';

const app = new App({
    // ... rest of App config
    oauth: {
        // The key here should match the OAuth Connection setting
        // defined in your Azure Bot resource.
        defaultConnectionName: 'custom',
    },
});

app.message('me', async ({ activity, signin, token, send }) => {
    // In production, it is probably better to implement a local cache.
    // (e.g. \`activity.from.id\` <-> token).
    // Otherwise this triggers an API call to Azure Token Service on every inbound message.
    if (!await signin()) {
        return;
    }

    // Call external API
    const response = await fetch('https://example.com/api/helloworld', {
        method: 'POST',
        headers: {
            "Authorization": token,
        },
    });
    const result = await response.json();
    await send(JSON.stringify(result));
});