Коли замовник просить голосового агента, який не тупить на паузах і не чекає три секунди перед відповіддю — стандартні 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 одночасних дзвінків.







