Agent API — автономные агенты

Voicyfy Agent API

Создание и настройка автономных агентов обзвона по персональному API-ключу — для интеграций вроде Claude Code. Markdown-версия для AI-инструментов: /static/agent-api.md

Аутентификация

Все запросы передают персональный API-ключ в заголовке X-Api-Key:

X-Api-Key: vfy_...

Ключ генерируется в кабинете: Настройки → API-ключ для интеграций. Полный ключ показывается один раз при генерации. При перевыпуске старый ключ мгновенно перестаёт работать.

Неверный ключ → 401 {"detail": "invalid_api_key"}.

Область действия ключа
По ключу доступны только эндпоинты этой страницы: чтение, создание и редактирование агентов + справочник моделей. Остальное API Voicyfy по ключу недоступно.

Как устроен агент (важно перед настройкой)

У агента два независимых AI-компонента, у каждого — свой скрытый базовый системный промпт (через API не редактируется):

  1. Оркестратор — текстовый «мозг»: ведёт CRM, планирует звонки, готовит стратегию каждого звонка, анализирует результаты. Его промпт = базовый шаблон + 5 документов doc_* + additional_instructions.
  2. Голосовой агент — говорит в живом телефонном разговоре. Его промпт в исходящих = базовый шаблон + voice_additional_instructions; во входящих на номер агента — voice_additional_instructions + правила вызова функций + карточка звонящего. Документы doc_* в живом разговоре не используются.
ПолеКуда попадаетЧто писать
doc_who_am_iоркестраторКто компания: название, город, чем занимается
doc_who_we_callоркестраторЦелевая аудитория: кому звоним и зачем
doc_how_we_talkоркестраторСтиль общения бренда
doc_what_we_offerоркестраторПродукты/услуги, цены, условия
doc_rules_and_goalsоркестраторЦели, KPI, ограничения
additional_instructionsоркестраторПравила планирования и работы с контактами
voice_additional_instructionsголосовойПоведение в живом разговоре: имя ассистента, манера речи, возражения
inbound_first_phraseголосовойПриветствие только для входящих звонков (≤500 символов)
Первая фраза исходящих звонков
Её генерирует оркестратор индивидуально под каждый звонок (стратегия PreCall) — статически она не настраивается. Влияйте на неё через doc_* и additional_instructions. Статическое поле inbound_first_phrase действует только на входящие.

Жизненный цикл звонка (PreCall → звонок → PostCall)

Каждый исходящий звонок проходит три фазы — понимание цикла — ключ к правильным промптам:

  1. PreCall (оркестратор, без инструментов). Перед набором номера оркестратор получает задачу, карточку контакта, память о нём, полный транскрипт последнего звонка и хронологию всего общения (звонки + SMS + Telegram). На выходе — стратегия: первая фраза, тактика, тон, ключевые факты. Она передаётся голосовому агенту.
  2. Живой разговор (голосовой агент). Говорит по стратегии PreCall. Документов doc_* и CRM-доступа у него нет — фактура приходит только через стратегию и базу знаний.
  3. PostCall (оркестратор, с инструментами). Получает транскрипт и выполняет действия: всегда обновляет память о контакте; меняет стадию воронки только при реальном основании; для исходящих всегда планирует следующее касание, кроме случая достигнутой цели (недозвон → перезвон через 24 ч; ответил, но цель не достигнута → 1–3 дня, либо отложенное сообщение в Telegram); при важных событиях шлёт уведомление владельцу.

Итог звонка: SUCCESS / REJECTED / DO_NOT_CALL (только когда агент сам поставил эту стадию), FOLLOWUP (запланирован следующий шаг), ANSWERED (разговор без итога — контакт «В работе»), NO_ANSWER, ERROR (разбор не удался, стадия не менялась).

Стадии воронки: new → active → success / rejected / do_not_call.

Память о контакте: сводка, ключевые факты, лучшее время звонка, история тона — накапливается и автоматически попадает в контекст каждого следующего PreCall, PostCall и чата.

Инструменты оркестратора (чат с владельцем)

Владелец общается с оркестратором в чате на странице агента и (если подключён бот) в Telegram. Пустое условие = инструмент доступен всегда.

CRM: контакты

