сообщения бота Stream

Примечание.

  • Потоковая передача сообщений бота поддерживается только в чатах с одним подключением.
  • Teams поддерживает только один одновременный ответ потоковой передачи для каждого чата за раз.
  • Потоковая передача доступна в Интернете, на настольных компьютерах и мобильных устройствах.

Вы можете выполнять потоковую передачу сообщений бота, чтобы доставить пользователю ответы бота в виде небольших обновлений, пока создается полный ответ для улучшения взаимодействия с пользователем. Часто ботам требуется много времени, чтобы создать ответы без обновления пользовательского интерфейса, что приводит к менее привлекательному интерфейсу.

Когда пользователи наблюдают, как бот обрабатывает свой запрос в режиме реального времени, это может повысить их удовлетворенность и доверие. Такая воспринимаемая скорость реагирования и прозрачность повышают вовлеченность пользователей и уменьшают прекращение беседы с ботом.

пользовательский интерфейс Stream сообщений

Потоковые сообщения бота имеют два типа обновлений:

  • Информативные обновления. Информативные обновления отображаются в виде синего индикатора выполнения в нижней части чата. Он информирует пользователя о текущих действиях бота во время создания ответа.

    Снимок экрана: информативные обновления потоковой передачи для ботов.

    Информативные сообщения не должны содержать более 1 КБ или 1000 символов.

  • Потоковая передача ответов. Потоковая передача ответа отображается в виде индикатора ввода. Он показывает ответ бота пользователю в виде небольших обновлений, пока создается полный ответ.

    Снимок экрана: потоковая передача ответов ботов.

    • Кнопка Остановить . Кнопка позволяет пользователям управлять потоковыми ответами, останавливая их на ранней стадии. Он доступен по умолчанию во время потоковой передачи, что позволяет пользователям уточнять запросы или отправлять новые. Понимание принципов работы кнопки остановки потоковой передачи поможет разработать более эффективные и удобные интерфейсы для общения.

    • Потоковое содержимое. Во время потоковой передачи сообщения бота должны содержать предыдущее потоковое содержимое.

      Например: это пример приемлемого ответа потоковой передачи.
      Коричневый
      Коричневая лиса
      Коричневая лиса прыгает через забор

      Не является примером. Это пример потокового ответа, который возвращает ошибку.
      Коричневый
      Привет

      Дополнительные сведения об ошибке см. в разделе Коды ошибок.

Реализация потоковой передачи с помощью пакета SDK для Teams

Используйте Stream.Update для записи информативных обновлений перед запуском потока сообщений. Stream.Update может вызываться несколько раз с разным текстом обновления.

Используйте Stream.Emit для записи фрагмента содержимого в поток. Блоки будут отрисовываться в сообщении сразу после их получения Teams. После первого вызова Stream.Emitинформационные обновления больше не будут отображаться и Stream.Update не будут действовать.

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

Используйте stream.update для записи информативных обновлений перед запуском потока сообщений. stream.update может вызываться несколько раз с разным текстом обновления.

Используйте stream.emit для записи фрагмента содержимого в поток. Блоки будут отрисовываться в сообщении сразу после их получения Teams. После первого вызова stream.emitинформационные обновления больше не будут отображаться и stream.update не будут действовать.

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!"
});

Используйте stream.update для записи информативных обновлений перед запуском потока сообщений. stream.update может вызываться несколько раз с разным текстом обновления.

Используйте stream.emit для записи фрагмента содержимого в поток. Блоки будут отрисовываться в сообщении сразу после их получения Teams. После первого вызова stream.emitинформационные обновления больше не будут отображаться и stream.update не будут действовать.

@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)

Stream сообщение через REST API

Сообщения бота можно передавать через REST API. Потоковые сообщения поддерживают форматированный текст и ссылки. Вложение, метка ИИ, кнопка обратной связи и метки конфиденциальности доступны только для окончательного сообщения потоковой передачи. Дополнительные сведения см. в статье вложения и сообщения бота с содержимым, созданным ИИ.

