Статус: техническое задание для сообщества / контрибьюторов. Цель: создать один эталонный, реально работающий проект-витрину, который демонстрирует все ключевые возможности
umbotв связке и служит живым примером «как правильно». Это то, что разработчик клонирует и запускает за 2 минуты, чтобы понять ценность фреймворка.
Сейчас в examples/skills/ лежит набор изолированных демо (папка с index.ts, контроллером и README на каждое), каждое из которых показывает одну фичу. Это хорошо для справочника, но не даёт ответа на главный вопрос нового пользователя: «как выглядит настоящий бот целиком?».
Отдельного демо-проекта нет — его роль частично играет CLI-шаблон (npx umbot create) и визуальный редактор. Но шаблон намеренно минимален, а редактор требует внешнего сервиса.
Нужен один законченный продукт: многокомандный бот с диалогами, формами, состоянием, кнопками, карточками и middleware, который можно запустить локально и сразу «пощупать» в консоли через BotTest.
«Кофейня-бот» — бот-бариста, который:
userData;fullPlatforms.Домен «кофейни» выбран потому, что в нём естественно возникают команды, шаги, формы, состояние и карточки — все ключевые примитивы фреймворка.
| Команда | Слоты | Поведение |
|---|---|---|
welcome |
привет, здравствуй |
Приветствие + кнопки меню |
menu |
меню, карта |
Карточка-галерея напитков |
order |
заказ, заказать, хочу кофе |
Запуск формы заказа |
favorite |
любимый, мой напиток |
Показать любимый напиток из userData |
help |
помощь, что ты умеешь |
Список команд |
FALLBACK_COMMAND |
— | Дружелюбный ответ + подсказка «помощь» |
addForm)Поля:
drink — «Что будете пить?» + валидация по списку (кофе, чай, какао);size — «Какой объём?» + валидация (маленький, средний, большой);name — «На чьё имя?» + валидация непустой строки.onComplete: сохранить заказ в userData.history, обновить userData.favorite, подтвердить заказ текстом с кнопкой «Ещё заказ».
Отдельный шаг confirm_favorite (addStep): если у пользователя уже есть любимый напиток,
бот сначала спрашивает «как обычно?» и при подтверждении повторяет последний заказ.
userData)interface ICoffeeOrder {
drink: string; // напиток
size: string; // объём
name: string; // имя
total: number; // итоговая сумма (0, если сработала лояльность)
ts: number; // время оформления (unix-мс)
}
interface ICoffeeUserData extends IUserData {
favorite?: string;
history?: ICoffeeOrder[];
}
Использовать дженерик Bot<ICoffeeUserData> (в server.ts), чтобы показать
типобезопасный доступ к ctx.userData. В command-only режиме тот же тип
прокидывается в колбэки команд через addCommand<BotController<ICoffeeUserData>>
(псевдоним CoffeeCtx), поэтому отдельный класс-контроллер не требуется.
YANDEX.CONFIRM (Nlu.T_INTENT_CONFIRM) с текстовым фолбэком
(«да», «конечно» и т.п. через Text.isSayTrue) для консоли и чат-платформ;nlu / Text.bot.use(rateLimiter());
bot.use(requestId());
buttons.addBtn / addLink — меню, подтверждение;card.addImage / галерея — карточка меню;sound (опционально) — звук при завершении заказа для голосовых платформ.umbot-demo/
├── src/
│ ├── index.ts # ВСЯ логика бота: цепочка addCommand/addStep/addForm
│ │ # + подключение платформ, БД и middleware
│ ├── menu.ts # продуктовый слой: меню с ценами, размеры, итог,
│ │ # лояльность, оформление заказа (чистый TypeScript)
│ ├── config/
│ │ ├── appConfig.ts # IAppConfig
│ │ └── appParams.ts # IAppParam (запасные тексты, intents: null)
│ ├── types/
│ │ └── ICoffeeUserData.ts # типизация userData
│ ├── dev.ts # консольный режим (BotTest + bot.test())
│ └── server.ts # webhook-режим (Bot + bot.start())
├── tests/
│ └── coffee.test.ts # тесты через BotTest.simulate
├── package.json
├── tsconfig.json
├── jest.config.js
├── eslint.config.js
├── .gitignore
└── README.md
Стиль — только команды (без своего контроллера). Вся логика описана одной цепочкой
addCommand→addStep→addFormпрямо вindex.ts. Собственный класс-контроллер сaction()не нужен: фреймворк по умолчанию используетBaseBotController, а типизированныйuserDataдаёт дженерикBotController<ICoffeeUserData>в колбэках команд (см.CoffeeCtxвmenu.ts). Это рекомендуемый, самый простой путь для нового бота.
npm run dev → BotTest + bot.test() — интерактивная отладка без токенов и сети.npm start → Bot + bot.start() — для подключения к реальным платформам через токены из .env.umbot (текущая стабильная);typescript, @types/node (dev);FileAdapter из коробки (не требует установки Mongo). Опционально показать подключение MongoAdapter в комментарии.Покрыть через BotTest:
userData;favorite читает сохранённое значение;Использовать simulate() для кроссплатформенной проверки (минимум 2 платформы: alisa и telegram).
git clone → npm install → npm run dev (3 команды).BotTest..env, токены).userData, кнопки, карточки, NLU, middleware, fallback.userData через дженерик Bot<T>.npm test), покрытие ключевых сценариев.npm run build и npm run lint чистые.