devpilot.
До вибору прикладів

НАВЧАЛЬНИЙ ПРИКЛАД

Помічник для повідомлень на замовлення

Розробимо помічника для відповідей за погодженою базою знань і фіксації звернень. У демо готовий діалог магазину створює локальну заявку й показує шлях до оператора.

DEMOБез вигаданих показників продажів
Полотно:

Це ширина демонстраційного полотна. Вона не замінює перевірку справжнього пристрою.

DEMO / message-assistant

Помічник для повідомлень на замовлення

Клієнту потрібна відповідь на його запитання, а співробітнику — контекст звернення й зрозумілий статус. На замовлення розробимо помічника для вибраного каналу, погодженої бази знань, фіксації ліда та передавання оператору.

Відкрити робочу демонстрацію
ПОВІДОМЛЕННЯ / СЦЕНАРІЙDEMO

Сценарна демонстрація

Уточнення адреси навчального замовлення

Вигаданий навчальний інтернет-магазин. Фіксований навчальний сценарій: локальна картка й черга, без справжніх дзвінків, повідомлень, CRM і ШІ-генерації відповіді.

    Карток створено в демо 0

    Структура демокартки JSON
    Переглянути весь навчальний діалог
    1. Клієнт / навчальна репліка

      Можна перевірити адресу доставки й змінити її до відправлення замовлення?

    2. Помічник / готова відповідь

      Підготую запит до відділу доставки. Укажіть номер замовлення та що потрібно змінити; співробітник перевірить стан замовлення й можливість зміни.

    3. Підтвердження в сценарії

      Навчальне замовлення ORDER-DEMO-24: прошу перевірити зміну адреси до відправлення. Нову адресу й контакт передам співробітнику.

    Переглянути код сценарію
    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; опис майбутнього рішення доступний без запуску.

    Лише текст, без HTML. Зміни залишаються у вкладці.

    Завдання в цьому сценарії

    Клієнту потрібна відповідь на його запитання, а співробітнику — контекст звернення й зрозумілий статус. На замовлення розробимо помічника для вибраного каналу, погодженої бази знань, фіксації ліда та передавання оператору.

    Як побудовано рішення

    • Для робочого рішення погодимо джерела відповідей, межі самостійної обробки та випадки передавання людині. Відомості про доставку, повернення й інші умови підтверджує бізнес.
    • У демонстрації використовуються три готові репліки про зміну адреси навчального замовлення. Відповідь написана заздалегідь: тут немає читання справжньої бази знань, підключення месенджера чи генерації моделлю.
    • Із сценарію збирається локальна картка з деталями й відділом доставки. Її статус і передавання співробітнику можна вивчити в демо, не надсилаючи справжнього повідомлення.

    Проміжні матеріали

    1. Початкове завдання та обмеження → Клієнту потрібна відповідь на його запитання, а співробітнику — контекст звернення й зрозумілий статус. На замовлення розробимо помічника для вибраного каналу, погодженої бази знань, фіксації ліда та передавання оператору.
    2. Склад рішення → Фіксований навчальний діалог магазину з трьох реплік.
    3. Перевірка перед запуском → Пройти діалог, звірити картку з репліками й перевірити призначення співробітнику без справжнього надсилання.

    Що перевірити перед запуском

    • Пройти діалог, звірити картку з репліками й перевірити призначення співробітнику без справжнього надсилання.
    • Для робочого бота підтвердити базу знань, канал, правила даних і статусів, підключення CRM та умови передавання оператору.

    Що входить у приклад

    • Фіксований навчальний діалог магазину з трьох реплік.
    • Локальна картка DEMO з описом запиту й позначенням контакту.
    • Зрозуміле призначення відділу та сценарій передавання оператору.

    Технічний паспорт

    DevPilot 1.5.2 · Охоплення перевірок, вихідний код і дата свідчень

    Статус
    DEMO · Вигадана компанія й навчальні дані
    Матеріали
    Власні HTML/CSS/SVG, вихідний код і локальні алгоритми. Фотографії клієнтів не використовуються.
    Обробка
    Демонстрація виконується в браузері. Відкриття прикладу не створює заявку чи оплачений проєкт.
    Докази
    Вміст і локальні перевірки відокремлені від справжнього браузерного, хостингового та комерційного приймання.