InquirerLPA off Palawan to bring rains across parts of PHThe Jerusalem PostEyal Waldman backs Eisenkot, warns Netanyahu win could threaten Israel’s democracy, economyPunchAisha Buhari visits AtikuDaily MaverickPHOTO ESSAY: Johannesburg’s walls are giant canvases for the city’s storiesוואלהבשל סירוב ויזה: אבו מאזן (שוב) לא ישתתף בעצרת האו"ם한겨레‘땅’ 아닌 ‘계획’ 부족… 국내 태양광 잠재량, 2030년 목표 4배Bollywood HungamaEXCLUSIVE: Abundantia Entertainment and Almighty Motion Picture join hands for Kodaikanal Mercury thriller Heavy MetalSözcüBankaların tuzak kelimesi: Telefonda söylerseniz borçlu çıkarsınızCNN TürkBORSA NEDEN DÜŞTÜ? BİST 100’de sert düşüş | Borsa İstanbul bugün neden düşüyor, son durum ne?The South AfricanTides: High and low tide times as heavy rain hitsObservador DesportoAs notícias das 7hDaily MailPutney Pusher suspect is found dead: Millionaire HSBC banker, 44, and ex-Army captain with links to royalty was under investigation in hunt for jogger who shoved woman into path of bus
The Daily Newsstand · Free, Always
Thursday, September 17, 2026

Power Automate + LLM API: автоматизация протоколов совещаний из Teams транскриптов (с помощью Claude)

Translate

TL;DR: Хотел полную автоматизацию "встреча → протокол в канале Teams". Получил полуавтоматику с ручным шагом в 30 секунд. Сэкономил 20-30 минут на каждую встречу за $0.33 в месяц. Разбираю что сработало, где упёрся в ограничения Microsoft, и стоила ли игра свеч. Весь проект — от идеи до работающего flow — собран в диалоге с Claude.

Проблема

Я delivery-менеджер, веду несколько команд. После каждой встречи нужен протокол: кто был, что обсудили, кто что делает.

Раньше это выглядело так:

Делаю заметки во время встречи — постоянно останавливаю участников, прошу повторить или уточнить формулировку, чтобы записать осмысленный вывод. Пока записываю — беседа уходит вперёд, теряю контекст. Фокус на записи вместо управления групповой динамикой. Если встреча короткая и плотная — заметки не успеваю, приходится потом переслушивать запись и восстанавливать по памяти. 15-20 минут (или больше, если переслушиваю).

Пишу протокол из заметок — структурирую, формулирую action items, проверяю что никого не забыл. 10 минут.

Форматирую и отправляю в канал — привожу в читаемый вид, копирую в Teams. 10 минут.

30-40 минут на встречу. При 3-5 встречах в день — это полтора-два часа чистого времени на документирование. И это не считая когнитивной нагрузки от постоянного переключения между "слушать" и "записывать".

В Teams есть транскрипция. В 2026 году есть LLM, которые умеют структурировать текст. Почему бы не соединить?

Целевая архитектура (мечта)

Teams Meeting (с включённой записью)
        ↓ автоматически
OneDrive /Recordings
        ↓ триггер Power Automate
Получить транскрипт через Graph API
        ↓
Отправить в LLM
        ↓
Опубликовать в канал Teams

Ожидание: Полная автоматизация, я только провожу встречу.

Что получилось (реальность)

Teams Meeting (с включённой записью)
        ↓ автоматически
OneDrive /Recordings (.mp4)
        ↓ вручную (30 сек)
Кликнуть по ссылке на запись → Скачать транскрипт .vtt
        ↓ триггер Power Automate  
Отправить в LLM
        ↓
Опубликовать в канал Teams

Что происходит: Видео сохраняется в OneDrive автоматически при нажатии "Записать встречу" в Teams. А вот транскрипт — нет. После завершения встречи нужно кликнуть по ссылке на запись и в открывшемся окне нажать "Скачать" → выбрать формат .vtt. Сохраняю в ту же папку /Recordings — и дальше flow подхватывает.

Один ручной шаг остался. Но вместо 30-40 минут — 30 секунд + ожидание генерации.

Почему не получилось полностью автоматизировать

Ограничение 1: Teams не автосохраняет транскрипты

Teams автоматически сохраняет .mp4 записи в OneDrive. Но .vtt файл с транскриптом — нет. Его нужно скачать вручную из интерфейса Teams после встречи.

Я проверил Teams Admin Center, политики PowerShell — настройки для автосохранения транскриптов не существует (на момент написания статьи).

Ограничение 2: Graph API для транскриптов — это боль

Попытался обойти через Microsoft Graph API:

  1. Ловим триггер на .mp4 файл

  2. Получаем Meeting ID через API

  3. Скачиваем транскрипт

  4. Отправляем в LLM

Что пошло не так:

Проблема 1: Endpoint /me/calendarView не работает с Application permissions — только с Delegated. Пришлось использовать /users/{email}/calendarView.

