[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DEVXVZTRQHHBF2PMKENJH1":3,"skill-same:01M6DEVXVZTRQHHBF2PMKENJH1":172},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":34,"linkOnly":35,"markdownContent":36,"markdownBody":37,"frontMatter":38,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":6,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6DEVXVZTRQHHBF2PMKENJH1","telephony",null,"Provision Twilio numbers, SMS\u002FMMS, and AI outbound calls.","zapabob\u002FSkills","zapabob","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F130830376?v=4","01M6DBMYZAGRTFQDSQYW3W764P","峯岸 亮","01M6DBMZ3GKDSJ01NZ9XTZD7JD",2,"MIT","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002F41\u002F41ec6380adce44ffe76259a6642412b121ca1de0fd5381acc6d501f1f4334d12\u002FSKILL.md",[],[5,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"google","macos","linux","research","windows","productivity","Google-Workspace","voice","workspace","maps","agentmail","phone","calling","twilio","outbound","2026-11-10 10:12:30",false,"---\nname: telephony\ndescription: Provision Twilio numbers, SMS\u002FMMS, and AI outbound calls.\nversion: 1.0.0\nauthor: Nous Research\nlicense: MIT\nplatforms: [linux, macos, windows]\nmetadata:\n  hermes:\n    tags: [telephony, phone, sms, mms, voice, twilio, bland.ai, vapi, calling, texting]\n    related_skills: [maps, google-workspace, agentmail]\n    category: productivity\n---\n\n# Telephony — Numbers, Calls, and Texts without Core Tool Changes\n\nThis optional skill gives Hermes practical phone capabilities while keeping telephony out of the core tool list.\n\nIt ships with a helper script, `scripts\u002Ftelephony.py`, that can:\n- save provider credentials into `${HERMES_HOME:-~\u002F.hermes}\u002F.env`\n- search for and buy a Twilio phone number\n- remember that owned number for later sessions\n- send SMS \u002F MMS from the owned number\n- poll inbound SMS for that number with no webhook server required\n- make direct Twilio calls using TwiML `\u003CSay>` or `\u003CPlay>`\n- import the owned Twilio number into Vapi\n- place outbound AI calls through Bland.ai or Vapi\n\n## What this solves\n\nThis skill is meant to cover the practical phone tasks users actually want:\n- outbound calls\n- texting\n- owning a reusable agent number\n- checking messages that arrive to that number later\n- preserving that number and related IDs between sessions\n- future-friendly telephony identity for inbound SMS polling and other automations\n\nIt 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.\n\n## Safety rules — mandatory\n\n1. Always confirm before placing a call or sending a text.\n2. Never dial emergency numbers.\n3. Never use telephony for harassment, spam, impersonation, or anything illegal.\n4. Treat third-party phone numbers as sensitive operational data:\n   - do not save them to Hermes memory\n   - do not include them in skill docs, summaries, or follow-up notes unless the user explicitly wants that\n5. It is fine to persist the **agent-owned Twilio number** because that is part of the user's configuration.\n6. VoIP numbers are **not guaranteed** to work for all third-party 2FA flows. Use with caution and set user expectations clearly.\n\n## Decision tree — which service to use?\n\nUse this logic instead of hardcoded provider routing:\n\n### 1) \"I want Hermes to own a real phone number\"\nUse **Twilio**.\n\nWhy:\n- easiest path to buying and keeping a number\n- best SMS \u002F MMS support\n- simplest inbound SMS polling story\n- cleanest future path to inbound webhooks or call handling\n\nUse cases:\n- receive texts later\n- send deployment alerts \u002F cron notifications\n- maintain a reusable phone identity for the agent\n- experiment with phone-based auth flows later\n\n### 2) \"I only need the easiest outbound AI phone call right now\"\nUse **Bland.ai**.\n\nWhy:\n- quickest setup\n- one API key\n- no need to first buy\u002Fimport a number yourself\n\nTradeoff:\n- less flexible\n- voice quality is decent, but not the best\n\n### 3) \"I want the best conversational AI voice quality\"\nUse **Twilio + Vapi**.\n\nWhy:\n- Twilio gives you the owned number\n- Vapi gives you better conversational AI call quality and more voice\u002Fmodel flexibility\n\nRecommended flow:\n1. Buy\u002Fsave a Twilio number\n2. Import it into Vapi\n3. Save the returned `VAPI_PHONE_NUMBER_ID`\n4. Use `ai-call --provider vapi`\n\n### 4) \"I want to call with a custom prerecorded voice message\"\nUse **Twilio direct call** with a public audio URL.\n\nWhy:\n- easiest way to play a custom MP3\n- pairs well with Hermes `text_to_speech` plus a public file host or tunnel\n\n## Files and persistent state\n\nThe skill persists telephony state in two places:\n\n### `${HERMES_HOME:-~\u002F.hermes}\u002F.env`\nUsed for long-lived provider credentials and owned-number IDs, for example:\n- `TWILIO_ACCOUNT_SID`\n- `TWILIO_AUTH_TOKEN`\n- `TWILIO_PHONE_NUMBER`\n- `TWILIO_PHONE_NUMBER_SID`\n- `BLAND_API_KEY`\n- `VAPI_API_KEY`\n- `VAPI_PHONE_NUMBER_ID`\n- `PHONE_PROVIDER` (AI call provider: bland or vapi)\n\n### `~\u002F.hermes\u002Ftelephony_state.json`\nUsed for skill-only state that should survive across sessions, for example:\n- remembered default Twilio number \u002F SID\n- remembered Vapi phone number ID\n- last inbound message SID\u002Fdate for inbox polling checkpoints\n\nThis means:\n- the next time the skill is loaded, `diagnose` can tell you what number is already configured\n- `twilio-inbox --since-last --mark-seen` can continue from the previous checkpoint\n\n## Locate the helper script\n\nAfter installing this skill, locate the script like this:\n\n```bash\nSCRIPT=\"$(find ~\u002F.hermes\u002Fskills -path '*\u002Ftelephony\u002Fscripts\u002Ftelephony.py' -print -quit)\"\n```\n\nIf `SCRIPT` is empty, the skill is not installed yet.\n\n## Install\n\nThis is an official optional skill, so install it from the Skills Hub:\n\n```bash\nhermes skills search telephony\nhermes skills install official\u002Fproductivity\u002Ftelephony\n```\n\n## Provider setup\n\n### Twilio — owned number, SMS\u002FMMS, direct calls, inbound SMS polling\n\nSign up at:\n- https:\u002F\u002Fwww.twilio.com\u002Ftry-twilio\n\nThen save credentials into Hermes:\n\n```bash\npython \"$SCRIPT\" save-twilio ACXXXXXXXXXXXXXXXXXXXXXXXXXXXX your_auth_token_here\n```\n\nSearch for available numbers:\n\n```bash\npython \"$SCRIPT\" twilio-search --country US --area-code 702 --limit 5\n```\n\nBuy and remember a number:\n\n```bash\npython \"$SCRIPT\" twilio-buy \"+17025551234\" --save-env\n```\n\nList owned numbers:\n\n```bash\npython \"$SCRIPT\" twilio-owned\n```\n\nSet one of them as the default later:\n\n```bash\npython \"$SCRIPT\" twilio-set-default \"+17025551234\" --save-env\n# or\npython \"$SCRIPT\" twilio-set-default PNXXXXXXXXXXXXXXXXXXXXXXXXXXXX --save-env\n```\n\n### Bland.ai — easiest outbound AI calling\n\nSign up at:\n- https:\u002F\u002Fapp.bland.ai\n\nSave config:\n\n```bash\npython \"$SCRIPT\" save-bland your_bland_api_key --voice mason\n```\n\n### Vapi — better conversational voice quality\n\nSign up at:\n- https:\u002F\u002Fdashboard.vapi.ai\n\nSave the API key first:\n\n```bash\npython \"$SCRIPT\" save-vapi your_vapi_api_key\n```\n\nImport your owned Twilio number into Vapi and persist the returned phone number ID:\n\n```bash\npython \"$SCRIPT\" vapi-import-twilio --save-env\n```\n\nIf you already know the Vapi phone number ID, save it directly:\n\n```bash\npython \"$SCRIPT\" save-vapi your_vapi_api_key --phone-number-id vapi_phone_number_id_here\n```\n\n## Diagnose current state\n\nAt any time, inspect what the skill already knows:\n\n```bash\npython \"$SCRIPT\" diagnose\n```\n\nUse this first when resuming work in a later session.\n\n## Common workflows\n\n### A. Buy an agent number and keep using it later\n\n1. Save Twilio credentials:\n```bash\npython \"$SCRIPT\" save-twilio AC... auth_token_here\n```\n\n2. Search for a number:\n```bash\npython \"$SCRIPT\" twilio-search --country US --area-code 702 --limit 10\n```\n\n3. Buy it and save it into `${HERMES_HOME:-~\u002F.hermes}\u002F.env` + state:\n```bash\npython \"$SCRIPT\" twilio-buy \"+17025551234\" --save-env\n```\n\n4. Next session, run:\n```bash\npython \"$SCRIPT\" diagnose\n```\nThis shows the remembered default number and inbox checkpoint state.\n\n### B. Send a text from the agent number\n\n```bash\npython \"$SCRIPT\" twilio-send-sms \"+15551230000\" \"Your deployment completed successfully.\"\n```\n\nWith media:\n\n```bash\npython \"$SCRIPT\" twilio-send-sms \"+15551230000\" \"Here is the chart.\" --media-url \"https:\u002F\u002Fexample.com\u002Fchart.png\"\n```\n\n### C. Check inbound texts later with no webhook server\n\nPoll the inbox for the default Twilio number:\n\n```bash\npython \"$SCRIPT\" twilio-inbox --limit 20\n```\n\nOnly show messages that arrived after the last checkpoint, and advance the checkpoint when you're done reading:\n\n```bash\npython \"$SCRIPT\" twilio-inbox --since-last --mark-seen\n```\n\nThis is the main answer to “how do I access messages the number receives next time the skill is loaded?”\n\n### D. Make a direct Twilio call with built-in TTS\n\n```bash\npython \"$SCRIPT\" twilio-call \"+15551230000\" --message \"Hello! This is Hermes calling with your status update.\" --voice Polly.Joanna\n```\n\n### E. Call with a prerecorded \u002F custom voice message\n\nThis is the main path for reusing Hermes's existing `text_to_speech` support.\n\nUse this when:\n- you want the call to use Hermes's configured TTS voice rather than Twilio `\u003CSay>`\n- you want a one-way voice delivery (briefing, alert, joke, reminder, status update)\n- you do **not** need a live conversational phone call\n\nGenerate or host audio separately, then:\n\n```bash\npython \"$SCRIPT\" twilio-call \"+155****0000\" --audio-url \"https:\u002F\u002Fexample.com\u002Fbriefing.mp3\"\n```\n\nRecommended Hermes TTS -> Twilio Play workflow:\n\n1. Generate the audio with Hermes `text_to_speech`.\n2. Make the resulting MP3 publicly reachable.\n3. Place the Twilio call with `--audio-url`.\n\nExample agent flow:\n- Ask Hermes to create the message audio with `text_to_speech`\n- If needed, expose the file with a temporary static host \u002F tunnel \u002F object storage URL\n- Use `twilio-call --audio-url ...` to deliver it by phone\n\nGood hosting options for the MP3:\n- a temporary public object\u002Fstorage URL\n- a short-lived tunnel to a local static file server\n- any existing HTTPS URL the phone provider can fetch directly\n\nImportant note:\n- Hermes TTS is great for prerecorded outbound messages\n- Bland\u002FVapi are better for **live conversational AI calls** because they handle the real-time telephony audio stack themselves\n- Hermes STT\u002FTTS alone is not being used here as a full duplex phone conversation engine; that would require a much heavier streaming\u002Fwebhook integration than this skill is trying to introduce\n\n### F. Navigate a phone tree \u002F IVR with Twilio direct calling\n\nIf you need to press digits after the call connects, use `--send-digits`.\nTwilio interprets `w` as a short wait.\n\n```bash\npython \"$SCRIPT\" twilio-call \"+18005551234\" --message \"Connecting to billing now.\" --send-digits \"ww1w2w3\"\n```\n\nThis is useful for reaching a specific menu branch before handing off to a human or delivering a short status message.\n\n### G. Outbound AI phone call with Bland.ai\n\n```bash\npython \"$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\n```\n\nCheck status:\n\n```bash\npython \"$SCRIPT\" ai-status \u003Ccall_id> --provider bland\n```\n\nAsk Bland analysis questions after completion:\n\n```bash\npython \"$SCRIPT\" ai-status \u003Ccall_id> --provider bland --analyze \"Was the appointment confirmed?,What date and time?,Any special instructions?\"\n```\n\n### H. Outbound AI phone call with Vapi on your owned number\n\n1. Import your Twilio number into Vapi:\n```bash\npython \"$SCRIPT\" vapi-import-twilio --save-env\n```\n\n2. Place the call:\n```bash\npython \"$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\n```\n\n3. Check result:\n```bash\npython \"$SCRIPT\" ai-status \u003Ccall_id> --provider vapi\n```\n\n## Suggested agent procedure\n\nWhen the user asks for a call or text:\n\n1. Determine which path fits the request via the decision tree.\n2. Run `diagnose` if configuration state is unclear.\n3. Gather the full task details.\n4. Confirm with the user before dialing or texting.\n5. Use the correct command.\n6. Poll for results if needed.\n7. Summarize the outcome without persisting third-party numbers to Hermes memory.\n\n## What this skill still does not do\n\n- real-time inbound call answering\n- webhook-based live SMS push into the agent loop\n- guaranteed support for arbitrary third-party 2FA providers\n\nThose would require more infrastructure than a pure optional skill.\n\n## Pitfalls\n\n- Twilio trial accounts and regional rules can restrict who you can call\u002Ftext.\n- Some services reject VoIP numbers for 2FA.\n- `twilio-inbox` polls the REST API; it is not instant push delivery.\n- Vapi outbound calling still depends on having a valid imported number.\n- Bland is easiest, but not always the best-sounding.\n- Do not store arbitrary third-party phone numbers in Hermes memory.\n\n## Verification checklist\n\nAfter setup, you should be able to do all of the following with just this skill:\n\n1. `diagnose` shows provider readiness and remembered state\n2. search and buy a Twilio number\n3. persist that number to `${HERMES_HOME:-~\u002F.hermes}\u002F.env`\n4. send an SMS from the owned number\n5. poll inbound texts for the owned number later\n6. place a direct Twilio call\n7. place an AI call via Bland or Vapi\n\n## References\n\n- Twilio phone numbers: https:\u002F\u002Fwww.twilio.com\u002Fdocs\u002Fphone-numbers\u002Fapi\n- Twilio messaging: https:\u002F\u002Fwww.twilio.com\u002Fdocs\u002Fmessaging\u002Fapi\u002Fmessage-resource\n- Twilio voice: https:\u002F\u002Fwww.twilio.com\u002Fdocs\u002Fvoice\u002Fapi\u002Fcall-resource\n- Vapi docs: https:\u002F\u002Fdocs.vapi.ai\u002F\n- Bland.ai: https:\u002F\u002Fapp.bland.ai\u002F\n","# Telephony — Numbers, Calls, and Texts without Core Tool Changes\n\nThis optional skill gives Hermes practical phone capabilities while keeping telephony out of the core tool list.\n\nIt ships with a helper script, `scripts\u002Ftelephony.py`, that can:\n- save provider credentials into `${HERMES_HOME:-~\u002F.hermes}\u002F.env`\n- search for and buy a Twilio phone number\n- remember that owned number for later sessions\n- send SMS \u002F MMS from the owned number\n- poll inbound SMS for that number with no webhook server required\n- make direct Twilio calls using TwiML `\u003CSay>` or `\u003CPlay>`\n- import the owned Twilio number into Vapi\n- place outbound AI calls through Bland.ai or Vapi\n\n## What this solves\n\nThis skill is meant to cover the practical phone tasks users actually want:\n- outbound calls\n- texting\n- owning a reusable agent number\n- checking messages that arrive to that number later\n- preserving that number and related IDs between sessions\n- future-friendly telephony identity for inbound SMS polling and other automations\n\nIt 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.\n\n## Safety rules — mandatory\n\n1. Always confirm before placing a call or sending a text.\n2. Never dial emergency numbers.\n3. Never use telephony for harassment, spam, impersonation, or anything illegal.\n4. Treat third-party phone numbers as sensitive operational data:\n   - do not save them to Hermes memory\n   - do not include them in skill docs, summaries, or follow-up notes unless the user explicitly wants that\n5. It is fine to persist the **agent-owned Twilio number** because that is part of the user's configuration.\n6. VoIP numbers are **not guaranteed** to work for all third-party 2FA flows. Use with caution and set user expectations clearly.\n\n## Decision tree — which service to use?\n\nUse this logic instead of hardcoded provider routing:\n\n### 1) \"I want Hermes to own a real phone number\"\nUse **Twilio**.\n\nWhy:\n- easiest path to buying and keeping a number\n- best SMS \u002F MMS support\n- simplest inbound SMS polling story\n- cleanest future path to inbound webhooks or call handling\n\nUse cases:\n- receive texts later\n- send deployment alerts \u002F cron notifications\n- maintain a reusable phone identity for the agent\n- experiment with phone-based auth flows later\n\n### 2) \"I only need the easiest outbound AI phone call right now\"\nUse **Bland.ai**.\n\nWhy:\n- quickest setup\n- one API key\n- no need to first buy\u002Fimport a number yourself\n\nTradeoff:\n- less flexible\n- voice quality is decent, but not the best\n\n### 3) \"I want the best conversational AI voice quality\"\nUse **Twilio + Vapi**.\n\nWhy:\n- Twilio gives you the owned number\n- Vapi gives you better conversational AI call quality and more voice\u002Fmodel flexibility\n\nRecommended flow:\n1. Buy\u002Fsave a Twilio number\n2. Import it into Vapi\n3. Save the returned `VAPI_PHONE_NUMBER_ID`\n4. Use `ai-call --provider vapi`\n\n### 4) \"I want to call with a custom prerecorded voice message\"\nUse **Twilio direct call** with a public audio URL.\n\nWhy:\n- easiest way to play a custom MP3\n- pairs well with Hermes `text_to_speech` plus a public file host or tunnel\n\n## Files and persistent state\n\nThe skill persists telephony state in two places:\n\n### `${HERMES_HOME:-~\u002F.hermes}\u002F.env`\nUsed for long-lived provider credentials and owned-number IDs, for example:\n- `TWILIO_ACCOUNT_SID`\n- `TWILIO_AUTH_TOKEN`\n- `TWILIO_PHONE_NUMBER`\n- `TWILIO_PHONE_NUMBER_SID`\n- `BLAND_API_KEY`\n- `VAPI_API_KEY`\n- `VAPI_PHONE_NUMBER_ID`\n- `PHONE_PROVIDER` (AI call provider: bland or vapi)\n\n### `~\u002F.hermes\u002Ftelephony_state.json`\nUsed for skill-only state that should survive across sessions, for example:\n- remembered default Twilio number \u002F SID\n- remembered Vapi phone number ID\n- last inbound message SID\u002Fdate for inbox polling checkpoints\n\nThis means:\n- the next time the skill is loaded, `diagnose` can tell you what number is already configured\n- `twilio-inbox --since-last --mark-seen` can continue from the previous checkpoint\n\n## Locate the helper script\n\nAfter installing this skill, locate the script like this:\n\n```bash\nSCRIPT=\"$(find ~\u002F.hermes\u002Fskills -path '*\u002Ftelephony\u002Fscripts\u002Ftelephony.py' -print -quit)\"\n```\n\nIf `SCRIPT` is empty, the skill is not installed yet.\n\n## Install\n\nThis is an official optional skill, so install it from the Skills Hub:\n\n```bash\nhermes skills search telephony\nhermes skills install official\u002Fproductivity\u002Ftelephony\n```\n\n## Provider setup\n\n### Twilio — owned number, SMS\u002FMMS, direct calls, inbound SMS polling\n\nSign up at:\n- https:\u002F\u002Fwww.twilio.com\u002Ftry-twilio\n\nThen save credentials into Hermes:\n\n```bash\npython \"$SCRIPT\" save-twilio ACXXXXXXXXXXXXXXXXXXXXXXXXXXXX your_auth_token_here\n```\n\nSearch for available numbers:\n\n```bash\npython \"$SCRIPT\" twilio-search --country US --area-code 702 --limit 5\n```\n\nBuy and remember a number:\n\n```bash\npython \"$SCRIPT\" twilio-buy \"+17025551234\" --save-env\n```\n\nList owned numbers:\n\n```bash\npython \"$SCRIPT\" twilio-owned\n```\n\nSet one of them as the default later:\n\n```bash\npython \"$SCRIPT\" twilio-set-default \"+17025551234\" --save-env\n# or\npython \"$SCRIPT\" twilio-set-default PNXXXXXXXXXXXXXXXXXXXXXXXXXXXX --save-env\n```\n\n### Bland.ai — easiest outbound AI calling\n\nSign up at:\n- https:\u002F\u002Fapp.bland.ai\n\nSave config:\n\n```bash\npython \"$SCRIPT\" save-bland your_bland_api_key --voice mason\n```\n\n### Vapi — better conversational voice quality\n\nSign up at:\n- https:\u002F\u002Fdashboard.vapi.ai\n\nSave the API key first:\n\n```bash\npython \"$SCRIPT\" save-vapi your_vapi_api_key\n```\n\nImport your owned Twilio number into Vapi and persist the returned phone number ID:\n\n```bash\npython \"$SCRIPT\" vapi-import-twilio --save-env\n```\n\nIf you already know the Vapi phone number ID, save it directly:\n\n```bash\npython \"$SCRIPT\" save-vapi your_vapi_api_key --phone-number-id vapi_phone_number_id_here\n```\n\n## Diagnose current state\n\nAt any time, inspect what the skill already knows:\n\n```bash\npython \"$SCRIPT\" diagnose\n```\n\nUse this first when resuming work in a later session.\n\n## Common workflows\n\n### A. Buy an agent number and keep using it later\n\n1. Save Twilio credentials:\n```bash\npython \"$SCRIPT\" save-twilio AC... auth_token_here\n```\n\n2. Search for a number:\n```bash\npython \"$SCRIPT\" twilio-search --country US --area-code 702 --limit 10\n```\n\n3. Buy it and save it into `${HERMES_HOME:-~\u002F.hermes}\u002F.env` + state:\n```bash\npython \"$SCRIPT\" twilio-buy \"+17025551234\" --save-env\n```\n\n4. Next session, run:\n```bash\npython \"$SCRIPT\" diagnose\n```\nThis shows the remembered default number and inbox checkpoint state.\n\n### B. Send a text from the agent number\n\n```bash\npython \"$SCRIPT\" twilio-send-sms \"+15551230000\" \"Your deployment completed successfully.\"\n```\n\nWith media:\n\n```bash\npython \"$SCRIPT\" twilio-send-sms \"+15551230000\" \"Here is the chart.\" --media-url \"https:\u002F\u002Fexample.com\u002Fchart.png\"\n```\n\n### C. Check inbound texts later with no webhook server\n\nPoll the inbox for the default Twilio number:\n\n```bash\npython \"$SCRIPT\" twilio-inbox --limit 20\n```\n\nOnly show messages that arrived after the last checkpoint, and advance the checkpoint when you're done reading:\n\n```bash\npython \"$SCRIPT\" twilio-inbox --since-last --mark-seen\n```\n\nThis is the main answer to “how do I access messages the number receives next time the skill is loaded?”\n\n### D. Make a direct Twilio call with built-in TTS\n\n```bash\npython \"$SCRIPT\" twilio-call \"+15551230000\" --message \"Hello! This is Hermes calling with your status update.\" --voice Polly.Joanna\n```\n\n### E. Call with a prerecorded \u002F custom voice message\n\nThis is the main path for reusing Hermes's existing `text_to_speech` support.\n\nUse this when:\n- you want the call to use Hermes's configured TTS voice rather than Twilio `\u003CSay>`\n- you want a one-way voice delivery (briefing, alert, joke, reminder, status update)\n- you do **not** need a live conversational phone call\n\nGenerate or host audio separately, then:\n\n```bash\npython \"$SCRIPT\" twilio-call \"+155****0000\" --audio-url \"https:\u002F\u002Fexample.com\u002Fbriefing.mp3\"\n```\n\nRecommended Hermes TTS -> Twilio Play workflow:\n\n1. Generate the audio with Hermes `text_to_speech`.\n2. Make the resulting MP3 publicly reachable.\n3. Place the Twilio call with `--audio-url`.\n\nExample agent flow:\n- Ask Hermes to create the message audio with `text_to_speech`\n- If needed, expose the file with a temporary static host \u002F tunnel \u002F object storage URL\n- Use `twilio-call --audio-url ...` to deliver it by phone\n\nGood hosting options for the MP3:\n- a temporary public object\u002Fstorage URL\n- a short-lived tunnel to a local static file server\n- any existing HTTPS URL the phone provider can fetch directly\n\nImportant note:\n- Hermes TTS is great for prerecorded outbound messages\n- Bland\u002FVapi are better for **live conversational AI calls** because they handle the real-time telephony audio stack themselves\n- Hermes STT\u002FTTS alone is not being used here as a full duplex phone conversation engine; that would require a much heavier streaming\u002Fwebhook integration than this skill is trying to introduce\n\n### F. Navigate a phone tree \u002F IVR with Twilio direct calling\n\nIf you need to press digits after the call connects, use `--send-digits`.\nTwilio interprets `w` as a short wait.\n\n```bash\npython \"$SCRIPT\" twilio-call \"+18005551234\" --message \"Connecting to billing now.\" --send-digits \"ww1w2w3\"\n```\n\nThis is useful for reaching a specific menu branch before handing off to a human or delivering a short status message.\n\n### G. Outbound AI phone call with Bland.ai\n\n```bash\npython \"$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\n```\n\nCheck status:\n\n```bash\npython \"$SCRIPT\" ai-status \u003Ccall_id> --provider bland\n```\n\nAsk Bland analysis questions after completion:\n\n```bash\npython \"$SCRIPT\" ai-status \u003Ccall_id> --provider bland --analyze \"Was the appointment confirmed?,What date and time?,Any special instructions?\"\n```\n\n### H. Outbound AI phone call with Vapi on your owned number\n\n1. Import your Twilio number into Vapi:\n```bash\npython \"$SCRIPT\" vapi-import-twilio --save-env\n```\n\n2. Place the call:\n```bash\npython \"$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\n```\n\n3. Check result:\n```bash\npython \"$SCRIPT\" ai-status \u003Ccall_id> --provider vapi\n```\n\n## Suggested agent procedure\n\nWhen the user asks for a call or text:\n\n1. Determine which path fits the request via the decision tree.\n2. Run `diagnose` if configuration state is unclear.\n3. Gather the full task details.\n4. Confirm with the user before dialing or texting.\n5. Use the correct command.\n6. Poll for results if needed.\n7. Summarize the outcome without persisting third-party numbers to Hermes memory.\n\n## What this skill still does not do\n\n- real-time inbound call answering\n- webhook-based live SMS push into the agent loop\n- guaranteed support for arbitrary third-party 2FA providers\n\nThose would require more infrastructure than a pure optional skill.\n\n## Pitfalls\n\n- Twilio trial accounts and regional rules can restrict who you can call\u002Ftext.\n- Some services reject VoIP numbers for 2FA.\n- `twilio-inbox` polls the REST API; it is not instant push delivery.\n- Vapi outbound calling still depends on having a valid imported number.\n- Bland is easiest, but not always the best-sounding.\n- Do not store arbitrary third-party phone numbers in Hermes memory.\n\n## Verification checklist\n\nAfter setup, you should be able to do all of the following with just this skill:\n\n1. `diagnose` shows provider readiness and remembered state\n2. search and buy a Twilio number\n3. persist that number to `${HERMES_HOME:-~\u002F.hermes}\u002F.env`\n4. send an SMS from the owned number\n5. poll inbound texts for the owned number later\n6. place a direct Twilio call\n7. place an AI call via Bland or Vapi\n\n## References\n\n- Twilio phone numbers: https:\u002F\u002Fwww.twilio.com\u002Fdocs\u002Fphone-numbers\u002Fapi\n- Twilio messaging: https:\u002F\u002Fwww.twilio.com\u002Fdocs\u002Fmessaging\u002Fapi\u002Fmessage-resource\n- Twilio voice: https:\u002F\u002Fwww.twilio.com\u002Fdocs\u002Fvoice\u002Fapi\u002Fcall-resource\n- Vapi docs: https:\u002F\u002Fdocs.vapi.ai\u002F\n- Bland.ai: https:\u002F\u002Fapp.bland.ai\u002F\n",{"name":5,"author":39,"license":15,"version":40,"metadata":41,"platforms":51,"description":7},"Nous Research","1.0.0",{"hermes":42},{"tags":43,"category":24,"related_skills":49},[5,30,44,45,26,32,46,47,31,48],"sms","mms","bland.ai","vapi","texting",[28,50,29],"google-workspace",[21,20,23],"main","0d1434f89f4bc6b07e9d272accd8c1013768820f","archive\u002Fskill-md-reviewed\u002Fsha256\u002F41\u002F41ec6380adce44ffe76259a6642412b121ca1de0fd5381acc6d501f1f4334d12",0,"https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills","https:\u002F\u002Fgithub.com\u002Fzapabob","The Open University of JAPAN　2019-now\r\n\r\nTokyo University of Science　2007-2010","2026-10-26 16:29:01",{"source":8,"skillName":5,"commands":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add zapabob\u002FSkills --skill telephony",{"tool":66,"command":67},"bunx","bunx skills add zapabob\u002FSkills --skill telephony",{"tool":69,"command":70},"pnpm","pnpm dlx skills add zapabob\u002FSkills --skill telephony","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Farchive\u002Fskill-md-reviewed\u002Fsha256\u002F41\u002F41ec6380adce44ffe76259a6642412b121ca1de0fd5381acc6d501f1f4334d12\u002FSKILL.md",true,[74,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168],{"path":75,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":78,"sourceHtmlUrl":79},"bmad-skill-manifest.yaml","REFERENCE","参考文档",12,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fbmad-skill-manifest.yaml",{"path":81,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":82,"sourceHtmlUrl":83},"data\u002Fdesign-system-guide.md",8888,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fdata\u002Fdesign-system-guide.md",{"path":85,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":86,"sourceHtmlUrl":87},"steps-c\u002Fstep-01-scan-existing.md",4448,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-01-scan-existing.md",{"path":89,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":90,"sourceHtmlUrl":91},"steps-c\u002Fstep-02-compare-attributes.md",8508,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-02-compare-attributes.md",{"path":93,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":94,"sourceHtmlUrl":95},"steps-c\u002Fstep-03-calculate-similarity.md",9675,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-03-calculate-similarity.md",{"path":97,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":98,"sourceHtmlUrl":99},"steps-c\u002Fstep-04-identify-opportunities.md",10615,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-04-identify-opportunities.md",{"path":101,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":102,"sourceHtmlUrl":103},"steps-c\u002Fstep-05-identify-risks.md",10821,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-05-identify-risks.md",{"path":105,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":106,"sourceHtmlUrl":107},"steps-c\u002Fstep-06-present-decision.md",12779,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-06-present-decision.md",{"path":109,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":110,"sourceHtmlUrl":111},"steps-c\u002Fstep-07-execute-decision.md",12083,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-07-execute-decision.md",{"path":113,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":114,"sourceHtmlUrl":115},"steps-c\u002Fstep-08a-initialize-design-system.md",10983,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-08a-initialize-design-system.md",{"path":117,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":118,"sourceHtmlUrl":119},"steps-c\u002Fstep-08b-create-new-component.md",14560,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-08b-create-new-component.md",{"path":121,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":122,"sourceHtmlUrl":123},"steps-c\u002Fstep-08c-update-component.md",12626,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-08c-update-component.md",{"path":125,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":126,"sourceHtmlUrl":127},"steps-c\u002Fstep-08d-add-variant.md",11405,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-08d-add-variant.md",{"path":129,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":130,"sourceHtmlUrl":131},"steps-c\u002Fstep-08e-generate-catalog.md",16473,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fsteps-c\u002Fstep-08e-generate-catalog.md",{"path":133,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":134,"sourceHtmlUrl":135},"templates\u002Fcatalog.template.html",12973,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Ftemplates\u002Fcatalog.template.html",{"path":137,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":138,"sourceHtmlUrl":139},"templates\u002Fcomponent-library-config.template.md",875,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Ftemplates\u002Fcomponent-library-config.template.md",{"path":141,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":142,"sourceHtmlUrl":143},"templates\u002Fcomponent.template.md",1480,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Ftemplates\u002Fcomponent.template.md",{"path":145,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":146,"sourceHtmlUrl":147},"templates\u002Fdesign-tokens.template.md",2112,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Ftemplates\u002Fdesign-tokens.template.md",{"path":149,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":150,"sourceHtmlUrl":151},"workflow-browse.md",2630,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fworkflow-browse.md",{"path":153,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":154,"sourceHtmlUrl":155},"workflow-create.md",2205,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fworkflow-create.md",{"path":157,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":158,"sourceHtmlUrl":159},"workflow-edit.md",1860,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fworkflow-edit.md",{"path":161,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":162,"sourceHtmlUrl":163},"workflow-import.md",2185,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fworkflow-import.md",{"path":165,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":166,"sourceHtmlUrl":167},"workflow-view.md",1708,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fworkflow-view.md",{"path":169,"resourceType":76,"resourceTypeDesc":77,"sizeBytes":170,"sourceHtmlUrl":171},"workflow.md",3838,"https:\u002F\u002Fgithub.com\u002Fdanielmtt9\u002Fbloomcornerkiddies\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fwds-7-design-system\u002Fworkflow.md",[173,208,243,270,297,314],{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":192,"publishedAt":34},"01M6GJTE1GESGGF9K028Y7753E","xurl","X\u002FTwitter via xurl CLI: post, search, DM, media, v2 API.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fxurl\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[179,184,187],{"categoryNo":180,"categoryName":181,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":185,"categoryName":186,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":188,"categoryName":189,"taxonomyType":190,"taxonomyTypeDesc":191},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[175,193,20,194,195,21,23,196,197,198,199,200,201,202,203,204,52,205,206,207],"openclaw","cli","github","official","search","https","social-media","api","Media","hermes","hermes agent","twitter","social","via","post",{"skillNo":209,"name":210,"nameZh":6,"description":211,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":212,"categories":213,"keywords":225,"publishedAt":34},"01M6GJT8S1PXQ8WPXT1HSNBWH2","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwriting-plans\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[214,217,220,221,222],{"categoryNo":215,"categoryName":216,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":218,"categoryName":219,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":185,"categoryName":186,"taxonomyType":182,"taxonomyTypeDesc":183},{"categoryNo":188,"categoryName":189,"taxonomyType":190,"taxonomyTypeDesc":191},{"categoryNo":223,"categoryName":224,"taxonomyType":190,"taxonomyTypeDesc":191},"01JBSEEDCAT000000000000036","内容创作者",[226,227,228,229,20,230,21,231,23,232,233,234,235,236,237,238,239,240,241,242],"writing","writing plans","plans","design","review","workflow","documentation","tasks","development","code","planning","code-review","subagent","write","superpowers","paths","test-driven-development",{"skillNo":244,"name":245,"nameZh":6,"description":246,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":247,"categories":248,"keywords":252,"publishedAt":34},"01M6GJST0H5X7WHBJ3BZK0DVKH","whisper","OpenAI's general-purpose speech recognition model. Supports 99 languages, transcription, translation to English, and language identification. Six model sizes from tiny (39M params) to large (1550M params). Use for speech-to-text, podcast transcription, or multilingual audio processing. Best for robust, multilingual ASR.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwhisper\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[249],{"categoryNo":250,"categoryName":251,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000016","图像与多媒体",[245,20,21,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269],"openai","speech","multimodal","Transformers","ASR","Audio","text","model","speech recognition","use","general","multilingual","translation","english","identification","processing","Audio Processing",{"skillNo":271,"name":272,"nameZh":6,"description":273,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":274,"categories":275,"keywords":279,"publishedAt":34},"01M6GJSMRQ8EETZTYMG72P70EA","weights-and-biases","W&B: log ML experiments, sweeps, model registry, dashboards.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fweights-and-biases\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[276],{"categoryNo":277,"categoryName":278,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000013","分析与可视化",[280,20,281,282,23,283,284,285,286,287,288,260,289,290,291,292,293,294,295,296],"weights and biases","tensorflow","experiments","pytorch","visualization","registry","real-time","tuning","dashboards","experiment","log","time","Experiment Tracking","Model Registry","Hyperparameter Tuning","WandB","Real-Time Visualization",{"skillNo":298,"name":299,"nameZh":6,"description":300,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":301,"categories":302,"keywords":304,"publishedAt":34},"01M6GJS19KDPRY112JTR326S06","watchers","Poll RSS, JSON APIs, and GitHub with watermark dedup.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fwatchers\u002Fvariants\u002Fhermes-agent-optional\u002FSKILL.md",[303],{"categoryNo":185,"categoryName":186,"taxonomyType":182,"taxonomyTypeDesc":183},[299,20,305,195,21,306,307,308,309,310,311,202,203,312,313],"terminal","automation","http","monitoring","cron","json","rss","devops","with",{"skillNo":315,"name":316,"nameZh":6,"description":317,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":318,"categories":319,"keywords":322,"publishedAt":34},"01M6GJRHJD2A6Q830SWF9W48BC","serving-llms-vllm","vLLM: high-throughput LLM serving, OpenAI API, quantization.","https:\u002F\u002Fgithub.com\u002Fzapabob\u002FSkills\u002Fblob\u002Fmain\u002Fregistry\u002Fskills\u002Fvllm\u002Fvariants\u002Fhermes-agent\u002FSKILL.md",[320,321],{"categoryNo":180,"categoryName":181,"taxonomyType":182,"taxonomyTypeDesc":183},{"categoryNo":188,"categoryName":189,"taxonomyType":190,"taxonomyTypeDesc":191},[323,324,325,21,22,253,326,327,328,256,329,200,330,331,332,333,334,335,336,337],"llms","vLLM","serving llms vllm","openai api","tensor","Inference Serving","Production","llm serving","High Throughput","PagedAttention","Continuous Batching","Quantization","Tensor Parallelism","high-throughput","throughput"]