ИнструментЧто делаетУсловие
create_agent_contactСоздать контакт (телефон обязателен)
bulk_create_contactsСоздать несколько контактов разом, дубли по номеру пропускаются
find_contactНайти конкретного человека по имени, телефону или компании: любой порядок слов, ё/е, телефон в любом формате; нет точного совпадения — похожие (падеж, опечатка)
search_contactsПоиск, отбор и подсчёт по фильтрам (стадии, попытки, давность звонка, дата добавления); постранично до 200 строк, точный total
get_agent_contactsОбщий список контактов
get_contact_detailsПолная карточка: поля, стадия, заметки, память, попытки
get_contacts_by_stageРазбивка контактов по стадиям воронки
update_contact_infoПерезаписать имя/компанию/должность/заметки
append_contact_noteДописать заметку с датой, не стирая старые
move_contact_stageПеревести контакт на стадию воронки
bulk_move_contacts_stageПеревести группу контактов на стадию по фильтру
snooze_contactПауза до даты: отменяет запланированные звонки
delete_agent_contactУдалить контакт (необратимо, по явной просьбе)

Планирование звонков

ИнструментЧто делаетУсловие
create_agent_taskЗапланировать звонок; сдвигается в рабочие часы
update_agent_taskПеренести/переименовать запланированный звонок
delete_agent_taskОтменить запланированный звонок (необратимо)
bulk_schedule_callsОбзвон группы по фильтру с интервалом; пропускает дубли и «Не звонить»
bulk_cancel_callsОтменить запланированные звонки группе контактов по фильтру
trigger_immediate_callПозвонить прямо сейчас; ночью — в начале рабочих часов
get_agent_tasksСписок задач с фильтрами, проверка дублей
get_upcoming_scheduleКалендарь ближайших звонков по всем контактам

Аналитика и история

ИнструментЧто делаетУсловие
get_agent_statsСводная статистика: контакты, звонки, задачи
get_period_reportОтчёт за период: дозвоны, успехи, конверсия
get_failed_callsОчередь недозвонов на перезвон
get_contact_call_historyИстория звонков контакта (кратко)
get_contact_timelineЕдиная хронология: звонки + SMS + Telegram
get_call_transcriptПолный транскрипт конкретного звонка

Каналы и внешние системы

ИнструментЧто делаетУсловие
send_smsSMS клиенту с номера агента (до 500 символов)
send_telegram_notificationУведомление ВЛАДЕЛЬЦУ в Telegram-бот агентаподключён бот
send_webhookСобытие (event + payload) на вебхук владельцазадан webhook_url
search_knowledge_baseВекторный поиск по базе знаний компаниисоздана база
telegram_send_messageСообщение КЛИЕНТУ с личного Telegram владельцаличный аккаунт
telegram_get_threadПрочитать переписку с клиентом в Telegramличный аккаунт
schedule_telegram_messageОтложенное сообщение клиенту (передаётся инструкция, текст составится при отправке)личный аккаунт
Google CalendarСоздать/найти/изменить/удалить событие, свободные слотыконнектор
GmailОтправить/прочитать/ответить/переслать письмоконнектор
Инструменты PostCall-анализа
После звонка оркестратору доступен сокращённый набор: update_contact_memory (всегда вызывается), create_agent_task, move_contact_stage, update_contact_info, send_telegram_notification, search_knowledge_base, send_sms, send_webhook + условные инструменты Telegram и коннекторов.

Функции голосового агента (в живом звонке)

Набор голосового агента намеренно маленький — он говорит, а не ведёт CRM:

ФункцияЧто делаетУсловие
hangup_callЗавершить звонок с прощальной фразой
send_smsSMS клиенту прямо во время звонка (адрес, ссылка, код)
search_pineconeПоиск по базе знаний во время разговорасоздана база
google_calendar_create_event / find_eventsЗаписать на встречу / посмотреть календарьконнектор
gmail_send_email / fetch_emailsОтправить/прочитать письмо с Gmail владельцаконнектор
Чего у голосового агента НЕТ (важно для промптов)
Нет CRM-инструментов, планирования задач, личного Telegram, вебхуков и документов doc_*. Если клиент просит перезвонить — агент уточняет время, а задачу ставит PostCall. Поэтому в voice_additional_instructions не нужно писать «запиши в CRM» или «поставь задачу» — это произойдёт автоматически. Пишите только про поведение в разговоре.

Каналы и автоматика вне звонков

  • Входящие звонки: голосовой агент отвечает (inbound_first_phrase), после разговора — тот же PostCall-анализ (перезвон планируется только при необходимости).
  • Входящие SMS: обрабатывает оркестратор — может ответить SMS, запланировать звонок, обновить память/стадию, уведомить владельца.
  • Входящие Telegram (личный аккаунт + автоответ): оркестратор отвечает клиенту как живой человек; охват — только контакты из базы или все входящие.
  • Отложенные Telegram-сообщения: живут в общем списке задач; перед отправкой оркестратор сверяется с контекстом — если договорённость уже закрыта, сообщение не отправляется.
  • Рабочие часы (МСК, по умолчанию 9–21; начало = конец — круглосуточно): вне окна клиенту не звонят и не пишут — звонки, сообщения Telegram/MAX, проверки ответа и trigger_immediate_call переносятся на утро. Контакту в стадии «Не звонить» ничего не планируется.
  • Вебхук: события (заявка, лид, результат звонка) POST-запросом на URL владельца — для n8n / Make / Zapier / CRM.
  • Планировщик проверяет задачи каждые ~30 секунд — «позвони сейчас» стартует в пределах полуминуты.

Гайд: как писать промпты

additional_instructions (оркестратор) — правила планирования и работы с базой в терминах реальных инструментов и стадий:

  • «Не звонить одному контакту чаще 1 раза в 3 дня»
  • «После двух недозвонов подряд отправляй SMS с предложением перезвонить»
  • «Отказников (rejected) не трогать 3 месяца»
  • «Горячих клиентов (просят счёт) — сразу уведомление владельцу»

voice_additional_instructions (голосовой агент) — только поведение в живом разговоре:

  • «Твоё имя — Алёна. Говори коротко, тепло, без канцелярита»
  • «Не называй цены на монтаж — предлагай замер»
  • «На возражение „дорого" — расскажи про рассрочку»
  • «Если просят человека — скажи, что менеджер перезвонит, и завершай звонок»
Не дублируйте базовый промпт
Уже встроено: русский язык, проверка дублей задач, время по МСК, «сначала читай данные — потом действуй», запрет выдумывать данные, автозавершение звонка (hangup_call), обновление CRM после звонка. Объёмную фактуру (каталог, прайс) кладите в базу знаний — её ищут и оркестратор, и голосовой агент.

Тарифы, кредиты и подключения

Через API не настраивается — всё делается в кабинете, но полезно для ответов пользователям:

  • Доступ к агенту: тестовый период 3 дня (единожды, +1500 кредитов) или тариф profi (+10 000 кредитов). Без доступа — 402 subscription_required.
  • Кредиты — валюта работы оркестратора: списываются за токены каждого вызова (PreCall, PostCall, чат, входящие) по ставкам выбранной модели. Баланс ниже 100 — оркестратор не запускается (402 insufficient_credits). Пакеты пополнения — на странице агента.
  • Голосовая часть оплачивается отдельно: собственные API-ключи провайдеров (OpenAI / Gemini / Cartesia / Yandex) + телефония Voximplant (номера, минуты, SMS).
  • Telegram-бот агента: уведомления владельцу + чат с оркестратором в Telegram.
  • Личный Telegram-аккаунт: агент пишет клиентам от имени владельца и отвечает на входящие; встроены анти-бан лимиты.
  • Коннекторы (Google Calendar, Gmail): OAuth-подключение на странице агента.
  • База знаний: создаётся на странице агента; наличие видно по has_knowledge_base.
  • Лимит: до 3 агентов; у каждого свои контакты, задачи, память и подключения.

GET /api/agent/list

Список агентов пользователя. Отсюда берётся agent_id (поле id) для остальных запросов.

curl -H "X-Api-Key: vfy_..." https://voicyfy.ru/api/agent/list
{
  "total": 1,
  "max_agents": 3,
  "can_create_more": true,
  "has_agent_access": true,
  "agents": [ { "id": "…", "name": "…", ... } ]
}

GET /api/agent/?agent_id={id}

Один агент со всеми настройками. Без agent_id возвращается первый (самый старый) агент. Перед редактированием всегда читайте текущее состояние этим запросом.

curl -H "X-Api-Key: vfy_..." "https://voicyfy.ru/api/agent/?agent_id=<uuid>"

GET /api/agent/orchestrator-models

Справочник моделей оркестратора. В поле orchestrator_model передавайте только slug из этого списка; если не передавать — применится модель по умолчанию.

{"models": [{"slug": "…", "name": "…", "description": "…"}], "default": "…"}

POST /api/agent/create

Создание агента. Все 5 документов обязательны.

curl -X POST https://voicyfy.ru/api/agent/create \
  -H "X-Api-Key: vfy_..." \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Алёна",
    "assistant_type": "openai",
    "doc_who_am_i": "Компания «АкваЛето», Иркутск...",
    "doc_who_we_call": "Частные домовладельцы, дачники...",
    "doc_how_we_talk": "Дружелюбно, на «вы»...",
    "doc_what_we_offer": "Бассейны Intex и Bestway от 15 000 ₽...",
    "doc_rules_and_goals": "Цель — записать на замер...",
    "voice_additional_instructions": "Твоё имя — Алёна.",
    "inbound_first_phrase": "Здравствуйте! Компания АкваЛето, меня зовут Алёна.",
    "working_hours_start": 9,
    "working_hours_end": 21,
    "voice": "marin"
  }'
