Настройка команд Microsoft

Подключите Hermes Agent к Microsoft Teams в качестве бота. В отличие от режима Slack Socket, Teams передает сообщения, вызывая публичный HTTPS-вебхук, поэтому ваш экземпляр должен иметь общедоступную конечную точку — либо туннель для разработки (локальная разработка), либо реальный домен (продакшн).

Нужны сводки, собранные из событий Microsoft Graph, вместо обычного беседы с ботом? Используйте настройки страницы: Teams Meetings.

Как отвечает бот

Контекст Поведение
Личный чат (DM) Бот отвечает за каждое сообщение. Упоминание @ не требуется.
Групповой чат Бот отвечает только при упоминании @.
Канал Бот отвечает только при упоминании @.

Teams доставляет @упоминания как обычные сообщения с тегами <at>BotName</at>, которые Hermes автоматически удаляет перед обработкой.


Шаг 1: Установка Teams CLI

@microsoft/teams.cli автоматизирует регистрацию бота — портал Azure не требуется.

npm install -g @microsoft/teams.cli@preview
teams login

Чтобы проверить свой вход и найти свой идентификатор объекта AAD (нужен для TEAMS_ALLOWED_USERS):

teams status --verbose

Шаг 2: Открытие порта вебхука

Команды не могут отправлять сообщения на «localhost». Для локальной разработки используйте любой инструмент туннелирования для получения публичного URL-адреса HTTPS. Порт по умолчанию — 3978 — измените его с помощью TEAMS_PORT при необходимости.

# devtunnel (Microsoft)
devtunnel create hermes-bot --allow-anonymous
devtunnel port create hermes-bot -p 3978 --protocol https  # замените 3978 на TEAMS_PORT, если изменен
devtunnel host hermes-bot

# ngrok
ngrok http 3978  # замените 3978 на TEAMS_PORT, если изменен

# cloudflared
cloudflared tunnel --url http://localhost:3978  # замените 3978 на TEAMS_PORT, если изменен

Скопируйте URL-адрес https://` из результатов — он понадобится на следующем шаге. Оставьте туннель рабочим во время разработки.

Для продакшена укажите конечную точку вашего бота на публичном домене вашего сервера (см. Развертывание в продакшн).


Шаг 3: Создание бота

teams app create \
  --name "Hermes" \
  --endpoint "https://<your-tunnel-url>/api/messages"

CLI выведет ваши CLIENT_ID, CLIENT_SECRET и TENANT_ID, а также ссылку для установки для шага 6. Сохраните секрет клиента — он больше не будет показан.


Шаг 4: Настройка контура окружения

Добавьте в ~/.hermes/.env:

# Обязательно
TEAMS_CLIENT_ID=<your-client-id>
TEAMS_CLIENT_SECRET=<your-client-secret>
TEAMS_TENANT_ID=<your-tenant-id>

# Ограничение доступа к конкретным пользователям (рекомендуется)
# Используйте AAD object ID из `teams status --verbose`
TEAMS_ALLOWED_USERS=<your-aad-object-id>

Шаг 5: Запуск шлюза

HERMES_UID=$(id -u) HERMES_GID=$(id -g) docker compose up -d gateway

Это запускает шлюз. Порт вебхука по умолчанию — 3978 (переопределяется с помощью TEAMS_PORT). Проверьте, что он работает:

curl http://localhost:3978/health   # должно вернуть: ok
docker logs -f hermes

Ищите:

[teams] Webhook server listening on 0.0.0.0:3978/api/messages

Шаг 6: Установка приложений в Teams

teams app get <teamsAppId> --install-link

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


Справочник по конфигурации

Переменные окружения

Переменная Описание
TEAMS_CLIENT_ID Идентификатор приложения (клиента) Azure AD
TEAMS_CLIENT_SECRET Секрет клиента Azure AD
TEAMS_TENANT_ID Идентификатор клиента Azure AD
TEAMS_ALLOWED_USERS Разделенные запятыми идентификаторы объектов AAD пользователей, которым разрешено использовать бота
TEAMS_ALLOW_ALL_USERS Установите true, чтобы опубликовать белый список и разрешить всем
TEAMS_HOME_CHANNEL ID беседы для доставки планировщика/проактивных сообщений
TEAMS_HOME_CHANNEL_NAME Открываемое имя домашнего канала
TEAMS_PORT Порт вебхука (по умолчанию: 3978)

конфиг.yaml

В качестве альтернативы настроить через ~/.hermes/config.yaml:

platforms:
  teams:
    enabled: true
    extra:
      client_id: "your-client-id"
      client_secret: "your-secret"
      tenant_id: "your-tenant-id"
      port: 3978

