ИП Горелов Максим Николаевич 8 (915) 093-74-75
js скрипт - voximplant Входящий звонок
require(Modules.OpenAI); require(Modules.ElevenLabs); ////////// ProTalk const bot_id = 12345; const bot_token = 'XXXXXXXXXXXXXXXXXXXX'; const generateChatId = prefix => prefix + Math.random().toString(36).substring(2, 15); const chat_id = generateChatId('vox_'); ////////////////////////////////////////////////////////////////////////////// ////////// DO NOT TOUCH !!! const get_voximplant_bot_values = async (bot_id, bot_token) => { const url = 'https://eu1.api.pro-talk.ru/api/v1.0/get_voximplant_bot_values'; const data = { 'bot_id': bot_id, 'bot_token': bot_token, }; Logger.write(`get_voximplant_bot_values: ${url} ${bot_id} ${bot_token}`); return Net.httpRequestAsync(url, { headers: ["Content-Type: application/json"], method: 'POST', postData: JSON.stringify(data) }); }; const run_function = async (function_id, arguments) => { const url = 'https://eu1.api.pro-talk.ru/api/v1.0/run_function'; const data = { 'function_id': function_id, 'functions_base_id': 'appkq3HrzrxYxoAV8', 'bot_id': bot_id, 'bot_token': bot_token, 'arguments': arguments }; return Net.httpRequestAsync(url, { headers: ["Content-Type: application/json"], method: 'POST', postData: JSON.stringify(data) }); }; VoxEngine.addEventListener(AppEvents.CallAlerting, async ({ call }) => { const voximplant_bot_raw = await get_voximplant_bot_values(bot_id, bot_token); voximplant_bot_values = JSON.parse(voximplant_bot_raw.text); Logger.write('voximplant_bot_values: ' + JSON.stringify(voximplant_bot_values)); let realtimeAPIClient = undefined; let greetingPlayed = false; let player = undefined; let useOpenAIVoice = false; let openAIVoiceName = ''; // Проверяем, используем ли голос OpenAI if (voximplant_bot_values.voice_id && voximplant_bot_values.voice_id.includes('OpenAI:')) { useOpenAIVoice = true; openAIVoiceName = voximplant_bot_values.voice_id.replace('OpenAI: ', '').toLowerCase(); } else { // Параметры для ElevenLabs const pathParameters = { voice_id: voximplant_bot_values.voice_id, }; const queryParameters = { model_id: 'eleven_flash_v2_5', }; var ttsParameters = { pathParameters, queryParameters, keepAlive: true, }; } call.answer(); const callBaseHandler = () => { if (realtimeAPIClient) realtimeAPIClient.close(); VoxEngine.terminate(); }; call.addEventListener(CallEvents.Disconnected, callBaseHandler); call.addEventListener(CallEvents.Failed, callBaseHandler); const MODEL = "gpt-4o-realtime-preview"; const ON_WEB_SOCKET_CLOSE = (event) => { // Connection to OpenAI has been closed VoxEngine.terminate(); }; try { // Create realtime client instance realtimeAPIClient = await OpenAI.Beta.createRealtimeAPIClient({ apiKey: voximplant_bot_values.openai_api_key, model: MODEL, onWebSocketClose: ON_WEB_SOCKET_CLOSE }); // Настройка сессии в зависимости от выбранного голоса var session_update = { 'instructions': voximplant_bot_values.prompt, "input_audio_transcription": { "model": "gpt-4o-transcribe" } }; // Добавляем tools и tool_choice только если functions не null if (voximplant_bot_values.functions !== null) { session_update.tools = voximplant_bot_values.functions; session_update.tool_choice = "auto"; } if (useOpenAIVoice) { // Используем голос OpenAI session_update.voice = openAIVoiceName; // Отправляем медиа сразу в OpenAI realtimeAPIClient.sendMediaTo(call); } else { // Используем ElevenLabs session_update.modalities = ["text"]; } realtimeAPIClient.sessionUpdate(session_update); Logger.write('instructions: ' + voximplant_bot_values.prompt); const response = { instructions: `А теперь скажи так: "${voximplant_bot_values.hello}"` }; realtimeAPIClient.responseCreate(response); if (useOpenAIVoice) { // Логика для голосов OpenAI realtimeAPIClient.addEventListener(OpenAI.Beta.Events.WebSocketMediaEnded, (event) => { if (!greetingPlayed) { greetingPlayed = true; VoxEngine.sendMediaBetween(call, realtimeAPIClient); } }); } else { // Логика для ElevenLabs realtimeAPIClient.addEventListener(OpenAI.Beta.RealtimeAPIEvents.ResponseTextDone, (event) => { player.append(" ", true); if (!greetingPlayed) { greetingPlayed = true; call.sendMediaTo(realtimeAPIClient); } }); realtimeAPIClient.addEventListener(OpenAI.Beta.RealtimeAPIEvents.ResponseTextDelta, (event) => { if (player == undefined) { player = ElevenLabs.createRealtimeTTSPlayer(event.data.delta, ttsParameters); player.sendMediaTo(call); } else { player.append(event.data.delta); } }); realtimeAPIClient.addEventListener(OpenAI.Beta.RealtimeAPIEvents.InputAudioBufferSpeechStarted, (event) => { if (player != undefined) player.clearBuffer(); }); } realtimeAPIClient.addEventListener(OpenAI.Beta.RealtimeAPIEvents.ResponseFunctionCallArgumentsDone, async (event) => { Logger.write(`RealtimeAPIEvents: ${event.data.arguments}`); try { const args = JSON.parse(event.data.arguments); Logger.write(`RealtimeAPIEvents args: ${args}`); const res = await run_function(args.function_id, args); Logger.write('run_function res: ' + JSON.stringify(res, null, 2)); var response = { 'instructions': 'Вот результат выполнения функции: `\n' + JSON.stringify(res, null, 2) + '`\nИспользуй эту информацию для ответа, но не воспроизводи её дословно.' }; if (voximplant_bot_values.log) { var now = new Date(); var dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${now.getHours()}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`; args_log = { url: voximplant_bot_values.log, sheet_number: 1, row_to_append: `${dateStr};;${chat_id};; ;;${event.data.arguments};;${JSON.stringify(res, null, 2)};;Voximplant;;${bot_id}`, next_question: '' } const res_log = await run_function(182, args_log); } realtimeAPIClient.responseCreate(response); } catch (error) { Logger.write('Error RealtimeAPIEvents: ' + error.message); } }); } catch (error) { Logger.write(error); VoxEngine.terminate(); } });
Пример кода для Google AppScript
function runVoximplantCall() { var vox_cred = { "account_email": "user@mail.com", "account_id": 3333333, "key_id": "22520be0-1a99-4c09-a155-770776366657", "private_key": "-----BEGIN PRIVATE KEY-----XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-----END PRIVATE KEY-----\n" } // URL вашего API var url = "https://eu1.api.pro-talk.ru/api/v1.0/run_voximplant_call_post"; // Европейский сервер // var url = "https://us1.api.pro-talk.ru/api/v1.0/run_voximplant_call_post"; // Сервер в США (альтернативный вариант) // Данные для отправки в API var payload = { "vox_cred": vox_cred, // Учетные данные Voximplant "phone": "7912XXXXXXX", // Номер телефона, на который будет совершен звонок "bot_id": 12345, // ID бота, который будет использоваться для звонка "bot_token": "XXXXXXXXXXXXXXXXXXXXXXX", // Токен бота для аутентификации "elevellabs_api": "XXXXXXXXXXXXXXXXXXXXXX", // API ключ для Elevellabs (синтез речи) "elevellabs_voice_id": "XXXXXXXXXXXXXX", // ID голоса для синтеза речи "hello_text": "Привет! Это консультант по расчету стоимости установки окон - Олег", // Текст, который будет произнесен при звонке "rule_id": 7654321 // ID правила для обработки звонка в Voximplant }; // Опции для HTTP-запроса var options = { "method": "post", // Метод запроса (POST) "contentType": "application/json", // Тип содержимого (JSON) "payload": JSON.stringify(payload) // Преобразуем данные в JSON-строку }; // Отправка запроса на сервер var response = UrlFetchApp.fetch(url, options); // Логирование ответа от сервера Logger.log(response.getContentText()); // Выводим ответ в лог для отладки }
Интеграция ProTalk + Voximplant + ElevenLabs + Google AppScript
С помощью интеграции с Voximplant и Google AppScript вы можете легко настроить автоматические звонки для своих клиентов. Это идеальное решение для:
Оповещений о заказах, доставках или важных событиях.
Продаж — бот может звонить клиентам и предлагать товары или услуги.
Поддержки — напоминания, консультации и ответы на вопросы в режиме реального времени.
Настройте бота на платформе ProTalk. Используйте готовый Google AppScript для запуска звонков через Voximplant. Бот звонит клиенту, произносит заданный текст (например, приветствие или информацию о заказе) и может взаимодействовать с клиентом через голосовое меню. Простота настройки: Готовый шаблон для Google AppScript.
Гибкость: Настройте текст, голос и сценарий звонка под свои задачи.
Интеграция: Работает с Voximplant и синтезом речи от Elevellabs.
Автоматизация: Ваш бот звонит сам, экономя ваше время и ресурсы.
Теперь можно проводить телефонные опросы с ИИ-ботом прямо из Google Таблиц!
Связка Voximplant + ProTalk позволяет автоматизировать звонки и собирать ответы респондентов напрямую в Google Таблицу — без лишних действий!
Как это работает? Настраиваете сценарий звонка в Voximplant (можно с ИИ-ассистентом).
Запускаете опрос из Google Таблицы через ProTalk.
Получаете ответы респондентов в эту же таблицу — удобно анализировать!
Плюсы: Автоматизация — никаких ручных обзвонов.
Интеграция — все данные сразу в таблице.
Гибкость — можно кастомизировать сценарии.
js скрипт - voximplant Входящий звонок
require(Modules.OpenAI); require(Modules.ElevenLabs); ////////// ProTalk const bot_id = 29102; const bot_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; const generateChatId = prefix => prefix + Math.random().toString(36).substring(2, 15); const chat_id = generateChatId('vox_'); ////////////////////////////////////////////////////////////////////////////// ////////// DO NOT TOUCH !!! const get_voximplant_bot_values = async (bot_id, bot_token) => { const url = 'https://eu1.api.pro-talk.ru/api/v1.0/get_voximplant_bot_values'; const data = { 'bot_id': bot_id, 'bot_token': bot_token, }; Logger.write(`get_voximplant_bot_values: ${url} ${bot_id} ${bot_token}`); return Net.httpRequestAsync(url, { headers: ["Content-Type: application/json"], method: 'POST', postData: JSON.stringify(data) }); }; const run_function = async (function_id, arguments) => { const url = 'https://eu1.api.pro-talk.ru/api/v1.0/run_function'; const data = { 'function_id': function_id, 'functions_base_id': 'appkq3HrzrxYxoAV8', 'bot_id': bot_id, 'bot_token': bot_token, 'arguments': arguments }; return Net.httpRequestAsync(url, { headers: ["Content-Type: application/json"], method: 'POST', postData: JSON.stringify(data) }); }; VoxEngine.addEventListener(AppEvents.CallAlerting, async ({ call }) => { const voximplant_bot_raw = await get_voximplant_bot_values(bot_id, bot_token); voximplant_bot_values = JSON.parse(voximplant_bot_raw.text); Logger.write('voximplant_bot_values: ' + JSON.stringify(voximplant_bot_values)); let realtimeAPIClient = undefined; let greetingPlayed = false; let player = undefined; const pathParameters = { voice_id: voximplant_bot_values.voice_id, }; const queryParameters = { model_id: 'eleven_flash_v2_5', }; const ttsParameters = { pathParameters, queryParameters, keepAlive: true, }; call.answer(); const callBaseHandler = () => { if (realtimeAPIClient) realtimeAPIClient.close(); VoxEngine.terminate(); }; call.addEventListener(CallEvents.Disconnected, callBaseHandler); call.addEventListener(CallEvents.Failed, callBaseHandler); const MODEL = "gpt-4o-realtime-preview"; const ON_WEB_SOCKET_CLOSE = (event) => { // Connection to OpenAI has been closed VoxEngine.terminate(); }; try { // Create realtime client instance realtimeAPIClient = await OpenAI.Beta.createRealtimeAPIClient({ apiKey: voximplant_bot_values.openai_api_key, model: MODEL, onWebSocketClose: ON_WEB_SOCKET_CLOSE }); // Disable audio generation by specifying modalities var session_update = { 'instructions' : voximplant_bot_values.prompt, "modalities": ["text"], "input_audio_transcription": { "model": "gpt-4o-transcribe" //"whisper-1" }, "tools": voximplant_bot_values.functions, "tool_choice": "auto" }; realtimeAPIClient.sessionUpdate(session_update); // Force the agent to start the conversation Logger.write('instructions: ' + voximplant_bot_values.prompt); const response = { instructions: `А теперь скажи так: "${voximplant_bot_values.hello}"` }; realtimeAPIClient.responseCreate(response); // Full response text has been received realtimeAPIClient.addEventListener(OpenAI.Beta.RealtimeAPIEvents.ResponseTextDone, (event) => { // Flush ElevenLabs buffer to playback what's left in it player.append(" ", true); if (!greetingPlayed) { greetingPlayed = true; // Start sending media to OpenAI call.sendMediaTo(realtimeAPIClient); } }); realtimeAPIClient.addEventListener(OpenAI.Beta.RealtimeAPIEvents.ResponseFunctionCallArgumentsDone, async (event) => { // Check the function name and act accordingly Logger.write(`RealtimeAPIEvents: ${event.data.arguments}`); try { const args = JSON.parse(event.data.arguments); Logger.write(`RealtimeAPIEvents args: ${args}`); const res = await run_function(args.function_id, args); Logger.write('run_function res: ' + JSON.stringify(res, null, 2)); var response = { 'instructions': 'Вот результат выполнения функции: `\n' + JSON.stringify(res, null, 2) + '`\nИспользуй эту информацию для ответа, но не воспроизводи её дословно.' }; ///////////////// Write in LOG if (voximplant_bot_values.log) { var now = new Date(); var dateStr = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${now.getHours()}:${String(now.getMinutes()).padStart(2, '0')}:${String(now.getSeconds()).padStart(2, '0')}`; args_log = { url: voximplant_bot_values.log, sheet_number: 1, row_to_append: `${dateStr};;${chat_id};; ;;${event.data.arguments};;${JSON.stringify(res, null, 2)};;Voximplant;;${bot_id}`, next_question: '' } const res_log = await run_function(182, args_log); } ////////////////// realtimeAPIClient.responseCreate(response); } catch (error) { Logger.write('Error RealtimeAPIEvents: ' + error.message); } }); realtimeAPIClient.addEventListener(OpenAI.Beta.RealtimeAPIEvents.ResponseTextDelta, (event) => { if (player == undefined) { // Create real-time TTS player using ElevenLabs as the provider player = ElevenLabs.createRealtimeTTSPlayer(event.data.delta, ttsParameters); player.sendMediaTo(call); } else player.append(event.data.delta); }); // VAD on OpenAI's side has detected input speech realtimeAPIClient.addEventListener(OpenAI.Beta.RealtimeAPIEvents.InputAudioBufferSpeechStarted, (event) => { // Stop TTS playback if input speech has been detected if (player != undefined) player.clearBuffer(); }); } catch (error) { // Something went wrong Logger.write(error); VoxEngine.terminate(); } });
JS - VOXIMPLANT исХОДЯЩИЙ ЗВОНОК ИИ АГЕНТУ
require(Modules.ASR); const generateChatId = prefix => prefix + Math.random().toString(36).substring(2, 15); let askURL = 'https://api.chatforyou.ru/api/v1.0/ask/XXXXXXXXXXXXXXXXXX'; // Европа //let askURL = 'https://api.chatforyou.ru/api/v1.0/ask/XXXXXXXXXXXXXXX'; // США let bot_id = 0; let elevellabs_api_key = 'XXXXXXXXXXXXXXXXXXXXXXXXX'; let elevellabs_voice = 'XXXXXXXXXXXX'; let hello_text = 'Добрый день!'; let chat_id; let ai_busy = false; let dialog_started = false; let call, asr; let isPlayingResponse = false; // Флаг для отслеживания воспроизведения ответа // List of universal phrases const universalPhrases = [ 'Одну минутку, я обдумаю свой ответ.', 'Хорошо, я вас услышал!', 'Да, да, мне понятен ваш вопрос!', 'Понятно, секундочку.', 'Мне нужно немного времени на ответ.', 'Еще немного, я скоро отвечу.', 'Ваш запрос обрабатывается, пожалуйста, подождите.', 'Дайте мне минутку подумать над ответом.', 'Собираю информацию для ответа на ваш вопрос.', 'Подождите минутку, я дам развернутый ответ', 'Ммм_ окей.', 'Ага, да да.', 'Ээээ, да, я понял.', 'Да, услышал.', 'Да, принято.', ]; // Функция для выполнения API-запроса в фоновом режиме function startDialog() { if (!dialog_started) { dialog_started = true; requestCompletion('🏁') .then(res => { if (res.code === 200) { const jsData = JSON.parse(res.text); // Обработка ответа от API, если нужно Logger.write(`API response: ${jsData.done}`); } }) .catch(error => { Logger.write(`Error during API call: ${error}`); }); } } // Function to shuffle an array using Fisher-Yates algorithm function shuffle(array) { let shuffled = array.slice(); for (let i = shuffled.length - 1; i > 0; i--) { let j = Math.floor(Math.random() * (i + 1)); [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; } return shuffled; } // Initialize shuffled phrases and index let shuffledPhrases = shuffle(universalPhrases); let phraseIndex = 0; // Function to send a random universal phrase without repetition function sendRandomPhrase(call) { if (phraseIndex >= shuffledPhrases.length) { shuffledPhrases = shuffle(universalPhrases); phraseIndex = 0; } const phrase = shuffledPhrases[phraseIndex]; phraseIndex++; Logger.write(`sendRandomPhrase: ${phrase}`); sendMessageText(call, phrase); } function sendMessageText(call, text) { const textToSynthesize = encodeURIComponent(text); var tts_url = `https://api.chatforyou.ru/api/v1.0/tts?token=dai-tts-3605ae6627c857bbaa9c249864522b8a&voice=${elevellabs_voice}&text=${textToSynthesize}&apikey=${elevellabs_api_key}`; Logger.write(`tts_url: ${tts_url}`); const speechSynthesisApiUrl = tts_url; Net.httpRequest(speechSynthesisApiUrl, (res) => { if (res.code === 200) { let audioUrl = res.text; Logger.write(res.code + " sendMessage: " + text); if (call && call.startPlayback) { call.startPlayback(audioUrl); } else { Logger.write("Ошибка: объект call не инициализирован или недоступен."); } } else { Logger.write(`Ошибка: ${text} - ${res.code} - ${res.text}`); } }, {method: 'GET'}); return 'OK'; }; const sendMessage = (call, text) => { call.startPlayback(text); return 'OK'; }; const requestCompletion = async message => { return Net.httpRequestAsync(askURL, { headers: ["Content-Type: application/json"], method: 'POST', postData: JSON.stringify({ bot_id, chat_id, message, audio: `ElevenLabs: ${elevellabs_voice}`, elevellabs_api_key: elevellabs_api_key, }) }); }; const handleASRResult = async e => { if (!isPlayingResponse) { // Проверяем, идет ли воспроизведение ответа sendRandomPhrase(call); if (!ai_busy) { ai_busy = true; const startTime = Date.now(); const res = await requestCompletion(e.text); if (res.code === 200) { const jsData = JSON.parse(res.text); isPlayingResponse = true; // Устанавливаем флаг перед воспроизведением ответа sendMessage(call, jsData.done); } ai_busy = false; // Ensure ai_busy is set to false after response } } call.sendMediaTo(asr); }; const handleCallConnected = async () => { sendMessageText(call, hello_text); startDialog(); call.sendMediaTo(asr); }; // Обработчик окончания воспроизведения аудио const handlePlaybackFinished = () => { isPlayingResponse = false; // Сбрасываем флаг после завершения воспроизведения Logger.write("Playback finished, resetting isPlayingResponse flag."); }; // Функция для инициализации исходящего звонка const makeOutboundCall = (phone, script_id, bot_token, bot_hello, elevellabs_api, elevellabs_voice_id) => { chat_id = generateChatId('vox_'); askURL = askURL + bot_token; bot_id = script_id; hello_text = bot_hello; elevellabs_api_key = elevellabs_api; elevellabs_voice = 'voice_id:' + elevellabs_voice_id; Logger.write(`Making outbound call to ${phone} with script_id: ${script_id}`); // Инициализация ASR asr = VoxEngine.createASR({ profile: ASRProfileList.Google.ru_RU, singleUtterance: true }); asr.addEventListener(ASREvents.Result, handleASRResult); // Инициализация звонка call = VoxEngine.callPSTN(phone, '79014684884'); // 7901XXXXXXX - замените на ваш исходящий номер call.addEventListener(CallEvents.Connected, handleCallConnected); call.addEventListener(CallEvents.Disconnected, () => VoxEngine.terminate()); call.addEventListener(CallEvents.PlaybackFinished, handlePlaybackFinished); }; // Обработка входящих параметров const handleCustomData = (customData) => { try { const data = JSON.parse(customData); const { phone, script_id, bot_token, bot_hello, elevellabs_api, elevellabs_voice_id } = data; Logger.write(`Received custom data: phone=${phone}, script_id=${script_id}`); makeOutboundCall(phone, script_id, bot_token, bot_hello, elevellabs_api, elevellabs_voice_id); } catch (error) { Logger.write(`Error parsing custom data: ${error}`); VoxEngine.terminate(); } }; // Обработчик события запуска сценария VoxEngine.addEventListener(AppEvents.Started, () => { Logger.write("Scenario started. Checking for custom data..."); // Получаем customData через VoxEngine.customData() const customData = VoxEngine.customData(); if (customData) { Logger.write(`Custom data received: ${customData}`); handleCustomData(customData); } else { Logger.write("No custom data provided. Terminating."); VoxEngine.terminate(); } });
промпт - оператор телефонных опросов
Цель: Твоя цель - запустить телефонный опрос. Роль: Ты - женщина. Тебя зовут - Анна Ты работаешь в должности - Оператор телефонных опросов Ты - Анна, ты дружелюбная и внимательная девушка. Поведение: 1. Из предоставленной тебе переписки возьми только один контакт клиента (если их несколько, то бери первый контакт в списке). 2. Запусти функцию `ask_question_by_phone` со следующими параметрами: ``` "employee_id": 3671, "voxapikeys_url": "https://АДРЕС_КУДА_СОХРАНИТЕ_СКРИПТ_ДЛЯ_VOXIMPLANT/DialogAI_skgpt.json", "rule_id": 3702231, "role": "Ты женщина, ты менеджер по сбору обратной связи у клиентов. Задай строго последовательно два вопроса: 1. Вы довольны установкой рекламной вывески? 2. Вы будете рекомендовать нашу компанию знакомым?\n\nВеди диалог последовательно и задавай вопросы только по одному за раз.", "hello_text": "Добрый день! У вас будет пара минут для опроса?", "voice": "Rachel", ``` остальные параметры заполни самостоятельно. Внимание! При каждом моем обращении сразу вызывай функцию `ask_question_by_phone`, иначе то ты получишь штраф.
промпт - специалист по анализу данных в exel
Цель: Помочь с работой с таблицей по адресу: `https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxx/edit?usp=sharing` Роль: Ты - мужчина. Тебя зовут - Александр Ты работаешь в должности - Специалист по анализу данных в Excel Ты - опытный менеджер Google таблиц, готовый помочь с любыми задачами в таблицах. Поведение: 1. Будь внимателен к деталям при работе с таблицами. 2. Во всех датах первое число в дате это день, затем месяц. 3. Если тебе нужно получить данные из таблицы то передай `mode="?"`, если что-то изменить в таблице то `mode="."`. 4. При режиме `mode="?"` передавай в параметр `request` запрос: `Мне нужно имя и телефон клиента с которым еще не проводился опрос`. 5. При использовании режима `mode="."` сформируй JSON словарь, содержащий имя клиента, телефон клиента и ответы клиента на вопросы из диалога и передай его в параметр `request`. 6. Передавай очень внимательно ссылку на таблицу. 7. При чтении данных из таблицы выдай только имя и телефон первого клиента. ! При каждом моем обращении вызывай функцию работы с таблицей.
промпт - руководитель отдела телефонных опросов
Цель: Твоя цель запустить цепочку задач и следовать четко по этому чек-листу: ``` 1. Передать такой запрос Александру [3672]: `Дай мне один контакт клиента из твоей таблицы у которого еще не собиралась обратная связь`. 2. Передать такой запрос Анне [3671]: `Запусти телефонный опрос с выбранным клиентом`. 3. Попроси Александра [3672] записать в таблицу ответы клиента. ``` Строго следуй очередности в выбранной цепочке задач и передавай подзадачи от одного помощника к другому при помощи вызова функции: `send_taks_to_assistant`. Роль: Ты - мужчина. Тебя зовут - Александр Ты работаешь в должности - Руководитель отдела по телефонным опросам клиентов Ты не отвечаешь на мои вопросы или сообщения, а только сразу передаешь дословно мои сообщения исполнителям. Список исполнителей: 1. Менеджер Александр (работает с таблицей клиентов в Google Sheets) 2. Оператор Анна (проведет телефонный опрос с клиентом) Поведение: Критически важные инструкции: 1. Максимально подробно объясняй задачу своему сотруднику. 2. Когда я скажу что утверждаю, сразу переходи к следующему сотруднику в цепочке задач. ! Перед каждым своим ответом проверяй очерёдность выполнения чек-листа шаг за шагом.
Пример кода для Google AppScript
function runVoximplantCall() { var vox_cred = { "account_email": "user@mail.com", "account_id": 3333333, "key_id": "22520be0-1a99-4c09-a155-770776366657", "private_key": "-----BEGIN PRIVATE KEY-----XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-----END PRIVATE KEY-----\n" } // URL вашего API var url = "https://eu1.api.pro-talk.ru/api/v1.0/run_voximplant_call_post"; // Европейский сервер // var url = "https://us1.api.pro-talk.ru/api/v1.0/run_voximplant_call_post"; // Сервер в США (альтернативный вариант) // Данные для отправки в API var payload = { "vox_cred": vox_cred, // Учетные данные Voximplant "phone": "7912XXXXXXX", // Номер телефона, на который будет совершен звонок "bot_id": 12345, // ID бота, который будет использоваться для звонка "bot_token": "XXXXXXXXXXXXXXXXXXXXXXX", // Токен бота для аутентификации "elevellabs_api": "XXXXXXXXXXXXXXXXXXXXXX", // API ключ для Elevellabs (синтез речи) "elevellabs_voice_id": "XXXXXXXXXXXXXX", // ID голоса для синтеза речи "hello_text": "Привет! Это консультант по расчету стоимости установки окон - Олег", // Текст, который будет произнесен при звонке "rule_id": 7654321 // ID правила для обработки звонка в Voximplant }; // Опции для HTTP-запроса var options = { "method": "post", // Метод запроса (POST) "contentType": "application/json", // Тип содержимого (JSON) "payload": JSON.stringify(payload) // Преобразуем данные в JSON-строку }; // Отправка запроса на сервер var response = UrlFetchApp.fetch(url, options); // Логирование ответа от сервера Logger.log(response.getContentText()); // Выводим ответ в лог для отладки }
ИП Горелов Максим Николаевич ИНН 500104951533 ОГРН 309500106900065