Разработка голосовых агентов на платформе VAPI
Клиент жалуется, что бот перебивает или медленно отвечает? Чаще всего проблема в неверной конфигурации прерываний и выборе STT. Мы разрабатываем голосовых AI-агентов на VAPI — платформе, которая даёт полный контроль над стеком: от транспорта до модели. Наш опыт — 5+ лет и 50+ внедрённых проектов, поэтому мы гарантируем снижение p99 latency до 800 мс и естественный диалог.
VAPI (Voice API) — инфраструктурная платформа для построения голосовых AI-агентов с акцентом на разработчиков. В отличие от no-code решений, VAPI предоставляет полный контроль над стеком: выбор провайдера STT (Deepgram, AssemblyAI), LLM (GPT-4o, Claude, Llama), TTS (ElevenLabs, Azure, OpenAI) и транспортного уровня (WebRTC, PSTN, SIP). Это позволяет создавать агентов с RAG, function calling и кастомными голосами, которые работают в 10 раз быстрее стандартных IVR-систем.
Архитектура VAPI-агента
Phone Call / WebRTC
↓
[VAPI Transport Layer]
↓
[STT: Deepgram / Whisper]
↓
[LLM: GPT-4o / Claude] ←→ [Function Calls / Tools]
↓
[TTS: ElevenLabs / Azure]
↓
Audio Response
Почему VAPI, а не Twilio или собственное решение?
Twilio Voice API — это низкоуровневый SIP-стек, где каждую задержку (STT, LLM, TTS) приходится соединять самому. VAPI агрегирует все этапы в одном вызове API, управляет таймаутами и прерываниями из коробки. Результат: p99 latency на 40% ниже, а стоимость разработки — в 2–3 раза меньше. Для продакшена это означает экономию на инфраструктуре и операторах до 40%.
Создание агента через VAPI API
import requests
from typing import Optional
class VAPIAgentBuilder:
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = "https://api.vapi.ai"
self.headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
def create_assistant(self, name: str,
system_prompt: str,
model: str = "gpt-4o",
voice_provider: str = "elevenlabs",
voice_id: str = "rachel",
tools: Optional[list] = None) -> dict:
assistant_config = {
"name": name,
"model": {
"provider": "openai" if "gpt" in model else "anthropic",
"model": model,
"systemPrompt": system_prompt,
"temperature": 0.7,
},
"voice": {
"provider": voice_provider,
"voiceId": voice_id,
"speed": 1.0,
"stability": 0.5,
},
"transcriber": {
"provider": "deepgram",
"model": "nova-2",
"language": "ru",
},
"firstMessage": "Здравствуйте! Чем могу помочь?",
"endCallMessage": "Спасибо за звонок. До свидания!",
"endCallFunctionEnabled": True,
"silenceTimeoutSeconds": 20,
"maxDurationSeconds": 600,
}
if tools:
assistant_config["model"]["tools"] = tools
response = requests.post(
f"{self.base_url}/assistant",
json=assistant_config,
headers=self.headers
)
return response.json()
def create_tool(self, name: str,
description: str,
parameters: dict,
server_url: str) -> dict:
return {
"type": "function",
"function": {
"name": name,
"description": description,
"parameters": {
"type": "object",
"properties": parameters,
"required": list(parameters.keys())
}
},
"server": {
"url": server_url,
"timeoutSeconds": 5,
}
}
def create_outbound_call(self, assistant_id: str,
phone_number: str,
customer_data: dict = None) -> dict:
payload = {
"assistantId": assistant_id,
"customer": {
"number": phone_number,
"name": customer_data.get("name", "") if customer_data else "",
},
}
if customer_data:
payload["assistantOverrides"] = {
"variableValues": customer_data
}
response = requests.post(
f"{self.base_url}/call",
json=payload,
headers=self.headers
)
return response.json()
def setup_inbound_phone_number(self, phone_number: str,
assistant_id: str) -> dict:
payload = {
"number": phone_number,
"assistantId": assistant_id,
"fallbackDestination": {
"type": "number",
"number": "+1234567890"
}
}
response = requests.post(
f"{self.base_url}/phone-number",
json=payload,
headers=self.headers
)
return response.json()
Как уменьшить latency до комфортного минимума?
Задержка складывается из трёх этапов: распознавание речи (STT), логика модели (LLM) и синтез (TTS). В VAPI можно влиять на каждый:
- Выбор STT: Deepgram Nova-2 даёт ~250 мс при WER 8%, OpenAI Whisper — ~600 мс, но точнее. Для русскоязычных проектов часто выбирают Whisper.
- Прерывания: включение
interruptionsEnabledи установкаnumWordsToInterruptAssistant = 1позволяют пользователю прерывать агента без задержки. - Transport: WebRTC быстрее PSTN — используйте его для клиентов в регионе.
- Балансировка: загружайте LLM на эндпоинтах с низкой latency, например, через vLLM или Groq.
На практике после оптимизации p99 latency составляет 600–900 мс — это комфортный уровень для диалога.
Как настроить прерывания для естественного диалога?
VAPI позволяет тонко настраивать параметры, влияющие на естественность разговора:
-
interruptionsEnabled— разрешает пользователю прерывать агента. Критично для натуральности диалога. -
backgroundDenoisingEnabled— фильтрация фонового шума через Krisp. -
numWordsToInterruptAssistant— сколько слов пользователя нужно для прерывания агента (рекомендуется 1-2). -
backchannelingEnabled— агент произносит «угу», «понятно» во время пауз.
Пример конфигурации для низкой задержки
{
"model": {
"provider": "openai",
"model": "gpt-4o",
"temperature": 0.7
},
"voice": {
"provider": "elevenlabs",
"voiceId": "rachel",
"speed": 1.0
},
"transcriber": {
"provider": "deepgram",
"model": "nova-2",
"language": "ru"
},
"interruptionsEnabled": true,
"numWordsToInterruptAssistant": 1,
"backchannelingEnabled": false
}
Интеграция с WebRTC для веб-звонков
import Vapi from "@vapi-ai/web";
const vapi = new Vapi("YOUR_PUBLIC_KEY");
vapi.start({
assistantId: "your-assistant-id",
});
vapi.on("call-start", () => console.log("Call started"));
vapi.on("call-end", () => console.log("Call ended"));
vapi.on("message", (message) => {
if (message.type === "transcript") {
console.log(message.role, message.transcript);
}
if (message.type === "function-call") {
console.log("Tool:", message.functionCall.name);
}
});
Сравнение STT провайдеров в VAPI
| Провайдер | Latency (WER) | Русский | Стоимость |
|---|---|---|---|
| Deepgram Nova-2 | ~250ms, WER 8% | хорошо | $0.0059/мин |
| AssemblyAI Universal | ~400ms, WER 7% | хорошо | $0.0065/мин |
| OpenAI Whisper | ~600ms, WER 6% | отлично | $0.006/мин |
| Azure Cognitive | ~300ms, WER 9% | хорошо | $0.016/мин |
Параметры оптимизации latency
| Параметр | Значение по умолчанию | Рекомендация |
|---|---|---|
interruptionsEnabled |
false | true |
numWordsToInterruptAssistant |
3 | 1-2 |
backgroundDenoisingEnabled |
false | true (если шум) |
| Transport | PSTN | WebRTC |
Что входит в работу
Каждый проект включает:
- Архитектуру агента с выбором оптимальных провайдеров под ваш сценарий.
- Реализацию Function Calls для интеграции с вашими системами (CRM, базы знаний).
- Настройку прерываний и лимитов для естественного диалога.
- Развёртывание в production (SageMaker, Vercel, собственный сервер).
- Документацию кода и инструкции по поддержке.
- Гарантийную поддержку в течение месяца после запуска.
Типичные ошибки при разработке VAPI-агента
- Разрешение прерываний без тестирования реальных сценариев: агент не дослушивает длинные ответы.
- Использование PSTN вместо WebRTC: latency на 1–2 секунды выше.
- Игнорирование таймаутов Function Calls: если эндпоинт отвечает дольше 5с, агент зависает.
- Отсутствие fallback-номера: при ошибке клиент должен переключаться на оператора.
Сроки и стоимость
Прототип голосового агента с базовым сценарием — от 2 до 3 дней. Полноценное решение с интеграциями, тестированием и обучением — от 3 до 5 недель. Стоимость рассчитывается индивидуально под ваш проект. Свяжитесь с нами, чтобы получить прототип за 2-3 дня. Закажите консультацию для оценки вашего сценария.
Источник: VAPI REST API







