Diffuser les messages de l’agent en stream

Remarque

  • Les messages de l’agent de diffusion en continu sont pris en charge uniquement dans les conversations en tête-à-tête.
  • Teams ne prend en charge qu’une seule réponse de streaming simultanée par conversation à la fois.
  • La diffusion en continu est généralement disponible sur le web, les ordinateurs de bureau et les appareils mobiles.

Vous pouvez diffuser des messages d’agent pour transmettre les réponses d’un agent à l’utilisateur sous forme de petites mises à jour pendant que la réponse complète est générée pour améliorer l’expérience utilisateur. Souvent, les agents mettent beaucoup de temps à générer des réponses sans mettre à jour l’interface utilisateur, ce qui entraîne une expérience moins engageante.

Lorsque les utilisateurs observent l’agent traiter leur demande en temps réel, cela peut augmenter leur satisfaction et leur confiance. Cette réactivité et cette transparence perçues améliorent l’engagement des utilisateurs et réduisent l’abandon de conversation avec l’agent.

Expérience utilisateur des messages Stream

Les messages de l’agent de diffusion en continu ont deux types de mises à jour :

  • Mises à jour informatives : Les mises à jour informatives apparaissent dans la bulle de message diffusée en continu et informent l’utilisateur des actions en cours de l’agent pendant la génération d’une réponse. Ils text restent visibles jusqu’à ce que la prochaine mise à jour informative ou le contenu diffusé en continu le remplace.

    La capture d’écran montre les mises à jour informatives de la diffusion en continu des agents.

    Les messages informatifs ne doivent pas contenir plus de 1 ko ou 1 000 caractères.

  • Diffusion en continu de réponses : la diffusion en continu de réponses remplace la mise à jour informative et affiche la réponse de l’agent dans la bulle de message au fur et à mesure de sa génération.

    La capture d’écran montre la diffusion en continu des réponses des agents.

    • Bouton Arrêter : le bouton permet aux utilisateurs de contrôler les réponses de streaming en les arrêtant tôt. Il est disponible par défaut pendant la diffusion en continu, ce qui permet aux utilisateurs d’affiner les invites ou d’en envoyer de nouvelles. Comprendre le fonctionnement du bouton d’arrêt de la diffusion peut vous aider à concevoir des interfaces de conversation plus efficaces et plus conviviales.

    • Contenu en streaming : lors de la diffusion en continu, les messages de l’agent doivent contenir le contenu diffusé en continu précédent.

      Par exemple : Ceci est un exemple de réponse de streaming acceptable.
      Un brun
      Renard brun
      Renard brun saute par-dessus la clôture

      Non-exemple : Ceci est un exemple de réponse de streaming qui renverra une erreur.
      Un brun
      Bonjour

      Pour plus d’informations sur l’erreur, voir Codes d’erreur.

Implémenter la diffusion en continu avec le SDK Teams

Permet Stream.Update d’écrire des mises à jour informatives avant de commencer le flux de messages. Stream.Update peut être appelée plusieurs fois avec un texte de mise à jour différent.

Permet Stream.Emit d’écrire un morceau de contenu dans le flux. Les blocs seront affichés dans le message dès qu’ils seront reçus par Teams. Après le premier appel à , les mises à Stream.Emitjour informatives ne seront plus affichées et Stream.Update n’auront aucun effet.

app.OnMessage(async (context, cancellationToken) =>
{   
   context.Stream.Update("Testing");
   await Task.Delay(1000);
   context.Stream.Emit("hello");
   context.Stream.Emit(", ");
   context.Stream.Emit("world!");
});

Permet stream.update d’écrire des mises à jour informatives avant de commencer le flux de messages. stream.update peut être appelée plusieurs fois avec un texte de mise à jour différent.

Permet stream.emit d’écrire un morceau de contenu dans le flux. Les blocs seront affichés dans le message dès qu’ils seront reçus par Teams. Après le premier appel à , les mises à stream.emitjour informatives ne seront plus affichées et stream.update n’auront aucun effet.

app.on('message', async ({ activity, stream }) => {
  stream.update("Thinking...");
  await new Promise(resolve => setTimeout(resolve, 1000))  
  stream.emit('hello');
  stream.emit(', ');
  stream.emit('world!');

  // result message: "hello, world!"
});

Permet stream.update d’écrire des mises à jour informatives avant de commencer le flux de messages. stream.update peut être appelée plusieurs fois avec un texte de mise à jour différent.

Permet stream.emit d’écrire un morceau de contenu dans le flux. Les blocs seront affichés dans le message dès qu’ils seront reçus par Teams. Après le premier appel à , les mises à stream.emitjour informatives ne seront plus affichées et stream.update n’auront aucun effet.

