Security News
Node.js EOL Versions CVE Dubbed the "Worst CVE of the Year" by Security Experts
Critics call the Node.js EOL CVE a misuse of the system, sparking debate over CVE standards and the growing noise in vulnerability databases.
@sberdevices/assistant-client
Advanced tools
Assistant Client - это инструмент для встраивания Виртуального Ассистента (ВА) на различные поверхности.
Технически Assistant Client представляет собой интегрируемый в WebView JS-код, который связан биндингами с нативным кодом операционной системы. В режиме разработки используется реализация протокола на javascript (эмулирует среду Android), что позволяет запускать ассистент в браузере.
Установка:
$ npm install @sberdevices/assistant-client
import { createAssistant, createAssistantDev, AssistantAction, AssistantServerAction, AssistantCharacterCommand, AssistantNavigationCommand, AssistantSmartAppCommand, AssistantAppState } from '@sberdevices/assistant-client';
const initialize = (getState: AssistantAppState): {
getInitialData: () => AssistantCommands[];
on: ('start' || 'data', cb: (data?: AssistantCharacterCommand | AssistantNavigationCommand | AssistantSmartAppCommand) => void) => void;
sendData: (data: AssistantAction | AssistantServerAction) => void;
setGetState: (getState: () => AssistantAppState) => void;
} => {
if (process.env.NODE_ENV === 'development') {
return createAssistantDev({
url: 'wss://...', // стенд
surface: '...', // поверхность
channel: '...', // канал
getState,
initPhrase: 'Хочу попкорн', // фраза для запуска аппа
nativePanel: {
defaultText: 'Кутузовский д.32', // текст в панели
},
});
}
return createAssistant({ getState });
}
...
const assistant = initialize(() => state);
assistant.on('data', (command: AssistantNavigationCommand) => {
// подписка на команды ассистента, в т.ч. команда инициализации смартаппа
if (command.navigation) {
switch(command.navigation.command.direction) {
case 'UP':
window.scrollTo(0, 0);
break;
case 'DOWN':
window.scrollTo(0, 1000);
break;
...
}
}
...
});
const handleOnClick = () => {
// отправка ServerAction
assistant.sendData({ action_id: 'some_action_name' });
};
createAssistant
Создает экземпляр AssistantClient
, обязательный параметр getState
- функция, которая возвращает актуальное состояние смартаппа при каждом обращении к бэкенду.
createAssistantDev
Создает экземпляр AssistantClient
, добавляет на экран браузера панель с голосовым ассистентом, подобно устройствам. Панель позволяет вводить команды с клавиатуры и голосом. Также активируется озвучка ассистента.
Параметр | Dev only | Описание |
---|---|---|
getState* | [] | Функция, которая возвращает актуальное состояние смартаппа. |
url* | [x] | Стенд. |
userChannel* | [x] | Канал. |
surface* | [x] | Поверхность. |
initPhrase* | [x] | Текст команды для запуска смартаппа (закажи попкорн и т.п). |
nativePanel | [x] | Конфигурация панели ассистента. |
userId | [x] | Идентификатор пользователя. |
token | [x] | Токен. |
enableRecord | [x] | Флаг активации функции записи диалога (true/false). |
По-умолчанию, в режиме разработки, панель отрисовывается. Чтобы выключить панель ассистента в режиме разработки, необходимо установить значение null
, соответствующему параметру.
import { createAssistantDev } from '@sberdevices/assistant-client';
const assistant = createAssistantDev({ ..., nativePanel: null });
Первоначальный текст в панели ассистента конфигурируется установкой параметра defaultText
.
import { createAssistantDev } from '@sberdevices/assistant-client';
const assistant = createAssistantDev({ ..., nativePanel: { defaultText: 'Покажи 1' } });
В режиме разработке, в целях отладки и тестирования, есть возможность получить файл с записью разговора ассистента. По-умолчанию, эта возможность деактирована, для активаци необходимо установить значение параметра enableRecord: true
. В результате, на экране будут отрисованы кнопки управления записью диалога (start/stop/save).
import { createAssistantDev } from '@sberdevices/assistant-client';
createAssistantDev({
getState,
...
enableRecord: true
});
createRecordPlayer
- возвращает RecordPlayer
, предоставляет возможность воспроизведения диалога. Принимает два необязательных параметра - запись и объект window (для взаимодействия с assistant-client).
interface RecordPlayer {
/* проиграть следующую реплику, возвращает флаг наличия следующей реплики */
continue: () => boolean;
/* проиграть весь диалог до конца */
play: () => void;
/* Установить запись */
setRecord: (record: AssistantRecord) => void;
}
Пример интеграции с cypress:
import { createRecordPlayer } from '@sberdevices/assistant-client';
describe('Тест', () => {
it('Запуск аппа', () => {
cy.fixture('app_start.json').then((record) => {
cy.window().then((win) => {
const player = createRecordPlayer(record, win);
player.play();
});
});
});
);
Возвращает данные, полученные при инициализации смартаппа
Подписка на событие готовности ассистента к работе
Подписка на событие получения данных от бэкенда
Отправляет сервер-экшен, который будет передан бэкенду
Подменяет колбек, возвращаюший актуальное состояние приложения
AssistantAppState
Объект AssistantAppState
— текущее состояние смартаппа, которое не хранится в платформе или сценарии. То, что происходит на экране у пользователя и как пользователь может взамодействовать с смартаппа в конкретный момент времени - ответственность смартаппа. Assistant Client, в данном случае, некий буфер, который хранит состояние и предоставляет его платформе и сценарию смартапа.
Каждый раз, когда пользователь начинает говорить, Assistant Client вызывает коллбек getState, чтобы получить и передать бэкенду состояние экрана пользователя.
interface AssistantAppState {
/* Любые данные, которые могут потребоваться Backend'у для принятия решений */
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[key: string]: any;
item_selector?: {
ignored_words?: string[];
/* Список соответствий голосовых команд действиям в веб-приложении */
items: AssistantViewItem[];
};
}
interface AssistantViewItem {
/* Порядковый номер элемента, назначается смартаппом, уникален в рамках items */
number?: number;
/* Уникальный id элемента */
id?: string;
/* Ключевая фраза, которая должна приводить к данному действию */
title?: string;
/* Фразы-синонимы, которые должны быть расценены как данное действие */
aliases?: string[];
/* Сервер экшен, проксирует action обратно на бекэнд. */
server_action?: AssistantServerAction,
/* Экшен, выполяет действие от имени пользователя */
action?: AssistantAction;
/* Дополнительные данные для бэкенда */
[key: string]: any;
}
Например, когда пользователь говорит "Покажи 1", бэкенду нужно понимать что скрывается за единицей (какой элемент у пользователя пронумерован единицей). Ниже пример стейта, который позволяет понять бэкенду, что пользователь хочет чипсы.
{
item_selector: {
ignored_words: ["покажи"],
items: [
{ title: 'Кола' },
{ title: 'Сладкий попкорн' },
{ title: 'Соленый попкорн' },
{ title: 'Чипсы', number: 1 },
{ title: 'Начос', number: 2 },
{ title: 'Пиво', number: 3 }
]
}
}
AssistantAction
AssistantAction
- это действие, которое выполнит SDK от имени пользоваля: откроет ссылку или отправит сообщение в чат.
type AssistantAction = AssistantDeepLinkAction | AssistantTextAction;
interface AssistantTextAction {
type: 'text';
/* Строка из поля text будет отправлена в чат от имени пользователя */
text: string;
/* default = true, true если сообщение нужно отобразить в чате и отправить в бекэнд, false если сообщение нужно только отобразить в чате, и не отправлять на бекэнд */
should_send_to_backend?: boolean;
}
interface AssistantDeepLinkAction {
type: 'deep_link';
/* https ссылки будут открыты в браузере, а android-app://ru.sberbankmoblie/... - будут открыты в приложении */
deep_link: string;
}
AssistantServerAction
AssistantServerAction
- это любое сообщение, отправляемое от клиентской части приложения в бэкенд. Оно может быть как привязано к ui-элементу и приходить с бэка (в основном, для message-based аппов), так и формироваться самостоятельно фронтовой частью аппа при обработке событий внутри веб-вью аппа..
interface AssistantServerAction {
/* Тип сервер-экшена */
action_id: string;
/* любые параметры */
parameters?: Record<string, any>;
}
AssistantCharacterCommand
AssistantCharacterCommand
- информирует смартапп о текущем ассистенте.
interface AssistantCharacterCommand {
type: 'character';
character: {
id: 'sber' | 'eva' | 'joy';
};
}
AssistantNavigationCommand
AssistantNavigationCommand
- команда навигации пользователя по смартаппу. Большая часть навигационных команд может быть выполнена стандартным средствами Assistant Client. В платформе виртуального ассистента есть стандартные фразы, которые обрабатываются единым образом. Они обрабатываются и приходят одинаково для всех смартапов.
interface AssistantNavigationCommand {
/* Тип команды */
type: 'navigation';
/* Навигационная команда (направление навигации) */
navigation: { command: { direction: 'UP' | 'DOWN' | 'LEFT' | 'RIGHT' | 'FORWARD' | 'BACK' } };
}
AssistantSmartAppCommand
AssistantSmartAppCommand
- это команда для передачи смартаппу любых данных с бэкенда.
interface AssistantSmartAppCommand {
/* Тип команды */
type: 'smart_app_data';
/* Любые данные, которые нужны смартаппу */
smart_app_data: Record<string, any>;
}
Смартаппы должны корректно отображаться на разных устройствах (сбербокс, сберпоратал и др). Для этого, необходимо проверять смартапп на следующих разрешениях: 559x568, 768x400, 959x400, 1920x1080. Рекомендуется настроить эти разрешения на вкладке Devices Chrome.
FAQs
Модуль взаимодействия с виртуальным ассистентом
The npm package @sberdevices/assistant-client receives a total of 471 weekly downloads. As such, @sberdevices/assistant-client popularity was classified as not popular.
We found that @sberdevices/assistant-client demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Critics call the Node.js EOL CVE a misuse of the system, sparking debate over CVE standards and the growing noise in vulnerability databases.
Security News
cURL and Go security teams are publicly rejecting CVSS as flawed for assessing vulnerabilities and are calling for more accurate, context-aware approaches.
Security News
Bun 1.2 enhances its JavaScript runtime with 90% Node.js compatibility, built-in S3 and Postgres support, HTML Imports, and faster, cloud-first performance.