Проблема 2: Фильтр isOnlineMeeting eq true не поддерживается для calendarView. Пришлось получать все события и фильтровать в flow.

Проблема 3: Главное разочарование — endpoint /users/{userId}/onlineMeetings возвращает только встречи, созданные через API. Встречи из Outlook/Teams календаря там не появляются.

Это означает, что получить Meeting ID для обычной календарной встречи через Graph API с Application permissions — невозможно (или я не нашёл способа).

Рабочее решение: пошаговая инструкция

После всех экспериментов остановился на простом варианте с ручной загрузкой .vtt.

Архитектура flow

📁 При создании файла в /Recordings
         ↓
❓ Условие: имя файла заканчивается на .vtt?
    ├── ✅ Да → Получить содержимое файла
    │            ↓
    │         HTTP POST в LLM API
    │            ↓
    │         Анализ JSON (ответ)
    │            ↓
    │         For each → Опубликовать в канал Teams
    │
    └── ❌ Нет → (ничего не делаем)

Шаг 1: Триггер и условие

Триггер: OneDrive for Business → "При создании файла"

  • Папка: /Recordings

Условие: Фильтруем только .vtt файлы

  • Левое поле (через fx): triggerOutputs()?['headers']?['x-ms-file-name']

  • Оператор: заканчивается на

  • Правое поле: .vtt

Почему не .docx? Изначально пробовал экспортировать транскрипт в Word. Но .docx — это ZIP-архив с XML внутри. При отправке в LLM через Power Automate передаются бинарные данные, и модель получает мусор. .vtt — plain text, передаётся как есть.

Шаг 2: Получить содержимое файла

Действие: OneDrive for Business → "Получить содержимое файла"

  • Файл: динамический контент → "Идентификатор файла" из триггера

Шаг 3: HTTP запрос к LLM

Действие: HTTP

Поле

Значение

Method

POST

URI

https://your-llm-api.com/v1/chat/completions

Headers:

Ключ

Значение

Authorization

Bearer ваш-api-ключ

Content-Type

application/json

Body:

json

{
  "model": "gpt-5.6-luna",
  "messages": [
    {
      "role": "system",
      "content": "You are a meeting notes assistant. Generate structured meeting minutes in the same language as the transcript. Use format: # Meeting Minutes, **Date:**, **Attendees:**, ## Discussion Summary, ## Action Items (table with columns: Action, Responsible, Deadline), ## Notes. IMPORTANT: Output ONLY the meeting minutes, do NOT include any thinking, reasoning, or <think> tags."
    },
    {
      "role": "user",
      "content": "Generate meeting minutes from this transcript:\n\n[ДИНАМИЧЕСКИЙ КОНТЕНТ: Содержимое файла]"
    }
  ],
  "max_tokens": 4000
}

Важно про промпт:

  • "in the same language as the transcript" — протокол будет на языке встречи (у меня русский)

  • Явно указываю формат с таблицей Action Items — так удобнее отслеживать задачи

  • "do NOT include any thinking" — некоторые модели (типа DeepSeek, MiniMax) добавляют <think> блоки с рассуждениями, это засоряет вывод

Шаг 4: Парсинг ответа

Действие: "Анализ JSON" (Parse JSON)

Content: Body из HTTP-шага

Schema:

json

