Give Hermes phone capabilities without core tool changes. Provision and persist a Twilio number, send and receive SMS/MMS, make direct calls, and place AI-driven outbound calls through Bland.ai or Vapi.
Standardmäßig ist der Prompt ausgewählt, der zuerst die Quelle prüft. Sie können zu einem direkten Befehl wechseln oder eine lokale Kopie herunterladen.
Quelldateien prüfen
Lesen Sie SKILL.md und alle von SkillsMP angezeigten Begleitdateien, bevor Sie sich für eine Installation entscheiden.
Mit Codex oder Claude installieren Kopieren Sie diesen Prompt, fügen Sie ihn in Codex, Claude oder einen anderen Assistant ein und lassen Sie die Skill-Seite prüfen und installieren.
Ein direkter Befehl überspringt den Prüf-Prompt. Prüfen Sie die Quelle, bevor Sie ihn ausführen.
Give Hermes phone capabilities without core tool changes. Provision and persist a Twilio number, send and receive SMS/MMS, make direct calls, and place AI-driven outbound calls through Bland.ai or Vapi.
Telephony — Numbers, Calls, and Texts without Core Tool Changes
This optional skill gives Hermes practical phone capabilities while keeping telephony out of the core tool list.
It ships with a helper script, scripts/telephony.py, that can:
save provider credentials into ~/.edgecrab/.env
search for and buy a Twilio phone number
remember that owned number for later sessions
send SMS / MMS from the owned number
poll inbound SMS for that number with no webhook server required
make direct Twilio calls using TwiML <Say> or <Play>
import the owned Twilio number into Vapi
place outbound AI calls through Bland.ai or Vapi
What this solves
This skill is meant to cover the practical phone tasks users actually want:
outbound calls
texting
owning a reusable agent number
checking messages that arrive to that number later
preserving that number and related IDs between sessions
future-friendly telephony identity for inbound SMS polling and other automations
It does not turn Hermes into a real-time inbound phone gateway. Inbound SMS is handled by polling the Twilio REST API. That is enough for many workflows, including notifications and some one-time-code retrieval, without adding core webhook infrastructure.
Safety rules — mandatory
Always confirm before placing a call or sending a text.
Never dial emergency numbers.
Never use telephony for harassment, spam, impersonation, or anything illegal.
Treat third-party phone numbers as sensitive operational data:
do not save them to Hermes memory
do not include them in skill docs, summaries, or follow-up notes unless the user explicitly wants that
It is fine to persist the agent-owned Twilio number because that is part of the user's configuration.
VoIP numbers are not guaranteed to work for all third-party 2FA flows. Use with caution and set user expectations clearly.
Decision tree — which service to use?
Use this logic instead of hardcoded provider routing:
1) "I want Hermes to own a real phone number"
Use Twilio.
Why:
easiest path to buying and keeping a number
best SMS / MMS support
simplest inbound SMS polling story
cleanest future path to inbound webhooks or call handling
Use cases:
receive texts later
send deployment alerts / cron notifications
maintain a reusable phone identity for the agent
experiment with phone-based auth flows later
2) "I only need the easiest outbound AI phone call right now"
Use Bland.ai.
Why:
quickest setup
one API key
no need to first buy/import a number yourself
Tradeoff:
less flexible
voice quality is decent, but not the best
3) "I want the best conversational AI voice quality"
Use Twilio + Vapi.
Why:
Twilio gives you the owned number
Vapi gives you better conversational AI call quality and more voice/model flexibility
Recommended flow:
Buy/save a Twilio number
Import it into Vapi
Save the returned VAPI_PHONE_NUMBER_ID
Use ai-call --provider vapi
4) "I want to call with a custom prerecorded voice message"
Use Twilio direct call with a public audio URL.
Why:
easiest way to play a custom MP3
pairs well with Hermes text_to_speech plus a public file host or tunnel
Files and persistent state
The skill persists telephony state in two places:
~/.edgecrab/.env
Used for long-lived provider credentials and owned-number IDs, for example:
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 call provider: bland or vapi)
~/.edgecrab/telephony_state.json
Used for skill-only state that should survive across sessions, for example:
remembered default Twilio number / SID
remembered Vapi phone number ID
last inbound message SID/date for inbox polling checkpoints
This means:
the next time the skill is loaded, diagnose can tell you what number is already configured
twilio-inbox --since-last --mark-seen can continue from the previous checkpoint
Locate the helper script
After installing this skill, locate the script like this:
Ask Hermes to create the message audio with text_to_speech
If needed, expose the file with a temporary static host / tunnel / object storage URL
Use twilio-call --audio-url ... to deliver it by phone
Good hosting options for the MP3:
a temporary public object/storage URL
a short-lived tunnel to a local static file server
any existing HTTPS URL the phone provider can fetch directly
Important note:
Hermes TTS is great for prerecorded outbound messages
Bland/Vapi are better for live conversational AI calls because they handle the real-time telephony audio stack themselves
Hermes STT/TTS alone is not being used here as a full duplex phone conversation engine; that would require a much heavier streaming/webhook integration than this skill is trying to introduce
F. Navigate a phone tree / IVR with Twilio direct calling
If you need to press digits after the call connects, use --send-digits.
Twilio interprets w as a short wait.
This is useful for reaching a specific menu branch before handing off to a human or delivering a short status message.
G. Outbound AI phone call with 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
Check status:
python3 "$SCRIPT" ai-status <call_id> --provider bland
Ask Bland analysis questions after completion:
python3 "$SCRIPT" ai-status <call_id> --provider bland --analyze "Was the appointment confirmed?,What date and time?,Any special instructions?"
H. Outbound AI phone call with Vapi on your owned number
Import your Twilio number into Vapi:
python3 "$SCRIPT" vapi-import-twilio --save-env
Place the call:
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
Check result:
python3 "$SCRIPT" ai-status <call_id> --provider vapi
Suggested agent procedure
When the user asks for a call or text:
Determine which path fits the request via the decision tree.
Run diagnose if configuration state is unclear.
Gather the full task details.
Confirm with the user before dialing or texting.
Use the correct command.
Poll for results if needed.
Summarize the outcome without persisting third-party numbers to Hermes memory.
What this skill still does not do
real-time inbound call answering
webhook-based live SMS push into the agent loop
guaranteed support for arbitrary third-party 2FA providers
Those would require more infrastructure than a pure optional skill.
Pitfalls
Twilio trial accounts and regional rules can restrict who you can call/text.
Some services reject VoIP numbers for 2FA.
twilio-inbox polls the REST API; it is not instant push delivery.
Vapi outbound calling still depends on having a valid imported number.
Bland is easiest, but not always the best-sounding.
Do not store arbitrary third-party phone numbers in Hermes memory.
Verification checklist
After setup, you should be able to do all of the following with just this skill:
diagnose shows provider readiness and remembered state