Телефония
Добавьте Hermes Agent телефонные возможности без изменений в ядре инструментов. Выделите и сохраните номер Twilio, отправляйте и принимайте SMS/MMS, совершайте прямые звонки и исходящие звонки с ИИ-управлением через Bland.ai или Vapi.
Метаданные навыка
| Источник | Опциональный (устанавливается по запросу) — установите командой hermes skills install official/productivity/telephony |
| Путь | optional-skills/productivity/telephony |
| Версия | 1.0.0 |
| Автор | Nous Research |
| Лицензия | MIT |
| Платформы | linux, macos, windows |
| Теги | telephony, phone, sms, mms, voice, twilio, bland.ai, vapi, calling, texting |
| Связанные навыки | maps, google-workspace, agentmail |
Справочник: полный SKILL.md
Ниже приведено полное определение навыка, которое Hermes загружает при его активации. Именно это агент видит в виде инструкций, когда навык включён.
Telephony — Numbers, Calls, and Texts without Core Tool Changes
Этот опциональный навык даёт Hermes практические телефонные возможности, не добавляя телефонию в основной список инструментов.
В комплекте идёт вспомогательный скрипт scripts/telephony.py, который умеет:
- сохранять учётные данные провайдеров в
~/.hermes/.env - искать и покупать телефонные номера Twilio
- запоминать купленный номер для последующих сессий
- отправлять SMS / MMS с этого номера
- опрашивать входящие SMS без необходимости держать вебхук-сервер
- совершать прямые звонки через Twilio с использованием TwiML
<Say>или<Play> - импортировать номер Twilio в Vapi
- размещать исходящие ИИ-звонки через Bland.ai или Vapi
Что решает этот навык
Навык закрывает практические телефонные задачи, которые реально нужны пользователям:
- исходящие звонки
- отправка сообщений
- постоянный номер агента для повторного использования
- чтение сообщений, пришедших на этот номер позже
- сохранение номера и связанных идентификаторов между сессиями
- устойчивая телефонная идентичность агента для опроса входящих SMS и других автоматизаций
Навык не превращает Hermes в полноценный шлюз входящих звонков в реальном времени. Входящие SMS читаются через опрос Twilio REST API — этого хватает для уведомлений и получения одноразовых кодов без необходимости поднимать вебхук-инфраструктуру.
Правила безопасности — обязательны
- Всегда запрашивать подтверждение перед звонком или отправкой сообщения.
- Никогда не набирать номера экстренных служб.
- Не использовать телефонию для преследования, спама, имперсонации и любых незаконных действий.
- Телефонные номера третьих лиц — конфиденциальные операционные данные:
- не сохранять их в память Hermes
- не включать в документацию навыков, сводки или заметки, если пользователь явно не попросил об обратном
- Сохранять номер Twilio, принадлежащий агенту, — допустимо: это часть конфигурации пользователя.
- VoIP-номера не гарантируют работу со всеми 2FA-сервисами сторонних провайдеров. Используйте с осторожностью и заранее предупреждайте пользователя.
Дерево выбора — какой сервис подходит?
Используйте эту логику вместо жёсткого выбора провайдера по умолчанию.
1) «Хочу, чтобы у Hermes был реальный телефонный номер»
Используйте Twilio.
Почему:
- проще всего купить и удержать номер
- лучшая поддержка SMS / MMS
- наиболее простой сценарий опроса входящих SMS
- самый чистый путь к входящим вебхукам или обработке звонков в будущем
Сценарии использования:
- получать тексты позже
- отправлять оповещения о деплоях / уведомления из cron
- поддерживать переиспользуемую телефонную идентичность агента
- пробовать телефонные схемы аутентификации в будущем
2) «Мне нужен самый простой исходящий ИИ-звонок прямо сейчас»
Используйте Bland.ai.
Почему:
- быстрейшая настройка
- один API-ключ
- не нужно предварительно покупать или импортировать номер
Компромисс:
- меньше гибкости
- качество голоса приемлемое, но не наилучшее
3) «Хочу лучшее качество разговорного ИИ-голоса»
Используйте Twilio + Vapi.
Почему:
- Twilio даёт собственный номер
- Vapi обеспечивает более высокое качество ИИ-звонков и больший выбор голосов и моделей
Рекомендуемый процесс:
- Купите / сохраните номер Twilio
- Импортируйте его в Vapi
- Сохраните возвращённый
VAPI_PHONE_NUMBER_ID - Используйте
ai-call --provider vapi
4) «Хочу позвонить с заранее записанным голосовым сообщением»
Используйте прямой звонок Twilio с публичным URL аудиофайла.
Почему:
- проще всего воспроизвести собственный MP3
- хорошо сочетается с
text_to_speechв Hermes плюс любым публичным хостингом файлов или туннелем
Файлы и постоянное состояние
Навык хранит состояние телефонии в двух местах.
~/.hermes/.env
Для долгосрочных учётных данных провайдеров и идентификаторов принадлежащих номеров, например:
TWILIO_ACCOUNT_SIDTWILIO_AUTH_TOKENTWILIO_PHONE_NUMBERTWILIO_PHONE_NUMBER_SIDBLAND_API_KEYVAPI_API_KEYVAPI_PHONE_NUMBER_IDPHONE_PROVIDER(провайдер ИИ-звонков: bland или vapi)
~/.hermes/telephony_state.json
Для состояния только этого навыка, которое должно сохраняться между сессиями, например:
- запомненный номер Twilio по умолчанию / SID
- запомненный идентификатор номера Vapi
- SID / дата последнего входящего сообщения — контрольные точки для опроса входящих
В результате:
- при следующей загрузке навыка
diagnoseпокажет, какой номер уже настроен twilio-inbox --since-last --mark-seenпродолжит с предыдущей контрольной точки
Найти вспомогательный скрипт
После установки навыка найдите скрипт так:
SCRIPT="$(find ~/.hermes/skills -path '*/telephony/scripts/telephony.py' -print -quit)"
Если SCRIPT пустой — навык ещё не установлен.
Установка
Это официальный опциональный навык, устанавливается из Skills Hub:
hermes skills search telephony
hermes skills install official/productivity/telephony
Настройка провайдеров
Twilio — собственный номер, SMS/MMS, прямые звонки, опрос входящих SMS
Зарегистрируйтесь по адресу:
Затем сохраните учётные данные в Hermes:
python3 "$SCRIPT" save-twilio ACXXXXXXXXXXXXXXXXXXXXXXXXXXXX your_auth_token_here
Поиск доступных номеров:
python3 "$SCRIPT" twilio-search --country US --area-code 702 --limit 5
Покупка и запоминание номера:
python3 "$SCRIPT" twilio-buy "+17025551234" --save-env
Список принадлежащих номеров:
python3 "$SCRIPT" twilio-owned
Установить один из них как номер по умолчанию:
python3 "$SCRIPT" twilio-set-default "+17025551234" --save-env
# или
python3 "$SCRIPT" twilio-set-default PNXXXXXXXXXXXXXXXXXXXXXXXXXXXX --save-env
Bland.ai — самые простые исходящие ИИ-звонки
Зарегистрируйтесь по адресу:
Сохраните конфигурацию:
python3 "$SCRIPT" save-bland your_bland_api_key --voice mason
Vapi — более высокое качество разговорного голоса
Зарегистрируйтесь по адресу:
Сначала сохраните API-ключ:
python3 "$SCRIPT" save-vapi your_vapi_api_key
Импортируйте ваш номер Twilio в Vapi и сохраните возвращённый идентификатор номера:
python3 "$SCRIPT" vapi-import-twilio --save-env
Если вы уже знаете идентификатор номера Vapi, сохраните его напрямую:
python3 "$SCRIPT" save-vapi your_vapi_api_key --phone-number-id vapi_phone_number_id_here
Диагностика текущего состояния
В любой момент можно проверить, что навык уже знает:
python3 "$SCRIPT" diagnose
Запускайте это в первую очередь при возобновлении работы в новой сессии.
Типичные рабочие процессы
A. Купить номер агента и использовать его в дальнейшем
- Сохраните учётные данные Twilio:
python3 "$SCRIPT" save-twilio AC... auth_token_here
- Найдите подходящий номер:
python3 "$SCRIPT" twilio-search --country US --area-code 702 --limit 10
- Купите его и сохраните в
~/.hermes/.env+ состояние:
python3 "$SCRIPT" twilio-buy "+17025551234" --save-env
- В следующей сессии запустите:
python3 "$SCRIPT" diagnose
Команда покажет запомненный номер по умолчанию и состояние контрольных точек входящих.
B. Отправить SMS с номера агента
python3 "$SCRIPT" twilio-send-sms "+15551230000" "Your deployment completed successfully."
С медиафайлом:
python3 "$SCRIPT" twilio-send-sms "+15551230000" "Here is the chart." --media-url "https://example.com/chart.png"
C. Проверить входящие сообщения без вебхук-сервера
Опрос входящих для номера Twilio по умолчанию:
python3 "$SCRIPT" twilio-inbox --limit 20
Показать только сообщения после последней контрольной точки и продвинуть её после прочтения:
python3 "$SCRIPT" twilio-inbox --since-last --mark-seen
Это основной ответ на вопрос «как получить сообщения, пришедшие на номер, при следующей загрузке навыка?»
D. Прямой звонок через Twilio со встроенным TTS
python3 "$SCRIPT" twilio-call "+15551230000" --message "Hello! This is Hermes calling with your status update." --voice Polly.Joanna
E. Звонок с заранее записанным или кастомным голосовым сообщением
Это основной сценарий для повторного использования поддержки text_to_speech в Hermes.
Подходит, когда:
- звонок должен использовать голос TTS из Hermes, а не Twilio
<Say> - нужна односторонняя голосовая доставка: брифинг, оповещение, напоминание, обновление статуса
- живой разговорный звонок не нужен
Сгенерируйте или разместите аудио отдельно, затем:
python3 "$SCRIPT" twilio-call "+155****0000" --audio-url "https://example.com/briefing.mp3"
Рекомендуемый процесс Hermes TTS → Twilio Play:
- Сгенерируйте аудио с помощью
text_to_speechв Hermes. - Сделайте получившийся MP3 публично доступным.
- Разместите звонок через Twilio с
--audio-url.
Пример потока агента:
- Попросите Hermes создать аудио сообщения через
text_to_speech - При необходимости опубликуйте файл через временный статический хост / туннель / URL объектного хранилища
- Используйте
twilio-call --audio-url ...для доставки по телефону
Подходящие варианты хостинга для MP3:
- временный публичный URL объектного хранилища
- короткоживущий туннель к локальному статическому файловому серверу
- любой существующий HTTPS-URL, доступный провайдеру напрямую
Важное замечание:
- Hermes TTS хорошо работает для заранее записанных исходящих сообщений
- Bland/Vapi лучше подходят для живых разговорных ИИ-звонков: они сами ведут стек телефонного аудио в реальном времени
- STT/TTS в Hermes здесь не используются как полнодуплексный движок телефонного разговора — это потребовало бы куда более тяжёлой стриминг/вебхук-интеграции
F. Навигация по телефонному дереву / IVR через прямой звонок Twilio
Если нужно нажимать цифры после установления соединения, используйте --send-digits.
Twilio интерпретирует w как короткую паузу.
python3 "$SCRIPT" twilio-call "+18005551234" --message "Connecting to billing now." --send-digits "ww1w2w3"
Удобно для перехода в конкретную ветку меню перед передачей оператору или коротким статусным сообщением.
G. Исходящий ИИ-звонок через Bland.ai
python3 "$SCRIPT" ai-call "+15551230000" "Call the dental office, ask for a cleaning appointment on Tuesday afternoon, and if they do not have Tuesday availability, ask for Wednesday or Thursday instead." --provider bland --voice mason --max-duration 3
Проверить статус:
python3 "$SCRIPT" ai-status <call_id> --provider bland
Задать аналитические вопросы Bland после завершения звонка:
python3 "$SCRIPT" ai-status <call_id> --provider bland --analyze "Was the appointment confirmed?,What date and time?,Any special instructions?"
H. Исходящий ИИ-звонок через Vapi с вашего номера
- Импортируйте номер Twilio в Vapi:
python3 "$SCRIPT" vapi-import-twilio --save-env
- Разместите звонок:
python3 "$SCRIPT" ai-call "+15551230000" "You are calling to make a dinner reservation for two at 7:30 PM. If that is unavailable, ask for the nearest time between 6:30 and 8:30 PM." --provider vapi --max-duration 4
- Проверьте результат:
python3 "$SCRIPT" ai-status <call_id> --provider vapi
Рекомендуемый порядок действий агента
Когда пользователь просит совершить звонок или отправить сообщение:
- Определите подходящий путь по дереву выбора.
- Запустите
diagnose, если состояние конфигурации не ясно. - Соберите полные сведения о задаче.
- Подтвердите с пользователем перед набором номера или отправкой.
- Используйте правильную команду.
- При необходимости опросите результаты.
- Сформулируйте итог, не сохраняя телефонные номера третьих лиц в память Hermes.
Что этот навык пока не умеет
- отвечать на входящие звонки в реальном времени
- получать живой push входящих SMS в цикл агента через вебхуки
- гарантированно работать с произвольными 2FA-сервисами сторонних провайдеров
Всё это требует инфраструктуры, выходящей за рамки чистого опционального навыка.
Подводные камни
- Пробные аккаунты Twilio и региональные ограничения могут запрещать звонки / SMS определённым адресатам.
- Некоторые сервисы отклоняют VoIP-номера для 2FA.
twilio-inboxопрашивает REST API — это не мгновенная push-доставка.- Исходящие звонки через Vapi требуют корректно импортированного номера.
- Bland проще всего, но не всегда звучит лучше.
- Не сохраняйте произвольные телефонные номера третьих лиц в память Hermes.
Контрольный список после настройки
После настройки всё перечисленное должно работать только силами этого навыка:
diagnoseпоказывает готовность провайдеров и запомненное состояние- искать и покупать номер Twilio
- сохранять его в
~/.hermes/.env - отправлять SMS с этого номера
- опрашивать входящие сообщения позже
- совершать прямой звонок через Twilio
- совершать ИИ-звонок через Bland или Vapi
Ссылки
- Twilio phone numbers: https://www.twilio.com/docs/phone-numbers/api
- Twilio messaging: https://www.twilio.com/docs/messaging/api/message-resource
- Twilio voice: https://www.twilio.com/docs/voice/api/call-resource
- Vapi docs: https://docs.vapi.ai/
- Bland.ai: https://app.bland.ai/