跳到主要內容

電話通信

無需更改核心工具即可賦予 Hermes 電話功能。配置並持久化 Twilio 號碼,發送和接收 SMS/MMS,進行直接呼叫,以及通過 Bland.ai 或 Vapi 發起 AI 驅動的外呼。

技能元數據

來源可選 — 使用 hermes skills install official/productivity/telephony 安裝
路徑optional-skills/productivity/telephony
版本1.0.0
作者Nous Research
許可證MIT
標籤telephony, phone, sms, mms, voice, twilio, bland.ai, vapi, calling, texting
相關技能maps, google-workspace, agentmail

參考:完整 SKILL.md

信息

以下是 Hermes 在觸發此技能時加載的完整技能定義。這是技能激活時代理所看到的指令。

電話通信 — 無需更改核心工具即可實現號碼、呼叫和短信

此可選技能在保持電話通信功能獨立於核心工具列表之外的同時,為 Hermes 提供實用的電話功能。

它附帶一個輔助腳本 scripts/telephony.py,可以執行以下操作:

  • 將提供商憑據保存到 ~/.hermes/.env
  • 搜索併購買 Twilio 電話號碼
  • 記住該自有號碼以供後續會話使用
  • 從自有號碼發送 SMS / MMS
  • 無需 webhook 服務器即可輪詢該號碼的入站 SMS
  • 使用 TwiML <Say><Play> 進行直接 Twilio 呼叫
  • 將自有 Twilio 號碼導入 Vapi
  • 通過 Bland.ai 或 Vapi 發起 outbound AI 呼叫

解決的問題

此技能旨在涵蓋用戶實際需要的實用電話任務:

  • 外呼
  • 發短信
  • 擁有可複用的代理號碼
  • 稍後檢查發送到該號碼的消息
  • 在會話之間保留該號碼及相關 ID
  • 為入站 SMS 輪詢和其他自動化提供面向未來的電話身份

不會將 Hermes 轉變為實時入站電話網關。入站 SMS 通過輪詢 Twilio REST API 處理。這對於許多工作流(包括通知和一些一次性代碼檢索)已經足夠,無需添加核心 webhook 基礎設施。

安全規則 — 強制要求

  1. 在撥打電話或發送短信前務必確認。
  2. 切勿撥打緊急號碼。
  3. 切勿將電話通信用於騷擾、垃圾郵件、冒充或任何非法行為。
  4. 將第三方電話號碼視為敏感操作數據:
    • 不要將其保存到 Hermes 記憶中
    • 除非用戶明確要求,否則不要將其包含在技能文檔、摘要或後續筆記中
  5. 可以持久化代理擁有的 Twilio 號碼,因為這是用戶配置的一部分。
  6. VoIP 號碼不保證適用於所有第三方雙因素認證 (2FA) 流程。請謹慎使用並明確設定用戶預期。

決策樹 — 使用哪項服務?

使用此邏輯而非硬編碼的提供商路由:

1) “我希望 Hermes 擁有一個真實的電話號碼”

使用 Twilio

原因:

  • 購買和保留號碼的最簡單途徑
  • 最佳的 SMS / MMS 支持
  • 最簡單的入站 SMS 輪詢方案
  • 通往入站 webhook 或呼叫處理的最清晰未來路徑

用例:

  • 稍後接收短信
  • 發送部署警報 / cron 通知
  • 為代理維護可複用的電話身份
  • 日後嘗試基於電話的身份驗證流程

2) “我現在只需要最簡單的外呼 AI 電話”

使用 Bland.ai

原因:

  • 設置最快
  • 只需一個 API 密鑰
  • 無需先自行購買/導入號碼

權衡:

  • 靈活性較低
  • 語音質量尚可,但並非最佳

3) “我想要最佳的對話式 AI 語音質量”

使用 Twilio + Vapi

原因:

  • Twilio 提供自有號碼
  • Vapi 提供更佳的對話式 AI 呼叫質量和更多的語音/模型靈活性

