This page is machine-translated from the Russian original. If something reads oddly, the Russian version is the source of truth — open an issue.
umbot is a TypeScript framework for building voice skills and chatbots. It gives you a single business logic for all
platforms — yet it is just as effective if you work with only one.
Supported out of the box: Yandex Alice, Sber Salute (SmartApp), as well as Telegram, VK, MAX and Viber.
There is a separate adapter for existing Marusia skills.
Unlike most solutions that require a separate implementation for each platform, umbot abstracts the differences in
request and response formats, giving the developer a single, predictable interface. This lets you write the logic once
— and run it everywhere.
The framework follows SemVer. Breaking changes are possible only in MAJOR versions.
English: documentation in English (machine-translated from Russian).
umbot?No more writing several versions of the same application.
No more digging into the JSON formats of Alice, Sber, Marusia, Telegram, MAX and so on.
One business logic. Any platform.
Key benefits:
umbot recommends
uploading the resources you need in advance with the Preload class.The key idea:
umbotis not a "multi-platform add-on" but a base layer that makes development for any platform (even a single one) faster, cleaner and ready to scale.
umbot provides a unified interface for building responses while taking each platform's specifics into account:
AlisaAdapter.This approach guarantees that your skill/bot behaves predictably and needs no special workarounds when moving between platforms.
umbot different from other solutions?Most frameworks (for example, telegraf, alice-sdk, etc.) target only one platform. To
run an application both in Alice and in Telegram, you have to:
umbot solves this problem:
one business logic for all platforms,
a single API for buttons, cards, voice and text,
automatic adaptation to each platform's format "under the hood".
This is especially valuable if you already maintain an Alice skill and want to move quickly to Sber Salute, Telegram, MAX or VK — without rewriting or substantially reworking the code.
Even if you develop for a single platform for now, umbot saves you from boilerplate, gives you a single API for
state, buttons and media, and, most importantly, does not get in the way when it is time to add new channels.
umbot for?umbot is not just a wrapper for several platforms. It is an architectural solution for projects where the user initiates
the dialog. It is equally valuable for one platform and for a dozen.
You will use umbot if:
umbot makes extension predictable.umbot lets you write the core once and forget about boilerplate.| Platform | Identifier | What is supported |
|---|---|---|
| Yandex Alice | alisa |
The skills protocol: text, TTS, buttons, cards, sounds, state, authorization |
| Sber Salute | smart_app |
The SmartApp API protocol: text, speech, buttons, cards, state |
| Telegram | telegram |
The basic set: text, buttons (inline and reply), photos and media groups, voice, callback, inline queries, message events |
| VK | vk |
The basic set: text, keyboard, carousel, voice, callback buttons |
| MAX | max_app |
The basic set: text, inline keyboard, images, audio, callback, the bot_started deep link |
| Viber | viber |
The basic set: text, keyboard, rich media. Since 2024 Viber bots are created only on commercial terms |
| Marusia | marusia |
The skills protocol. VK stopped accepting new skills (20.12.2024) — existing skills only |
| Your platform | ... |
Through adapters |
For messengers, the "basic set" is what makes sense in shared logic across all platforms. Platform-specific features
(polls, payments, message editing, etc.) are not abstracted by the framework, but they are available directly: through
controller.api and the platform API clients (TelegramRequest, VkRequest, MaxRequest, ViberRequest from
umbot/plugins; each has a universal call(method) method).
Platforms are connected via a webhook, and Telegram, VK and MAX also via long polling:
bot.startPolling() instead of bot.start(), and you need neither HTTPS nor a tunnel to check the bot on your local machine.
Alice, Marusia, SmartApp and Viber need a webhook (for local checks, a tunnel such as ngrok). Without a network you can
check the logic in the console with BotTest. One command enables webhook signature verification for Telegram and MAX:
npx umbot webhook <telegram|max> <https-url>, and npx umbot doctor checks tokens, .env and the webhook
status.
Need your own platform?
Create an adapter scaffold withnpx umbot add platform <Name>— it compiles and passes its own test right away, and the places for the platform API are markedTODO. A DB adapter (add db) and middleware (add middleware) are created the same way.
This lets you integrateumbotinto any internal system or corporate messenger, or support any other platform, for example WhatsApp or WeChat.
Separate npm packages that connect with one line via bot.use(). The core stays lightweight: DBMS drivers and
third-party platform APIs are installed only by those who need them.
| Package | Purpose |
|---|---|
| umbot-knex-adapter | Relational databases via Knex.js: PostgreSQL, MySQL/MariaDB, SQLite, MSSQL |
| umbot-ydb-adapter | YDB (Yandex Database): storage for skills and bots in Yandex Cloud Functions, tables are created automatically |
| umbot-wechat-adapter | WeChat Official Account (Weixin) |
npm install umbot umbot-knex-adapter knex pg
import { Bot } from 'umbot';
import { TelegramAdapter } from 'umbot/plugins';
import { KnexAdapter } from 'umbot-knex-adapter';
const bot = new Bot()
.use(new TelegramAdapter(process.env.TELEGRAM_TOKEN))
.use(new KnexAdapter({ host: 'localhost', database: 'bot_db', options: { client: 'pg' } }));
Want to write your own adapter? Specifications with contracts and readiness checklists:
Install the framework:
npm install umbot
Create and run a project in five commands:
npx umbot create echo
cd echo
npm i
npm run build
npm start
Adjust the files to your needs. For example:
// index.ts
import { Bot } from 'umbot';
import { fullPlatforms } from 'umbot/plugins';
import { EchoController } from './controller/EchoController';
const bot = new Bot()
.use(fullPlatforms)
.setAppConfig({ json: './data', isLocalStorage: true })
.initBotController(EchoController);
bot.start('localhost', 3000);
// EchoController.ts
import { BotController, WELCOME_INTENT_NAME } from 'umbot';
export class EchoController extends BotController {
public action(intentName: string | null): void {
if (intentName === WELCOME_INTENT_NAME) {
this.text = 'Hi! I repeat after you.';
} else {
this.text = `You said: ${this.userCommand}`;
}
}
}
Test the application and publish it if needed.
👉 A detailed getting started guide
In stress tests on standard hardware (AMD Ryzen 5 5600G, Windows 10), with 1003 commands the framework shows:
Important:
Long-running testing (48 hours) revealed no memory leaks or performance degradation: the average throughput in the sequential scenario stayed at ~67 000 RPS, and memory usage was stable.
Detailed documentation is available in the following sections:
Umbot Flow is a visual editor for building bots on the umbot framework. Assemble the logic on a canvas, export the JSON configuration and generate a TypeScript project with the CLI.
The pipeline:
Visual editor → JSON configuration → npx umbot create from-flow → TypeScript project → Your server
Quick start with the editor:
flow.jsonnpx umbot create from-flow flow.json --output ./my-bot
my-bot folderJSON format description — the full specification of all node types, connections and code generation rules.
MIT License. See LICENSE for details.
If you have questions or suggestions:
Full reference — API v-3.1 · all versions.