Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
С помощью пакета SDK Agent 365 агент может обрабатывать события действий платформы, такие как установка и удаление, а также отправлять несколько отдельных сообщений в рамках одного этапа разговора. В этой статье рассматриваются основные подходы к взаимодействию с пользователями и информированию их о ходе обработки запросов агентом.
Обработка событий установки и удаления агента
Когда пользователь устанавливает или удаляет ваш агент в Teams или других каналах, размещенных на платформе Agent 365, платформа отправляет действие InstallationUpdate (также называемое событием agentInstanceCreated). Ваш агент может обрабатывать эти события, отправляя приветственное сообщение при установке и прощальное сообщение при удалении.
| Действие | Description |
|---|---|
add |
Пользователь устанавливает агент |
remove |
Пользователь удаляет агент |
В отличие от обработчиков уведомлений, обработчик InstallationUpdate не требует проверки подлинности, так как событие установки или удаления агента происходит до того, как у пользователя появляется активный сеанс, или после его завершения.
Регистрация обработчика установки и удаления
Зарегистрируйте обработчик действий для типа действия InstallationUpdate в инициализации вашего агента:
@agent_app.activity("installationUpdate")
async def on_installation_update(context: TurnContext, state: TurnState):
action = context.activity.action
from_prop = context.activity.from_property
logger.info(
"InstallationUpdate received — Action: '%s', DisplayName: '%s', UserId: '%s'",
action or "(none)",
getattr(from_prop, "name", "(unknown)") if from_prop else "(unknown)",
getattr(from_prop, "id", "(unknown)") if from_prop else "(unknown)",
)
if action == "add":
await context.send_activity("Thank you for hiring me! Looking forward to assisting you in your professional journey!")
elif action == "remove":
await context.send_activity("Thank you for your time, I enjoyed working with you.")
Activity.action имеет строковое значение "add" при установке агента или "remove" при его удалении.
Activity.from_property — это экземпляр ChannelAccount, содержащий идентификатор пользователя.
Отправка нескольких сообщений
Агенты Agent 365 могут отправлять несколько отдельных сообщений в ответ на один пользовательский запрос. Для этого вызовите SendActivityAsync (.NET), send_activity (Python) или sendActivity (JavaScript) несколько раз в рамках одного этапа разговора.
Важно
Teams не поддерживает потоковую передачу ответов для агентных удостоверений. Пакет SDK обнаруживает агентное удостоверение и буферизирует поток в одно сообщение. Используйте SendActivityAsync, send_activity или sendActivity, чтобы сразу отправлять пользователю отдельные сообщения.
В следующих примерах показано, как использовать этот подход, отправляя пользователю подтверждение получения запроса до ответа языковой модели.
@agent_app.activity("message")
async def on_message(context: TurnContext, state: TurnState):
# Message 1: immediate ack — reaches the user right away
await context.send_activity("Got it — working on it…")
# ... LLM processing ...
# Message 2: the LLM response
await context.send_activity(response)
В примере показано, как реализовать этот подход в методе on_message (host_agent_server.py): перед ответом языковой модели пользователю сразу отправляется подтверждение получения запроса.
Каждый вызов sendActivity, send_activity или SendActivityAsync создает отдельное сообщение. Вы можете вызывать эту функцию столько раз, сколько потребуется, чтобы отправлять обновления хода выполнения, частичные результаты или окончательный ответ.
Индикаторы ввода
Индикаторы ввода отображают анимацию хода выполнения ... в Teams:
- Индикаторы отображаются примерно в течение пяти секунд, поэтому их необходимо обновлять в цикле примерно каждые четыре секунды.
- Они видны только в индивидуальных и малых групповых чатах, а не в каналах.
Агент отправляет индикаторы ввода в цикле примерно каждые четыре секунды, чтобы во время обработки запроса языковой моделью продолжала отображаться анимация ...:
# Message 1: immediate ack — reaches the user right away
await context.send_activity("Got it — working on it…")
# Send typing indicator immediately (awaited so it arrives before the LLM call starts).
await context.send_activity(Activity(type="typing"))
# Background loop refreshes the "..." animation every ~4s (it times out after ~5s).
async def _typing_loop():
try:
while True:
await asyncio.sleep(4)
await context.send_activity(Activity(type="typing"))
except asyncio.CancelledError:
pass # Expected on cancel.
typing_task = asyncio.create_task(_typing_loop())
try:
response = await agent.process_user_message(...)
await context.send_activity(response)
finally:
typing_task.cancel()
try:
await typing_task
except asyncio.CancelledError:
pass