推薦流程:

  1. 購買/保存 Twilio 號碼
  2. 將其導入 Vapi
  3. 保存返回的 VAPI_PHONE_NUMBER_ID
  4. 使用 ai-call --provider vapi

4) “我想使用自定義預錄製語音消息進行呼叫”

使用帶有公共音頻 URL 的 Twilio 直接呼叫

原因:

  • 播放自定義 MP3 的最簡單方式
  • 與 Hermes text_to_speech 加上公共文件主機或隧道配合良好

文件和持久狀態

該技能在兩個位置持久化電話通信狀態:

~/.hermes/.env

用於長期存在的提供商憑據和自有號碼 ID,例如:

  • TWILIO_ACCOUNT_SID
  • TWILIO_AUTH_TOKEN
  • TWILIO_PHONE_NUMBER
  • TWILIO_PHONE_NUMBER_SID
  • BLAND_API_KEY
  • VAPI_API_KEY
  • VAPI_PHONE_NUMBER_ID
  • PHONE_PROVIDER(AI 呼叫提供商:bland 或 vapi)

~/.hermes/telephony_state.json

用於僅屬於技能且應在會話間保留的狀態,例如:

  • 記住的默認 Twilio 號碼 / SID
  • 記住的 Vapi 電話號碼 ID
  • 用於收件箱輪詢檢查點的最後入站消息 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
# or
python3 "$SCRIPT" twilio-set-default PNXXXXXXXXXXXXXXXXXXXXXXXXXXXX --save-env

Bland.ai — 最簡單的出站 AI 呼叫

註冊地址:

保存配置:

python3 "$SCRIPT" save-bland your_bland_api_key --voice mason

Vapi — 更好的對話語音質量

註冊地址:

首先保存 API 密鑰:

python3 "$SCRIPT" save-vapi your_vapi_api_key

將你擁有的 Twilio 號碼導入 Vapi 並持久化返回的電話號碼 ID:

python3 "$SCRIPT" vapi-import-twilio --save-env

如果你已經知道 Vapi 電話號碼 ID,可以直接保存:

python3 "$SCRIPT" save-vapi your_vapi_api_key --phone-number-id vapi_phone_number_id_here

診斷當前狀態

隨時檢查技能已知的信息:

python3 "$SCRIPT" diagnose

在後續會話中恢復工作時,請首先使用此命令。

常見工作流

A. 購買代理號碼並在以後繼續使用

  1. 保存 Twilio 憑據:
python3 "$SCRIPT" save-twilio AC... auth_token_here
  1. 搜索號碼:
python3 "$SCRIPT" twilio-search --country US --area-code 702 --limit 10
  1. 購買並將其保存到 ~/.hermes/.env + 狀態中:
python3 "$SCRIPT" twilio-buy "+17025551234" --save-env
  1. 下次會話時,運行:
python3 "$SCRIPT" diagnose

這將顯示記住的默認號碼和收件箱檢查點狀態。

B. 從代理號碼發送短信

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. 在沒有 webhook 服務器的情況下稍後檢查入站短信

輪詢默認 Twilio 號碼的收件箱:

python3 "$SCRIPT" twilio-inbox --limit 20

僅顯示在上次檢查點之後到達的消息,並在閱讀完成後推進檢查點:

python3 "$SCRIPT" twilio-inbox --since-last --mark-seen

這是“下次加載技能時如何訪問該號碼接收到的消息?”的主要答案。

D. 使用內置 TTS 進行直接 Twilio 呼叫

python3 "$SCRIPT" twilio-call "+15551230000" --message "Hello! This is Hermes calling with your status update." --voice Polly.Joanna

E. 使用預錄製/自定義語音消息進行呼叫

這是複用 Hermes 現有 text_to_speech 支持的主要路徑。

