Запись на услугу через AI-агента

LLM-tools для броней, как агент выбирает слот в чате, виджет day-picker, маркер «мои записи».

Запись на услугу через AI-агента

Если в группе есть услуги и они видимы агенту (service_agent_visibility), агент автоматически получает booking-tools — никакой настройки не нужно. Эти tools комбинируются с commerce-tools: один и тот же агент может в одном диалоге и продать товар, и записать на массаж.

LLM-tools

search_services

Поиск по каталогу услуг с фильтрами.

search_services({
  query?: string,
  tags?: string[],
  categorySlug?: string,
  limit?: number    // default 20
})

Возвращает только услуги, доступные этому конкретному агенту в группе (учитывает service_agent_visibility + isActive).

get_available_slots

Получение свободных слотов на диапазон дат.

get_available_slots({
  serviceId: string,
  from: string,           // ISO date, max 14 дней до to
  to: string,             // ISO date
  resourceId?: string     // конкретный мастер (если хочет клиент)
})
  • Max 14-дневный диапазон в одном запросе.
  • До 30 слотов в ответе.
  • Учитывает lead-часы, horizon-дни, capacity, buffer'ы, time-off — всё, что и публичный slot-picker.

book_appointment

Создание брони.

book_appointment({
  serviceId: string,
  startAt: string,                    // ISO datetime UTC
  customerName: string,
  customerEmail?: string,             // нужен один из контактов
  customerPhone?: string,
  resourceId?: string,
  notes?: string
})

Если услуга платная — агент получает в ответ ссылку на чекаут, отдаёт её клиенту через маркер [[pay:<orderId>]]. Если бесплатная — бронь сразу confirmed, агент пишет «всё, ждём вас 25 марта в 15:00».

В feedback'е модели документированы коды ошибок (slot_taken, too_soon, contacts_required и т.д.) с инструкцией, как объяснить клиенту и что делать дальше. Цель — чтобы модель сама перестраивала диалог при ошибке, а не сваливала «техническую» формулировку клиенту.

Маркеры

МаркерЧто рендерится
[[services:id1,id2,id3]]Карточки услуг (фото, название, цена, длительность, кнопка «Выбрать время»). LLM включает этот маркер после search_services.
[[slots:<serviceId>|<ISO1>,<ISO2>,...]]Day-picker: карусель дней + времена выбранного дня. LLM включает этот маркер после get_available_slots. Клик по времени → плашка «Подтвердить запись на HH:MM» без автосенда.
[[booking:<bookingId>]]Confirmation-карточка: детали записи + кнопка отмены. LLM включает этот маркер после book_appointment.
[[my-bookings]]Magic-link на /my?tab=bookings с одноразовым кодом по email клиента. Зеркало [[my-orders]].
[[pay:<orderId>]]Кнопка «💳 Оплатить» — для платной брони (см. commerce/agent-selling).

Day-picker в чате

Чтобы клиент мог быстро выбрать время, виджет агента поддерживает специальный режим day-picker:

  • Карусель дней (горизонтальный скролл) — каждый день: число + день недели + статус (свободно/занято).
  • Список времён выбранного дня.
  • Клик по времени → подсвечивает + появляется плашка «Подтвердить запись на 15:00». Никакого автосенда — клиент должен явно подтвердить.

В Telegram/VK картинка горизонтального скролла не поддерживается, поэтому слоты рендерятся как inline-keyboard с callback'ами: ряд кнопок «25.03 →», «26.03 →», по клику — кнопки времён.

VK: пагинация слотов. VK API лимитирует 10 inline-кнопок на сообщение. Виджет рендерит страницу из 8 кнопок-слотов + до 2 навигационных (← Назад / Дальше →), всего ≤10 кнопок. В заголовке указывается «стр. 2 / 3:» если страниц больше одной. Клик по слоту с любой страницы ведёт на ту же бронь — глобальный индекс сохраняется. Slot-view хранится в channelMeta.slotsView 24 часа; если за это время юзер не выбрал слот — виджет вернёт «слоты устарели, попроси показать заново» вместо устаревшей кнопки. Telegram-UX не изменился (TG не имеет 10-button лимита, рендерит все 30 слотов как было).

Промпт-блок

При наличии активных видимых услуг агенту автоматически добавляется блок в системный промпт с описанием доступных tools и правилами:

  • собирать email или телефон до вызова book_appointment (иначе ошибка);
  • предлагать ближайший слот сразу, не показывать «полотно» из 30 вариантов;
  • честно сообщать о платных услугах: «Это запись на массаж за 4000 ₽ — оформим оплату сейчас или хотите по карте на месте?» (зависит от requiresPayment и prepaymentPercent).

Это дополняется автоматически — вам не нужно прописывать это в свой prompt.

Пример диалога

Клиент: хочу к массажисту на этой неделе вечером

Агент: Ок, у нас есть три варианта на ближайшие три дня:

  • вт 18:00 — Маша
  • ср 19:00 — Маша
  • чт 18:30 — Аня

Какой подходит?

Клиент: ср 19:00

Агент: Записываю на среду 19:00 к Маше. На какое имя оформить и контакт для подтверждения?

Клиент: Николай, +7 999 ...

Агент: Готово. Часовой массаж, 4000 ₽. Оплачивайте по кнопке ниже — после оплаты бронь будет подтверждена. [[pay:ord_xyz]]

После оплаты клиенту приходит email с cancel-токеном; бронь в админке /account/bookings появляется в статусе confirmed.

Связанные разделы

На этой странице