@salutejs/scenario
Библиотека описания структры, матчинга и хендлеров пользовательского сценария.
npm i -S @salutejs/scenario
Словарь интентов и сущностей
Словарь описывается локально в файле с заданной схемой. В зависимости от типа рекогнайзера, словарь может синхронизроваться с удалённой моделью распознования.
./src/intents.ts
import { createIntents } from '@salutejs/scenario';
export const intents = createIntents({
openItem: {
matchers: ['покажи', 'открой', 'открой номер'],
},
slotFilling: {
matchers: ['захвати яблок', 'захвати @number ялок'],
variables: {
number: {
required: true,
questions: ['Сколько яблок?', 'Сколько?'],
},
},
},
});
Пользовательский сценарий
import { createUserScenario } from '@salutejs/scenario';
const userScenario = createUserScenario({
OpenItemState: {
match: intent('OpenItem'),
handle: ({ req, res }) => {
const { number } = req.variables;
res.appendCommand({ type: 'OpenItem', payload: selectItem({ number })(req) });
},
},
slotFillingState: {
match: intent('slotFilling'),
handle: ({ res, req }) => res.setPronounceText(`Вы попросили ${req.variables.number} яблок`),
},
});
Матчеры
Хелперы декларативного описания условия выполнения хендела на поступивший запрос.
import { createMatchers, createUserScenario, SaluteRequest } from '@salutejs/scenario';
import { intents } from './intents';
const { match, intent, text, action, state, selectItem } = createMatchers<SaluteRequest, typeof intents>();
const userScenario = createUserScenario({
state1: {
match: match(intent('OpenItem'), state({ screen: 'main' }),
handle: () => {},
},
state2: {
match: text('да'),
handle: () => {},
},
state3: {
match: action('LOAD_DATA'),
handle: () => {},
},
});
Системный сценарий
NLP-платформа обладает набором специальных интентов, которые указывают на жизненный цикл смартапа: run_up
, close_app
. Кроме них случаются ситуации, когда фраза пользователя не попала ни под один матчер состояния. Грубо говоря, мы не поняли что хотел сказать пользователь. Такие состояние описываются в отдельном обработчике системного сценария.
import { createSystemScenario } from '@salutejs/scenario';
const systemScenario = createSystemScenario({
RUN_APP: ({ res }) => {
res.setPronounceText('Привет!');
},
CLOSE_APP: ({ res, session }) => {
db.save(session);
},
NO_MATCH: ({ res }) => {
res.setPronounceText('Я не понимаю');
},
});
SberDevices with :heart: