telephony
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.
What this skill does
# 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 `~/.hermes/.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 1. Always confirm before placing a call or sending a text. 2. Never dial emergency numbers. 3. Never use telephony for harassment, spam, impersonation, or anything illegal. 4. 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 5. It is fine to persist the **agent-owned Twilio number** because that is part of the user's configuration. 6. 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: 1. Buy/save a Twilio number 2. Import it into Vapi 3. Save the returned `VAPI_PHONE_NUMBER_ID` 4. 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: ### `~/.hermes/.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) ### `~/.hermes/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: ```bash SCRIPT="$(find ~/.hermes/skills -path '*/telephony/scripts/telephony.py' -print -quit)" ``` If `SCRIPT` is empty, the skill is not installed yet. ## Install This is an official optional skill, so install it from the Skills Hub: ```bash hermes skills search telephony hermes skills install official/productivity/telephony ``` ## Provider setup ### Twilio — owned number, SMS/MMS, direct calls, inbound SMS polling Sign up at: - https://www.twilio.com/try-twilio Then save credentials into Hermes: ```bash python3 "$SCRIPT" save-twilio ACXXXXXXXXXXXXXXXXXXXXXXXXXXXX your_auth_token_here ``` Search for available numbers: ```bash python3 "$SCRIPT" twilio-search --country US --area-code 702 --limit 5 ``` Buy and remember a number: ```bash python3 "$SCRIPT" twilio-buy "+17025551234" --save-env ``` List owned numbers: ```bash python3 "$SCRIPT" twilio-owned ``` Set one of them as the default later: ```bash python3 "$SCRIPT" twilio-set-default "+17025551234" --save-env # or python3 "$SCRIPT" twilio-set-default PNXXXXXXXXXXXXXXXXXXXXXXXXXXXX --save-env ``` ### Bland.ai — easiest outbound AI calling Sign up at: - https://app.bland.ai Save config: ```bash python3 "$SCRIPT" save-bland your_bland_api_key --voice mason ``` ### Vapi — better conversational voice quality Sign up at: - https://dashboard.vapi.ai Save the API key first: ```bash python3 "$SCRIPT" save-vapi your_vapi_api_key ``` Import your owned Twilio number into Vapi and persist the returned phone number ID: ```bash python3 "$SCRIPT" vapi-import-twilio --save-env ``` If you already know the Vapi phone number ID, save it directly: ```bash python3 "$SCRIPT" save-vapi your_vapi_api_key --phone-number-id vapi_phone_number_id_here ``` ## Diagnose current state At any time, inspect what the skill already knows: ```bash python3 "$SCRIPT" diagnose ``` Use this first when resuming work in a later session. ## Common workflows ### A. Buy an agent number and keep using it later 1. Save Twilio credentials: ```bash python3 "$SCRIPT" save-twilio AC... auth_token_here ``` 2. Search for a number: ```bash python3 "$SCRIPT" twilio-search --country US --area-code 702 --limit 10 ``` 3. Buy it and save it into `~/.hermes/.env` + state: ```bash python3 "$SCRIPT" twilio-buy "+17025551234" --save-env ``` 4. Next session, run: ```bash python3 "$SCRIPT" diagnose ``` This shows the remembered default number and inbox checkpoint state. ### B. Send a text from the agent number ```bash python3 "$SCRIPT" twilio-send-sms "+15551230000" "Your deployment completed successfully." ``` With media: ```bash python3 "$SCRIPT" twilio-send-sms "+15551230000" "Here is the chart." --media-url "https://example.com/chart.png" ``` ### C. Check inbound texts later with no webhook server Poll the inbox for the default Twilio number: ```bash python3 "$SCRIPT" twilio-inbox --limit 20 ``` Only show messages that arrived after the last checkpoint, and advance the checkpoint when you're done reading: ```bash python3 "$SCRIPT" twilio-inbox --since-last --mark-seen ``` This is the main answer to “how do I access messages the number receives next time the skill is loaded?” ### D. Make a direct Twilio call with built-in TTS ```bash python3 "$SCRIPT" twilio-call "+15551230000" --message "Hello! This is Hermes calling with your status update." --voice Polly.Joanna ``` ### E. Call with a prerecorded / custom voice message This is the main path for reusing Hermes's existing `text_to_speech` support. Use this when: - you want the call to use Hermes's configured TTS voice rather than Twilio `<Say>` - you want a one-way voice delivery (briefing, alert, joke, reminder, status update) - you do **not** need a live conversational phone call Generate or host audio separately, then: ```bash python3 "$SCRIPT" t
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.