{
  "type": "object",
  "properties": {
    "choices": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "message": {
            "type": "object",
            "properties": {
              "content": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}

Шаг 5: Публикация в Teams

Действие: Microsoft Teams → "Опубликовать сообщение в чате или канале"

Поле

Значение

Опубликовать от имени

Бот Flow

Опубликовать в

Канал

Команда

Ваша команда

Канал

Meeting minutes (или любой другой)

Сообщение

(через fx) first(body('Анализ_JSON')?['choices'])?['message']?['content']

Результат

После загрузки .vtt файла в папку, через 30-60 секунд в канале появляется готовый протокол:

markdown

# Meeting Minutes

**Date:** 2026-09-15
**Attendees:** Алексей, Мария, Дмитрий, Елена

## Discussion Summary

Обсудили статус текущего спринта. Задача по интеграции с внешним 
сервисом отстаёт на 2 дня из-за изменений в спецификации со стороны 
партнёра. Договорились о переносе релиза на следующую неделю.

Рассмотрели результаты A/B теста новой формы регистрации. 
Конверсия выросла на 12%. Решили раскатывать на всех пользователей.

## Action Items

| Задача | Ответственный | Срок |
|--------|---------------|------|
| Обновить спецификацию API | Дмитрий | 17.09 |
| Уведомить стейкхолдеров о переносе | Алексей | 16.09 |
| Подготовить тест-кейсы для интеграции | Елена | 18.09 |
| Раскатить новую форму регистрации | Мария | 16.09 |

## Notes

- Следующий статус-митинг — пятница 10:00
- Ретро по спринту запланировано на понедельник

Грабли, на которые наступил

1. Выбор модели

Не все модели одинаково полезны:

Модель

Проблема

MiniMax-M2

Добавляет <think>...</think> блоки в вывод

Некоторые модели

Не поддерживают temperature ≠ 1

Дешёвые модели

Таймауты на длинных транскриптах

Решение: Тестируйте на реальных транскриптах перед продом. Я остановился на GPT-5.6 Luna (через корпоративный API).

2. Таймауты

Длинные встречи (1+ час) генерируют большие транскрипты. LLM может не успеть ответить за стандартный таймаут Power Automate.

Решение:

  • Уменьшить max_tokens если не нужны детальные протоколы

  • Или настроить retry policy в HTTP-действии

3. Формат .vtt vs .docx

.docx — бинарный формат (ZIP с XML). При передаче через Power Automate в LLM улетает мусор.

.vtt — plain text с таймкодами. Выглядит так:

WEBVTT

00:00:05.000 --> 00:00:08.000
<v Алексей>Всем привет, начинаем встречу.</v>

00:00:08.500 --> 00:00:12.000
<v Мария>Привет! У меня апдейт по задаче.</v>

LLM отлично понимает этот формат и игнорирует таймкоды при генерации протокола.

Что не получилось и почему

Graph API: почему полная автоматизация невозможна

Я потратил ~6 часов на попытку автоматизировать получение транскриптов через Microsoft Graph API. Вот что узнал:

Шаг 1: Регистрация приложения в Azure AD — ок, 15 минут.

Шаг 2: Получение разрешений — нужен IT-администратор для admin consent. Ок, согласовал.

Шаг 3: Получение списка встреч

GET /users/{email}/calendarView?startDateTime=...&endDateTime=...

Работает. Но фильтр $filter=isOnlineMeeting eq true не поддерживается. Приходится получать все события и фильтровать в flow.

Шаг 4: Получение Meeting ID

GET /users/{email}/onlineMeetings?$filter=JoinWebUrl eq '{url}'

Не работает. Возвращает 404.

После долгих экспериментов нашёл причину в документации Microsoft:

"The onlineMeetings resource represents meetings that were created programmatically using the Create onlineMeeting API."

Встречи, созданные через Outlook или Teams календарь, не доступны через этот endpoint.

Это означает, что для 99% корпоративных встреч Graph API бесполезен для получения транскриптов с Application permissions.

Выводы

Стоимость

GPT-5.6 Luna: $0.20/1M input tokens, $1.20/1M output tokens

Расчёт на одну встречу (30 минут):

  • Транскрипт: ~10,000 токенов → $0.002

  • Протокол: ~1,000 токенов → $0.0012

  • Итого: ~$0.003 (менее 1 цента)

При 5 встречах в день:

  • $0.015/день × 22 рабочих дня = ~$0.33/месяц

  • Это примерно 25 рублей в месяц

ROI

Метрика

До

После

Время на протокол

30-40 мин

30 сек + ожидание

Когнитивная нагрузка на встрече

Высокая (записываю)

Низкая (слушаю)

Стоимость

$0

~$0.33/месяц

Время на настройку

~4 часа (с граблями)

При 3-5 встречах в день экономия — 1.5-2 часа ежедневно.

Окупаемость настройки — 2-3 дня.

Где ИИ реально помог

  • Структурирование — LLM отлично превращает поток речи в структурированный документ

  • Выделение action items — модель хорошо понимает "кто что должен сделать"

  • Мультиязычность — работает на любом языке транскрипта

Где ИИ создал иллюзию продуктивности

  • "Сейчас быстро автоматизирую через API" — потратил 6 часов на борьбу с ограничениями Microsoft

  • "Любая модель подойдёт" — нет, нужно тестировать на реальных данных

Что бы сделал иначе

  1. Сразу начал бы с .vtt — не тратил время на эксперименты с .docx

  2. Не лез бы в Graph API — ручной шаг в 30 секунд не стоит 6 часов разработки

  3. Раньше протестировал бы модели — выбор модели критичен

Итого

Полная автоматизация "встреча → протокол" в Microsoft Teams пока невозможна из-за ограничений платформы. Но даже частичная автоматизация с одним ручным шагом даёт:

  • Экономию 1.5-2 часа в день

  • Возможность полностью сфокусироваться на встрече

  • Консистентный формат протоколов

  • Стоимость — копейки (~$0.33/месяц)

Если у вас есть доступ к LLM API и Power Automate — попробуйте. Настройка займёт пару часов, а профит будет каждый день.

Этот проект был реализован в диалоге с Claude (Anthropic). Поиск решений, отладка ошибок Graph API, написание промптов и даже эта статья — всё делалось в переписке с ИИ-ассистентом. Такой формат "парного программирования с LLM" сэкономил несколько часов на изучение документации и дебаг.

View the original on Хабр

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.