Бизнесу нужен понятный маршрут звонка: принять обращение, уточнить задачу и передать сотруднику сведения для ответа. Под заказ согласуем роль голосового помощника, сбор контакта, создание задачи в CRM и случаи перевода человеку.
УЧЕБНЫЙ ПРИМЕР
Голосовой приём обращений под заказ
Разработаем сценарий приёма звонка: уточнение задачи, контакт, сводка и передача сотруднику. В примере готовый учебный диалог создаёт локальную карточку без телефонии и распознавания речи.
Это ширина демонстрационного холста. Она не заменяет проверку настоящего устройства.
DEMO / voice-assistant
Голосовой приём обращений под заказ
Бизнесу нужен понятный маршрут звонка: принять обращение, уточнить задачу и передать сотруднику сведения для ответа. Под заказ согласуем роль голосового помощника, сбор контакта, создание задачи в CRM и случаи перевода человеку.
Открыть рабочую демонстрацию
Сценарная демонстрация
Запрос диагностики в автосервисе
Вымышленный учебный автосервис. Фиксированный учебный сценарий: локальная карточка и очередь, без настоящих звонков, сообщений, CRM и ИИ-генерации ответа.
Локальный голос для языка страницы недоступен; готовый ответ можно прочитать.
Озвучка готового текста возможна при наличии локального голоса. Микрофон, распознавание речи и телефония не используются.
Карточек создано в демо 0
- Номер
- —
- Тема
- —
- Отдел
- —
Структура демокарточки JSON
Посмотреть весь учебный диалог
- Клиент / учебная реплика
Хочу обратиться в автосервис: кондиционер перестал охлаждать. Можно подготовить запись на диагностику?
- Помощник / готовый ответ
Помогу подготовить запрос. Уточните автомобиль, удобный день и способ связи; время, состав и стоимость работ подтвердит сотрудник.
- Подтверждение в сценарии
У меня седан, кондиционер не охлаждает. Удобен будний день, контакт передам сотруднику.
Посмотреть код сценария
function transitionAssistant(current, action, scenario) {
const text = value => typeof value === 'string' && value.trim().length > 0 && value.length <= 2000;
if (!scenario || typeof scenario !== 'object' || Array.isArray(scenario) ||
!['client_initial', 'assistant_reply', 'client_confirmation', 'handoff_department'].every(key => text(scenario[key]))) {
throw new Error('SCENARIO_INVALID');
}
const source = scenario.ticket;
if (!source || typeof source !== 'object' || Array.isArray(source) ||
typeof source.id !== 'string' || !/^DEMO-[A-Za-z0-9_-]{1,64}$/.test(source.id) ||
!['call', 'message'].includes(source.channel) || !['high', 'standard'].includes(source.priority) ||
!text(source.topic) || !text(source.department) ||
['contact', 'details'].some(key => source[key] !== undefined && !text(source[key]))) throw new Error('SCENARIO_INVALID');
const initial = {status: 'idle', transcript: [], ticket: null, count: 0};
if (action === 'reset') return initial;
const state = current == null ? initial : current;
if (!['idle', 'received', 'replied', 'captured', 'assigned'].includes(state.status) ||
!Array.isArray(state.transcript) || ![0, 1].includes(state.count)) throw new Error('ASSISTANT_STATE');
const transcript = state.transcript.map(entry => ({speaker: entry.speaker, text: entry.text}));
if (action === 'start' && state.status === 'idle') {
return {status: 'received', transcript: [{speaker: 'client', text: scenario.client_initial}], ticket: null, count: 0};
}
if (action === 'reply' && state.status === 'received') {
transcript.push({speaker: 'assistant', text: scenario.assistant_reply}, {speaker: 'client', text: scenario.client_confirmation});
return {status: 'replied', transcript, ticket: null, count: 0};
}
if (action === 'capture' && ['captured', 'assigned'].includes(state.status) && state.ticket) {
return {status: state.status, transcript, ticket: {...state.ticket}, count: 1};
}
if (action === 'capture' && state.status === 'replied') {
const ticket = {};
['id', 'channel', 'topic', 'contact', 'details', 'department', 'priority'].forEach(key => {
if (source[key] !== undefined) ticket[key] = source[key];
});
const required=source.channel==='call'?['contact','vehicle','preferred_time']:['contact','delivery_address'];
const provided=Array.isArray(scenario.provided_fields)?scenario.provided_fields:[];
ticket.missing_fields=required.filter(key=>!provided.includes(key));
ticket.ready_to_execute=ticket.missing_fields.length===0;
ticket.handed_off=false;
ticket.status = 'captured';
return {status: 'captured', transcript, ticket, count: 1};
}
if (action === 'handoff' && state.status === 'captured' && state.ticket) {
return {status: 'assigned', transcript, ticket: {...state.ticket, department: scenario.handoff_department, status: 'assigned', assigned_to: 'operator', handed_off: true}, count: 1};
}
if (!['start', 'reply', 'capture', 'handoff'].includes(action)) throw new Error('ASSISTANT_ACTION');
throw new Error('ASSISTANT_ORDER');
}Для действий демо нужен JavaScript; описание будущего решения доступно без запуска.
Фиксированный учебный диалог из трёх реплик.
Пройти учебный диалог, создать карточку и проверить передачу в нужный отдел; при наличии локального голоса попробовать озвучку.
Задача в этом сценарии
Бизнесу нужен понятный маршрут звонка: принять обращение, уточнить задачу и передать сотруднику сведения для ответа. Под заказ согласуем роль голосового помощника, сбор контакта, создание задачи в CRM и случаи перевода человеку.
Как устроено решение
- В проекте определяем, какие вопросы помощник задаёт, какие сведения фиксирует и когда передаёт разговор сотруднику. Телефония, распознавание и голосовой провайдер выбираются и подключаются отдельно в согласованном объёме.
- Здесь показаны три заранее написанные реплики учебного автосервиса. По ним локально создаётся карточка с темой, описанием и назначением; реального звонка, распознавания и ИИ-генерации ответа нет.
- Готовую реплику можно озвучить, если в браузере доступен локальный голос для языка страницы. Микрофон не используется, а озвучка не является телефонным разговором.
Промежуточные материалы
- Исходная задача и ограничения → Бизнесу нужен понятный маршрут звонка: принять обращение, уточнить задачу и передать сотруднику сведения для ответа. Под заказ согласуем роль голосового помощника, сбор контакта, создание задачи в CRM и случаи перевода человеку.
- Состав решения → Фиксированный учебный диалог из трёх реплик.
- Проверка перед запуском → Пройти учебный диалог, создать карточку и проверить передачу в нужный отдел; при наличии локального голоса попробовать озвучку.
Что проверить перед запуском
- Пройти учебный диалог, создать карточку и проверить передачу в нужный отдел; при наличии локального голоса попробовать озвучку.
- До реального запуска согласовать каналы, провайдеров, условия согласия и работы с данными, CRM и правила передачи сотруднику; проверить согласованные сценарии.
Что входит в пример
- Фиксированный учебный диалог из трёх реплик.
- Локальная карточка DEMO с темой, условным обозначением контакта, деталями, отделом и приоритетом.
- Сценарная передача сотруднику и необязательная озвучка готовой реплики локальным голосом.
Технический паспорт
DevPilot 1.5.2 · Охват проверок, исходники и дата свидетельств
- Статус
- DEMO · Вымышленная компания и учебные данные
- Материалы
- Собственные HTML/CSS/SVG, исходники и локальные алгоритмы. Фотографии клиентов не используются.
- Обработка
- Демонстрация выполняется в браузере. Открытие примера не создаёт заявку или оплаченный проект.
- Доказательства
- Содержимое и локальные проверки отделены от реальной браузерной, хостинговой и коммерческой приёмки.