Настройка 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_ID | ID приложения (клиента) Azure AD |
TEAMS_CLIENT_SECRET | Секрет клиента Azure AD |
TEAMS_TENANT_ID | ID арендатора Azure AD |
TEAMS_ALLOWED_USERS | Разделённые запятыми AAD object IDs пользователей, которым разрешено использовать бота |
TEAMS_ALLOW_ALL_USERS | Установите true, чтобы пропустить белый список и разрешить всем |
TEAMS_HOME_CHANNEL | ID беседы для доставки сообщений по расписанию/проактивно |
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 отклоняются