[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-deepgram-deepclaw-voice":3,"mdc-k2fcgg-key":31,"related-org-deepgram-deepclaw-voice":1732,"related-repo-deepgram-deepclaw-voice":1885},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":26,"sourceUrl":29,"mdContent":30},"deepclaw-voice","configure phone calls with Deepgram Voice","Set up phone calling to OpenClaw using Deepgram Voice Agent API",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"deepgram","Deepgram","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fdeepgram.png",[12,14,17],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"API Development","api-development",{"name":18,"slug":19,"type":13},"Voice","voice",78,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw","2026-07-12T08:29:25.371332",null,13,[],{"repoUrl":21,"stars":20,"forks":24,"topics":27,"description":28},[],"Give your OpenClaw a voice (and a phone number!)","https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw\u002Ftree\u002FHEAD\u002Fskills\u002Fdeepclaw-voice","---\nname: deepclaw-voice\ndescription: Set up phone calling to OpenClaw using Deepgram Voice Agent API\nrequires:\n  bins:\n    - python3\n    - ngrok\n    - git\n---\n\n# deepclaw Voice Setup\n\nUse this skill when the user wants to call you on the phone, set up voice calling, or talk to OpenClaw via phone.\n\n## What This Sets Up\n\nPhone calls to OpenClaw using:\n- **Deepgram Voice Agent API** - STT, TTS, turn-taking, barge-in\n- **Twilio** - Phone number routing\n- **OpenClaw** - Your AI (via chat completions proxy)\n\n## Setup Process\n\n### Step 1: Clone the repo\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw.git ~\u002Fdeepclaw\ncd ~\u002Fdeepclaw\npip install -r requirements.txt\n```\n\n### Step 2: Get Deepgram API Key\n\n1. Go to https:\u002F\u002Fconsole.deepgram.com\u002F\n2. Sign up (free $200 credit)\n3. **API Keys** → **Create API Key** → Name: \"deepclaw\", Full Access\n4. Copy key immediately\n\nAsk: \"What's your Deepgram API key?\"\n\n### Step 3: Get Twilio Credentials\n\n1. Go to https:\u002F\u002Fwww.twilio.com\u002F and sign up\n2. Copy **Account SID** and **Auth Token** from dashboard\n3. **Phone Numbers** → **Buy a number** with Voice (~$1\u002Fmonth)\n\nAsk: \"What's your Twilio phone number, Account SID, and Auth Token?\"\n\n### Step 4: Get OpenClaw Gateway Token\n\nRun this to get the token from their OpenClaw config:\n```bash\ngrep -A2 '\"auth\"' ~\u002F.openclaw\u002Fopenclaw.json | grep token\n```\n\nOr generate a new one:\n```bash\nopenssl rand -hex 24\n```\n\nIf generating new, tell them to add it to `~\u002F.openclaw\u002Fopenclaw.json` under `gateway.auth.token`.\n\n### Step 5: Create .env file\n\nCreate `~\u002Fdeepclaw\u002F.env` with their values:\n```\nDEEPGRAM_API_KEY=\u003Ctheir_deepgram_key>\nTWILIO_ACCOUNT_SID=\u003Ctheir_sid>\nTWILIO_AUTH_TOKEN=\u003Ctheir_token>\nOPENCLAW_GATEWAY_URL=http:\u002F\u002F127.0.0.1:18789\nOPENCLAW_GATEWAY_TOKEN=\u003Ctheir_gateway_token>\n```\n\n### Step 6: Ensure OpenClaw Gateway has chat completions enabled\n\nCheck their `~\u002F.openclaw\u002Fopenclaw.json` has:\n```json\n{\n  \"gateway\": {\n    \"http\": {\n      \"endpoints\": {\n        \"chatCompletions\": {\n          \"enabled\": true\n        }\n      }\n    }\n  }\n}\n```\n\nIf not, add it and restart the gateway: `openclaw daemon restart`\n\n### Step 7: Start ngrok\n\n```bash\nngrok http 8000\n```\n\nNote the HTTPS URL (e.g., `https:\u002F\u002Fabc123.ngrok-free.app`).\n\n### Step 8: Configure Twilio Webhook\n\n1. https:\u002F\u002Fconsole.twilio.com\u002F\n2. **Phone Numbers** → **Active Numbers** → Click their number\n3. **Voice Configuration**:\n   - A Call Comes In: **Webhook**\n   - URL: `https:\u002F\u002F\u003Cngrok-url>\u002Ftwilio\u002Fincoming`\n   - Method: **POST**\n4. Save\n\n### Step 9: Start Server\n\n```bash\ncd ~\u002Fdeepclaw\npython -m deepclaw.voice_agent_server\n```\n\n### Step 10: Test\n\nTell them: \"Call your Twilio number now!\"\n\nWatch the server logs for:\n- \"Connected to Deepgram Voice Agent API\"\n- \"Agent settings applied\"\n- \"LLM proxy request received\"\n\n---\n\n## Customizing Voice\n\nEdit `~\u002Fdeepclaw\u002Fdeepclaw\u002Fvoice_agent_server.py`, find `get_agent_config()`, change the `model` in `speak`:\n\n```python\n\"speak\": {\"provider\": {\"type\": \"deepgram\", \"model\": \"aura-2-orion-en\"}},\n```\n\n### Voice Options\n\n**English:** thalia (F, default), orion (M), apollo (M), athena (F), luna (F), zeus (M), draco (M, British), pandora (F, British), hyperion (M, Australian)\n\n**Spanish:** estrella (F, Mexican), javier (M, Mexican), alvaro (M, Spain), celeste (F, Colombian)\n\n**German:** fabian (M), aurelia (F), lara (F)\n\n**French:** hector (M), agathe (F)\n\n**Italian:** cesare (M), livia (F)\n\n**Dutch:** lars (M), daphne (F)\n\n**Japanese:** ebisu (M), izanami (F)\n\nFormat: `aura-2-\u003Cname>-\u003Clang>` (e.g., `aura-2-estrella-es`)\n\n---\n\n## Troubleshooting\n\nWhen something goes wrong, check the server logs first. Here's how to diagnose common issues:\n\n### No server logs when calling\n\n**Symptom:** You call, phone hangs up, but no logs appear in the server terminal.\n\n**Cause:** Twilio webhook URL doesn't match your ngrok URL.\n\n**Fix:**\n1. Check your current ngrok URL in the ngrok terminal\n2. Go to Twilio Console → Phone Numbers → Your Number → Voice Configuration\n3. Make sure the webhook URL matches exactly: `https:\u002F\u002F\u003Cyour-ngrok-url>\u002Ftwilio\u002Fincoming`\n4. Save and try again\n\n### \"Check your think provider settings\" error\n\n**Symptom:** Call connects, you hear the greeting, then Deepgram says \"Check your think provider settings\" and hangs up.\n\n**Cause:** Deepgram can't reach the LLM proxy endpoint, or it's returning an error.\n\n**Fix:**\n1. Test the proxy endpoint directly:\n   ```bash\n   curl -X POST https:\u002F\u002F\u003Cyour-ngrok-url>\u002Fv1\u002Fchat\u002Fcompletions \\\n     -H \"Content-Type: application\u002Fjson\" \\\n     -d '{\"model\":\"gpt-4\",\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}]}'\n   ```\n2. If you get `401 Unauthorized`, the auth is blocking requests. This shouldn't happen with the latest code.\n3. If you get connection refused, the server isn't running or ngrok isn't forwarding.\n4. Check that OpenClaw gateway is running: `curl http:\u002F\u002F127.0.0.1:18789\u002Fhealth`\n\n### Call works once then hangs up\n\n**Symptom:** First exchange works (greeting + one response), then call drops with \"FAILED_TO_THINK\" in logs.\n\n**Cause:** SSE stream formatting issue—usually fixed in latest code.\n\n**Fix:**\n1. Make sure you have the latest code: `cd ~\u002Fdeepclaw && git pull`\n2. Restart the server\n\n### Words running together in speech\n\n**Symptom:** TTS says \"Whydo you want\" instead of \"Why do you want\"\n\n**Cause:** Markdown stripping was removing spaces between streaming chunks.\n\n**Fix:**\n1. Update to latest code: `cd ~\u002Fdeepclaw && git pull`\n2. Restart the server\n\n### Inbound calls don't work, but everything else does\n\n**Symptom:** Server responds to curl, ngrok works, but calling from your phone gets immediate disconnect with no logs.\n\n**Cause:** Your carrier may be blocking calls to the Twilio number, or you're dialing wrong.\n\n**Fix:**\n1. Verify you're dialing the exact Twilio number (with country code if needed)\n2. Try calling from a different phone\n3. Test with an outbound call from Twilio to you:\n   ```python\n   # Run this in Python with your .env loaded\n   import requests\n   requests.post(\n       f'https:\u002F\u002Fapi.twilio.com\u002F2010-04-01\u002FAccounts\u002F{TWILIO_ACCOUNT_SID}\u002FCalls.json',\n       auth=(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN),\n       data={\n           'To': '+1YOURNUMBER',\n           'From': '+1TWILIONUMBER',\n           'Url': 'https:\u002F\u002F\u003Cyour-ngrok-url>\u002Ftwilio\u002Fincoming'\n       }\n   )\n   ```\n   If this works, the issue is your carrier blocking outbound calls to Twilio.\n\n### OpenClaw returns errors\n\n**Symptom:** Logs show errors from OpenClaw like \"No API key found for provider\"\n\n**Fix:**\n1. Make sure OpenClaw is configured with your Anthropic API key\n2. Run `openclaw configure --section model` to set it up\n3. Restart OpenClaw gateway: `openclaw daemon restart`\n\n### ngrok URL keeps changing\n\n**Symptom:** Every time you restart ngrok, you get a new URL and have to update Twilio.\n\n**Fix:** Use a fixed ngrok domain (requires ngrok account):\n```bash\nngrok http 8000 --domain=your-chosen-name.ngrok-free.app\n```\n\n### Still stuck?\n\n1. Check the server logs carefully—they usually tell you what's wrong\n2. Test each component individually:\n   - Server health: `curl http:\u002F\u002Flocalhost:8000\u002Fhealth`\n   - ngrok forwarding: `curl https:\u002F\u002F\u003Cngrok-url>\u002Fhealth`\n   - OpenClaw gateway: `curl http:\u002F\u002F127.0.0.1:18789\u002Fhealth`\n   - LLM proxy: `curl -X POST https:\u002F\u002F\u003Cngrok-url>\u002Fv1\u002Fchat\u002Fcompletions -H \"Content-Type: application\u002Fjson\" -d '{\"model\":\"gpt-4\",\"messages\":[{\"role\":\"user\",\"content\":\"test\"}]}'`\n3. Open an issue at https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw\u002Fissues\n",{"data":32,"body":38},{"name":4,"description":6,"requires":33},{"bins":34},[35,36,37],"python3","ngrok","git",{"type":39,"children":40},"root",[41,50,56,63,68,104,110,117,194,200,244,249,255,305,310,316,321,377,382,413,434,440,453,463,469,481,678,689,695,719,732,738,814,820,856,862,867,872,890,894,900,936,951,957,967,977,987,997,1007,1017,1027,1048,1051,1057,1062,1068,1078,1088,1096,1125,1131,1140,1149,1156,1302,1308,1317,1326,1333,1352,1358,1367,1376,1383,1400,1406,1415,1424,1431,1545,1551,1560,1567,1598,1604,1613,1622,1650,1656,1726],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"deepclaw-voice-setup",[47],{"type":48,"value":49},"text","deepclaw Voice Setup",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"Use this skill when the user wants to call you on the phone, set up voice calling, or talk to OpenClaw via phone.",{"type":42,"tag":57,"props":58,"children":60},"h2",{"id":59},"what-this-sets-up",[61],{"type":48,"value":62},"What This Sets Up",{"type":42,"tag":51,"props":64,"children":65},{},[66],{"type":48,"value":67},"Phone calls to OpenClaw using:",{"type":42,"tag":69,"props":70,"children":71},"ul",{},[72,84,94],{"type":42,"tag":73,"props":74,"children":75},"li",{},[76,82],{"type":42,"tag":77,"props":78,"children":79},"strong",{},[80],{"type":48,"value":81},"Deepgram Voice Agent API",{"type":48,"value":83}," - STT, TTS, turn-taking, barge-in",{"type":42,"tag":73,"props":85,"children":86},{},[87,92],{"type":42,"tag":77,"props":88,"children":89},{},[90],{"type":48,"value":91},"Twilio",{"type":48,"value":93}," - Phone number routing",{"type":42,"tag":73,"props":95,"children":96},{},[97,102],{"type":42,"tag":77,"props":98,"children":99},{},[100],{"type":48,"value":101},"OpenClaw",{"type":48,"value":103}," - Your AI (via chat completions proxy)",{"type":42,"tag":57,"props":105,"children":107},{"id":106},"setup-process",[108],{"type":48,"value":109},"Setup Process",{"type":42,"tag":111,"props":112,"children":114},"h3",{"id":113},"step-1-clone-the-repo",[115],{"type":48,"value":116},"Step 1: Clone the repo",{"type":42,"tag":118,"props":119,"children":124},"pre",{"className":120,"code":121,"language":122,"meta":123,"style":123},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","git clone https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw.git ~\u002Fdeepclaw\ncd ~\u002Fdeepclaw\npip install -r requirements.txt\n","bash","",[125],{"type":42,"tag":126,"props":127,"children":128},"code",{"__ignoreMap":123},[129,156,170],{"type":42,"tag":130,"props":131,"children":134},"span",{"class":132,"line":133},"line",1,[135,140,146,151],{"type":42,"tag":130,"props":136,"children":138},{"style":137},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[139],{"type":48,"value":37},{"type":42,"tag":130,"props":141,"children":143},{"style":142},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[144],{"type":48,"value":145}," clone",{"type":42,"tag":130,"props":147,"children":148},{"style":142},[149],{"type":48,"value":150}," https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw.git",{"type":42,"tag":130,"props":152,"children":153},{"style":142},[154],{"type":48,"value":155}," ~\u002Fdeepclaw\n",{"type":42,"tag":130,"props":157,"children":159},{"class":132,"line":158},2,[160,166],{"type":42,"tag":130,"props":161,"children":163},{"style":162},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[164],{"type":48,"value":165},"cd",{"type":42,"tag":130,"props":167,"children":168},{"style":142},[169],{"type":48,"value":155},{"type":42,"tag":130,"props":171,"children":173},{"class":132,"line":172},3,[174,179,184,189],{"type":42,"tag":130,"props":175,"children":176},{"style":137},[177],{"type":48,"value":178},"pip",{"type":42,"tag":130,"props":180,"children":181},{"style":142},[182],{"type":48,"value":183}," install",{"type":42,"tag":130,"props":185,"children":186},{"style":142},[187],{"type":48,"value":188}," -r",{"type":42,"tag":130,"props":190,"children":191},{"style":142},[192],{"type":48,"value":193}," requirements.txt\n",{"type":42,"tag":111,"props":195,"children":197},{"id":196},"step-2-get-deepgram-api-key",[198],{"type":48,"value":199},"Step 2: Get Deepgram API Key",{"type":42,"tag":201,"props":202,"children":203},"ol",{},[204,217,222,239],{"type":42,"tag":73,"props":205,"children":206},{},[207,209],{"type":48,"value":208},"Go to ",{"type":42,"tag":210,"props":211,"children":215},"a",{"href":212,"rel":213},"https:\u002F\u002Fconsole.deepgram.com\u002F",[214],"nofollow",[216],{"type":48,"value":212},{"type":42,"tag":73,"props":218,"children":219},{},[220],{"type":48,"value":221},"Sign up (free $200 credit)",{"type":42,"tag":73,"props":223,"children":224},{},[225,230,232,237],{"type":42,"tag":77,"props":226,"children":227},{},[228],{"type":48,"value":229},"API Keys",{"type":48,"value":231}," → ",{"type":42,"tag":77,"props":233,"children":234},{},[235],{"type":48,"value":236},"Create API Key",{"type":48,"value":238}," → Name: \"deepclaw\", Full Access",{"type":42,"tag":73,"props":240,"children":241},{},[242],{"type":48,"value":243},"Copy key immediately",{"type":42,"tag":51,"props":245,"children":246},{},[247],{"type":48,"value":248},"Ask: \"What's your Deepgram API key?\"",{"type":42,"tag":111,"props":250,"children":252},{"id":251},"step-3-get-twilio-credentials",[253],{"type":48,"value":254},"Step 3: Get Twilio Credentials",{"type":42,"tag":201,"props":256,"children":257},{},[258,270,289],{"type":42,"tag":73,"props":259,"children":260},{},[261,262,268],{"type":48,"value":208},{"type":42,"tag":210,"props":263,"children":266},{"href":264,"rel":265},"https:\u002F\u002Fwww.twilio.com\u002F",[214],[267],{"type":48,"value":264},{"type":48,"value":269}," and sign up",{"type":42,"tag":73,"props":271,"children":272},{},[273,275,280,282,287],{"type":48,"value":274},"Copy ",{"type":42,"tag":77,"props":276,"children":277},{},[278],{"type":48,"value":279},"Account SID",{"type":48,"value":281}," and ",{"type":42,"tag":77,"props":283,"children":284},{},[285],{"type":48,"value":286},"Auth Token",{"type":48,"value":288}," from dashboard",{"type":42,"tag":73,"props":290,"children":291},{},[292,297,298,303],{"type":42,"tag":77,"props":293,"children":294},{},[295],{"type":48,"value":296},"Phone Numbers",{"type":48,"value":231},{"type":42,"tag":77,"props":299,"children":300},{},[301],{"type":48,"value":302},"Buy a number",{"type":48,"value":304}," with Voice (~$1\u002Fmonth)",{"type":42,"tag":51,"props":306,"children":307},{},[308],{"type":48,"value":309},"Ask: \"What's your Twilio phone number, Account SID, and Auth Token?\"",{"type":42,"tag":111,"props":311,"children":313},{"id":312},"step-4-get-openclaw-gateway-token",[314],{"type":48,"value":315},"Step 4: Get OpenClaw Gateway Token",{"type":42,"tag":51,"props":317,"children":318},{},[319],{"type":48,"value":320},"Run this to get the token from their OpenClaw config:",{"type":42,"tag":118,"props":322,"children":324},{"className":120,"code":323,"language":122,"meta":123,"style":123},"grep -A2 '\"auth\"' ~\u002F.openclaw\u002Fopenclaw.json | grep token\n",[325],{"type":42,"tag":126,"props":326,"children":327},{"__ignoreMap":123},[328],{"type":42,"tag":130,"props":329,"children":330},{"class":132,"line":133},[331,336,341,347,352,357,362,367,372],{"type":42,"tag":130,"props":332,"children":333},{"style":137},[334],{"type":48,"value":335},"grep",{"type":42,"tag":130,"props":337,"children":338},{"style":142},[339],{"type":48,"value":340}," -A2",{"type":42,"tag":130,"props":342,"children":344},{"style":343},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[345],{"type":48,"value":346}," '",{"type":42,"tag":130,"props":348,"children":349},{"style":142},[350],{"type":48,"value":351},"\"auth\"",{"type":42,"tag":130,"props":353,"children":354},{"style":343},[355],{"type":48,"value":356},"'",{"type":42,"tag":130,"props":358,"children":359},{"style":142},[360],{"type":48,"value":361}," ~\u002F.openclaw\u002Fopenclaw.json",{"type":42,"tag":130,"props":363,"children":364},{"style":343},[365],{"type":48,"value":366}," |",{"type":42,"tag":130,"props":368,"children":369},{"style":137},[370],{"type":48,"value":371}," grep",{"type":42,"tag":130,"props":373,"children":374},{"style":142},[375],{"type":48,"value":376}," token\n",{"type":42,"tag":51,"props":378,"children":379},{},[380],{"type":48,"value":381},"Or generate a new one:",{"type":42,"tag":118,"props":383,"children":385},{"className":120,"code":384,"language":122,"meta":123,"style":123},"openssl rand -hex 24\n",[386],{"type":42,"tag":126,"props":387,"children":388},{"__ignoreMap":123},[389],{"type":42,"tag":130,"props":390,"children":391},{"class":132,"line":133},[392,397,402,407],{"type":42,"tag":130,"props":393,"children":394},{"style":137},[395],{"type":48,"value":396},"openssl",{"type":42,"tag":130,"props":398,"children":399},{"style":142},[400],{"type":48,"value":401}," rand",{"type":42,"tag":130,"props":403,"children":404},{"style":142},[405],{"type":48,"value":406}," -hex",{"type":42,"tag":130,"props":408,"children":410},{"style":409},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[411],{"type":48,"value":412}," 24\n",{"type":42,"tag":51,"props":414,"children":415},{},[416,418,424,426,432],{"type":48,"value":417},"If generating new, tell them to add it to ",{"type":42,"tag":126,"props":419,"children":421},{"className":420},[],[422],{"type":48,"value":423},"~\u002F.openclaw\u002Fopenclaw.json",{"type":48,"value":425}," under ",{"type":42,"tag":126,"props":427,"children":429},{"className":428},[],[430],{"type":48,"value":431},"gateway.auth.token",{"type":48,"value":433},".",{"type":42,"tag":111,"props":435,"children":437},{"id":436},"step-5-create-env-file",[438],{"type":48,"value":439},"Step 5: Create .env file",{"type":42,"tag":51,"props":441,"children":442},{},[443,445,451],{"type":48,"value":444},"Create ",{"type":42,"tag":126,"props":446,"children":448},{"className":447},[],[449],{"type":48,"value":450},"~\u002Fdeepclaw\u002F.env",{"type":48,"value":452}," with their values:",{"type":42,"tag":118,"props":454,"children":458},{"className":455,"code":457,"language":48},[456],"language-text","DEEPGRAM_API_KEY=\u003Ctheir_deepgram_key>\nTWILIO_ACCOUNT_SID=\u003Ctheir_sid>\nTWILIO_AUTH_TOKEN=\u003Ctheir_token>\nOPENCLAW_GATEWAY_URL=http:\u002F\u002F127.0.0.1:18789\nOPENCLAW_GATEWAY_TOKEN=\u003Ctheir_gateway_token>\n",[459],{"type":42,"tag":126,"props":460,"children":461},{"__ignoreMap":123},[462],{"type":48,"value":457},{"type":42,"tag":111,"props":464,"children":466},{"id":465},"step-6-ensure-openclaw-gateway-has-chat-completions-enabled",[467],{"type":48,"value":468},"Step 6: Ensure OpenClaw Gateway has chat completions enabled",{"type":42,"tag":51,"props":470,"children":471},{},[472,474,479],{"type":48,"value":473},"Check their ",{"type":42,"tag":126,"props":475,"children":477},{"className":476},[],[478],{"type":48,"value":423},{"type":48,"value":480}," has:",{"type":42,"tag":118,"props":482,"children":486},{"className":483,"code":484,"language":485,"meta":123,"style":123},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"gateway\": {\n    \"http\": {\n      \"endpoints\": {\n        \"chatCompletions\": {\n          \"enabled\": true\n        }\n      }\n    }\n  }\n}\n","json",[487],{"type":42,"tag":126,"props":488,"children":489},{"__ignoreMap":123},[490,498,527,552,578,605,633,642,651,660,669],{"type":42,"tag":130,"props":491,"children":492},{"class":132,"line":133},[493],{"type":42,"tag":130,"props":494,"children":495},{"style":343},[496],{"type":48,"value":497},"{\n",{"type":42,"tag":130,"props":499,"children":500},{"class":132,"line":158},[501,506,512,517,522],{"type":42,"tag":130,"props":502,"children":503},{"style":343},[504],{"type":48,"value":505},"  \"",{"type":42,"tag":130,"props":507,"children":509},{"style":508},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[510],{"type":48,"value":511},"gateway",{"type":42,"tag":130,"props":513,"children":514},{"style":343},[515],{"type":48,"value":516},"\"",{"type":42,"tag":130,"props":518,"children":519},{"style":343},[520],{"type":48,"value":521},":",{"type":42,"tag":130,"props":523,"children":524},{"style":343},[525],{"type":48,"value":526}," {\n",{"type":42,"tag":130,"props":528,"children":529},{"class":132,"line":172},[530,535,540,544,548],{"type":42,"tag":130,"props":531,"children":532},{"style":343},[533],{"type":48,"value":534},"    \"",{"type":42,"tag":130,"props":536,"children":537},{"style":137},[538],{"type":48,"value":539},"http",{"type":42,"tag":130,"props":541,"children":542},{"style":343},[543],{"type":48,"value":516},{"type":42,"tag":130,"props":545,"children":546},{"style":343},[547],{"type":48,"value":521},{"type":42,"tag":130,"props":549,"children":550},{"style":343},[551],{"type":48,"value":526},{"type":42,"tag":130,"props":553,"children":555},{"class":132,"line":554},4,[556,561,566,570,574],{"type":42,"tag":130,"props":557,"children":558},{"style":343},[559],{"type":48,"value":560},"      \"",{"type":42,"tag":130,"props":562,"children":563},{"style":409},[564],{"type":48,"value":565},"endpoints",{"type":42,"tag":130,"props":567,"children":568},{"style":343},[569],{"type":48,"value":516},{"type":42,"tag":130,"props":571,"children":572},{"style":343},[573],{"type":48,"value":521},{"type":42,"tag":130,"props":575,"children":576},{"style":343},[577],{"type":48,"value":526},{"type":42,"tag":130,"props":579,"children":581},{"class":132,"line":580},5,[582,587,593,597,601],{"type":42,"tag":130,"props":583,"children":584},{"style":343},[585],{"type":48,"value":586},"        \"",{"type":42,"tag":130,"props":588,"children":590},{"style":589},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[591],{"type":48,"value":592},"chatCompletions",{"type":42,"tag":130,"props":594,"children":595},{"style":343},[596],{"type":48,"value":516},{"type":42,"tag":130,"props":598,"children":599},{"style":343},[600],{"type":48,"value":521},{"type":42,"tag":130,"props":602,"children":603},{"style":343},[604],{"type":48,"value":526},{"type":42,"tag":130,"props":606,"children":608},{"class":132,"line":607},6,[609,614,620,624,628],{"type":42,"tag":130,"props":610,"children":611},{"style":343},[612],{"type":48,"value":613},"          \"",{"type":42,"tag":130,"props":615,"children":617},{"style":616},"--shiki-light:#916B53;--shiki-default:#916B53;--shiki-dark:#916B53",[618],{"type":48,"value":619},"enabled",{"type":42,"tag":130,"props":621,"children":622},{"style":343},[623],{"type":48,"value":516},{"type":42,"tag":130,"props":625,"children":626},{"style":343},[627],{"type":48,"value":521},{"type":42,"tag":130,"props":629,"children":630},{"style":343},[631],{"type":48,"value":632}," true\n",{"type":42,"tag":130,"props":634,"children":636},{"class":132,"line":635},7,[637],{"type":42,"tag":130,"props":638,"children":639},{"style":343},[640],{"type":48,"value":641},"        }\n",{"type":42,"tag":130,"props":643,"children":645},{"class":132,"line":644},8,[646],{"type":42,"tag":130,"props":647,"children":648},{"style":343},[649],{"type":48,"value":650},"      }\n",{"type":42,"tag":130,"props":652,"children":654},{"class":132,"line":653},9,[655],{"type":42,"tag":130,"props":656,"children":657},{"style":343},[658],{"type":48,"value":659},"    }\n",{"type":42,"tag":130,"props":661,"children":663},{"class":132,"line":662},10,[664],{"type":42,"tag":130,"props":665,"children":666},{"style":343},[667],{"type":48,"value":668},"  }\n",{"type":42,"tag":130,"props":670,"children":672},{"class":132,"line":671},11,[673],{"type":42,"tag":130,"props":674,"children":675},{"style":343},[676],{"type":48,"value":677},"}\n",{"type":42,"tag":51,"props":679,"children":680},{},[681,683],{"type":48,"value":682},"If not, add it and restart the gateway: ",{"type":42,"tag":126,"props":684,"children":686},{"className":685},[],[687],{"type":48,"value":688},"openclaw daemon restart",{"type":42,"tag":111,"props":690,"children":692},{"id":691},"step-7-start-ngrok",[693],{"type":48,"value":694},"Step 7: Start ngrok",{"type":42,"tag":118,"props":696,"children":698},{"className":120,"code":697,"language":122,"meta":123,"style":123},"ngrok http 8000\n",[699],{"type":42,"tag":126,"props":700,"children":701},{"__ignoreMap":123},[702],{"type":42,"tag":130,"props":703,"children":704},{"class":132,"line":133},[705,709,714],{"type":42,"tag":130,"props":706,"children":707},{"style":137},[708],{"type":48,"value":36},{"type":42,"tag":130,"props":710,"children":711},{"style":142},[712],{"type":48,"value":713}," http",{"type":42,"tag":130,"props":715,"children":716},{"style":409},[717],{"type":48,"value":718}," 8000\n",{"type":42,"tag":51,"props":720,"children":721},{},[722,724,730],{"type":48,"value":723},"Note the HTTPS URL (e.g., ",{"type":42,"tag":126,"props":725,"children":727},{"className":726},[],[728],{"type":48,"value":729},"https:\u002F\u002Fabc123.ngrok-free.app",{"type":48,"value":731},").",{"type":42,"tag":111,"props":733,"children":735},{"id":734},"step-8-configure-twilio-webhook",[736],{"type":48,"value":737},"Step 8: Configure Twilio Webhook",{"type":42,"tag":201,"props":739,"children":740},{},[741,750,765,809],{"type":42,"tag":73,"props":742,"children":743},{},[744],{"type":42,"tag":210,"props":745,"children":748},{"href":746,"rel":747},"https:\u002F\u002Fconsole.twilio.com\u002F",[214],[749],{"type":48,"value":746},{"type":42,"tag":73,"props":751,"children":752},{},[753,757,758,763],{"type":42,"tag":77,"props":754,"children":755},{},[756],{"type":48,"value":296},{"type":48,"value":231},{"type":42,"tag":77,"props":759,"children":760},{},[761],{"type":48,"value":762},"Active Numbers",{"type":48,"value":764}," → Click their number",{"type":42,"tag":73,"props":766,"children":767},{},[768,773,775],{"type":42,"tag":77,"props":769,"children":770},{},[771],{"type":48,"value":772},"Voice Configuration",{"type":48,"value":774},":\n",{"type":42,"tag":69,"props":776,"children":777},{},[778,788,799],{"type":42,"tag":73,"props":779,"children":780},{},[781,783],{"type":48,"value":782},"A Call Comes In: ",{"type":42,"tag":77,"props":784,"children":785},{},[786],{"type":48,"value":787},"Webhook",{"type":42,"tag":73,"props":789,"children":790},{},[791,793],{"type":48,"value":792},"URL: ",{"type":42,"tag":126,"props":794,"children":796},{"className":795},[],[797],{"type":48,"value":798},"https:\u002F\u002F\u003Cngrok-url>\u002Ftwilio\u002Fincoming",{"type":42,"tag":73,"props":800,"children":801},{},[802,804],{"type":48,"value":803},"Method: ",{"type":42,"tag":77,"props":805,"children":806},{},[807],{"type":48,"value":808},"POST",{"type":42,"tag":73,"props":810,"children":811},{},[812],{"type":48,"value":813},"Save",{"type":42,"tag":111,"props":815,"children":817},{"id":816},"step-9-start-server",[818],{"type":48,"value":819},"Step 9: Start Server",{"type":42,"tag":118,"props":821,"children":823},{"className":120,"code":822,"language":122,"meta":123,"style":123},"cd ~\u002Fdeepclaw\npython -m deepclaw.voice_agent_server\n",[824],{"type":42,"tag":126,"props":825,"children":826},{"__ignoreMap":123},[827,838],{"type":42,"tag":130,"props":828,"children":829},{"class":132,"line":133},[830,834],{"type":42,"tag":130,"props":831,"children":832},{"style":162},[833],{"type":48,"value":165},{"type":42,"tag":130,"props":835,"children":836},{"style":142},[837],{"type":48,"value":155},{"type":42,"tag":130,"props":839,"children":840},{"class":132,"line":158},[841,846,851],{"type":42,"tag":130,"props":842,"children":843},{"style":137},[844],{"type":48,"value":845},"python",{"type":42,"tag":130,"props":847,"children":848},{"style":142},[849],{"type":48,"value":850}," -m",{"type":42,"tag":130,"props":852,"children":853},{"style":142},[854],{"type":48,"value":855}," deepclaw.voice_agent_server\n",{"type":42,"tag":111,"props":857,"children":859},{"id":858},"step-10-test",[860],{"type":48,"value":861},"Step 10: Test",{"type":42,"tag":51,"props":863,"children":864},{},[865],{"type":48,"value":866},"Tell them: \"Call your Twilio number now!\"",{"type":42,"tag":51,"props":868,"children":869},{},[870],{"type":48,"value":871},"Watch the server logs for:",{"type":42,"tag":69,"props":873,"children":874},{},[875,880,885],{"type":42,"tag":73,"props":876,"children":877},{},[878],{"type":48,"value":879},"\"Connected to Deepgram Voice Agent API\"",{"type":42,"tag":73,"props":881,"children":882},{},[883],{"type":48,"value":884},"\"Agent settings applied\"",{"type":42,"tag":73,"props":886,"children":887},{},[888],{"type":48,"value":889},"\"LLM proxy request received\"",{"type":42,"tag":891,"props":892,"children":893},"hr",{},[],{"type":42,"tag":57,"props":895,"children":897},{"id":896},"customizing-voice",[898],{"type":48,"value":899},"Customizing Voice",{"type":42,"tag":51,"props":901,"children":902},{},[903,905,911,913,919,921,927,929,935],{"type":48,"value":904},"Edit ",{"type":42,"tag":126,"props":906,"children":908},{"className":907},[],[909],{"type":48,"value":910},"~\u002Fdeepclaw\u002Fdeepclaw\u002Fvoice_agent_server.py",{"type":48,"value":912},", find ",{"type":42,"tag":126,"props":914,"children":916},{"className":915},[],[917],{"type":48,"value":918},"get_agent_config()",{"type":48,"value":920},", change the ",{"type":42,"tag":126,"props":922,"children":924},{"className":923},[],[925],{"type":48,"value":926},"model",{"type":48,"value":928}," in ",{"type":42,"tag":126,"props":930,"children":932},{"className":931},[],[933],{"type":48,"value":934},"speak",{"type":48,"value":521},{"type":42,"tag":118,"props":937,"children":940},{"className":938,"code":939,"language":845,"meta":123,"style":123},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\"speak\": {\"provider\": {\"type\": \"deepgram\", \"model\": \"aura-2-orion-en\"}},\n",[941],{"type":42,"tag":126,"props":942,"children":943},{"__ignoreMap":123},[944],{"type":42,"tag":130,"props":945,"children":946},{"class":132,"line":133},[947],{"type":42,"tag":130,"props":948,"children":949},{},[950],{"type":48,"value":939},{"type":42,"tag":111,"props":952,"children":954},{"id":953},"voice-options",[955],{"type":48,"value":956},"Voice Options",{"type":42,"tag":51,"props":958,"children":959},{},[960,965],{"type":42,"tag":77,"props":961,"children":962},{},[963],{"type":48,"value":964},"English:",{"type":48,"value":966}," thalia (F, default), orion (M), apollo (M), athena (F), luna (F), zeus (M), draco (M, British), pandora (F, British), hyperion (M, Australian)",{"type":42,"tag":51,"props":968,"children":969},{},[970,975],{"type":42,"tag":77,"props":971,"children":972},{},[973],{"type":48,"value":974},"Spanish:",{"type":48,"value":976}," estrella (F, Mexican), javier (M, Mexican), alvaro (M, Spain), celeste (F, Colombian)",{"type":42,"tag":51,"props":978,"children":979},{},[980,985],{"type":42,"tag":77,"props":981,"children":982},{},[983],{"type":48,"value":984},"German:",{"type":48,"value":986}," fabian (M), aurelia (F), lara (F)",{"type":42,"tag":51,"props":988,"children":989},{},[990,995],{"type":42,"tag":77,"props":991,"children":992},{},[993],{"type":48,"value":994},"French:",{"type":48,"value":996}," hector (M), agathe (F)",{"type":42,"tag":51,"props":998,"children":999},{},[1000,1005],{"type":42,"tag":77,"props":1001,"children":1002},{},[1003],{"type":48,"value":1004},"Italian:",{"type":48,"value":1006}," cesare (M), livia (F)",{"type":42,"tag":51,"props":1008,"children":1009},{},[1010,1015],{"type":42,"tag":77,"props":1011,"children":1012},{},[1013],{"type":48,"value":1014},"Dutch:",{"type":48,"value":1016}," lars (M), daphne (F)",{"type":42,"tag":51,"props":1018,"children":1019},{},[1020,1025],{"type":42,"tag":77,"props":1021,"children":1022},{},[1023],{"type":48,"value":1024},"Japanese:",{"type":48,"value":1026}," ebisu (M), izanami (F)",{"type":42,"tag":51,"props":1028,"children":1029},{},[1030,1032,1038,1040,1046],{"type":48,"value":1031},"Format: ",{"type":42,"tag":126,"props":1033,"children":1035},{"className":1034},[],[1036],{"type":48,"value":1037},"aura-2-\u003Cname>-\u003Clang>",{"type":48,"value":1039}," (e.g., ",{"type":42,"tag":126,"props":1041,"children":1043},{"className":1042},[],[1044],{"type":48,"value":1045},"aura-2-estrella-es",{"type":48,"value":1047},")",{"type":42,"tag":891,"props":1049,"children":1050},{},[],{"type":42,"tag":57,"props":1052,"children":1054},{"id":1053},"troubleshooting",[1055],{"type":48,"value":1056},"Troubleshooting",{"type":42,"tag":51,"props":1058,"children":1059},{},[1060],{"type":48,"value":1061},"When something goes wrong, check the server logs first. Here's how to diagnose common issues:",{"type":42,"tag":111,"props":1063,"children":1065},{"id":1064},"no-server-logs-when-calling",[1066],{"type":48,"value":1067},"No server logs when calling",{"type":42,"tag":51,"props":1069,"children":1070},{},[1071,1076],{"type":42,"tag":77,"props":1072,"children":1073},{},[1074],{"type":48,"value":1075},"Symptom:",{"type":48,"value":1077}," You call, phone hangs up, but no logs appear in the server terminal.",{"type":42,"tag":51,"props":1079,"children":1080},{},[1081,1086],{"type":42,"tag":77,"props":1082,"children":1083},{},[1084],{"type":48,"value":1085},"Cause:",{"type":48,"value":1087}," Twilio webhook URL doesn't match your ngrok URL.",{"type":42,"tag":51,"props":1089,"children":1090},{},[1091],{"type":42,"tag":77,"props":1092,"children":1093},{},[1094],{"type":48,"value":1095},"Fix:",{"type":42,"tag":201,"props":1097,"children":1098},{},[1099,1104,1109,1120],{"type":42,"tag":73,"props":1100,"children":1101},{},[1102],{"type":48,"value":1103},"Check your current ngrok URL in the ngrok terminal",{"type":42,"tag":73,"props":1105,"children":1106},{},[1107],{"type":48,"value":1108},"Go to Twilio Console → Phone Numbers → Your Number → Voice Configuration",{"type":42,"tag":73,"props":1110,"children":1111},{},[1112,1114],{"type":48,"value":1113},"Make sure the webhook URL matches exactly: ",{"type":42,"tag":126,"props":1115,"children":1117},{"className":1116},[],[1118],{"type":48,"value":1119},"https:\u002F\u002F\u003Cyour-ngrok-url>\u002Ftwilio\u002Fincoming",{"type":42,"tag":73,"props":1121,"children":1122},{},[1123],{"type":48,"value":1124},"Save and try again",{"type":42,"tag":111,"props":1126,"children":1128},{"id":1127},"check-your-think-provider-settings-error",[1129],{"type":48,"value":1130},"\"Check your think provider settings\" error",{"type":42,"tag":51,"props":1132,"children":1133},{},[1134,1138],{"type":42,"tag":77,"props":1135,"children":1136},{},[1137],{"type":48,"value":1075},{"type":48,"value":1139}," Call connects, you hear the greeting, then Deepgram says \"Check your think provider settings\" and hangs up.",{"type":42,"tag":51,"props":1141,"children":1142},{},[1143,1147],{"type":42,"tag":77,"props":1144,"children":1145},{},[1146],{"type":48,"value":1085},{"type":48,"value":1148}," Deepgram can't reach the LLM proxy endpoint, or it's returning an error.",{"type":42,"tag":51,"props":1150,"children":1151},{},[1152],{"type":42,"tag":77,"props":1153,"children":1154},{},[1155],{"type":48,"value":1095},{"type":42,"tag":201,"props":1157,"children":1158},{},[1159,1273,1286,1291],{"type":42,"tag":73,"props":1160,"children":1161},{},[1162,1164],{"type":48,"value":1163},"Test the proxy endpoint directly:\n",{"type":42,"tag":118,"props":1165,"children":1167},{"className":120,"code":1166,"language":122,"meta":123,"style":123},"curl -X POST https:\u002F\u002F\u003Cyour-ngrok-url>\u002Fv1\u002Fchat\u002Fcompletions \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"model\":\"gpt-4\",\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}]}'\n",[1168],{"type":42,"tag":126,"props":1169,"children":1170},{"__ignoreMap":123},[1171,1225,1251],{"type":42,"tag":130,"props":1172,"children":1173},{"class":132,"line":133},[1174,1179,1184,1189,1194,1199,1204,1210,1215,1220],{"type":42,"tag":130,"props":1175,"children":1176},{"style":137},[1177],{"type":48,"value":1178},"curl",{"type":42,"tag":130,"props":1180,"children":1181},{"style":142},[1182],{"type":48,"value":1183}," -X",{"type":42,"tag":130,"props":1185,"children":1186},{"style":142},[1187],{"type":48,"value":1188}," POST",{"type":42,"tag":130,"props":1190,"children":1191},{"style":142},[1192],{"type":48,"value":1193}," https:\u002F\u002F",{"type":42,"tag":130,"props":1195,"children":1196},{"style":343},[1197],{"type":48,"value":1198},"\u003C",{"type":42,"tag":130,"props":1200,"children":1201},{"style":142},[1202],{"type":48,"value":1203},"your-ngrok-ur",{"type":42,"tag":130,"props":1205,"children":1207},{"style":1206},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1208],{"type":48,"value":1209},"l",{"type":42,"tag":130,"props":1211,"children":1212},{"style":343},[1213],{"type":48,"value":1214},">",{"type":42,"tag":130,"props":1216,"children":1217},{"style":142},[1218],{"type":48,"value":1219},"\u002Fv1\u002Fchat\u002Fcompletions",{"type":42,"tag":130,"props":1221,"children":1222},{"style":1206},[1223],{"type":48,"value":1224}," \\\n",{"type":42,"tag":130,"props":1226,"children":1227},{"class":132,"line":158},[1228,1233,1238,1243,1247],{"type":42,"tag":130,"props":1229,"children":1230},{"style":142},[1231],{"type":48,"value":1232},"  -H",{"type":42,"tag":130,"props":1234,"children":1235},{"style":343},[1236],{"type":48,"value":1237}," \"",{"type":42,"tag":130,"props":1239,"children":1240},{"style":142},[1241],{"type":48,"value":1242},"Content-Type: application\u002Fjson",{"type":42,"tag":130,"props":1244,"children":1245},{"style":343},[1246],{"type":48,"value":516},{"type":42,"tag":130,"props":1248,"children":1249},{"style":1206},[1250],{"type":48,"value":1224},{"type":42,"tag":130,"props":1252,"children":1253},{"class":132,"line":172},[1254,1259,1263,1268],{"type":42,"tag":130,"props":1255,"children":1256},{"style":142},[1257],{"type":48,"value":1258},"  -d",{"type":42,"tag":130,"props":1260,"children":1261},{"style":343},[1262],{"type":48,"value":346},{"type":42,"tag":130,"props":1264,"children":1265},{"style":142},[1266],{"type":48,"value":1267},"{\"model\":\"gpt-4\",\"messages\":[{\"role\":\"user\",\"content\":\"hi\"}]}",{"type":42,"tag":130,"props":1269,"children":1270},{"style":343},[1271],{"type":48,"value":1272},"'\n",{"type":42,"tag":73,"props":1274,"children":1275},{},[1276,1278,1284],{"type":48,"value":1277},"If you get ",{"type":42,"tag":126,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":48,"value":1283},"401 Unauthorized",{"type":48,"value":1285},", the auth is blocking requests. This shouldn't happen with the latest code.",{"type":42,"tag":73,"props":1287,"children":1288},{},[1289],{"type":48,"value":1290},"If you get connection refused, the server isn't running or ngrok isn't forwarding.",{"type":42,"tag":73,"props":1292,"children":1293},{},[1294,1296],{"type":48,"value":1295},"Check that OpenClaw gateway is running: ",{"type":42,"tag":126,"props":1297,"children":1299},{"className":1298},[],[1300],{"type":48,"value":1301},"curl http:\u002F\u002F127.0.0.1:18789\u002Fhealth",{"type":42,"tag":111,"props":1303,"children":1305},{"id":1304},"call-works-once-then-hangs-up",[1306],{"type":48,"value":1307},"Call works once then hangs up",{"type":42,"tag":51,"props":1309,"children":1310},{},[1311,1315],{"type":42,"tag":77,"props":1312,"children":1313},{},[1314],{"type":48,"value":1075},{"type":48,"value":1316}," First exchange works (greeting + one response), then call drops with \"FAILED_TO_THINK\" in logs.",{"type":42,"tag":51,"props":1318,"children":1319},{},[1320,1324],{"type":42,"tag":77,"props":1321,"children":1322},{},[1323],{"type":48,"value":1085},{"type":48,"value":1325}," SSE stream formatting issue—usually fixed in latest code.",{"type":42,"tag":51,"props":1327,"children":1328},{},[1329],{"type":42,"tag":77,"props":1330,"children":1331},{},[1332],{"type":48,"value":1095},{"type":42,"tag":201,"props":1334,"children":1335},{},[1336,1347],{"type":42,"tag":73,"props":1337,"children":1338},{},[1339,1341],{"type":48,"value":1340},"Make sure you have the latest code: ",{"type":42,"tag":126,"props":1342,"children":1344},{"className":1343},[],[1345],{"type":48,"value":1346},"cd ~\u002Fdeepclaw && git pull",{"type":42,"tag":73,"props":1348,"children":1349},{},[1350],{"type":48,"value":1351},"Restart the server",{"type":42,"tag":111,"props":1353,"children":1355},{"id":1354},"words-running-together-in-speech",[1356],{"type":48,"value":1357},"Words running together in speech",{"type":42,"tag":51,"props":1359,"children":1360},{},[1361,1365],{"type":42,"tag":77,"props":1362,"children":1363},{},[1364],{"type":48,"value":1075},{"type":48,"value":1366}," TTS says \"Whydo you want\" instead of \"Why do you want\"",{"type":42,"tag":51,"props":1368,"children":1369},{},[1370,1374],{"type":42,"tag":77,"props":1371,"children":1372},{},[1373],{"type":48,"value":1085},{"type":48,"value":1375}," Markdown stripping was removing spaces between streaming chunks.",{"type":42,"tag":51,"props":1377,"children":1378},{},[1379],{"type":42,"tag":77,"props":1380,"children":1381},{},[1382],{"type":48,"value":1095},{"type":42,"tag":201,"props":1384,"children":1385},{},[1386,1396],{"type":42,"tag":73,"props":1387,"children":1388},{},[1389,1391],{"type":48,"value":1390},"Update to latest code: ",{"type":42,"tag":126,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":48,"value":1346},{"type":42,"tag":73,"props":1397,"children":1398},{},[1399],{"type":48,"value":1351},{"type":42,"tag":111,"props":1401,"children":1403},{"id":1402},"inbound-calls-dont-work-but-everything-else-does",[1404],{"type":48,"value":1405},"Inbound calls don't work, but everything else does",{"type":42,"tag":51,"props":1407,"children":1408},{},[1409,1413],{"type":42,"tag":77,"props":1410,"children":1411},{},[1412],{"type":48,"value":1075},{"type":48,"value":1414}," Server responds to curl, ngrok works, but calling from your phone gets immediate disconnect with no logs.",{"type":42,"tag":51,"props":1416,"children":1417},{},[1418,1422],{"type":42,"tag":77,"props":1419,"children":1420},{},[1421],{"type":48,"value":1085},{"type":48,"value":1423}," Your carrier may be blocking calls to the Twilio number, or you're dialing wrong.",{"type":42,"tag":51,"props":1425,"children":1426},{},[1427],{"type":42,"tag":77,"props":1428,"children":1429},{},[1430],{"type":48,"value":1095},{"type":42,"tag":201,"props":1432,"children":1433},{},[1434,1439,1444],{"type":42,"tag":73,"props":1435,"children":1436},{},[1437],{"type":48,"value":1438},"Verify you're dialing the exact Twilio number (with country code if needed)",{"type":42,"tag":73,"props":1440,"children":1441},{},[1442],{"type":48,"value":1443},"Try calling from a different phone",{"type":42,"tag":73,"props":1445,"children":1446},{},[1447,1449,1543],{"type":48,"value":1448},"Test with an outbound call from Twilio to you:\n",{"type":42,"tag":118,"props":1450,"children":1452},{"className":938,"code":1451,"language":845,"meta":123,"style":123},"# Run this in Python with your .env loaded\nimport requests\nrequests.post(\n    f'https:\u002F\u002Fapi.twilio.com\u002F2010-04-01\u002FAccounts\u002F{TWILIO_ACCOUNT_SID}\u002FCalls.json',\n    auth=(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN),\n    data={\n        'To': '+1YOURNUMBER',\n        'From': '+1TWILIONUMBER',\n        'Url': 'https:\u002F\u002F\u003Cyour-ngrok-url>\u002Ftwilio\u002Fincoming'\n    }\n)\n",[1453],{"type":42,"tag":126,"props":1454,"children":1455},{"__ignoreMap":123},[1456,1464,1472,1480,1488,1496,1504,1512,1520,1528,1535],{"type":42,"tag":130,"props":1457,"children":1458},{"class":132,"line":133},[1459],{"type":42,"tag":130,"props":1460,"children":1461},{},[1462],{"type":48,"value":1463},"# Run this in Python with your .env loaded\n",{"type":42,"tag":130,"props":1465,"children":1466},{"class":132,"line":158},[1467],{"type":42,"tag":130,"props":1468,"children":1469},{},[1470],{"type":48,"value":1471},"import requests\n",{"type":42,"tag":130,"props":1473,"children":1474},{"class":132,"line":172},[1475],{"type":42,"tag":130,"props":1476,"children":1477},{},[1478],{"type":48,"value":1479},"requests.post(\n",{"type":42,"tag":130,"props":1481,"children":1482},{"class":132,"line":554},[1483],{"type":42,"tag":130,"props":1484,"children":1485},{},[1486],{"type":48,"value":1487},"    f'https:\u002F\u002Fapi.twilio.com\u002F2010-04-01\u002FAccounts\u002F{TWILIO_ACCOUNT_SID}\u002FCalls.json',\n",{"type":42,"tag":130,"props":1489,"children":1490},{"class":132,"line":580},[1491],{"type":42,"tag":130,"props":1492,"children":1493},{},[1494],{"type":48,"value":1495},"    auth=(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN),\n",{"type":42,"tag":130,"props":1497,"children":1498},{"class":132,"line":607},[1499],{"type":42,"tag":130,"props":1500,"children":1501},{},[1502],{"type":48,"value":1503},"    data={\n",{"type":42,"tag":130,"props":1505,"children":1506},{"class":132,"line":635},[1507],{"type":42,"tag":130,"props":1508,"children":1509},{},[1510],{"type":48,"value":1511},"        'To': '+1YOURNUMBER',\n",{"type":42,"tag":130,"props":1513,"children":1514},{"class":132,"line":644},[1515],{"type":42,"tag":130,"props":1516,"children":1517},{},[1518],{"type":48,"value":1519},"        'From': '+1TWILIONUMBER',\n",{"type":42,"tag":130,"props":1521,"children":1522},{"class":132,"line":653},[1523],{"type":42,"tag":130,"props":1524,"children":1525},{},[1526],{"type":48,"value":1527},"        'Url': 'https:\u002F\u002F\u003Cyour-ngrok-url>\u002Ftwilio\u002Fincoming'\n",{"type":42,"tag":130,"props":1529,"children":1530},{"class":132,"line":662},[1531],{"type":42,"tag":130,"props":1532,"children":1533},{},[1534],{"type":48,"value":659},{"type":42,"tag":130,"props":1536,"children":1537},{"class":132,"line":671},[1538],{"type":42,"tag":130,"props":1539,"children":1540},{},[1541],{"type":48,"value":1542},")\n",{"type":48,"value":1544},"\nIf this works, the issue is your carrier blocking outbound calls to Twilio.",{"type":42,"tag":111,"props":1546,"children":1548},{"id":1547},"openclaw-returns-errors",[1549],{"type":48,"value":1550},"OpenClaw returns errors",{"type":42,"tag":51,"props":1552,"children":1553},{},[1554,1558],{"type":42,"tag":77,"props":1555,"children":1556},{},[1557],{"type":48,"value":1075},{"type":48,"value":1559}," Logs show errors from OpenClaw like \"No API key found for provider\"",{"type":42,"tag":51,"props":1561,"children":1562},{},[1563],{"type":42,"tag":77,"props":1564,"children":1565},{},[1566],{"type":48,"value":1095},{"type":42,"tag":201,"props":1568,"children":1569},{},[1570,1575,1588],{"type":42,"tag":73,"props":1571,"children":1572},{},[1573],{"type":48,"value":1574},"Make sure OpenClaw is configured with your Anthropic API key",{"type":42,"tag":73,"props":1576,"children":1577},{},[1578,1580,1586],{"type":48,"value":1579},"Run ",{"type":42,"tag":126,"props":1581,"children":1583},{"className":1582},[],[1584],{"type":48,"value":1585},"openclaw configure --section model",{"type":48,"value":1587}," to set it up",{"type":42,"tag":73,"props":1589,"children":1590},{},[1591,1593],{"type":48,"value":1592},"Restart OpenClaw gateway: ",{"type":42,"tag":126,"props":1594,"children":1596},{"className":1595},[],[1597],{"type":48,"value":688},{"type":42,"tag":111,"props":1599,"children":1601},{"id":1600},"ngrok-url-keeps-changing",[1602],{"type":48,"value":1603},"ngrok URL keeps changing",{"type":42,"tag":51,"props":1605,"children":1606},{},[1607,1611],{"type":42,"tag":77,"props":1608,"children":1609},{},[1610],{"type":48,"value":1075},{"type":48,"value":1612}," Every time you restart ngrok, you get a new URL and have to update Twilio.",{"type":42,"tag":51,"props":1614,"children":1615},{},[1616,1620],{"type":42,"tag":77,"props":1617,"children":1618},{},[1619],{"type":48,"value":1095},{"type":48,"value":1621}," Use a fixed ngrok domain (requires ngrok account):",{"type":42,"tag":118,"props":1623,"children":1625},{"className":120,"code":1624,"language":122,"meta":123,"style":123},"ngrok http 8000 --domain=your-chosen-name.ngrok-free.app\n",[1626],{"type":42,"tag":126,"props":1627,"children":1628},{"__ignoreMap":123},[1629],{"type":42,"tag":130,"props":1630,"children":1631},{"class":132,"line":133},[1632,1636,1640,1645],{"type":42,"tag":130,"props":1633,"children":1634},{"style":137},[1635],{"type":48,"value":36},{"type":42,"tag":130,"props":1637,"children":1638},{"style":142},[1639],{"type":48,"value":713},{"type":42,"tag":130,"props":1641,"children":1642},{"style":409},[1643],{"type":48,"value":1644}," 8000",{"type":42,"tag":130,"props":1646,"children":1647},{"style":142},[1648],{"type":48,"value":1649}," --domain=your-chosen-name.ngrok-free.app\n",{"type":42,"tag":111,"props":1651,"children":1653},{"id":1652},"still-stuck",[1654],{"type":48,"value":1655},"Still stuck?",{"type":42,"tag":201,"props":1657,"children":1658},{},[1659,1664,1715],{"type":42,"tag":73,"props":1660,"children":1661},{},[1662],{"type":48,"value":1663},"Check the server logs carefully—they usually tell you what's wrong",{"type":42,"tag":73,"props":1665,"children":1666},{},[1667,1669],{"type":48,"value":1668},"Test each component individually:\n",{"type":42,"tag":69,"props":1670,"children":1671},{},[1672,1683,1694,1704],{"type":42,"tag":73,"props":1673,"children":1674},{},[1675,1677],{"type":48,"value":1676},"Server health: ",{"type":42,"tag":126,"props":1678,"children":1680},{"className":1679},[],[1681],{"type":48,"value":1682},"curl http:\u002F\u002Flocalhost:8000\u002Fhealth",{"type":42,"tag":73,"props":1684,"children":1685},{},[1686,1688],{"type":48,"value":1687},"ngrok forwarding: ",{"type":42,"tag":126,"props":1689,"children":1691},{"className":1690},[],[1692],{"type":48,"value":1693},"curl https:\u002F\u002F\u003Cngrok-url>\u002Fhealth",{"type":42,"tag":73,"props":1695,"children":1696},{},[1697,1699],{"type":48,"value":1698},"OpenClaw gateway: ",{"type":42,"tag":126,"props":1700,"children":1702},{"className":1701},[],[1703],{"type":48,"value":1301},{"type":42,"tag":73,"props":1705,"children":1706},{},[1707,1709],{"type":48,"value":1708},"LLM proxy: ",{"type":42,"tag":126,"props":1710,"children":1712},{"className":1711},[],[1713],{"type":48,"value":1714},"curl -X POST https:\u002F\u002F\u003Cngrok-url>\u002Fv1\u002Fchat\u002Fcompletions -H \"Content-Type: application\u002Fjson\" -d '{\"model\":\"gpt-4\",\"messages\":[{\"role\":\"user\",\"content\":\"test\"}]}'",{"type":42,"tag":73,"props":1716,"children":1717},{},[1718,1720],{"type":48,"value":1719},"Open an issue at ",{"type":42,"tag":210,"props":1721,"children":1724},{"href":1722,"rel":1723},"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdeepclaw\u002Fissues",[214],[1725],{"type":48,"value":1722},{"type":42,"tag":1727,"props":1728,"children":1729},"style",{},[1730],{"type":48,"value":1731},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1733,"total":1884},[1734,1740,1758,1772,1784,1796,1808,1819,1835,1849,1861,1873],{"slug":4,"name":4,"fn":5,"description":6,"org":1735,"tags":1736,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1737,1738,1739],{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13},{"slug":1741,"name":1741,"fn":1742,"description":1743,"org":1744,"tags":1745,"stars":1755,"repoUrl":1756,"updatedAt":1757},"1password","manage secrets with 1Password CLI","Set up and use 1Password CLI (op). Use when installing the CLI, enabling desktop app integration, signing in (single or multi-account), or reading\u002Finjecting\u002Frunning secrets via op.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1746,1749,1752],{"name":1747,"slug":1748,"type":13},"Automation","automation",{"name":1750,"slug":1751,"type":13},"CLI","cli",{"name":1753,"slug":1754,"type":13},"Security","security",23,"https:\u002F\u002Fgithub.com\u002Fdeepgram\u002Fdglabs-deepclaw","2026-07-12T08:28:49.991939",{"slug":1759,"name":1759,"fn":1760,"description":1761,"org":1762,"tags":1763,"stars":1755,"repoUrl":1756,"updatedAt":1771},"apple-notes","manage Apple Notes on macOS","Manage Apple Notes via the `memo` CLI on macOS (create, view, edit, delete, search, move, and export notes). Use when a user asks OpenClaw to add a note, list notes, search notes, or manage note folders.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1764,1765,1768],{"name":1750,"slug":1751,"type":13},{"name":1766,"slug":1767,"type":13},"Knowledge Management","knowledge-management",{"name":1769,"slug":1770,"type":13},"macOS","macos","2026-07-12T08:29:01.538106",{"slug":1773,"name":1773,"fn":1774,"description":1775,"org":1776,"tags":1777,"stars":1755,"repoUrl":1756,"updatedAt":1783},"apple-reminders","manage Apple Reminders via CLI","Manage Apple Reminders via the `remindctl` CLI on macOS (list, add, edit, complete, delete). Supports lists, date filters, and JSON\u002Fplain output.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1778,1779,1780],{"name":1750,"slug":1751,"type":13},{"name":1769,"slug":1770,"type":13},{"name":1781,"slug":1782,"type":13},"Task Management","task-management","2026-07-12T08:29:14.035414",{"slug":1785,"name":1785,"fn":1786,"description":1787,"org":1788,"tags":1789,"stars":1755,"repoUrl":1756,"updatedAt":1795},"bear-notes","manage Bear notes via CLI","Create, search, and manage Bear notes via grizzly CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1790,1791,1792],{"name":1750,"slug":1751,"type":13},{"name":1766,"slug":1767,"type":13},{"name":1793,"slug":1794,"type":13},"Notes","notes","2026-07-12T08:28:51.246011",{"slug":1797,"name":1797,"fn":1798,"description":1799,"org":1800,"tags":1801,"stars":1755,"repoUrl":1756,"updatedAt":1807},"blogwatcher","monitor blogs and RSS feeds","Monitor blogs and RSS\u002FAtom feeds for updates using the blogwatcher CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1802,1803,1804],{"name":1747,"slug":1748,"type":13},{"name":1750,"slug":1751,"type":13},{"name":1805,"slug":1806,"type":13},"Monitoring","monitoring","2026-07-12T08:29:02.762321",{"slug":1809,"name":1809,"fn":1810,"description":1811,"org":1812,"tags":1813,"stars":1755,"repoUrl":1756,"updatedAt":1818},"blucli","control BluOS audio playback","BluOS CLI (blu) for discovery, playback, grouping, and volume.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1814,1817],{"name":1815,"slug":1816,"type":13},"Audio","audio",{"name":1750,"slug":1751,"type":13},"2026-07-12T08:28:21.009637",{"slug":1820,"name":1820,"fn":1821,"description":1822,"org":1823,"tags":1824,"stars":1755,"repoUrl":1756,"updatedAt":1834},"bluebubbles","send and manage iMessages","Use when you need to send or manage iMessages via BlueBubbles (recommended iMessage integration). Calls go through the generic message tool with channel=\"bluebubbles\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1825,1828,1831],{"name":1826,"slug":1827,"type":13},"Communications","communications",{"name":1829,"slug":1830,"type":13},"iMessage","imessage",{"name":1832,"slug":1833,"type":13},"Messaging","messaging","2026-07-12T08:28:57.517914",{"slug":1836,"name":1836,"fn":1837,"description":1838,"org":1839,"tags":1840,"stars":1755,"repoUrl":1756,"updatedAt":1848},"camsnap","capture frames and clips from cameras","Capture frames or clips from RTSP\u002FONVIF cameras.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1841,1842,1845],{"name":1747,"slug":1748,"type":13},{"name":1843,"slug":1844,"type":13},"Camera","camera",{"name":1846,"slug":1847,"type":13},"Media","media","2026-07-12T08:28:28.096134",{"slug":1850,"name":1850,"fn":1851,"description":1852,"org":1853,"tags":1854,"stars":1755,"repoUrl":1756,"updatedAt":1860},"clawhub","manage agent skills with ClawHub","Use the ClawHub CLI to search, install, update, and publish agent skills from clawhub.com. Use when you need to fetch new skills on the fly, sync installed skills to latest or a specific version, or publish new\u002Fupdated skill folders with the npm-installed clawhub CLI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1855,1858,1859],{"name":1856,"slug":1857,"type":13},"Agents","agents",{"name":1747,"slug":1748,"type":13},{"name":1750,"slug":1751,"type":13},"2026-07-12T08:28:30.589001",{"slug":1862,"name":1862,"fn":1863,"description":1864,"org":1865,"tags":1866,"stars":1755,"repoUrl":1756,"updatedAt":1872},"coding-agent","run coding agents for programmatic control","Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1867,1868,1869],{"name":1856,"slug":1857,"type":13},{"name":1747,"slug":1748,"type":13},{"name":1870,"slug":1871,"type":13},"Coding","coding","2026-07-12T08:29:08.6658",{"slug":1874,"name":1874,"fn":1875,"description":1876,"org":1877,"tags":1878,"stars":1755,"repoUrl":1756,"updatedAt":1883},"eightctl","control Eight Sleep pod settings","Control Eight Sleep pods (status, temperature, alarms, schedules).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1879,1880],{"name":1747,"slug":1748,"type":13},{"name":1881,"slug":1882,"type":13},"Hardware","hardware","2026-07-12T08:28:39.322181",73,{"items":1886,"total":133},[1887],{"slug":4,"name":4,"fn":5,"description":6,"org":1888,"tags":1889,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1890,1891,1892],{"name":15,"slug":16,"type":13},{"name":9,"slug":8,"type":13},{"name":18,"slug":19,"type":13}]