@app.on_message
async def handle_message(ctx: ActivityContext[MessageActivity]):
    ctx.stream.update("Stream starting...")
    await asyncio.sleep(1)

    # Stream messages with delays using ctx.stream.emit
    for message in STREAM_MESSAGES:
        # Add some randomness to timing
        await asyncio.sleep(random())

        ctx.stream.emit(message)

Pour obtenir des conseils sur la mise en forme des messages diffusés avec Markdown étendu, y compris les fonctionnalités et la syntaxe prises en charge, consultez Mettre en forme les messages de votre agent.

Stream message via l’API REST

Les messages de l’agent peuvent être diffusés via l’API REST. Les messages de diffusion en continu prennent en charge le texte enrichi et la citation. La pièce jointe, l’étiquette AI, le bouton de commentaires et les étiquettes de confidentialité sont disponibles uniquement pour le message de diffusion en continu final. Pour plus d’informations, consultez les pièces jointes et lesmessages de l’agent avec du contenu généré par l’IA.

Lorsque votre agent appelle la diffusion en continu via l’API REST, veillez à appeler l’API de diffusion en continu suivante uniquement après avoir reçu une réponse réussie de l’appel d’API initial. Si votre agent utilise le SDK, vérifiez que vous recevez un objet de réponse null de la méthode d’activité d’envoi pour confirmer que l’appel précédent a été transmis avec succès.

Si votre agent appelle l’API de diffusion en continu trop rapidement, vous pouvez rencontrer des problèmes et l’expérience de diffusion en continu peut être interrompue. Nous vous recommandons que votre agent diffuse un message à la fois pour s’assurer qu’il appelle l’API de diffusion en continu à un rythme cohérent. Si ce n’est pas le cas, la demande peut être ralentie. Mettez en mémoire tampon les jetons du modèle pendant 1,5 à deux secondes pour garantir un processus de diffusion en continu fluide.

Voici les propriétés des messages de l’agent de diffusion en continu :

Propriété Obligatoire Description
type ✔️ Les valeurs prises en charge sont soit typing ou message.
typing: à utiliser lors de la diffusion du message.
message: à utiliser pour le message final diffusé.
text ✔️ Le contenu du message à diffuser. Teams affiche cette valeur dans la bulle de message de l’agent. Pour une informative mise à jour, le texte reste visible jusqu’à la prochaine mise à jour ou jusqu’à ce que le premier bloc diffusé le remplace. Une activité de diffusion en continu de début qui omet text est rejetée.
entities.type ✔️ Doit être streamInfo
entities.streamId ✔️ streamId À partir de la demande initiale de diffusion en continu, démarrer la diffusion en continu.
entities.streamType Type de diffusion en continu des mises à jour. Les valeurs prises en charge sont , informativestreaming, ou final. La valeur par défaut est streaming. final n’est utilisé que dans le message final.
entities.streamSequence ✔️ Entier incrémentiel pour chaque requête.

Remarque

Pour les API REST, streamSequence doit commencer à 1 et incrémenter de 1 pour chaque demande de diffusion en continu suivante. Ne définissez streamSequence pas pour le message final. L’animation de saisie Teams n’est pas disponible lorsqu’un flux est ouvert. Si votre agent n’a pas encore de contenu de réponse, envoyez une mise à jour informative pertinente au lieu d’un texte vide ou blanc.

Pour activer la diffusion en continu dans les agents, procédez comme suit :

  1. Démarrer la diffusion en continu
  2. Continuer la diffusion
  3. Streaming final

Démarrer la diffusion en continu

L’agent peut envoyer un message informatif ou un message en continu comme communication initiale. La réponse inclut le , qui est important pour l’exécution streamIddes appels ultérieurs.

Une activité de diffusion en continu doit inclure text. Si text est manquant, la demande échoue avec une 400 BadRequest réponse et le message Start streaming activities should include textd’erreur . Teams affiche cette valeur dans la bulle de message. Utilisez donc une mise à jour informative pertinente pour la première activité. Pour plus d’informations, voir Codes d’erreur.

Votre agent peut envoyer plusieurs mises à jour informatives tout en traitant la demande de l’utilisateur, telles que la numérisation des documents, la synthèse du contenu et les éléments de travail pertinents trouvés. Vous pouvez envoyer ces mises à jour avant que votre agent ne génère sa réponse finale à l’utilisateur.


//Ex: An agent sends the first request with content & the content is informative loading message.

POST /conversations/<conversationId>/activities HTTP/1.1 
{
  "type": "typing",
  "serviceurl": "https://smba.trafficmanager.net/amer/",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id": "<conversationId>"
  },
  "recipient": {
    "id": "<recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en-US",
  "text": "Searching through documents...", //(required) first informative loading message.
  "entities":[
    {
      "type": "streaminfo",
      "streamType": "informative", // informative or streaming; default= streaming.
      "streamSequence": 1 // (required) incremental integer; must be present for start and continue streaming request, but must not be set for final streaming request.
    }
  ],
}

