guap-alice: расписание ГУАП голосом
Голосовой навык Алисы: недельное расписание, контекст диалога и ответ до истечения таймаута.
В сентябре 2026 года я сделал голосовой интерфейс к расписанию ГУАП. Хотелось спросить «ко скольки завтра» и получить время первой пары, аудиторию и корпус, сохранив группу между разговорами. Из этой задачи вырос guap-alice, или Гуапик: Python-сервис с вебхуком для Яндекс Диалогов.

Разговор, который держит контекст
Навык понимает расписание на день, количество пар, первую и последнюю пару, начало и конец занятий, окна и преподавателей. После вопроса «что завтра» короткое «сколько пар» продолжает разговор о завтра. «А в четверг» меняет день, сохраняя выбранную группу.
В документации проекта приведён такой сценарий:
| Реплика | Поведение навыка |
|---|---|
| «Моя группа 3437к» | Сохраняет группу для следующих разговоров |
| «Что завтра» | Называет пары, предметы, аудитории и корпуса |
| «Ко скольки» | Возвращает время начала первой пары того же дня |
| «Есть окна» | Проверяет промежутки между занятиями |
Постоянный выбор группы отделён от разового вопроса. «У 2210 завтра» позволяет посмотреть чужое расписание, сохранив свою группу. Есть отдельный контекст преподавателя: «что у Фомичевой в четверг», затем «а в пятницу». При совпадении фамилий навык просит инициалы; неоднозначные даты и номера пар тоже уточняет.
От недельного шаблона к конкретной дате
Источник ГУАП отдаёт недельный шаблон с верхней и нижней неделей. Чтобы ответить про дату, провайдер читает номер и чётность текущей недели, вычисляет нужную неделю и выбирает подходящие занятия. В справочнике 581 группа и 775 преподавателей; обновление справочника вынесено в отдельный скрипт.
1
2
3
4
5
6
7
Алиса / Яндекс Диалоги
↓ HTTPS
FastAPI → группа, дата и контекст разговора
↓
провайдер расписания → кэш → публичная страница ГУАП
↓
выбор занятий → шаблон ответа → Алиса
Даты, диалог, загрузка расписания и русская речь разделены на модули. Ответ собирается из проверяемых шаблонов. Для ГУАП важны корпуса: когда занятия проходят по разным адресам, навык предупреждает о переезде. Отдельно пришлось разбирать падежи и исправлять случай, когда слово «пятницу» распознавалось как «пятая пара».
Как пережить медленный источник
На весь обработчик отведено 2,8 секунды, на запрос расписания 1,8 секунды. Свежий кэш используется час; при ошибке источника прежнее расписание можно отдать в пределах суток. После этого сервис объясняет недоступность данных. Эти пределы заданы в конфигурации, а поведение кэша реализовано в провайдере.
Вебхук проверяет JSON, размер запроса и при настройке список разрешённых навыков. Реплики и идентификаторы пользователей не записываются в журналы; выбранная группа хранится средствами Яндекса.
Что получилось и как проверять
Реализованы диалог, календарный расчёт и HTTP-сервис. В тестах есть случаи чётности недели, разового выбора другой группы, окон, переезда между корпусами, неоднозначных запросов и отказа источника. Они используют синтетические расписания; изменение реальной HTML-разметки нужно дополнительно проверять на живом источнике.
Расписание сессии, пересдач и отдельных подгрупп ограничено данными, которые публикует университет. Поэтому следующий шаг развития связан с качеством источника и уточнениями диалога.
Открытый код guap-alice · Страница проекта · Описание источника данных
