Перейти к основному содержимому

Настройка Microsoft Teams

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

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

Выполните vibeos gateway setup и выберите Microsoft Teams для пошаговой настройки.

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

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

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


Для установки из исходного кода или локально добавьте дополнительный пакет Teams, чтобы встроенный адаптер мог импортировать SDK Microsoft Teams:

uv sync --extra teams
# или для редактируемой установки:
uv pip install -e ".[teams]"

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

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

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

Чтобы проверить свой логин и найти собственный AAD object ID (необходим для TEAMS_ALLOWED_USERS):

teams status --verbose

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

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

# devtunnel (Microsoft)
devtunnel create vibeos-bot --allow-anonymous
devtunnel port create vibeos-bot -p 3978 --protocol https # замените 3978 на TEAMS_PORT, если изменён
devtunnel host vibeos-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 "VibeOS" \
--endpoint "https://<url-вашего-туннеля>/api/messages"

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


Шаг 4: Настройка переменных окружения​

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

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

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

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

VIBEOS_UID=$(id -u) VIBEOS_GID=$(id -g) docker compose up -d gateway

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

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

Ищите строку:

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

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

teams app get <teamsAppId> --install-link

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


Справочник по настройке​

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

ПеременнаяОписание
TEAMS_CLIENT_IDID приложения (клиента) Azure AD
TEAMS_CLIENT_SECRETСекрет клиента Azure AD
TEAMS_TENANT_IDID арендатора Azure AD
TEAMS_ALLOWED_USERSРазделённые запятыми AAD object IDs пользователей, которым разрешено использовать бота
TEAMS_ALLOW_ALL_USERSУстановите true, чтобы пропустить белый список и разрешить всем
TEAMS_HOME_CHANNELID беседы для доставки сообщений по расписанию/проактивно
TEAMS_HOME_CHANNEL_NAMEОтображаемое имя домашнего канала
TEAMS_PORTПорт вебхука (по умолчанию: 3978)

config.yaml​

Также можно настроить через ~/.vibeos/config.yaml:

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

Возможности​

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

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

  • Allow Once — подтвердить эту конкретную команду
  • Allow Session — подтвердить этот шаблон до конца сессии
  • Always Allow — навсегда подтвердить этот шаблон
  • Deny — отклонить команду

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

Доставка сводок встреч (конвейер Teams Meetings)​

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

Доставка сводок конвейера настраивается в записи платформы 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.Нет threading ответов, нет реакций, отображается как настроенная учётная запись вебхука.
graphСообщения в канале с threading или личные/групповые чаты от имени бота через Microsoft Graph.Требуется регистрация приложения Graph с разрешениями приложения ChannelMessage.Send (канал) или Chat.ReadWrite.All (чат).

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


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

Для постоянного сервера пропустите devtunnel и зарегистрируйте бота с публичным HTTPS-адресом вашего сервера:

teams app create \
--name "VibeOS" \
--endpoint "https://ваш-домен.com/api/messages"

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

teams app update --id <teamsAppId> --endpoint "https://ваш-домен.com/api/messages"

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


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

ПроблемаРешение
Конечная точка health работает, но бот не отвечаетПроверьте, что туннель всё ещё работает и конечная точка обмена сообщениями бота совпадает с URL туннеля
KeyError: 'teams' в логахПерезапустите контейнер — эта ошибка исправлена в текущей версии
Бот отвечает с ошибками аутентификацииУбедитесь, что TEAMS_CLIENT_ID, TEAMS_CLIENT_SECRET и TEAMS_TENANT_ID заданы правильно
No inference provider configuredПроверьте, что ANTHROPIC_API_KEY (или ключ другого провайдера) задан в ~/.vibeos/.env
Бот получает сообщения, но игнорирует ихВозможно, ваш AAD object ID отсутствует в TEAMS_ALLOWED_USERS. Выполните teams status --verbose, чтобы найти его
URL туннеля меняется при перезапускеURL devtunnel постоянны при использовании именованного туннеля (devtunnel create vibeos-bot). ngrok и cloudflared генерируют новый URL при каждом запуске, если у вас нет платного плана — обновите конечную точку бота с помощью teams app update при изменении
Teams показывает «Этот бот не отвечает»Вебхук вернул ошибку. Проверьте docker logs vibeos на наличие traceback
[teams] Failed to connect в логахSDK не удалось аутентифицироваться. Перепроверьте учётные данные и убедитесь, что tenant ID соответствует учётной записи, использованной в teams login

Безопасность​

предупреждение

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

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

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

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