在以下情況下使用:

  • 你希望呼叫使用 Hermes 配置的 TTS 語音,而不是 Twilio <Say>
  • 你希望進行單向語音交付(簡報、警報、笑話、提醒、狀態更新)
  • 需要實時對話電話呼叫

單獨生成或託管音頻,然後:

python3 "$SCRIPT" twilio-call "+155****0000" --audio-url "https://example.com/briefing.mp3"

推薦的 Hermes TTS -> Twilio Play 工作流:

  1. 使用 Hermes text_to_speech 生成音頻。
  2. 使生成的 MP3 可公開訪問。
  3. 使用 --audio-url 發起 Twilio 呼叫。

代理流程示例:

  • 要求 Hermes 使用 text_to_speech 創建消息音頻
  • 如果需要,通過臨時靜態主機/隧道/對象存儲 URL 暴露文件
  • 使用 twilio-call --audio-url ... 通過電話交付

MP3 的良好託管選項:

  • 臨時公共對象/存儲 URL
  • 指向本地靜態文件服務器的短期隧道
  • 電話提供商可以直接獲取的任何現有 HTTPS URL

重要說明:

  • Hermes TTS 非常適合預錄製的出站消息
  • Bland/Vapi 更適合實時對話 AI 呼叫,因為它們自己處理實時電話音頻棧
  • 此處並未將 Hermes STT/TTS 用作全雙工電話對話引擎;那需要比本技能試圖引入的更重的流式/webhook 集成

F. 使用 Twilio 直接呼叫導航電話樹/IVR

如果需要在呼叫連接後按下數字鍵,請使用 --send-digits。 Twilio 將 w 解釋為短暫等待。

python3 "$SCRIPT" twilio-call "+18005551234" --message "Connecting to billing now." --send-digits "ww1w2w3"

這在轉接給人工或交付簡短狀態消息之前到達特定菜單分支時很有用。

G. 使用 Bland.ai 進行出站 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 進行出站 AI 電話呼叫

  1. 將你的 Twilio 號碼導入 Vapi:
python3 "$SCRIPT" vapi-import-twilio --save-env
  1. 發起呼叫:
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
  1. 檢查結果:
python3 "$SCRIPT" ai-status <call_id> --provider vapi

建議的代理程序

當用戶請求呼叫或短信時:

  1. 通過決策樹確定哪種路徑適合該請求。
  2. 如果配置狀態不明確,運行 diagnose
  3. 收集完整的任務詳情。
  4. 在撥號或發送短信之前與用戶確認。
  5. 使用正確的命令。
  6. 如果需要,輪詢結果。
  7. 總結結果,不要將第三方號碼持久化到 Hermes 記憶中。

此技能尚不支持的功能

  • 實時接聽呼入電話
  • 基於 Webhook 的實時短信推送到代理循環中
  • 保證支持任意第三方雙因素認證(2FA)提供商

這些功能需要比純可選技能更多的基礎設施支持。

注意事項

  • Twilio 試用賬戶和區域規則可能會限制您可以呼叫或發送短信的對象。
  • 某些服務會拒絕將 VoIP 號碼用於雙因素認證(2FA)。
  • twilio-inbox 通過輪詢 REST API 獲取數據,並非即時推送交付。
  • Vapi 外呼仍然依賴於已導入的有效號碼。
  • Bland 使用最簡單,但音質並非總是最佳。
  • 不要在 Hermes 內存中存儲任意的第三方電話號碼。

驗證清單

完成設置後,僅使用此技能應能夠執行以下所有操作:

  1. diagnose 命令顯示提供商就緒狀態和已記憶的狀態
  2. 搜索併購買 Twilio 號碼
  3. 將該號碼持久化保存到 ~/.hermes/.env
  4. 從擁有的號碼發送短信
  5. 稍後輪詢該擁有號碼的接收短信
  6. 發起直接的 Twilio 呼叫
  7. 通過 Bland 或 Vapi 發起 AI 呼叫

參考資料