201 created { "id": "a-0000l" } // return stream id

L’image suivante est un exemple de démarrage de diffusion en continu :

La capture d’écran montre démarrer la diffusion en continu.

Continuer la diffusion

Utilisez le streamId que vous avez reçu de la demande initiale pour envoyer des messages d’information ou de diffusion en continu. Vous pouvez commencer par des mises à jour informatives , puis passer à la diffusion en continu lorsque la réponse finale est prête.

Commencer par des mises à jour informatives

À mesure que votre agent génère une réponse, envoyez des mises à jour informatives à l’utilisateur, telles que la numérisation des documents, la synthèse du contenu et les éléments de travail pertinents trouvés. Assurez-vous de ne passer les appels suivants qu’une fois que l’agent a reçu une réponse réussie des appels précédents.

Chaque mise à jour informative remplace la précédente dans la bulle de message et reste visible pour l’utilisateur jusqu’à l’arrivée de la prochaine mise à jour ou du premier morceau diffusé en continu.


// Ex: An agent sends the second request with content & the content is informative loading message.

POST /conversations/<conversationId>/activities HTTP/1.1 
{
  "type": "typing",
  "serviceurl": "https://smba.trafficmanager.net/amer/",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id" : "<conversationId>"
  },
  "recipient": {
    "id": "<recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en -US",
  "text": "Searching through emails...", // (required) second informative loading message.
  "entities":[
    {
      "type": "streaminfo",
      "streamId": "a-0000l", // // (required) must be present for any subsequent request after the first chunk.
      "streamType": "informative", // informative or streaming; default= streaming.
      "streamSequence": 2 // (required) incremental integer; must be present for start and continue streaming request, but must not be set for final streaming request.
    }
  ],
} 
202 0K { }

L’image suivante est un exemple d’agent fournissant des mises à jour informatives :

La capture d’écran montre les mises à jour informatives de la diffusion en continu.

Passer au streaming de réponses

Une fois que votre agent est prêt à générer son message final pour l’utilisateur, passez de la fourniture de mises à jour informatives à la diffusion en continu de réponses. Pour chaque mise à jour de diffusion en continu de réponse, le contenu du message doit être la dernière version du message final. Cela signifie que votre agent doit incorporer tous les nouveaux jetons générés par les grands modèles de langage (LLM). Ajoutez ces jetons à la version précédente du message, puis envoyez-le à l’utilisateur.

La limitation est de 1 requête par seconde. Vous devez vous assurer que l’agent envoie la demande dans ce délai. L’agent peut envoyer des demandes à un rythme plus lent, selon les besoins.


// Ex: An agent sends the third request with content & the content is actual streaming content.

POST /conversations/<conversationId>/activities HTTP/1.1
{
  "type": "typing",
  "serviceurl" : "https://smba.trafficmanager.net/amer/ ",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id" : "<conversationId>"
  },
  "recipient": {
    "id" : "<recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en-US" ,
  "text": "A brown fox", // (required) first streaming content.
  "entities":[
    {
      "type": "streaminfo",
      "streamId": "a-0000l", // // (required) must be present for any subsequent request after the first chunk.
      "streamType": "streaming", // informative or streaming; default= streaming.
      "streamSequence": 3 // (required) incremental integer; must be present for start and continue streaming request, but must not be set for final streaming request.
    }
  ],
}
202 0K{ }


// Ex: An agent sends the fourth request with content & the content is actual streaming content.

POST /conversations/<conversationId>/activities HTTP/1.1
{
  "type": "typing",
  "serviceurl" : "https://smba.trafficmanager.net/amer/ ",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id" : "<conversationId>"
  },
  "recipient": {
    "id" : "<recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en-US" ,
  "text": "A brown fox jumped over the fence", // (required) first streaming content.
  "entities":[
    {
      "type": "streaminfo",
      "streamId": "a-0000l", // // (required) must be present for any subsequent request after the first chunk.
      "streamType": "streaming", // informative or streaming; default= streaming.
      "streamSequence": 4 // (required) incremental integer; must be present for start and continue streaming request, but must not be set for final streaming request.
    }
  ],
}
202 0K{ }

L’image suivante est un exemple d’agent fournissant des mises à jour par blocs :

La capture d’écran montre la diffusion en continu de réponses.

Streaming final

Une fois que votre agent a terminé de générer son message, envoyez le signal de fin de streaming avec le message final. Pour le message final, l’activité est message.type Ici, l’agent définit tous les champs qui sont autorisés pour l’activité de message standard, mais final qui est la seule valeur autorisée pour streamType.


// Ex: An agent sends the second request with content && the content is informative loading message.

