Создайте агента из шаблона, при желании задав его поля в том же запросе. Без template агент создаётся пустым; GET /api/v1/voice/catalog перечисляет шаблоны, а также языки и голоса, которые можно задать агенту. Шаблоны написаны на английском и китайском, поэтому для другого языка передайте system_prompt и first_message на нём. Либо сохраняется весь запрос, либо агент не создаётся, так что отклонённый запрос можно отправить снова после исправления. dashboard_url в ответе — страница агента в панели, где можно поговорить с черновиком в браузере. Каждый агент работает на EvaSay ASR, EvaSay LLM и EvaSay TTS: EvaSay выбирает их для каждого звонка по языку и нагрузке, и они входят в цену звонка; аккаунты других провайдеров настраивать не нужно.
curl https://evasay.com/api/v1/voice/agents \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Front desk",
"language": "en",
"first_message": "Hi, thanks for calling Sunrise Salon. How can I help?",
"system_prompt": "You are the front desk of Sunrise Salon..."
}'
Любое из этих полей обновляется через PATCH /api/v1/voice/agents/{id}:
| Поле | Примечания |
|---|---|
name, first_message, system_prompt | Текст |
status | published публикует черновик как новую версию; draft прекращает приём звонков |
language | Один из 27 языков, например en, zh, es, de, или multi, чтобы следовать языку звонящего |
temperature | 0-100 |
max_duration_sec, silence_timeout_sec | Ограничения звонка |
interruptible, end_call_enabled | Логические значения |
confirm_details | Логическое значение; агент повторяет вслух числа и имена и просит подтвердить |
ai_disclosure | Логическое значение, по умолчанию true; перед первым сообщением агент говорит на языке звонка, что звонящий разговаривает с ИИ (пропускается, если первое сообщение уже об этом говорит) |
voicemail_detection | Логическое значение; при исходящих звонках агент сначала слушает и завершает звонок, попав на автоответчик |
voicemail_message | Оставляется на автоответчике, может содержать {{variables}}; если не задано — агент вешает трубку |
transfer_number | Номер для перевода звонка, в международном формате |
transfer_destinations | До 9 дополнительных номеров, [{name, number, when}]; агент выбирает один по when |
transfer_briefing | Логическое значение; ответивший первым слышит краткое изложение звонка от агента |
pronunciations | До 100 [{word, say, case_sensitive}]; голос произносит say вместо word |
idle_messages | До 3 напоминаний, которые по очереди произносятся молчащему звонящему, прежде чем звонок завершится |
noise_reduction | Логическое значение; фоновый шум звонящего фильтруется, прежде чем его услышат |
recording_enabled | Логическое значение; звонки записываются в два канала (звонящий слева, агент справа) |
recording_consent | announce, ask (запись сохраняется, только если звонящий согласен) или none |
recording_notice | Уведомление или вопрос, произносимые первыми; пусто — встроенный текст на языке звонка |
handoffs | До 5 [{agent_id, when}]: другие агенты, которым этот может передать звонок |
knowledge_base_id | Одна из ваших баз знаний |
vocabulary_id | Один из ваших словарей; его термины распознаются надёжнее, когда их произносит звонящий |
voice_id | Идентификатор встроенного голоса EvaSay или один из ваших клонированных голосов (clone:…) |
Встроенные голоса зависят от языка: у китайского есть ming-designed-female-clear и ming-designed-female-warm (женские), ming-designed-male-clear и ming-designed-male-friendly (мужские), у остальных языков — F1–F5 (женские) и M1–M5 (мужские). Встроенный голос, который не говорит на языке агента, заменяется голосом того же пола, который на нём говорит. Прежнее имя поля tts_voice_id по-прежнему принимается. Любое другое значение voice_id, а также клонированный голос, который ещё не готов, отклоняется.
analysis_config задаёт, что извлекается из каждого звонка после его окончания: summary (по умолчанию true), summaryLanguage, successCriteria (чего достигает успешный звонок), fields (до 20 {name, type, description} для извлечения, где type — string, number или boolean) и scorecard (до 10 {name, description, weight}, вес 1–5). Результаты — в analysis звонка и в вебхуке call.analyzed.
Изменение полей агента меняет его черновик. Звонки продолжают использовать опубликованную версию, пока вы не опубликуете черновик через POST /api/v1/voice/agents/{id}/publish (при желании с note) или с status: "published" в том же PATCH. Каждая публикация сохраняет пронумерованную версию; published_version в агенте показывает, какую версию используют звонки. Звонок остаётся на версии, которая была активна в момент его начала, поэтому публикация во время звонка его не меняет. Тестовые звонки из панели используют черновик.
GET /agents/{id}/versions выводит список версий, а POST /agents/{id}/versions/{version}/restore откатывает: новые звонки используют эту версию, и черновик становится ею. Название агента, развёртывание, внешний вид виджета и уведомления не версионируются и меняются сразу, как и документы его базы знаний.