Коли замовник просить голосового агента, який не тупить на паузах і не чекає три секунди перед відповіддю — стандартні IVR рішення відпадають. Ми зіткнулися з цим у проєкті для фінтех-компанії: потрібно було обробляти 500+ дзвінків на годину з мінімальною затримкою та можливістю переривання. Retell AI виявився єдиною платформою, де latency залишається нижче 800 мс навіть при кастомній LLM-логіці. Ми впровадили його під ключ: налаштували WebSocket стрімінг, stateful-діалоги та інтеграцію з CRM. Нижче — деталі, як це працює і які проблеми вирішує.
Проблеми, які ми вирішуємо
Розробка production-grade голосових агентів — це не тільки про ASR та TTS. Основні технічні складнощі:
- Висока затримка (latency): готові рішення на кшталт VAPI або Play.ht дають 1.5–3 секунди, що вбиває конверсію. Retell з WebSocket стрімінгом укладається в 500–800 мс, а з налаштуваннями streaming буферизації — ще швидше.
- Управління станом діалогу: багатоходові сценарії (кваліфікація ліда, запис на зустріч, оплата) вимагають зберігання контексту. Retell дозволяє тримати stateful-сесію на вашому сервері, а не передавати історію з кожним запитом.
- Переривання та backchannel: у реальній розмові користувач може перебити агента. Retell підтримує interruption sensitivity та автоматичні backchannel'и ("угу", "так") — імітація живого спілкування.
- Інтеграція з CRM та аналітикою: без webhook'ів та REST API агент сліпий. Ми підключаємо будь-які системи (Bitrix24, AmoCRM, Salesforce) та збираємо повну аналітику дзвінків.
Зниження витрат на обробку дзвінків становить 35-50% порівняно з традиційним кол-центром, що підтверджують наші проєкти.
Як ми досягаємо low-latency?
Ключовий елемент — двонаправлений WebSocket між інфраструктурою Retell та нашим LLM-сервером. На відміну від конкурентів, де запит йде через посередника, Retell передає голос безпосередньо, а текстові транскрипти стрімиться в реальному часі. Згідно з документацією Retell AI, latency становить 500-800 мс. Нижче — приклад кастомного сервера на Python, який обробляє діалог через OpenAI gpt-4o:
import asyncio import json import websockets from typing import AsyncGenerator class RetellAgentServer: """ Кастомний LLM сервер для Retell AI. Retell підключається по WebSocket і очікує streaming відповіді. """ def __init__(self, openai_client, system_prompt: str): self.openai = openai_client self.system_prompt = system_prompt async def handle_connection(self, websocket, path): """Обробка WebSocket сесії від Retell""" async for message in websocket: data = json.loads(message) if data.get("interaction_type") == "call_details": # Початок дзвінка — отримуємо метадані call_info = data.get("call", {}) print(f"New call: {call_info.get('call_id')}") continue if data.get("interaction_type") in ("response_required", "reminder_required"): # Користувач щось сказав або настав таймаут transcript = data.get("transcript", []) # Генеруємо відповідь через OpenAI streaming async for chunk in self._generate_response(transcript): response_message = { "response_id": data.get("response_id"), "content": chunk, "content_complete": False, "end_call": False, } await websocket.send(json.dumps(response_message)) # Фінальний чанк await websocket.send(json.dumps({ "response_id": data.get("response_id"), "content": "", "content_complete": True, "end_call": False, })) async def _generate_response(self, transcript: list) -> AsyncGenerator[str, None]: """Стрімінг відповіді через OpenAI""" messages = [{"role": "system", "content": self.system_prompt}] for turn in transcript: role = "assistant" if turn["role"] == "agent" else "user" messages.append({"role": role, "content": turn["content"]}) stream = await self.openai.chat.completions.create( model="gpt-4o", messages=messages, stream=True, temperature=0.7, ) async for chunk in stream: delta = chunk.choices[0].delta.content if delta: yield delta class RetellAPIClient: """Управління агентами через Retell REST API""" def __init__(self, api_key: str): import requests self.api_key = api_key self.base_url = "https://api.retellai.com" self.session = requests.Session() self.session.headers.update({ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json" }) def create_agent(self, agent_name: str, llm_websocket_url: str, voice_id: str = "11labs-Adrian", language: str = "ukrainian") -> dict: """ Створення агента з кастомним LLM бекендом. llm_websocket_url: ваш сервер для обробки діалогу """ payload = { "agent_name": agent_name, "llm_websocket_url": llm_websocket_url, "voice_id": voice_id, "language": language, "response_engine": { "type": "retell-llm", # Або "custom-llm" }, "responsiveness": 1.0, # 0-1, наскільки швидко реагує "interruption_sensitivity": 1.0, "enable_backchannel": True, # "угу", "так" під час пауз "backchannel_frequency": 0.9, "end_call_after_silence_ms": 600000, "max_call_duration_ms": 3600000, } return self.session.post( f"{self.base_url}/create-agent", json=payload ).json() def create_phone_call(self, from_number: str, to_number: str, agent_id: str, retell_llm_dynamic_variables: dict = None) -> dict: """Ініціювання вихідного дзвінка""" payload = { "from_number": from_number, "to_number": to_number, "agent_id": agent_id, } if retell_llm_dynamic_variables: payload["retell_llm_dynamic_variables"] = retell_llm_dynamic_variables return self.session.post( f"{self.base_url}/create-phone-call", json=payload ).json() Порівняння Retell AI з альтернативами
Порівняйте з типовим Twilio Autopilot або Dialogflow CX: у них latency 1.5–3 сек, нема вбудованого переривання, stateful-діалоги будуються через context — повільно та з обмеженнями. Retell AI дає виграш у 3–5 разів за швидкістю відгуку та в 10 разів за гнучкістю сценаріїв. Наприклад, у проєкті для логістики ми впровадили агента, який у реальному часі звіряє статус замовлення по API — time-to-response на запит клієнта знизився з 4 секунд до 700 мс.
Як працює управління перериваннями?
Механізм interruption sensitivity в Retell налаштовується від 0 до 1. При значенні 1.0 агент замовкає миттєво, щойно користувач починає говорити. Це критично для сценаріїв, де клієнт хоче поправити відповідь або задати уточнююче питання. У наших проєктах ми додатково налаштовуємо backchannel'и — короткі "угу" та "так" під час пауз, щоб діалог звучав природно. Без цього агент виглядає як робот, який чекає повної тиші перед відповіддю.
Що таке stateful-діалог в Retell?
Це можливість зберігати історію розмови на вашому сервері, а не передавати весь контекст з кожним запитом до LLM. Наприклад, у сценарії кваліфікації ліда агент може пам'ятати, що клієнт уже назвав бюджет і терміни, і не перепитувати заново. Нижче — спрощена реалізація state-менеджера:
class ConversationStateManager: """Управління станом розмови для Retell""" def __init__(self, call_id: str, customer_id: str): self.call_id = call_id self.customer_id = customer_id self.state = "greeting" self.collected_data = {} self.escalation_triggers = ["оператор", "скарга", "претензія", "керівник"] def should_escalate(self, user_message: str) -> bool: """Визначаємо чи потрібна передача живому оператору""" msg_lower = user_message.lower() return any(trigger in msg_lower for trigger in self.escalation_triggers) def get_context_prompt(self) -> str: """Динамічний промпт на основі поточного стану""" base = f"Поточний крок: {self.state}. Вже зібрано: {self.collected_data}." if self.state == "qualification": base += " Дізнайся: чи є бюджет, строки прийняття рішення, особа що приймає рішення." elif self.state == "scheduling": base += " Запропонуй 3 слоти для зустрічі на наступному тижні." return base Приклад налаштування агента для обробки замовлень
Кейс: для інтернет-магазину ми налаштували агента, який перевіряє статус замовлення по API, уточнює адресу доставки та пропонує товари-компаньйони. Використовували модель GPT-4o з кастомним промптом та state-машиною на 10 станів. Економія на операційних витратах склала 40%.Як ми впроваджуємо Retell AI: покрокова інструкція
- Аналітика та проектування: розбираємо сценарії, пишемо decision tree, визначаємо точки ескалації.
- Налаштування інфраструктури: розгортаємо WebSocket сервер, підключаємо модель (GPT-4o, Claude, YaGPT), налаштовуємо MLOps (MLflow, Weights & Biases).
- Розробка логіки: пишемо state machine, інтеграції з CRM, динамічні промпти.
- Тестування: симуляція дзвінків, заміри latency, A/B тести відповідей.
- Деплой та моніторинг: запуск у production, налаштування алертів за p99 latency та rate limit'ами.
Що входить у роботу
- Документація: архітектурна схема, опис webhook'ів, інструкція з обслуговування агента.
- Інтеграція: підключення CRM, бази знань, зовнішніх API через webhook та REST.
- Навчання: передача скриптів та регламентів для підтримки агента.
- Підтримка: гарантія 30 днів після впровадження, далі — SLA.
Платформа ідеальна для складних сценаріїв: кваліфікація лідів з динамічним скорингом, запис на зустрічі з інтеграцією календаря, обробка замовлень з перевіркою статусу по API. Прототип — 3-4 дні, production з інтеграціями — 4-6 тижнів.
Метрики Retell AI
| Параметр | Значення |
|---|---|
| End-to-end latency | 500-800ms |
| Одночасних дзвінків | масштабується горизонтально |
| WebSocket reconnect | автоматично |
| Webhook події | call_started, call_ended, call_analyzed |
| Український TTS (ElevenLabs) | хороша якість |
Порівняння Retell AI з альтернативами
| Критерій | Retell AI | Twilio Autopilot/ Dialogflow CX |
|---|---|---|
| Latency (p99) | <1.2 сек | 2-4 сек |
| Підтримка переривань | вбудована (interruption sensitivity) | нема |
| Кастомний LLM-сервер | WebSocket стрімінг | REST з пайплайнами |
| Stateful-діалоги | на вашому сервері | через context (обмежено) |
| Backchannel'и | налаштовувані | відсутні |
Замовте впровадження Retell AI у вашу інфраструктуру. Отримайте консультацію щодо вашого проєкту — оцінимо feasibility та строки безкоштовно. Зв'яжіться з нами для детального обговорення вашого проєкту. Ми гарантуємо, що впроваджений агент буде працювати з latency < 1 сек та обробляти до 1000 одночасних дзвінків.