Когда бот вызывает потоковую передачу через REST API, убедитесь, что следующий API потоковой передачи вызывается только после получения успешного ответа от первоначального вызова API. Если бот использует пакет SDK, убедитесь, что вы получили объект ответа NULL от метода действия отправки, чтобы убедиться, что предыдущий вызов успешно передан.

При слишком быстром вызове API потоковой передачи бот может столкнуться с проблемами, а взаимодействие с потоковой передачей может быть прервано. Рекомендуется, чтобы бот транслировал по одному сообщению за раз, чтобы убедиться, что он вызывает API потоковой передачи в согласованном темпе. В противном случае запрос может быть отрегулироваться. Буферизация маркеров из модели в течение 1,5–двух секунд, чтобы обеспечить плавный процесс потоковой передачи.

Ниже приведены свойства для потоковой передачи сообщений бота.

Property Обязательный Описание
type ✔️ Поддерживаемые значения: typing или message.
• : typingиспользуется при потоковой передаче сообщения.
• : messageиспользуется для окончательного потокового сообщения.
text ✔️ Содержимое сообщения для потоковой передачи.
entities.type ✔️ Необходимое значение — streamInfo.
entities.streamId ✔️ streamId из исходного запроса потоковой передачи начните потоковую передачу.
entities.streamType Тип потоковых обновлений. Поддерживаемые значения: informative, streamingили final. Значение по умолчанию — streaming. final используется только в последнем сообщении.
entities.streamSequence ✔️ Добавочное целое число для каждого запроса.

Примечание.

Ниже приведены требования к использованию streamSequence rest API:

  • Первый должен быть номером "1".
  • Последующие числа (кроме окончательных) должны быть монотонным увеличивающимся целым числом (например, 1-2-3>>).
  • Для конечного сообщения streamSequence не должно быть задано.

Чтобы включить потоковую передачу в ботах, выполните следующие действия.

  1. Запуск потоковой передачи
  2. Продолжить потоковую передачу
  3. Окончательная потоковая передача

Запуск потоковой передачи

Бот может отправить информативное или потоковое сообщение в качестве исходного сообщения. Ответ включает в streamIdсебя , который важен для выполнения последующих вызовов.

Бот может отправлять несколько информативных обновлений во время обработки запроса пользователя, таких как сканирование документов, сводка содержимого и поиск соответствующих рабочих элементов. Вы можете отправить эти обновления до того, как бот создаст окончательный ответ пользователю.


//Ex: A bot 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

На следующем рисунке показан пример запуска потоковой передачи:

Снимок экрана: запуск потоковой передачи.

Продолжить потоковую передачу

streamId Используйте , полученный от первоначального запроса, для отправки информативных или потоковых сообщений. Вы можете начать с информативных обновлений , а затем переключиться на потоковую передачу ответов , когда окончательный ответ будет готов.

Начните с информативных обновлений

Когда бот создает ответ, отправляйте пользователю информативные обновления, такие как сканирование документов, сводка содержимого и поиск соответствующих рабочих элементов. Убедитесь, что последующие вызовы будут выполняться только после того, как бот получит успешный ответ от предыдущих вызовов.


// Ex: A bot 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 { }

На следующем рисунке показан пример бота, предоставляющего информативные обновления:

Снимок экрана: информативные обновления потоковой передачи.

Переключение на потоковую передачу ответов

Когда бот будет готов к созданию окончательного сообщения для пользователя, переключитесь с предоставления информативных обновлений на потоковую передачу ответов. Для каждого обновления потоковой передачи ответов содержимое сообщения должно быть последней версией окончательного сообщения. Это означает, что бот должен включать все новые маркеры, созданные крупными языковыми моделями (LLM). Добавьте эти маркеры в предыдущую версию сообщения, а затем отправьте их пользователю.

Ограничение регулирования — 1 запрос в секунду. Необходимо убедиться, что бот отправляет запрос в пределах этого ограничения. По мере необходимости бот может отправлять запросы с более низкой скоростью.


// Ex: A bot 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: A bot 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{ }