POST /conversations/<conversationId>/activities HTTP/1.1
{
  "type": "message",
  "serviceurl" : "https://smba.trafficmanager.net/amer/ ",
  "channelId": "msteams",
  "from": {
    "id": "<botId>",
    "name": "<BotName>"
  },
  "conversation": {
    "conversationType": "personal",
    "id" : "<conversationId>"
  },
  "recipient": {
    "id" : "recipientId>",
    "name": "<recipientName>",
    "aadObjectId": "<recipient aad objecID>"
  },
  "locale": "en-US",
  "text": "A brown fox jumped over the fence.", // (required) first streaming content.
  "entities":[
    {
      "type": "streaminfo",
      "streamId": "a-0000l", // // (required) must be present for any subsequent request after the first chunk.
      "streamType": "final", // (required) final is only allowed for the last message of the streaming.
    }
  ],
  }
202 0K{ }

L’image suivante est un exemple de réponse finale de l’agent :

La capture d’écran montre le message final diffusé en continu.

Arrêter la réponse de l’agent de streaming

Le bouton permet aux utilisateurs de contrôler les réponses de diffusion en continu. Le bouton Arrêter est disponible par défaut lors de la diffusion en continu, ce qui permet aux utilisateurs d’arrêter une réponse de manière anticipée. Les utilisateurs peuvent interrompre la diffusion en continu des messages et affiner leurs invites ou en envoyer de nouvelles. Il améliore la gestion des conversations avec les agents pour une meilleure expérience utilisateur.

Après qu’un utilisateur a arrêté la génération de messages :

  • Les agents considèrent les réponses arrêtées comme incomplètes ou ignorées dans la conversation.

  • Les agents ne peuvent pas modifier le contenu déjà diffusé.

  • L’erreur suivante est générée si un agent continue la diffusion d’un message interrompu par un utilisateur :

    Détail de l’erreur Description
    Code d’status http 403
    Code d’erreur ContentStreamNotAllowed
    Message d’erreur Le flux de contenu a été annulé par l’utilisateur.
    Description La diffusion en continu a été arrêtée par l’utilisateur.

Codes de réponse

Voici les codes de réussite et d’erreur :

Code de réussite

Code d’status http Valeur renvoyée Description
201 streamId, il est identique à activityId{"id":"1728640934763"} L’agent renvoie cette valeur après avoir envoyé la demande initiale de diffusion en continu.
Pour toutes les demandes de diffusion en continu ultérieures, le streamId est requis.
202 {} Code de réussite pour toutes les demandes de diffusion en continu ultérieures.

Codes d’erreur

Code d’status http Code d’erreur Message d’erreur Description
202 ContentStreamSequenceOrderPreConditionFailed PreCondition failed exception when processing streaming activity. Peu de demandes de diffusion en continu peuvent arriver dans le désordre et être abandonnées. La demande de diffusion en continu la plus récente, déterminée par streamSequence, est utilisée lorsque les demandes sont reçues de manière désordonnée. Veillez à envoyer chaque demande de manière séquentielle.
400 BadRequest Selon le scénario, vous pouvez rencontrer différents messages d’erreur, tels que Start streaming activities should include text La charge utile entrante n’adhère pas aux valeurs nécessaires ou ne contient pas les valeurs nécessaires.
403 ContentStreamNotAllowed Content stream is not allowed La fonctionnalité d’API de diffusion en continu n’est pas autorisée pour l’utilisateur ou l’agent.
403 ContentStreamNotAllowed Content stream is not allowed on an already completed streamed message Un agent ne peut pas diffuser en continu un message déjà diffusé et terminé.
403 ContentStreamNotAllowed Content stream finished due to exceeded streaming time. L’agent n’a pas terminé le processus de diffusion en continu dans le délai strict de deux minutes.
403 ContentStreamNotAllowed Message size too large L’agent a envoyé un message qui dépasse la restriction de taille de message actuelle.
403 ContentStreamNotAllowed Content stream was canceled by user La diffusion en continu a été arrêtée par l’utilisateur.
403 ContentStreamNotAllowed Request streamed content should contain the previously streamed content Le contenu entrant du message de flux ne contient pas ce qui a déjà été diffusé.
429 N/A API calls quota exceeded Le nombre de messages transmis par l’agent a dépassé le quota.

Exemple de code

Exemple de nom Description Node.js C# Python
Exemple d’agent de streaming Teams Cet exemple d’application peut être utilisé pour des scénarios de diffusion en continu dans Teams à l’aide d’Azure Open AI et de Bot Framework v4 pour l’étendue personnelle. N/A View N/A
Agent de diffusion en continu conversationnel Il s’agit d’un agent de diffusion en continu de conversation avec le SDK Teams. View View View

Voir aussi