Partager via


Implémenter une messagerie asynchrone et proactive dans des agents de moteur personnalisés

Cet article explique comment implémenter des modèles de messagerie asynchrone et proactive dans les agents de moteur personnalisé que vous créez avec le Microsoft Bot Framework. Ces modèles permettent à vos agents de répondre aux utilisateurs après un délai ou sans message initié par l’utilisateur.

Vous pouvez utiliser la messagerie asynchrone et proactive pour permettre à vos agents de moteur personnalisé d’effectuer les opérations suivantes :

  • Répondez après un délai tout en continuant le traitement en arrière-plan.
  • Lancer des messages sans intervention de l’utilisateur (par exemple, les mises à jour déclenchées par le système).

Chaque requête utilisateur doit recevoir une réponse initiale dans les 15 secondes. Pour les tâches de longue durée, les agents peuvent envoyer des messages de suivi. Un délai d’expiration de 45 secondes s’applique entre les mises à jour de diffusion en continu.

Messages asynchrones

Les messages asynchrones sont envoyés une fois que l’agent a terminé une tâche en arrière-plan lancée par l’utilisateur. Ce modèle est utile pour les scénarios tels que le suivi des commandes ou les mises à jour status.

Par exemple, si un utilisateur commande un ordinateur portable, votre agent peut confirmer la demande et envoyer ultérieurement un message de suivi à l’utilisateur lorsque la commande est passée. L’exemple suivant montre comment utiliser Bot Framework pour envoyer un message asynchrone concernant la commande des ordinateurs portables.

app.message( 

    CustomMessageTypes.orderLaptopSelected.toString(), 
    async (context: TurnContext, _state) => { 
      return new Promise(async (resolve) => { 
        await context.sendActivity({ 
          text: "Thank you for order laptop. I will keep you posted with updates.", 
        });   

        setTimeout(async () => { 
          await context.sendActivity({ 
            text: "Great! I have successfully placed your order #1292. I'll notify you when it's delivered.", 
            attachments: [ 
              { 
                contentType: "application/vnd.microsoft.card.adaptive", 
                content: deliveredCard, 
              }, 
            ], 
          }); 
          resolve(); 
        }, 10 * 1000); 
      }); 
    } 
  ); 

Le tableau suivant récapitule le processus de message asynchrone.

Tâche Description
✅ Confirmation initiale Envoyez un message pour accuser réception de la demande.
✅ Traitement en arrière-plan Effectuez la tâche de manière asynchrone.
✅ Message de suivi Informez l’utilisateur lorsque la tâche est terminée.

Messages proactifs

Les messages proactifs sont initiés par le système, et non par l’utilisateur. Ces messages sont envoyés via un thread de conversation dédié.

Par exemple, votre agent peut envoyer une notification à un utilisateur concernant un événement ou une mise à jour sans requête utilisateur. L’exemple suivant montre comment utiliser l’API createConversation pour extraire les informations de conversation et envoyer des messages proactifs via un thread dédié.

export async function getToken() { 
  const url = 
    "https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token"; 
  const params = new URLSearchParams(); 
  params.append("grant_type", "client_credentials"); 
  params.append("client_id", config.MicrosoftAppId); 
  params.append("client_secret", config.MicrosoftAppPassword); 
  params.append("scope", "https://api.botframework.com/.default"); 

  const response = await fetch(url, { 
    method: "POST", 
    headers: { 
      "Content-Type": "application/x-www-form-urlencoded", 
    }, 
    body: params.toString(), 
  }); 

  if (!response.ok) { 
    throw new Error(`Error! status: ${response.status}`); 
  }

  const data = await response.json(); 
  return data; 
} 
  
  let accessToken; 
    try { 
      accessToken = getToken(); 
      if (!accessToken) { 
        console.log("No access token found, fetching a new one"); 
        const tokenResponse = await getToken(); 
        accessToken = tokenResponse.access_token; 
        if (!accessToken) { 
          throw new Error("Failed to obtain access token"); 
        } 
        setAccessToken(accessToken); 
      } 
    } catch (error) { 
      console.error("Error retrieving access token:", error); 
      await context.sendActivity( 
        "Failed to send proactive message due to authentication error" 
      ); 
      return; 
    }  

    const createConversationBody = { 
      members: [{ id: context.activity.from.aadObjectId }], 
      tenantId: context.activity.conversation.tenantId, 
      channelData: { 
        productContext: "Copilot", 
        conversation: { 
          conversationSubType: "AgentProactive", 
        }, 
      }, 
    }; 

    const createConversationResponse = await fetch( 
      "https://canary.botapi.skype.com/teams/v3/conversations", 
      { 
        method: "POST", 
        headers: { 
          "Content-Type": "application/json", 
          Authorization: `Bearer ${accessToken}`, 
        }, 
        body: JSON.stringify(createConversationBody), 
      } 
    );  

    const createConversationResponseData = 
      await createConversationResponse.json(); 
    console.log("Create conversation response", createConversationResponseData); 
    const body = { 
      text: "Hello proactive world", 
      type: "message", 
    }; 

    const response = await fetch( 
      `https://canary.botapi.skype.com/teams/v3/conversations/${createConversationResponseData.id}/activities`, 
      { 
        method: "POST", 
        headers: { 
          "Content-Type": "application/json", 
          Authorization: `Bearer ${accessToken}`, 
        }, 
        body: JSON.stringify(body), 
      } 
    ); 

Le tableau suivant récapitule le processus de message proactif.

Tâche Description
✅ Acquérir un jeton Utilisez OAuth2 pour vous authentifier.
✅ Créer une conversation Utilisez l’API Bot Framework pour lancer une conversation.
✅ Envoyer un message Publiez un message dans la conversation.