функции

Интерактивные карточки подтверждения

Когда агенту необходимо выполнить проверку опасной команды, он отправляет Adaptive Card специальными кнопками вместо того, чтобы попросить вас ввести /approve:

Нажатие кнопки разрешает действие на месте и заменяет карточку судебного решения.

Доставка сводок собранных (конвейер Teams Meeting)

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

Доставка конвейера для обнаружения в записи платформы команды вместе с конфигурацией бота:

platforms:
  teams:
    enabled: true
    extra:
      # существующая конфигурация бота (client_id, client_secret, tenant_id, port)...

      # Доставка сводки собраний (используется только при включенном плагине teams_pipeline)
      delivery_mode: "graph"       # или "incoming_webhook"
      # Для delivery_mode: graph — выберите ОДНО из:
      chat_id: "19:meeting_..."    # опубликовать в чат Teams
      # team_id: "..."             # ИЛИ опубликовать в канал
      # channel_id: "..."
      # access_token: "..."        # опционально; по умолчанию использует учетные данные приложения MSGRAPH_*
      # Для delivery_mode: incoming_webhook:
      # incoming_webhook_url: "https://outlook.office.com/webhook/..."
Режим Когда использовать Компромисс
incoming_webhook Просто «опубликовать сводку на этом канале» со статическим URL-адресом, сгенерированным Teams. Нет потоков ответов, нет звука, отображается как настроенная идентификация вебхука.
график Потоковые сообщения в канале или сообщения в личном/групповом чате под идентификацией бота через Microsoft Graph. Требует регистрации приложения Graph с разрешениями приложения ChannelMessage.Send (канал) или Chat.ReadWrite.All (чат).

Если плагин teams_pipeline не включен, эти настройки неактивны — они срабатывают только тогда, когда среда выполнения конвейера находится на входе вебхука Graph.


Развертывание в продакшн

Для постоянного сервера пропустите devtunnel и зарегистрируйте свою боту с публичной конечной точкой HTTPS вашего сервера:

teams app create \
  --name "Hermes" \
  --endpoint "https://your-domain.com/api/messages"

Если вы уже создаете боту и необходимо только обновить конечную точку:

teams app update --id <teamsAppId> --endpoint "https://your-domain.com/api/messages"

Убедитесь, что настроенный порт (TEAMS_PORT, по умолчанию 3978) доступен из Интернета и что ваш TLS-сертификат действителен — Teams отклоняет самоподписанные сертификаты.


Устранение неполадок

Проблема Решение
Конечная точка /health работает, но бот не отвечает убедитесь, что ваш туннель все еще работает, и передача сообщений конечной точки соответствует URL-адресу туннеля
KeyError: 'команды' в логах Перезапустите контейнер — это исправлено в текущей версии
Бот отвечает за ошибки аутентификации Убедитесь, что TEAMS_CLIENT_ID, TEAMS_CLIENT_SECRET и TEAMS_TENANT_ID установлены правильно
Поставщик вывода не настроен Проверьте, что ANTHROPIC_API_KEY (или ключ другого провайдера) установлен в ~/.hermes/.env
Бот получает сообщения, но игнорирует их Ваш идентификатор объекта AAD может отсутствовать в TEAMS_ALLOWED_USERS. Запустите командный статус --verbose, чтобы найти его
URL-адрес туннеля меняется при перезапуске URL-адрес devtunnel сохраняются, если вы используете именованный туннель («devtunnel create hermes-bot»). ngrok и cloudflared генерируют новый URL-адрес при каждом запуске, если у вас нет платного плана — обновите конечную точку бота с помощью «обновления приложения Teams», когда он меняется
Команды показывают «Этот бот не отвечает» Вебхук вернулся по ошибке. Проверить docker logs Hermes на наличие трассировки
[команды] Не удалось подключиться в логах SDK не прошел аутентификацию. Дважды проверьте учетные данные и что идентификатор клиента соответствует учетной записи, использованной в входе в команды

Безопасность:::предупреждение

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

Относитесь к TEAMS_CLIENT_SECRET как к паролю — периодически меняйте его через портал Azure или Teams CLI.

- Храните учетные данные в ~/.hermes/.env с правами 600 (chmod 600 ~/.hermes/.env) - Бот принимает сообщения только от пользователей из TEAMS_ALLOWED_USERS; неавторизованные сообщения молча игнорируются - Ваша общедоступная конечная точка (/api/messages) аутентифицируется Teams Bot Framework — запрос без обоснований JWT отклоняется.

Связанные документы