ПолеТипОбяз.Описание
namestringДаИмя агента (1–255)
assistant_typestringДаgemini | openai | cartesia | yandex
doc_who_am_i … doc_rules_and_goalsstringДа (все 5)Документы компании для оркестратора
additional_instructionsstringНетДоп. инструкции оркестратора
voice_additional_instructionsstringНетДоп. инструкции голосового агента
inbound_first_phrasestringНетПриветствие входящих (≤500)
working_hours_start / _endint 0–23НетРабочие часы (МСК), по умолчанию 9–21
orchestrator_modelstringНетSlug из /orchestrator-models
voicestringНетГолос для gemini/openai/yandex (см. списки ниже)
cartesia_voice_idstringНетID голоса Cartesia (только cartesia)
voice_speedfloat 0.5–1.5НетСкорость речи (только cartesia)
Предусловия (выполняются пользователем в кабинете)
Верифицированная телефония Voximplant; API-ключ выбранного голосового провайдера в настройках; активный тариф или доступный триал; меньше 3 агентов. Иначе — ошибки 400/402 (см. ниже).

PUT /api/agent/?agent_id={id}

Редактирование агента. Передавайте только изменяемые поля — остальные не трогаются. Доступны все поля из create, а также:

ПолеТипОписание
is_activeboolВключить/выключить агента
default_caller_idstringНомер, с которого звонит агент
webhook_urlstring ≤500URL вебхука для событий во внешнюю систему
assistant_typestringСмена голосового провайдера (нужен ключ нового провайдера)
curl -X PUT "https://voicyfy.ru/api/agent/?agent_id=<uuid>" \
  -H "X-Api-Key: vfy_..." \
  -H "Content-Type: application/json" \
  -d '{
    "voice_additional_instructions": "Твоё имя — Алёна. Отвечай короче.",
    "inbound_first_phrase": "Добрый день! АкваЛето, Алёна слушает."
  }'

При изменении voice_additional_instructions промпт голосового агента пересобирается автоматически; изменения doc_* оркестратор подхватывает на лету.

Голоса по провайдерам

  • openai: alloy, ash, ballad, coral, echo, sage, shimmer, verse, marin, cedar; голоса GPT-Live: beacon, bossa, cinder, delta, gleam, meridian, quartz, ripple, stone, tempo, vesper, willow
  • gemini: Zephyr, Puck, Charon, Kore, Fenrir, Leda, Orus, Aoede, Callirrhoe, Autonoe, Enceladus, Iapetus, Umbriel, Algieba, Despina, Erinome, Algenib, Rasalgethi, Laomedeia, Achernar, Alnilam, Schedar, Gacrux, Pulcherrima, Achird, Zubenelgenubi, Vindemiatrix, Sadachbia, Sadaltager, Sulafat
  • yandex: marina, dasha, alexander, julia, lera, masha, anton, kirill, filipp, ermil, jane, omazh, zahar, madi_ru, saule_ru
  • cartesia: голос задаётся через cartesia_voice_id + опционально voice_speed

Дефолты: openai — alloy, gemini — Kore, yandex — marina. Невалидное имя голоса в update → 400 invalid_voice.

Ошибки

КодdetailПричина
401invalid_api_keyНеверный или отозванный API-ключ
400telephony_not_verifiedТелефония Voximplant не верифицирована
400api_key_required_gemini/openai/cartesia/yandexНе задан ключ голосового провайдера в кабинете
400agent_limit_reachedУже 3 агента
400invalid_assistant_type / invalid_orchestrator_model / invalid_voiceНевалидное значение поля
402subscription_requiredТриал использован, нужен тариф
404not_foundАгент не найден (чужой или несуществующий agent_id)

Рекомендуемый флоу

Редактирование:

  1. GET /api/agent/list → найти агента, взять id
  2. GET /api/agent/?agent_id=<id> → прочитать текущие настройки
  3. PUT /api/agent/?agent_id=<id> → отправить только изменённые поля
  4. Перечитать агента и показать, что изменилось

Создание:

  1. GET /api/agent/list → проверить can_create_more
  2. GET /api/agent/orchestrator-models → выбрать модель (или пропустить)
  3. Составить 5 документов doc_* и инструкции (см. «Гайд: как писать промпты»)
  4. POST /api/agent/create, обработать возможные 400/402

При настройке промптов сверяйтесь с разделами «Жизненный цикл звонка», «Инструменты оркестратора» и «Функции голосового агента»: инструкции в терминах реальных инструментов и стадий работают заметно лучше абстрактных пожеланий.