На следующем рисунке показан пример бота, предоставляющего обновления блоками:

Снимок экрана: потоковая передача ответов.

Окончательная потоковая передача

Когда бот завершит создание сообщения, отправьте сигнал конечной потоковой передачи вместе с окончательным сообщением. Для конечного сообщения type значение действия имеет значение message. Здесь бот задает все поля, которые разрешены для обычного действия сообщения, но final являются единственным допустимым значением для streamType.


// Ex: A bot 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{ }

На следующем рисунке показан пример окончательного ответа бота:

Снимок экрана: последнее потоковое сообщение.

Остановка ответа бота потоковой передачи

Кнопка позволяет пользователям управлять потоковыми ответами. Кнопка Остановить доступна по умолчанию во время потоковой передачи, что позволяет пользователям рано остановить ответ. Пользователи могут прервать потоковую передачу сообщений и уточнить свои запросы или отправить новые. Он улучшает управление беседами с помощью ботов для улучшения взаимодействия с пользователем.

После остановки создания сообщений пользователем:

  • Боты обрабатывают остановленные ответы как неполные или отбрасываются в беседе.

  • Боты не могут изменить уже потоковую передачу содержимого.

  • Если бот продолжает потоковую передачу сообщения, остановленного пользователем, создается следующая ошибка:

    Сведения об ошибке Описание
    Код состояния HTTP 403
    Код ошибки ContentStreamNotAllowed
    Сообщение об ошибке Поток содержимого был отменен пользователем.
    Описание Потоковая передача была остановлена пользователем.

Коды ответа

Ниже приведены коды успешного выполнения и ошибки.

Коды успешного выполнения

Код состояния HTTP Возвращаемое значение Описание
201 streamId, это то же самое, что и activityId{"id":"1728640934763"} Бот возвращает это значение после отправки первоначального запроса потоковой передачи.
Для всех последующих запросов потоковой передачи streamId требуется .
202 {} Код успешного выполнения для всех последующих запросов потоковой передачи.

Коды ошибок

Код состояния HTTP Код ошибки Сообщение об ошибке Описание
202 ContentStreamSequenceOrderPreConditionFailed PreCondition failed exception when processing streaming activity. Немногие запросы потоковой передачи могут поступать вне последовательности и удаляться. Самый последний запрос потоковой передачи, определяемый параметром streamSequence, используется при получении запросов неупорядоченным образом. Убедитесь, что каждый запрос отправляется последовательно.
400 BadRequest В зависимости от сценария могут возникать различные сообщения об ошибках, например Start streaming activities should include text Входящие полезные данные не соответствуют необходимым значениям или не содержат их.
403 ContentStreamNotAllowed Content stream is not allowed Функция API потоковой передачи не разрешена для пользователя или бота.
403 ContentStreamNotAllowed Content stream is not allowed on an already completed streamed message Бот не может непрерывно выполнять потоковую передачу сообщения, которое уже было выполнено и завершено.
403 ContentStreamNotAllowed Content stream finished due to exceeded streaming time. Боту не удалось завершить процесс потоковой передачи в течение строгого срока в две минуты.
403 ContentStreamNotAllowed Message size too large Бот отправил сообщение, которое превышает текущее ограничение на размер сообщения .
403 ContentStreamNotAllowed Content stream was canceled by user Потоковая передача была остановлена пользователем.
403 ContentStreamNotAllowed Request streamed content should contain the previously streamed content Входящее содержимое для сообщения потока не содержит то, что уже было потоково.
429 Н/Д API calls quota exceeded Количество сообщений, передаваемых ботом, превысило квоту.

Пример кода

Название примера Описание Node.js C# Python
Пример бота потоковой передачи Teams Этот пример приложения можно использовать для сценариев потоковой передачи в Teams с помощью Azure Open AI и Bot Framework версии 4 для личных область. Н/Д Просмотр Н/Д
Бот потоковой передачи беседы Это бот потоковой передачи бесед с пакетом SDK для Teams. Просмотр Просмотр Просмотр

См. также