Бізнесу потрібен зрозумілий шлях дзвінка: прийняти звернення, уточнити завдання й передати співробітнику відомості для відповіді. На замовлення погодимо роль голосового помічника, збирання контакту, створення завдання в 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, вихідний код і локальні алгоритми. Фотографії клієнтів не використовуються.
- Обробка
- Демонстрація виконується в браузері. Відкриття прикладу не створює заявку чи оплачений проєкт.
- Докази
- Вміст і локальні перевірки відокремлені від справжнього браузерного, хостингового та комерційного приймання.