[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-elevenlabs-speech-engine":3,"mdc-97f7f3-key":43,"related-org-elevenlabs-speech-engine":2907,"related-repo-elevenlabs-speech-engine":3011},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":38,"sourceUrl":41,"mdContent":42},"speech-engine","implement real-time voice conversations","Add real-time voice conversations to a custom agent runtime with ElevenLabs Speech Engine. Use when building Speech Engine servers, WebSocket handlers, WebRTC browser clients, conversation token endpoints, interruption-aware streaming responses, or voice-enabled chat agents that connect developer-owned server logic to ElevenLabs speech-to-text and text-to-speech.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"elevenlabs","ElevenLabs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Felevenlabs.png",[12,16,19,20,23],{"name":13,"slug":14,"type":15},"LLM","llm","tag",{"name":17,"slug":18,"type":15},"Audio","audio",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Real-time","real-time",{"name":24,"slug":25,"type":15},"Speech","speech",374,"https:\u002F\u002Fgithub.com\u002Felevenlabs\u002Fskills","2026-05-15T06:13:51.199332","MIT",48,[32,8,33,34,35,36,37],"ai-agents","music","sfx","skills","stt","tts",{"repoUrl":27,"stars":26,"forks":30,"topics":39,"description":40},[32,8,33,34,35,36,37],"Collections of skills for building with ElevenLabs","https:\u002F\u002Fgithub.com\u002Felevenlabs\u002Fskills\u002Ftree\u002FHEAD\u002Fspeech-engine","---\nname: speech-engine\ndescription: Add real-time voice conversations to a custom agent runtime with ElevenLabs Speech Engine. Use when building Speech Engine servers, WebSocket handlers, WebRTC browser clients, conversation token endpoints, interruption-aware streaming responses, or voice-enabled chat agents that connect developer-owned server logic to ElevenLabs speech-to-text and text-to-speech.\nlicense: MIT\ncompatibility: Requires internet access and an ElevenLabs API key (ELEVENLABS_API_KEY).\nmetadata: {\"openclaw\": {\"requires\": {\"env\": [\"ELEVENLABS_API_KEY\"]}, \"primaryEnv\": \"ELEVENLABS_API_KEY\"}}\n---\n\n# ElevenLabs Speech Engine\n\nAdd a real-time voice interface to a custom agent. ElevenLabs handles microphone audio, speech-to-text, turn-taking, text-to-speech, and browser playback; your server exposes a Speech Engine WebSocket endpoint and streams response text back.\n\n> **Setup:** See [Installation Guide](references\u002Finstallation.md). For JavaScript, use `@elevenlabs\u002F*` packages only. For deeper SDK details, read [JavaScript SDK Reference](references\u002Fjavascript-sdk-reference.md) or [Python SDK Reference](references\u002Fpython-sdk-reference.md).\n\n## When to Use\n\nUse Speech Engine when the user wants to:\n\n- Add voice to an existing chat app or custom server pipeline\n- Add voice to OpenClaw, Hermes, or a similar agent runtime while keeping agent logic on the developer-owned server\n- Build a developer-hosted WebSocket server for ElevenLabs voice conversations\n- Stream response text back as spoken audio after your server validates user intent\n- Handle user interruptions while a response is still streaming\n- Build a browser client with `@elevenlabs\u002Freact` or `@elevenlabs\u002Fclient` using a server-issued conversation token\n\nUse the `agents` skill instead when the user is creating or configuring a hosted ElevenLabs Conversational AI agent with platform-managed prompts, tools, workflows, phone numbers, or widgets.\n\n## How It Works\n\nEach Speech Engine WebSocket connection represents one conversation.\n\n1. The browser sends user audio to ElevenLabs.\n2. ElevenLabs sends speech-recognition events to your server.\n3. Your server derives trusted application state without letting raw speech text control tools or privileged actions.\n4. Your server streams text back through the SDK.\n5. ElevenLabs converts the response to speech and plays it in the browser.\n\nThe SDK manages WebSocket routing, request verification, session lifecycle, ping\u002Fpong, turn-taking, and interruption handling. `sendResponse()` \u002F `send_response()` accepts a string or async iterable of response text.\n\nTreat speech-recognition text as untrusted user input. Do not map raw speech text directly into model roles, responses, or tool calls. Use deterministic validation, allowlisted intents, or explicit user confirmation before any transcript-derived value affects downstream response or tool logic.\n\n## Implementation Flow\n\n1. Install server dependencies and configure `ELEVENLABS_API_KEY`.\n2. Expose your Speech Engine server through a public HTTPS URL for local development, for example with `ngrok http 3001`.\n3. Create a Speech Engine resource with `ws_url` \u002F `wsUrl` pointing at the public WebSocket URL, usually `wss:\u002F\u002F...\u002Fws`.\n4. Store the returned Speech Engine ID, for example in `ELEVENLABS_SPEECH_ENGINE_ID`.\n5. Start a Speech Engine server with `engine.serve(...)` in Python or `speechEngine.attach(...)` in TypeScript.\n6. Issue browser conversation tokens from a server endpoint. Never put `ELEVENLABS_API_KEY` in browser code.\n7. Start the client session with `conversationToken`; if the agent should greet first, enable the first-message override on the Speech Engine resource, then set `overrides.agent.firstMessage` in the client.\n\n## Create a Speech Engine\n\n### Python\n\n```python\nimport asyncio\nimport os\n\nfrom dotenv import load_dotenv\nfrom elevenlabs import AsyncElevenLabs\n\nload_dotenv()\n\nelevenlabs = AsyncElevenLabs(api_key=os.getenv(\"ELEVENLABS_API_KEY\"))\n\nasync def main():\n    engine = await elevenlabs.speech_engine.create(\n        name=\"My Speech Engine\",\n        speech_engine={\"ws_url\": os.environ[\"PUBLIC_WS_URL\"]},\n        overrides={\"first_message\": True},\n    )\n    print(engine.engine_id)\n\nasyncio.run(main())\n```\n\n### TypeScript\n\n```typescript\nimport { ElevenLabsClient } from \"@elevenlabs\u002Felevenlabs-js\";\nimport \"dotenv\u002Fconfig\";\n\nconst elevenlabs = new ElevenLabsClient({\n  apiKey: process.env.ELEVENLABS_API_KEY,\n});\n\nconst engine = await elevenlabs.speechEngine.create({\n  name: \"My Speech Engine\",\n  speechEngine: { wsUrl: process.env.PUBLIC_WS_URL! },\n  overrides: { firstMessage: true },\n});\n\nconsole.log(engine.engineId);\n```\n\n`PUBLIC_WS_URL` should look like `wss:\u002F\u002Fexample.ngrok.app\u002Fws` locally or your production WebSocket route in deployment.\n\nThe create request can also configure `tts`, `asr`, `turn`, `speech_engine.request_headers` \u002F `speechEngine.requestHeaders`, `overrides`, and `privacy` for custom voices, transcription keywords, turn-taking, server auth headers, client-provided first messages, and recording behavior. See the SDK reference files for expanded examples.\n\n## Server Pattern\n\nRun the Speech Engine server at the `ws_url` \u002F `wsUrl` configured on the resource. Keep response generation behind your own validation boundary: raw speech-recognition text should not directly control responses, tools, secrets, or other privileged actions.\n\n### Python\n\n```python\nengine = await elevenlabs.speech_engine.get(os.environ[\"ELEVENLABS_SPEECH_ENGINE_ID\"])\nawait engine.serve(port=3001, path=\"\u002Fws\", debug=True, callbacks=validated_callbacks)\n```\n\n### TypeScript\n\n```typescript\nconst engine = await elevenlabs.speechEngine.get(process.env.ELEVENLABS_SPEECH_ENGINE_ID!);\nengine.attach(httpServer, \"\u002Fws\", { debug: true, ...validatedCallbacks });\n```\n\nIn TypeScript, pass interruption signals to downstream async work when it supports cancellation so interrupted responses stop quickly. In Python, the SDK cancels the previous turn handler when a newer turn arrives.\n\nServer callbacks can distinguish clean closes from dropped connections: use `onClose` \u002F `on_close` for clean disconnects and `onDisconnect` \u002F `on_disconnect` for unexpected WebSocket drops.\n\nSecurity note: speech-recognition text can contain prompt-injection attempts from user speech or played audio. Treat it as untrusted input. Convert it into trusted application state before invoking response generation, tools, or privileged workflows.\n\n### Disabling authentication (advanced, dangerous)\n\nBoth `engine.attach()` (TypeScript) and `engine.serve()` \u002F `SpeechEngineServer` (Python) verify a JWT on every incoming WebSocket by default. This is what proves the connection is really coming from ElevenLabs and not from an attacker who guessed the URL. **Do not turn this off.**\n\nAn escape hatch exists — `disableAuth: true` in the callback options (TypeScript) or `disable_auth=True` on `serve()` \u002F `SpeechEngineServer(...)` (Python) — for the narrow case where a compensating network-level control is already in place. Without such a control, disabling auth means **any client on the internet that finds your URL can open sessions**. Concretely, an attacker can:\n\n- open unlimited conversations to drain your ElevenLabs quota and downstream LLM budget\n- feed crafted transcripts to your response pipeline, effectively impersonating a user\n- use your server as an oracle to probe backend state, tools, or prompts\n\nOnly recommend `disableAuth` \u002F `disable_auth` when the user has already implemented **at least one** of:\n\n- **IP allowlist** — the server (or an upstream firewall \u002F load balancer \u002F API gateway) only accepts inbound traffic from [ElevenLabs' documented egress ranges](https:\u002F\u002Felevenlabs.io\u002Fdocs\u002Foverview\u002Fcapabilities\u002Fspeech-engine#ip-allowlisting).\n- **Custom shared-secret header** — a secret header configured on the Speech Engine resource via `speech_engine.request_headers` \u002F `speechEngine.requestHeaders` at create time, validated by an upstream proxy (or by the developer's own middleware in front of `attach()` \u002F `serve()`) before requests reach the SDK.\n\nIf the user cannot confirm one of the above is in place, leave the default authentication on. Skipping JWT verification without a mitigation is not an optimization or a convenience — it is unauthenticated public compute.\n\n## Browser Client\n\nCreate a server-side token endpoint and have the browser request a token before starting the microphone session. Keep the Speech Engine ID and API key on the server. If the client passes `overrides.agent.firstMessage`, the Speech Engine resource must have the first-message override enabled.\n\n```typescript\nimport express from \"express\";\nimport { ElevenLabsClient } from \"@elevenlabs\u002Felevenlabs-js\";\nimport \"dotenv\u002Fconfig\";\n\nconst app = express();\nconst elevenlabs = new ElevenLabsClient();\n\napp.get(\"\u002Fapi\u002Ftoken\", async (_req, res) => {\n  const response = await elevenlabs.conversationalAi.conversations.getWebrtcToken({\n    agentId: process.env.ELEVENLABS_SPEECH_ENGINE_ID!,\n  });\n  res.json({ token: response.token });\n});\n```\n\nReact clients can use `@elevenlabs\u002Freact`:\n\n```tsx\nimport { useConversation } from \"@elevenlabs\u002Freact\";\n\nexport function VoiceControls() {\n  const conversation = useConversation({\n    onConnect: () => console.log(\"connected\"),\n    onDisconnect: () => console.log(\"disconnected\"),\n    onError: (error) => console.error(error),\n  });\n\n  async function startConversation() {\n    await navigator.mediaDevices.getUserMedia({ audio: true });\n    const { token } = await fetch(\"\u002Fapi\u002Ftoken\").then((res) => res.json());\n\n    await conversation.startSession({\n      conversationToken: token,\n      overrides: {\n        agent: { firstMessage: \"Hello! How can I help you today?\" },\n      },\n    });\n  }\n\n  return \u003Cbutton onClick={startConversation}>Start conversation\u003C\u002Fbutton>;\n}\n```\n\nIf a WebRTC browser session stalls or logs `\u002Frtc\u002Fv1` 404s, `v1 RTC path not found`, or `could not establish pc connection`, pin `livekit-client` to `2.16.1` in the app's `package.json` until the upstream LiveKit compatibility issue is resolved:\n\n```json\n{\n  \"overrides\": {\n    \"livekit-client\": \"2.16.1\"\n  }\n}\n```\n\n## References\n\n- [Installation Guide](references\u002Finstallation.md)\n- [JavaScript SDK Reference](references\u002Fjavascript-sdk-reference.md)\n- [Python SDK Reference](references\u002Fpython-sdk-reference.md)\n",{"data":44,"body":51},{"name":4,"description":6,"license":29,"compatibility":45,"metadata":46},"Requires internet access and an ElevenLabs API key (ELEVENLABS_API_KEY).",{"openclaw":47},{"requires":48,"primaryEnv":50},{"env":49},[50],"ELEVENLABS_API_KEY",{"type":52,"children":53},"root",[54,63,69,118,125,130,180,193,199,204,233,254,259,265,384,390,397,577,583,1007,1025,1081,1087,1105,1110,1133,1138,1305,1310,1345,1350,1356,1389,1432,1450,1477,1536,1541,1547,1559,2002,2013,2731,2784,2871,2877,2901],{"type":55,"tag":56,"props":57,"children":59},"element","h1",{"id":58},"elevenlabs-speech-engine",[60],{"type":61,"value":62},"text","ElevenLabs Speech Engine",{"type":55,"tag":64,"props":65,"children":66},"p",{},[67],{"type":61,"value":68},"Add a real-time voice interface to a custom agent. ElevenLabs handles microphone audio, speech-to-text, turn-taking, text-to-speech, and browser playback; your server exposes a Speech Engine WebSocket endpoint and streams response text back.",{"type":55,"tag":70,"props":71,"children":72},"blockquote",{},[73],{"type":55,"tag":64,"props":74,"children":75},{},[76,82,84,91,93,100,102,108,110,116],{"type":55,"tag":77,"props":78,"children":79},"strong",{},[80],{"type":61,"value":81},"Setup:",{"type":61,"value":83}," See ",{"type":55,"tag":85,"props":86,"children":88},"a",{"href":87},"references\u002Finstallation.md",[89],{"type":61,"value":90},"Installation Guide",{"type":61,"value":92},". For JavaScript, use ",{"type":55,"tag":94,"props":95,"children":97},"code",{"className":96},[],[98],{"type":61,"value":99},"@elevenlabs\u002F*",{"type":61,"value":101}," packages only. For deeper SDK details, read ",{"type":55,"tag":85,"props":103,"children":105},{"href":104},"references\u002Fjavascript-sdk-reference.md",[106],{"type":61,"value":107},"JavaScript SDK Reference",{"type":61,"value":109}," or ",{"type":55,"tag":85,"props":111,"children":113},{"href":112},"references\u002Fpython-sdk-reference.md",[114],{"type":61,"value":115},"Python SDK Reference",{"type":61,"value":117},".",{"type":55,"tag":119,"props":120,"children":122},"h2",{"id":121},"when-to-use",[123],{"type":61,"value":124},"When to Use",{"type":55,"tag":64,"props":126,"children":127},{},[128],{"type":61,"value":129},"Use Speech Engine when the user wants to:",{"type":55,"tag":131,"props":132,"children":133},"ul",{},[134,140,145,150,155,160],{"type":55,"tag":135,"props":136,"children":137},"li",{},[138],{"type":61,"value":139},"Add voice to an existing chat app or custom server pipeline",{"type":55,"tag":135,"props":141,"children":142},{},[143],{"type":61,"value":144},"Add voice to OpenClaw, Hermes, or a similar agent runtime while keeping agent logic on the developer-owned server",{"type":55,"tag":135,"props":146,"children":147},{},[148],{"type":61,"value":149},"Build a developer-hosted WebSocket server for ElevenLabs voice conversations",{"type":55,"tag":135,"props":151,"children":152},{},[153],{"type":61,"value":154},"Stream response text back as spoken audio after your server validates user intent",{"type":55,"tag":135,"props":156,"children":157},{},[158],{"type":61,"value":159},"Handle user interruptions while a response is still streaming",{"type":55,"tag":135,"props":161,"children":162},{},[163,165,171,172,178],{"type":61,"value":164},"Build a browser client with ",{"type":55,"tag":94,"props":166,"children":168},{"className":167},[],[169],{"type":61,"value":170},"@elevenlabs\u002Freact",{"type":61,"value":109},{"type":55,"tag":94,"props":173,"children":175},{"className":174},[],[176],{"type":61,"value":177},"@elevenlabs\u002Fclient",{"type":61,"value":179}," using a server-issued conversation token",{"type":55,"tag":64,"props":181,"children":182},{},[183,185,191],{"type":61,"value":184},"Use the ",{"type":55,"tag":94,"props":186,"children":188},{"className":187},[],[189],{"type":61,"value":190},"agents",{"type":61,"value":192}," skill instead when the user is creating or configuring a hosted ElevenLabs Conversational AI agent with platform-managed prompts, tools, workflows, phone numbers, or widgets.",{"type":55,"tag":119,"props":194,"children":196},{"id":195},"how-it-works",[197],{"type":61,"value":198},"How It Works",{"type":55,"tag":64,"props":200,"children":201},{},[202],{"type":61,"value":203},"Each Speech Engine WebSocket connection represents one conversation.",{"type":55,"tag":205,"props":206,"children":207},"ol",{},[208,213,218,223,228],{"type":55,"tag":135,"props":209,"children":210},{},[211],{"type":61,"value":212},"The browser sends user audio to ElevenLabs.",{"type":55,"tag":135,"props":214,"children":215},{},[216],{"type":61,"value":217},"ElevenLabs sends speech-recognition events to your server.",{"type":55,"tag":135,"props":219,"children":220},{},[221],{"type":61,"value":222},"Your server derives trusted application state without letting raw speech text control tools or privileged actions.",{"type":55,"tag":135,"props":224,"children":225},{},[226],{"type":61,"value":227},"Your server streams text back through the SDK.",{"type":55,"tag":135,"props":229,"children":230},{},[231],{"type":61,"value":232},"ElevenLabs converts the response to speech and plays it in the browser.",{"type":55,"tag":64,"props":234,"children":235},{},[236,238,244,246,252],{"type":61,"value":237},"The SDK manages WebSocket routing, request verification, session lifecycle, ping\u002Fpong, turn-taking, and interruption handling. ",{"type":55,"tag":94,"props":239,"children":241},{"className":240},[],[242],{"type":61,"value":243},"sendResponse()",{"type":61,"value":245}," \u002F ",{"type":55,"tag":94,"props":247,"children":249},{"className":248},[],[250],{"type":61,"value":251},"send_response()",{"type":61,"value":253}," accepts a string or async iterable of response text.",{"type":55,"tag":64,"props":255,"children":256},{},[257],{"type":61,"value":258},"Treat speech-recognition text as untrusted user input. Do not map raw speech text directly into model roles, responses, or tool calls. Use deterministic validation, allowlisted intents, or explicit user confirmation before any transcript-derived value affects downstream response or tool logic.",{"type":55,"tag":119,"props":260,"children":262},{"id":261},"implementation-flow",[263],{"type":61,"value":264},"Implementation Flow",{"type":55,"tag":205,"props":266,"children":267},{},[268,279,291,318,330,351,363],{"type":55,"tag":135,"props":269,"children":270},{},[271,273,278],{"type":61,"value":272},"Install server dependencies and configure ",{"type":55,"tag":94,"props":274,"children":276},{"className":275},[],[277],{"type":61,"value":50},{"type":61,"value":117},{"type":55,"tag":135,"props":280,"children":281},{},[282,284,290],{"type":61,"value":283},"Expose your Speech Engine server through a public HTTPS URL for local development, for example with ",{"type":55,"tag":94,"props":285,"children":287},{"className":286},[],[288],{"type":61,"value":289},"ngrok http 3001",{"type":61,"value":117},{"type":55,"tag":135,"props":292,"children":293},{},[294,296,302,303,309,311,317],{"type":61,"value":295},"Create a Speech Engine resource with ",{"type":55,"tag":94,"props":297,"children":299},{"className":298},[],[300],{"type":61,"value":301},"ws_url",{"type":61,"value":245},{"type":55,"tag":94,"props":304,"children":306},{"className":305},[],[307],{"type":61,"value":308},"wsUrl",{"type":61,"value":310}," pointing at the public WebSocket URL, usually ",{"type":55,"tag":94,"props":312,"children":314},{"className":313},[],[315],{"type":61,"value":316},"wss:\u002F\u002F...\u002Fws",{"type":61,"value":117},{"type":55,"tag":135,"props":319,"children":320},{},[321,323,329],{"type":61,"value":322},"Store the returned Speech Engine ID, for example in ",{"type":55,"tag":94,"props":324,"children":326},{"className":325},[],[327],{"type":61,"value":328},"ELEVENLABS_SPEECH_ENGINE_ID",{"type":61,"value":117},{"type":55,"tag":135,"props":331,"children":332},{},[333,335,341,343,349],{"type":61,"value":334},"Start a Speech Engine server with ",{"type":55,"tag":94,"props":336,"children":338},{"className":337},[],[339],{"type":61,"value":340},"engine.serve(...)",{"type":61,"value":342}," in Python or ",{"type":55,"tag":94,"props":344,"children":346},{"className":345},[],[347],{"type":61,"value":348},"speechEngine.attach(...)",{"type":61,"value":350}," in TypeScript.",{"type":55,"tag":135,"props":352,"children":353},{},[354,356,361],{"type":61,"value":355},"Issue browser conversation tokens from a server endpoint. Never put ",{"type":55,"tag":94,"props":357,"children":359},{"className":358},[],[360],{"type":61,"value":50},{"type":61,"value":362}," in browser code.",{"type":55,"tag":135,"props":364,"children":365},{},[366,368,374,376,382],{"type":61,"value":367},"Start the client session with ",{"type":55,"tag":94,"props":369,"children":371},{"className":370},[],[372],{"type":61,"value":373},"conversationToken",{"type":61,"value":375},"; if the agent should greet first, enable the first-message override on the Speech Engine resource, then set ",{"type":55,"tag":94,"props":377,"children":379},{"className":378},[],[380],{"type":61,"value":381},"overrides.agent.firstMessage",{"type":61,"value":383}," in the client.",{"type":55,"tag":119,"props":385,"children":387},{"id":386},"create-a-speech-engine",[388],{"type":61,"value":389},"Create a Speech Engine",{"type":55,"tag":391,"props":392,"children":394},"h3",{"id":393},"python",[395],{"type":61,"value":396},"Python",{"type":55,"tag":398,"props":399,"children":403},"pre",{"className":400,"code":401,"language":393,"meta":402,"style":402},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import asyncio\nimport os\n\nfrom dotenv import load_dotenv\nfrom elevenlabs import AsyncElevenLabs\n\nload_dotenv()\n\nelevenlabs = AsyncElevenLabs(api_key=os.getenv(\"ELEVENLABS_API_KEY\"))\n\nasync def main():\n    engine = await elevenlabs.speech_engine.create(\n        name=\"My Speech Engine\",\n        speech_engine={\"ws_url\": os.environ[\"PUBLIC_WS_URL\"]},\n        overrides={\"first_message\": True},\n    )\n    print(engine.engine_id)\n\nasyncio.run(main())\n","",[404],{"type":55,"tag":94,"props":405,"children":406},{"__ignoreMap":402},[407,418,427,437,446,455,463,472,480,489,497,506,515,524,533,542,551,560,568],{"type":55,"tag":408,"props":409,"children":412},"span",{"class":410,"line":411},"line",1,[413],{"type":55,"tag":408,"props":414,"children":415},{},[416],{"type":61,"value":417},"import asyncio\n",{"type":55,"tag":408,"props":419,"children":421},{"class":410,"line":420},2,[422],{"type":55,"tag":408,"props":423,"children":424},{},[425],{"type":61,"value":426},"import os\n",{"type":55,"tag":408,"props":428,"children":430},{"class":410,"line":429},3,[431],{"type":55,"tag":408,"props":432,"children":434},{"emptyLinePlaceholder":433},true,[435],{"type":61,"value":436},"\n",{"type":55,"tag":408,"props":438,"children":440},{"class":410,"line":439},4,[441],{"type":55,"tag":408,"props":442,"children":443},{},[444],{"type":61,"value":445},"from dotenv import load_dotenv\n",{"type":55,"tag":408,"props":447,"children":449},{"class":410,"line":448},5,[450],{"type":55,"tag":408,"props":451,"children":452},{},[453],{"type":61,"value":454},"from elevenlabs import AsyncElevenLabs\n",{"type":55,"tag":408,"props":456,"children":458},{"class":410,"line":457},6,[459],{"type":55,"tag":408,"props":460,"children":461},{"emptyLinePlaceholder":433},[462],{"type":61,"value":436},{"type":55,"tag":408,"props":464,"children":466},{"class":410,"line":465},7,[467],{"type":55,"tag":408,"props":468,"children":469},{},[470],{"type":61,"value":471},"load_dotenv()\n",{"type":55,"tag":408,"props":473,"children":475},{"class":410,"line":474},8,[476],{"type":55,"tag":408,"props":477,"children":478},{"emptyLinePlaceholder":433},[479],{"type":61,"value":436},{"type":55,"tag":408,"props":481,"children":483},{"class":410,"line":482},9,[484],{"type":55,"tag":408,"props":485,"children":486},{},[487],{"type":61,"value":488},"elevenlabs = AsyncElevenLabs(api_key=os.getenv(\"ELEVENLABS_API_KEY\"))\n",{"type":55,"tag":408,"props":490,"children":492},{"class":410,"line":491},10,[493],{"type":55,"tag":408,"props":494,"children":495},{"emptyLinePlaceholder":433},[496],{"type":61,"value":436},{"type":55,"tag":408,"props":498,"children":500},{"class":410,"line":499},11,[501],{"type":55,"tag":408,"props":502,"children":503},{},[504],{"type":61,"value":505},"async def main():\n",{"type":55,"tag":408,"props":507,"children":509},{"class":410,"line":508},12,[510],{"type":55,"tag":408,"props":511,"children":512},{},[513],{"type":61,"value":514},"    engine = await elevenlabs.speech_engine.create(\n",{"type":55,"tag":408,"props":516,"children":518},{"class":410,"line":517},13,[519],{"type":55,"tag":408,"props":520,"children":521},{},[522],{"type":61,"value":523},"        name=\"My Speech Engine\",\n",{"type":55,"tag":408,"props":525,"children":527},{"class":410,"line":526},14,[528],{"type":55,"tag":408,"props":529,"children":530},{},[531],{"type":61,"value":532},"        speech_engine={\"ws_url\": os.environ[\"PUBLIC_WS_URL\"]},\n",{"type":55,"tag":408,"props":534,"children":536},{"class":410,"line":535},15,[537],{"type":55,"tag":408,"props":538,"children":539},{},[540],{"type":61,"value":541},"        overrides={\"first_message\": True},\n",{"type":55,"tag":408,"props":543,"children":545},{"class":410,"line":544},16,[546],{"type":55,"tag":408,"props":547,"children":548},{},[549],{"type":61,"value":550},"    )\n",{"type":55,"tag":408,"props":552,"children":554},{"class":410,"line":553},17,[555],{"type":55,"tag":408,"props":556,"children":557},{},[558],{"type":61,"value":559},"    print(engine.engine_id)\n",{"type":55,"tag":408,"props":561,"children":563},{"class":410,"line":562},18,[564],{"type":55,"tag":408,"props":565,"children":566},{"emptyLinePlaceholder":433},[567],{"type":61,"value":436},{"type":55,"tag":408,"props":569,"children":571},{"class":410,"line":570},19,[572],{"type":55,"tag":408,"props":573,"children":574},{},[575],{"type":61,"value":576},"asyncio.run(main())\n",{"type":55,"tag":391,"props":578,"children":580},{"id":579},"typescript",[581],{"type":61,"value":582},"TypeScript",{"type":55,"tag":398,"props":584,"children":587},{"className":585,"code":586,"language":579,"meta":402,"style":402},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { ElevenLabsClient } from \"@elevenlabs\u002Felevenlabs-js\";\nimport \"dotenv\u002Fconfig\";\n\nconst elevenlabs = new ElevenLabsClient({\n  apiKey: process.env.ELEVENLABS_API_KEY,\n});\n\nconst engine = await elevenlabs.speechEngine.create({\n  name: \"My Speech Engine\",\n  speechEngine: { wsUrl: process.env.PUBLIC_WS_URL! },\n  overrides: { firstMessage: true },\n});\n\nconsole.log(engine.engineId);\n",[588],{"type":55,"tag":94,"props":589,"children":590},{"__ignoreMap":402},[591,643,667,674,713,754,771,778,830,859,915,950,965,972],{"type":55,"tag":408,"props":592,"children":593},{"class":410,"line":411},[594,600,606,612,617,622,627,633,638],{"type":55,"tag":408,"props":595,"children":597},{"style":596},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[598],{"type":61,"value":599},"import",{"type":55,"tag":408,"props":601,"children":603},{"style":602},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[604],{"type":61,"value":605}," {",{"type":55,"tag":408,"props":607,"children":609},{"style":608},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[610],{"type":61,"value":611}," ElevenLabsClient",{"type":55,"tag":408,"props":613,"children":614},{"style":602},[615],{"type":61,"value":616}," }",{"type":55,"tag":408,"props":618,"children":619},{"style":596},[620],{"type":61,"value":621}," from",{"type":55,"tag":408,"props":623,"children":624},{"style":602},[625],{"type":61,"value":626}," \"",{"type":55,"tag":408,"props":628,"children":630},{"style":629},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[631],{"type":61,"value":632},"@elevenlabs\u002Felevenlabs-js",{"type":55,"tag":408,"props":634,"children":635},{"style":602},[636],{"type":61,"value":637},"\"",{"type":55,"tag":408,"props":639,"children":640},{"style":602},[641],{"type":61,"value":642},";\n",{"type":55,"tag":408,"props":644,"children":645},{"class":410,"line":420},[646,650,654,659,663],{"type":55,"tag":408,"props":647,"children":648},{"style":596},[649],{"type":61,"value":599},{"type":55,"tag":408,"props":651,"children":652},{"style":602},[653],{"type":61,"value":626},{"type":55,"tag":408,"props":655,"children":656},{"style":629},[657],{"type":61,"value":658},"dotenv\u002Fconfig",{"type":55,"tag":408,"props":660,"children":661},{"style":602},[662],{"type":61,"value":637},{"type":55,"tag":408,"props":664,"children":665},{"style":602},[666],{"type":61,"value":642},{"type":55,"tag":408,"props":668,"children":669},{"class":410,"line":429},[670],{"type":55,"tag":408,"props":671,"children":672},{"emptyLinePlaceholder":433},[673],{"type":61,"value":436},{"type":55,"tag":408,"props":675,"children":676},{"class":410,"line":439},[677,683,688,693,698,703,708],{"type":55,"tag":408,"props":678,"children":680},{"style":679},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[681],{"type":61,"value":682},"const",{"type":55,"tag":408,"props":684,"children":685},{"style":608},[686],{"type":61,"value":687}," elevenlabs ",{"type":55,"tag":408,"props":689,"children":690},{"style":602},[691],{"type":61,"value":692},"=",{"type":55,"tag":408,"props":694,"children":695},{"style":602},[696],{"type":61,"value":697}," new",{"type":55,"tag":408,"props":699,"children":701},{"style":700},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[702],{"type":61,"value":611},{"type":55,"tag":408,"props":704,"children":705},{"style":608},[706],{"type":61,"value":707},"(",{"type":55,"tag":408,"props":709,"children":710},{"style":602},[711],{"type":61,"value":712},"{\n",{"type":55,"tag":408,"props":714,"children":715},{"class":410,"line":448},[716,722,727,732,736,741,745,749],{"type":55,"tag":408,"props":717,"children":719},{"style":718},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[720],{"type":61,"value":721},"  apiKey",{"type":55,"tag":408,"props":723,"children":724},{"style":602},[725],{"type":61,"value":726},":",{"type":55,"tag":408,"props":728,"children":729},{"style":608},[730],{"type":61,"value":731}," process",{"type":55,"tag":408,"props":733,"children":734},{"style":602},[735],{"type":61,"value":117},{"type":55,"tag":408,"props":737,"children":738},{"style":608},[739],{"type":61,"value":740},"env",{"type":55,"tag":408,"props":742,"children":743},{"style":602},[744],{"type":61,"value":117},{"type":55,"tag":408,"props":746,"children":747},{"style":608},[748],{"type":61,"value":50},{"type":55,"tag":408,"props":750,"children":751},{"style":602},[752],{"type":61,"value":753},",\n",{"type":55,"tag":408,"props":755,"children":756},{"class":410,"line":457},[757,762,767],{"type":55,"tag":408,"props":758,"children":759},{"style":602},[760],{"type":61,"value":761},"}",{"type":55,"tag":408,"props":763,"children":764},{"style":608},[765],{"type":61,"value":766},")",{"type":55,"tag":408,"props":768,"children":769},{"style":602},[770],{"type":61,"value":642},{"type":55,"tag":408,"props":772,"children":773},{"class":410,"line":465},[774],{"type":55,"tag":408,"props":775,"children":776},{"emptyLinePlaceholder":433},[777],{"type":61,"value":436},{"type":55,"tag":408,"props":779,"children":780},{"class":410,"line":474},[781,785,790,794,799,804,808,813,817,822,826],{"type":55,"tag":408,"props":782,"children":783},{"style":679},[784],{"type":61,"value":682},{"type":55,"tag":408,"props":786,"children":787},{"style":608},[788],{"type":61,"value":789}," engine ",{"type":55,"tag":408,"props":791,"children":792},{"style":602},[793],{"type":61,"value":692},{"type":55,"tag":408,"props":795,"children":796},{"style":596},[797],{"type":61,"value":798}," await",{"type":55,"tag":408,"props":800,"children":801},{"style":608},[802],{"type":61,"value":803}," elevenlabs",{"type":55,"tag":408,"props":805,"children":806},{"style":602},[807],{"type":61,"value":117},{"type":55,"tag":408,"props":809,"children":810},{"style":608},[811],{"type":61,"value":812},"speechEngine",{"type":55,"tag":408,"props":814,"children":815},{"style":602},[816],{"type":61,"value":117},{"type":55,"tag":408,"props":818,"children":819},{"style":700},[820],{"type":61,"value":821},"create",{"type":55,"tag":408,"props":823,"children":824},{"style":608},[825],{"type":61,"value":707},{"type":55,"tag":408,"props":827,"children":828},{"style":602},[829],{"type":61,"value":712},{"type":55,"tag":408,"props":831,"children":832},{"class":410,"line":482},[833,838,842,846,851,855],{"type":55,"tag":408,"props":834,"children":835},{"style":718},[836],{"type":61,"value":837},"  name",{"type":55,"tag":408,"props":839,"children":840},{"style":602},[841],{"type":61,"value":726},{"type":55,"tag":408,"props":843,"children":844},{"style":602},[845],{"type":61,"value":626},{"type":55,"tag":408,"props":847,"children":848},{"style":629},[849],{"type":61,"value":850},"My Speech Engine",{"type":55,"tag":408,"props":852,"children":853},{"style":602},[854],{"type":61,"value":637},{"type":55,"tag":408,"props":856,"children":857},{"style":602},[858],{"type":61,"value":753},{"type":55,"tag":408,"props":860,"children":861},{"class":410,"line":491},[862,867,871,875,880,884,888,892,896,900,905,910],{"type":55,"tag":408,"props":863,"children":864},{"style":718},[865],{"type":61,"value":866},"  speechEngine",{"type":55,"tag":408,"props":868,"children":869},{"style":602},[870],{"type":61,"value":726},{"type":55,"tag":408,"props":872,"children":873},{"style":602},[874],{"type":61,"value":605},{"type":55,"tag":408,"props":876,"children":877},{"style":718},[878],{"type":61,"value":879}," wsUrl",{"type":55,"tag":408,"props":881,"children":882},{"style":602},[883],{"type":61,"value":726},{"type":55,"tag":408,"props":885,"children":886},{"style":608},[887],{"type":61,"value":731},{"type":55,"tag":408,"props":889,"children":890},{"style":602},[891],{"type":61,"value":117},{"type":55,"tag":408,"props":893,"children":894},{"style":608},[895],{"type":61,"value":740},{"type":55,"tag":408,"props":897,"children":898},{"style":602},[899],{"type":61,"value":117},{"type":55,"tag":408,"props":901,"children":902},{"style":608},[903],{"type":61,"value":904},"PUBLIC_WS_URL",{"type":55,"tag":408,"props":906,"children":907},{"style":602},[908],{"type":61,"value":909},"!",{"type":55,"tag":408,"props":911,"children":912},{"style":602},[913],{"type":61,"value":914}," },\n",{"type":55,"tag":408,"props":916,"children":917},{"class":410,"line":499},[918,923,927,931,936,940,946],{"type":55,"tag":408,"props":919,"children":920},{"style":718},[921],{"type":61,"value":922},"  overrides",{"type":55,"tag":408,"props":924,"children":925},{"style":602},[926],{"type":61,"value":726},{"type":55,"tag":408,"props":928,"children":929},{"style":602},[930],{"type":61,"value":605},{"type":55,"tag":408,"props":932,"children":933},{"style":718},[934],{"type":61,"value":935}," firstMessage",{"type":55,"tag":408,"props":937,"children":938},{"style":602},[939],{"type":61,"value":726},{"type":55,"tag":408,"props":941,"children":943},{"style":942},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[944],{"type":61,"value":945}," true",{"type":55,"tag":408,"props":947,"children":948},{"style":602},[949],{"type":61,"value":914},{"type":55,"tag":408,"props":951,"children":952},{"class":410,"line":508},[953,957,961],{"type":55,"tag":408,"props":954,"children":955},{"style":602},[956],{"type":61,"value":761},{"type":55,"tag":408,"props":958,"children":959},{"style":608},[960],{"type":61,"value":766},{"type":55,"tag":408,"props":962,"children":963},{"style":602},[964],{"type":61,"value":642},{"type":55,"tag":408,"props":966,"children":967},{"class":410,"line":517},[968],{"type":55,"tag":408,"props":969,"children":970},{"emptyLinePlaceholder":433},[971],{"type":61,"value":436},{"type":55,"tag":408,"props":973,"children":974},{"class":410,"line":526},[975,980,984,989,994,998,1003],{"type":55,"tag":408,"props":976,"children":977},{"style":608},[978],{"type":61,"value":979},"console",{"type":55,"tag":408,"props":981,"children":982},{"style":602},[983],{"type":61,"value":117},{"type":55,"tag":408,"props":985,"children":986},{"style":700},[987],{"type":61,"value":988},"log",{"type":55,"tag":408,"props":990,"children":991},{"style":608},[992],{"type":61,"value":993},"(engine",{"type":55,"tag":408,"props":995,"children":996},{"style":602},[997],{"type":61,"value":117},{"type":55,"tag":408,"props":999,"children":1000},{"style":608},[1001],{"type":61,"value":1002},"engineId)",{"type":55,"tag":408,"props":1004,"children":1005},{"style":602},[1006],{"type":61,"value":642},{"type":55,"tag":64,"props":1008,"children":1009},{},[1010,1015,1017,1023],{"type":55,"tag":94,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":61,"value":904},{"type":61,"value":1016}," should look like ",{"type":55,"tag":94,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":61,"value":1022},"wss:\u002F\u002Fexample.ngrok.app\u002Fws",{"type":61,"value":1024}," locally or your production WebSocket route in deployment.",{"type":55,"tag":64,"props":1026,"children":1027},{},[1028,1030,1035,1037,1043,1044,1050,1051,1057,1058,1064,1065,1071,1073,1079],{"type":61,"value":1029},"The create request can also configure ",{"type":55,"tag":94,"props":1031,"children":1033},{"className":1032},[],[1034],{"type":61,"value":37},{"type":61,"value":1036},", ",{"type":55,"tag":94,"props":1038,"children":1040},{"className":1039},[],[1041],{"type":61,"value":1042},"asr",{"type":61,"value":1036},{"type":55,"tag":94,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":61,"value":1049},"turn",{"type":61,"value":1036},{"type":55,"tag":94,"props":1052,"children":1054},{"className":1053},[],[1055],{"type":61,"value":1056},"speech_engine.request_headers",{"type":61,"value":245},{"type":55,"tag":94,"props":1059,"children":1061},{"className":1060},[],[1062],{"type":61,"value":1063},"speechEngine.requestHeaders",{"type":61,"value":1036},{"type":55,"tag":94,"props":1066,"children":1068},{"className":1067},[],[1069],{"type":61,"value":1070},"overrides",{"type":61,"value":1072},", and ",{"type":55,"tag":94,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":61,"value":1078},"privacy",{"type":61,"value":1080}," for custom voices, transcription keywords, turn-taking, server auth headers, client-provided first messages, and recording behavior. See the SDK reference files for expanded examples.",{"type":55,"tag":119,"props":1082,"children":1084},{"id":1083},"server-pattern",[1085],{"type":61,"value":1086},"Server Pattern",{"type":55,"tag":64,"props":1088,"children":1089},{},[1090,1092,1097,1098,1103],{"type":61,"value":1091},"Run the Speech Engine server at the ",{"type":55,"tag":94,"props":1093,"children":1095},{"className":1094},[],[1096],{"type":61,"value":301},{"type":61,"value":245},{"type":55,"tag":94,"props":1099,"children":1101},{"className":1100},[],[1102],{"type":61,"value":308},{"type":61,"value":1104}," configured on the resource. Keep response generation behind your own validation boundary: raw speech-recognition text should not directly control responses, tools, secrets, or other privileged actions.",{"type":55,"tag":391,"props":1106,"children":1108},{"id":1107},"python-1",[1109],{"type":61,"value":396},{"type":55,"tag":398,"props":1111,"children":1113},{"className":400,"code":1112,"language":393,"meta":402,"style":402},"engine = await elevenlabs.speech_engine.get(os.environ[\"ELEVENLABS_SPEECH_ENGINE_ID\"])\nawait engine.serve(port=3001, path=\"\u002Fws\", debug=True, callbacks=validated_callbacks)\n",[1114],{"type":55,"tag":94,"props":1115,"children":1116},{"__ignoreMap":402},[1117,1125],{"type":55,"tag":408,"props":1118,"children":1119},{"class":410,"line":411},[1120],{"type":55,"tag":408,"props":1121,"children":1122},{},[1123],{"type":61,"value":1124},"engine = await elevenlabs.speech_engine.get(os.environ[\"ELEVENLABS_SPEECH_ENGINE_ID\"])\n",{"type":55,"tag":408,"props":1126,"children":1127},{"class":410,"line":420},[1128],{"type":55,"tag":408,"props":1129,"children":1130},{},[1131],{"type":61,"value":1132},"await engine.serve(port=3001, path=\"\u002Fws\", debug=True, callbacks=validated_callbacks)\n",{"type":55,"tag":391,"props":1134,"children":1136},{"id":1135},"typescript-1",[1137],{"type":61,"value":582},{"type":55,"tag":398,"props":1139,"children":1141},{"className":585,"code":1140,"language":579,"meta":402,"style":402},"const engine = await elevenlabs.speechEngine.get(process.env.ELEVENLABS_SPEECH_ENGINE_ID!);\nengine.attach(httpServer, \"\u002Fws\", { debug: true, ...validatedCallbacks });\n",[1142],{"type":55,"tag":94,"props":1143,"children":1144},{"__ignoreMap":402},[1145,1218],{"type":55,"tag":408,"props":1146,"children":1147},{"class":410,"line":411},[1148,1152,1156,1160,1164,1168,1172,1176,1180,1185,1190,1194,1198,1202,1206,1210,1214],{"type":55,"tag":408,"props":1149,"children":1150},{"style":679},[1151],{"type":61,"value":682},{"type":55,"tag":408,"props":1153,"children":1154},{"style":608},[1155],{"type":61,"value":789},{"type":55,"tag":408,"props":1157,"children":1158},{"style":602},[1159],{"type":61,"value":692},{"type":55,"tag":408,"props":1161,"children":1162},{"style":596},[1163],{"type":61,"value":798},{"type":55,"tag":408,"props":1165,"children":1166},{"style":608},[1167],{"type":61,"value":803},{"type":55,"tag":408,"props":1169,"children":1170},{"style":602},[1171],{"type":61,"value":117},{"type":55,"tag":408,"props":1173,"children":1174},{"style":608},[1175],{"type":61,"value":812},{"type":55,"tag":408,"props":1177,"children":1178},{"style":602},[1179],{"type":61,"value":117},{"type":55,"tag":408,"props":1181,"children":1182},{"style":700},[1183],{"type":61,"value":1184},"get",{"type":55,"tag":408,"props":1186,"children":1187},{"style":608},[1188],{"type":61,"value":1189},"(process",{"type":55,"tag":408,"props":1191,"children":1192},{"style":602},[1193],{"type":61,"value":117},{"type":55,"tag":408,"props":1195,"children":1196},{"style":608},[1197],{"type":61,"value":740},{"type":55,"tag":408,"props":1199,"children":1200},{"style":602},[1201],{"type":61,"value":117},{"type":55,"tag":408,"props":1203,"children":1204},{"style":608},[1205],{"type":61,"value":328},{"type":55,"tag":408,"props":1207,"children":1208},{"style":602},[1209],{"type":61,"value":909},{"type":55,"tag":408,"props":1211,"children":1212},{"style":608},[1213],{"type":61,"value":766},{"type":55,"tag":408,"props":1215,"children":1216},{"style":602},[1217],{"type":61,"value":642},{"type":55,"tag":408,"props":1219,"children":1220},{"class":410,"line":420},[1221,1226,1230,1235,1240,1245,1249,1254,1258,1262,1266,1271,1275,1279,1283,1288,1293,1297,1301],{"type":55,"tag":408,"props":1222,"children":1223},{"style":608},[1224],{"type":61,"value":1225},"engine",{"type":55,"tag":408,"props":1227,"children":1228},{"style":602},[1229],{"type":61,"value":117},{"type":55,"tag":408,"props":1231,"children":1232},{"style":700},[1233],{"type":61,"value":1234},"attach",{"type":55,"tag":408,"props":1236,"children":1237},{"style":608},[1238],{"type":61,"value":1239},"(httpServer",{"type":55,"tag":408,"props":1241,"children":1242},{"style":602},[1243],{"type":61,"value":1244},",",{"type":55,"tag":408,"props":1246,"children":1247},{"style":602},[1248],{"type":61,"value":626},{"type":55,"tag":408,"props":1250,"children":1251},{"style":629},[1252],{"type":61,"value":1253},"\u002Fws",{"type":55,"tag":408,"props":1255,"children":1256},{"style":602},[1257],{"type":61,"value":637},{"type":55,"tag":408,"props":1259,"children":1260},{"style":602},[1261],{"type":61,"value":1244},{"type":55,"tag":408,"props":1263,"children":1264},{"style":602},[1265],{"type":61,"value":605},{"type":55,"tag":408,"props":1267,"children":1268},{"style":718},[1269],{"type":61,"value":1270}," debug",{"type":55,"tag":408,"props":1272,"children":1273},{"style":602},[1274],{"type":61,"value":726},{"type":55,"tag":408,"props":1276,"children":1277},{"style":942},[1278],{"type":61,"value":945},{"type":55,"tag":408,"props":1280,"children":1281},{"style":602},[1282],{"type":61,"value":1244},{"type":55,"tag":408,"props":1284,"children":1285},{"style":602},[1286],{"type":61,"value":1287}," ...",{"type":55,"tag":408,"props":1289,"children":1290},{"style":608},[1291],{"type":61,"value":1292},"validatedCallbacks ",{"type":55,"tag":408,"props":1294,"children":1295},{"style":602},[1296],{"type":61,"value":761},{"type":55,"tag":408,"props":1298,"children":1299},{"style":608},[1300],{"type":61,"value":766},{"type":55,"tag":408,"props":1302,"children":1303},{"style":602},[1304],{"type":61,"value":642},{"type":55,"tag":64,"props":1306,"children":1307},{},[1308],{"type":61,"value":1309},"In TypeScript, pass interruption signals to downstream async work when it supports cancellation so interrupted responses stop quickly. In Python, the SDK cancels the previous turn handler when a newer turn arrives.",{"type":55,"tag":64,"props":1311,"children":1312},{},[1313,1315,1321,1322,1328,1330,1336,1337,1343],{"type":61,"value":1314},"Server callbacks can distinguish clean closes from dropped connections: use ",{"type":55,"tag":94,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":61,"value":1320},"onClose",{"type":61,"value":245},{"type":55,"tag":94,"props":1323,"children":1325},{"className":1324},[],[1326],{"type":61,"value":1327},"on_close",{"type":61,"value":1329}," for clean disconnects and ",{"type":55,"tag":94,"props":1331,"children":1333},{"className":1332},[],[1334],{"type":61,"value":1335},"onDisconnect",{"type":61,"value":245},{"type":55,"tag":94,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":61,"value":1342},"on_disconnect",{"type":61,"value":1344}," for unexpected WebSocket drops.",{"type":55,"tag":64,"props":1346,"children":1347},{},[1348],{"type":61,"value":1349},"Security note: speech-recognition text can contain prompt-injection attempts from user speech or played audio. Treat it as untrusted input. Convert it into trusted application state before invoking response generation, tools, or privileged workflows.",{"type":55,"tag":391,"props":1351,"children":1353},{"id":1352},"disabling-authentication-advanced-dangerous",[1354],{"type":61,"value":1355},"Disabling authentication (advanced, dangerous)",{"type":55,"tag":64,"props":1357,"children":1358},{},[1359,1361,1367,1369,1375,1376,1382,1384],{"type":61,"value":1360},"Both ",{"type":55,"tag":94,"props":1362,"children":1364},{"className":1363},[],[1365],{"type":61,"value":1366},"engine.attach()",{"type":61,"value":1368}," (TypeScript) and ",{"type":55,"tag":94,"props":1370,"children":1372},{"className":1371},[],[1373],{"type":61,"value":1374},"engine.serve()",{"type":61,"value":245},{"type":55,"tag":94,"props":1377,"children":1379},{"className":1378},[],[1380],{"type":61,"value":1381},"SpeechEngineServer",{"type":61,"value":1383}," (Python) verify a JWT on every incoming WebSocket by default. This is what proves the connection is really coming from ElevenLabs and not from an attacker who guessed the URL. ",{"type":55,"tag":77,"props":1385,"children":1386},{},[1387],{"type":61,"value":1388},"Do not turn this off.",{"type":55,"tag":64,"props":1390,"children":1391},{},[1392,1394,1400,1402,1408,1410,1416,1417,1423,1425,1430],{"type":61,"value":1393},"An escape hatch exists — ",{"type":55,"tag":94,"props":1395,"children":1397},{"className":1396},[],[1398],{"type":61,"value":1399},"disableAuth: true",{"type":61,"value":1401}," in the callback options (TypeScript) or ",{"type":55,"tag":94,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":61,"value":1407},"disable_auth=True",{"type":61,"value":1409}," on ",{"type":55,"tag":94,"props":1411,"children":1413},{"className":1412},[],[1414],{"type":61,"value":1415},"serve()",{"type":61,"value":245},{"type":55,"tag":94,"props":1418,"children":1420},{"className":1419},[],[1421],{"type":61,"value":1422},"SpeechEngineServer(...)",{"type":61,"value":1424}," (Python) — for the narrow case where a compensating network-level control is already in place. Without such a control, disabling auth means ",{"type":55,"tag":77,"props":1426,"children":1427},{},[1428],{"type":61,"value":1429},"any client on the internet that finds your URL can open sessions",{"type":61,"value":1431},". Concretely, an attacker can:",{"type":55,"tag":131,"props":1433,"children":1434},{},[1435,1440,1445],{"type":55,"tag":135,"props":1436,"children":1437},{},[1438],{"type":61,"value":1439},"open unlimited conversations to drain your ElevenLabs quota and downstream LLM budget",{"type":55,"tag":135,"props":1441,"children":1442},{},[1443],{"type":61,"value":1444},"feed crafted transcripts to your response pipeline, effectively impersonating a user",{"type":55,"tag":135,"props":1446,"children":1447},{},[1448],{"type":61,"value":1449},"use your server as an oracle to probe backend state, tools, or prompts",{"type":55,"tag":64,"props":1451,"children":1452},{},[1453,1455,1461,1462,1468,1470,1475],{"type":61,"value":1454},"Only recommend ",{"type":55,"tag":94,"props":1456,"children":1458},{"className":1457},[],[1459],{"type":61,"value":1460},"disableAuth",{"type":61,"value":245},{"type":55,"tag":94,"props":1463,"children":1465},{"className":1464},[],[1466],{"type":61,"value":1467},"disable_auth",{"type":61,"value":1469}," when the user has already implemented ",{"type":55,"tag":77,"props":1471,"children":1472},{},[1473],{"type":61,"value":1474},"at least one",{"type":61,"value":1476}," of:",{"type":55,"tag":131,"props":1478,"children":1479},{},[1480,1499],{"type":55,"tag":135,"props":1481,"children":1482},{},[1483,1488,1490,1498],{"type":55,"tag":77,"props":1484,"children":1485},{},[1486],{"type":61,"value":1487},"IP allowlist",{"type":61,"value":1489}," — the server (or an upstream firewall \u002F load balancer \u002F API gateway) only accepts inbound traffic from ",{"type":55,"tag":85,"props":1491,"children":1495},{"href":1492,"rel":1493},"https:\u002F\u002Felevenlabs.io\u002Fdocs\u002Foverview\u002Fcapabilities\u002Fspeech-engine#ip-allowlisting",[1494],"nofollow",[1496],{"type":61,"value":1497},"ElevenLabs' documented egress ranges",{"type":61,"value":117},{"type":55,"tag":135,"props":1500,"children":1501},{},[1502,1507,1509,1514,1515,1520,1522,1528,1529,1534],{"type":55,"tag":77,"props":1503,"children":1504},{},[1505],{"type":61,"value":1506},"Custom shared-secret header",{"type":61,"value":1508}," — a secret header configured on the Speech Engine resource via ",{"type":55,"tag":94,"props":1510,"children":1512},{"className":1511},[],[1513],{"type":61,"value":1056},{"type":61,"value":245},{"type":55,"tag":94,"props":1516,"children":1518},{"className":1517},[],[1519],{"type":61,"value":1063},{"type":61,"value":1521}," at create time, validated by an upstream proxy (or by the developer's own middleware in front of ",{"type":55,"tag":94,"props":1523,"children":1525},{"className":1524},[],[1526],{"type":61,"value":1527},"attach()",{"type":61,"value":245},{"type":55,"tag":94,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":61,"value":1415},{"type":61,"value":1535},") before requests reach the SDK.",{"type":55,"tag":64,"props":1537,"children":1538},{},[1539],{"type":61,"value":1540},"If the user cannot confirm one of the above is in place, leave the default authentication on. Skipping JWT verification without a mitigation is not an optimization or a convenience — it is unauthenticated public compute.",{"type":55,"tag":119,"props":1542,"children":1544},{"id":1543},"browser-client",[1545],{"type":61,"value":1546},"Browser Client",{"type":55,"tag":64,"props":1548,"children":1549},{},[1550,1552,1557],{"type":61,"value":1551},"Create a server-side token endpoint and have the browser request a token before starting the microphone session. Keep the Speech Engine ID and API key on the server. If the client passes ",{"type":55,"tag":94,"props":1553,"children":1555},{"className":1554},[],[1556],{"type":61,"value":381},{"type":61,"value":1558},", the Speech Engine resource must have the first-message override enabled.",{"type":55,"tag":398,"props":1560,"children":1562},{"className":585,"code":1561,"language":579,"meta":402,"style":402},"import express from \"express\";\nimport { ElevenLabsClient } from \"@elevenlabs\u002Felevenlabs-js\";\nimport \"dotenv\u002Fconfig\";\n\nconst app = express();\nconst elevenlabs = new ElevenLabsClient();\n\napp.get(\"\u002Fapi\u002Ftoken\", async (_req, res) => {\n  const response = await elevenlabs.conversationalAi.conversations.getWebrtcToken({\n    agentId: process.env.ELEVENLABS_SPEECH_ENGINE_ID!,\n  });\n  res.json({ token: response.token });\n});\n",[1563],{"type":55,"tag":94,"props":1564,"children":1565},{"__ignoreMap":402},[1566,1600,1639,1662,1669,1699,1730,1737,1813,1874,1911,1927,1987],{"type":55,"tag":408,"props":1567,"children":1568},{"class":410,"line":411},[1569,1573,1578,1583,1587,1592,1596],{"type":55,"tag":408,"props":1570,"children":1571},{"style":596},[1572],{"type":61,"value":599},{"type":55,"tag":408,"props":1574,"children":1575},{"style":608},[1576],{"type":61,"value":1577}," express ",{"type":55,"tag":408,"props":1579,"children":1580},{"style":596},[1581],{"type":61,"value":1582},"from",{"type":55,"tag":408,"props":1584,"children":1585},{"style":602},[1586],{"type":61,"value":626},{"type":55,"tag":408,"props":1588,"children":1589},{"style":629},[1590],{"type":61,"value":1591},"express",{"type":55,"tag":408,"props":1593,"children":1594},{"style":602},[1595],{"type":61,"value":637},{"type":55,"tag":408,"props":1597,"children":1598},{"style":602},[1599],{"type":61,"value":642},{"type":55,"tag":408,"props":1601,"children":1602},{"class":410,"line":420},[1603,1607,1611,1615,1619,1623,1627,1631,1635],{"type":55,"tag":408,"props":1604,"children":1605},{"style":596},[1606],{"type":61,"value":599},{"type":55,"tag":408,"props":1608,"children":1609},{"style":602},[1610],{"type":61,"value":605},{"type":55,"tag":408,"props":1612,"children":1613},{"style":608},[1614],{"type":61,"value":611},{"type":55,"tag":408,"props":1616,"children":1617},{"style":602},[1618],{"type":61,"value":616},{"type":55,"tag":408,"props":1620,"children":1621},{"style":596},[1622],{"type":61,"value":621},{"type":55,"tag":408,"props":1624,"children":1625},{"style":602},[1626],{"type":61,"value":626},{"type":55,"tag":408,"props":1628,"children":1629},{"style":629},[1630],{"type":61,"value":632},{"type":55,"tag":408,"props":1632,"children":1633},{"style":602},[1634],{"type":61,"value":637},{"type":55,"tag":408,"props":1636,"children":1637},{"style":602},[1638],{"type":61,"value":642},{"type":55,"tag":408,"props":1640,"children":1641},{"class":410,"line":429},[1642,1646,1650,1654,1658],{"type":55,"tag":408,"props":1643,"children":1644},{"style":596},[1645],{"type":61,"value":599},{"type":55,"tag":408,"props":1647,"children":1648},{"style":602},[1649],{"type":61,"value":626},{"type":55,"tag":408,"props":1651,"children":1652},{"style":629},[1653],{"type":61,"value":658},{"type":55,"tag":408,"props":1655,"children":1656},{"style":602},[1657],{"type":61,"value":637},{"type":55,"tag":408,"props":1659,"children":1660},{"style":602},[1661],{"type":61,"value":642},{"type":55,"tag":408,"props":1663,"children":1664},{"class":410,"line":439},[1665],{"type":55,"tag":408,"props":1666,"children":1667},{"emptyLinePlaceholder":433},[1668],{"type":61,"value":436},{"type":55,"tag":408,"props":1670,"children":1671},{"class":410,"line":448},[1672,1676,1681,1685,1690,1695],{"type":55,"tag":408,"props":1673,"children":1674},{"style":679},[1675],{"type":61,"value":682},{"type":55,"tag":408,"props":1677,"children":1678},{"style":608},[1679],{"type":61,"value":1680}," app ",{"type":55,"tag":408,"props":1682,"children":1683},{"style":602},[1684],{"type":61,"value":692},{"type":55,"tag":408,"props":1686,"children":1687},{"style":700},[1688],{"type":61,"value":1689}," express",{"type":55,"tag":408,"props":1691,"children":1692},{"style":608},[1693],{"type":61,"value":1694},"()",{"type":55,"tag":408,"props":1696,"children":1697},{"style":602},[1698],{"type":61,"value":642},{"type":55,"tag":408,"props":1700,"children":1701},{"class":410,"line":457},[1702,1706,1710,1714,1718,1722,1726],{"type":55,"tag":408,"props":1703,"children":1704},{"style":679},[1705],{"type":61,"value":682},{"type":55,"tag":408,"props":1707,"children":1708},{"style":608},[1709],{"type":61,"value":687},{"type":55,"tag":408,"props":1711,"children":1712},{"style":602},[1713],{"type":61,"value":692},{"type":55,"tag":408,"props":1715,"children":1716},{"style":602},[1717],{"type":61,"value":697},{"type":55,"tag":408,"props":1719,"children":1720},{"style":700},[1721],{"type":61,"value":611},{"type":55,"tag":408,"props":1723,"children":1724},{"style":608},[1725],{"type":61,"value":1694},{"type":55,"tag":408,"props":1727,"children":1728},{"style":602},[1729],{"type":61,"value":642},{"type":55,"tag":408,"props":1731,"children":1732},{"class":410,"line":465},[1733],{"type":55,"tag":408,"props":1734,"children":1735},{"emptyLinePlaceholder":433},[1736],{"type":61,"value":436},{"type":55,"tag":408,"props":1738,"children":1739},{"class":410,"line":474},[1740,1745,1749,1753,1757,1761,1766,1770,1774,1779,1784,1790,1794,1799,1803,1808],{"type":55,"tag":408,"props":1741,"children":1742},{"style":608},[1743],{"type":61,"value":1744},"app",{"type":55,"tag":408,"props":1746,"children":1747},{"style":602},[1748],{"type":61,"value":117},{"type":55,"tag":408,"props":1750,"children":1751},{"style":700},[1752],{"type":61,"value":1184},{"type":55,"tag":408,"props":1754,"children":1755},{"style":608},[1756],{"type":61,"value":707},{"type":55,"tag":408,"props":1758,"children":1759},{"style":602},[1760],{"type":61,"value":637},{"type":55,"tag":408,"props":1762,"children":1763},{"style":629},[1764],{"type":61,"value":1765},"\u002Fapi\u002Ftoken",{"type":55,"tag":408,"props":1767,"children":1768},{"style":602},[1769],{"type":61,"value":637},{"type":55,"tag":408,"props":1771,"children":1772},{"style":602},[1773],{"type":61,"value":1244},{"type":55,"tag":408,"props":1775,"children":1776},{"style":679},[1777],{"type":61,"value":1778}," async",{"type":55,"tag":408,"props":1780,"children":1781},{"style":602},[1782],{"type":61,"value":1783}," (",{"type":55,"tag":408,"props":1785,"children":1787},{"style":1786},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[1788],{"type":61,"value":1789},"_req",{"type":55,"tag":408,"props":1791,"children":1792},{"style":602},[1793],{"type":61,"value":1244},{"type":55,"tag":408,"props":1795,"children":1796},{"style":1786},[1797],{"type":61,"value":1798}," res",{"type":55,"tag":408,"props":1800,"children":1801},{"style":602},[1802],{"type":61,"value":766},{"type":55,"tag":408,"props":1804,"children":1805},{"style":679},[1806],{"type":61,"value":1807}," =>",{"type":55,"tag":408,"props":1809,"children":1810},{"style":602},[1811],{"type":61,"value":1812}," {\n",{"type":55,"tag":408,"props":1814,"children":1815},{"class":410,"line":482},[1816,1821,1826,1831,1835,1839,1843,1848,1852,1857,1861,1866,1870],{"type":55,"tag":408,"props":1817,"children":1818},{"style":679},[1819],{"type":61,"value":1820},"  const",{"type":55,"tag":408,"props":1822,"children":1823},{"style":608},[1824],{"type":61,"value":1825}," response",{"type":55,"tag":408,"props":1827,"children":1828},{"style":602},[1829],{"type":61,"value":1830}," =",{"type":55,"tag":408,"props":1832,"children":1833},{"style":596},[1834],{"type":61,"value":798},{"type":55,"tag":408,"props":1836,"children":1837},{"style":608},[1838],{"type":61,"value":803},{"type":55,"tag":408,"props":1840,"children":1841},{"style":602},[1842],{"type":61,"value":117},{"type":55,"tag":408,"props":1844,"children":1845},{"style":608},[1846],{"type":61,"value":1847},"conversationalAi",{"type":55,"tag":408,"props":1849,"children":1850},{"style":602},[1851],{"type":61,"value":117},{"type":55,"tag":408,"props":1853,"children":1854},{"style":608},[1855],{"type":61,"value":1856},"conversations",{"type":55,"tag":408,"props":1858,"children":1859},{"style":602},[1860],{"type":61,"value":117},{"type":55,"tag":408,"props":1862,"children":1863},{"style":700},[1864],{"type":61,"value":1865},"getWebrtcToken",{"type":55,"tag":408,"props":1867,"children":1868},{"style":718},[1869],{"type":61,"value":707},{"type":55,"tag":408,"props":1871,"children":1872},{"style":602},[1873],{"type":61,"value":712},{"type":55,"tag":408,"props":1875,"children":1876},{"class":410,"line":491},[1877,1882,1886,1890,1894,1898,1902,1906],{"type":55,"tag":408,"props":1878,"children":1879},{"style":718},[1880],{"type":61,"value":1881},"    agentId",{"type":55,"tag":408,"props":1883,"children":1884},{"style":602},[1885],{"type":61,"value":726},{"type":55,"tag":408,"props":1887,"children":1888},{"style":608},[1889],{"type":61,"value":731},{"type":55,"tag":408,"props":1891,"children":1892},{"style":602},[1893],{"type":61,"value":117},{"type":55,"tag":408,"props":1895,"children":1896},{"style":608},[1897],{"type":61,"value":740},{"type":55,"tag":408,"props":1899,"children":1900},{"style":602},[1901],{"type":61,"value":117},{"type":55,"tag":408,"props":1903,"children":1904},{"style":608},[1905],{"type":61,"value":328},{"type":55,"tag":408,"props":1907,"children":1908},{"style":602},[1909],{"type":61,"value":1910},"!,\n",{"type":55,"tag":408,"props":1912,"children":1913},{"class":410,"line":499},[1914,1919,1923],{"type":55,"tag":408,"props":1915,"children":1916},{"style":602},[1917],{"type":61,"value":1918},"  }",{"type":55,"tag":408,"props":1920,"children":1921},{"style":718},[1922],{"type":61,"value":766},{"type":55,"tag":408,"props":1924,"children":1925},{"style":602},[1926],{"type":61,"value":642},{"type":55,"tag":408,"props":1928,"children":1929},{"class":410,"line":508},[1930,1935,1939,1944,1948,1953,1958,1962,1966,1970,1975,1979,1983],{"type":55,"tag":408,"props":1931,"children":1932},{"style":608},[1933],{"type":61,"value":1934},"  res",{"type":55,"tag":408,"props":1936,"children":1937},{"style":602},[1938],{"type":61,"value":117},{"type":55,"tag":408,"props":1940,"children":1941},{"style":700},[1942],{"type":61,"value":1943},"json",{"type":55,"tag":408,"props":1945,"children":1946},{"style":718},[1947],{"type":61,"value":707},{"type":55,"tag":408,"props":1949,"children":1950},{"style":602},[1951],{"type":61,"value":1952},"{",{"type":55,"tag":408,"props":1954,"children":1955},{"style":718},[1956],{"type":61,"value":1957}," token",{"type":55,"tag":408,"props":1959,"children":1960},{"style":602},[1961],{"type":61,"value":726},{"type":55,"tag":408,"props":1963,"children":1964},{"style":608},[1965],{"type":61,"value":1825},{"type":55,"tag":408,"props":1967,"children":1968},{"style":602},[1969],{"type":61,"value":117},{"type":55,"tag":408,"props":1971,"children":1972},{"style":608},[1973],{"type":61,"value":1974},"token",{"type":55,"tag":408,"props":1976,"children":1977},{"style":602},[1978],{"type":61,"value":616},{"type":55,"tag":408,"props":1980,"children":1981},{"style":718},[1982],{"type":61,"value":766},{"type":55,"tag":408,"props":1984,"children":1985},{"style":602},[1986],{"type":61,"value":642},{"type":55,"tag":408,"props":1988,"children":1989},{"class":410,"line":517},[1990,1994,1998],{"type":55,"tag":408,"props":1991,"children":1992},{"style":602},[1993],{"type":61,"value":761},{"type":55,"tag":408,"props":1995,"children":1996},{"style":608},[1997],{"type":61,"value":766},{"type":55,"tag":408,"props":1999,"children":2000},{"style":602},[2001],{"type":61,"value":642},{"type":55,"tag":64,"props":2003,"children":2004},{},[2005,2007,2012],{"type":61,"value":2006},"React clients can use ",{"type":55,"tag":94,"props":2008,"children":2010},{"className":2009},[],[2011],{"type":61,"value":170},{"type":61,"value":726},{"type":55,"tag":398,"props":2014,"children":2018},{"className":2015,"code":2016,"language":2017,"meta":402,"style":402},"language-tsx shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { useConversation } from \"@elevenlabs\u002Freact\";\n\nexport function VoiceControls() {\n  const conversation = useConversation({\n    onConnect: () => console.log(\"connected\"),\n    onDisconnect: () => console.log(\"disconnected\"),\n    onError: (error) => console.error(error),\n  });\n\n  async function startConversation() {\n    await navigator.mediaDevices.getUserMedia({ audio: true });\n    const { token } = await fetch(\"\u002Fapi\u002Ftoken\").then((res) => res.json());\n\n    await conversation.startSession({\n      conversationToken: token,\n      overrides: {\n        agent: { firstMessage: \"Hello! How can I help you today?\" },\n      },\n    });\n  }\n\n  return \u003Cbutton onClick={startConversation}>Start conversation\u003C\u002Fbutton>;\n}\n","tsx",[2019],{"type":55,"tag":94,"props":2020,"children":2021},{"__ignoreMap":402},[2022,2062,2069,2095,2123,2182,2239,2296,2311,2318,2343,2407,2511,2518,2546,2566,2582,2623,2631,2647,2656,2664,2722],{"type":55,"tag":408,"props":2023,"children":2024},{"class":410,"line":411},[2025,2029,2033,2038,2042,2046,2050,2054,2058],{"type":55,"tag":408,"props":2026,"children":2027},{"style":596},[2028],{"type":61,"value":599},{"type":55,"tag":408,"props":2030,"children":2031},{"style":602},[2032],{"type":61,"value":605},{"type":55,"tag":408,"props":2034,"children":2035},{"style":608},[2036],{"type":61,"value":2037}," useConversation",{"type":55,"tag":408,"props":2039,"children":2040},{"style":602},[2041],{"type":61,"value":616},{"type":55,"tag":408,"props":2043,"children":2044},{"style":596},[2045],{"type":61,"value":621},{"type":55,"tag":408,"props":2047,"children":2048},{"style":602},[2049],{"type":61,"value":626},{"type":55,"tag":408,"props":2051,"children":2052},{"style":629},[2053],{"type":61,"value":170},{"type":55,"tag":408,"props":2055,"children":2056},{"style":602},[2057],{"type":61,"value":637},{"type":55,"tag":408,"props":2059,"children":2060},{"style":602},[2061],{"type":61,"value":642},{"type":55,"tag":408,"props":2063,"children":2064},{"class":410,"line":420},[2065],{"type":55,"tag":408,"props":2066,"children":2067},{"emptyLinePlaceholder":433},[2068],{"type":61,"value":436},{"type":55,"tag":408,"props":2070,"children":2071},{"class":410,"line":429},[2072,2077,2082,2087,2091],{"type":55,"tag":408,"props":2073,"children":2074},{"style":596},[2075],{"type":61,"value":2076},"export",{"type":55,"tag":408,"props":2078,"children":2079},{"style":679},[2080],{"type":61,"value":2081}," function",{"type":55,"tag":408,"props":2083,"children":2084},{"style":700},[2085],{"type":61,"value":2086}," VoiceControls",{"type":55,"tag":408,"props":2088,"children":2089},{"style":602},[2090],{"type":61,"value":1694},{"type":55,"tag":408,"props":2092,"children":2093},{"style":602},[2094],{"type":61,"value":1812},{"type":55,"tag":408,"props":2096,"children":2097},{"class":410,"line":439},[2098,2102,2107,2111,2115,2119],{"type":55,"tag":408,"props":2099,"children":2100},{"style":679},[2101],{"type":61,"value":1820},{"type":55,"tag":408,"props":2103,"children":2104},{"style":608},[2105],{"type":61,"value":2106}," conversation",{"type":55,"tag":408,"props":2108,"children":2109},{"style":602},[2110],{"type":61,"value":1830},{"type":55,"tag":408,"props":2112,"children":2113},{"style":700},[2114],{"type":61,"value":2037},{"type":55,"tag":408,"props":2116,"children":2117},{"style":718},[2118],{"type":61,"value":707},{"type":55,"tag":408,"props":2120,"children":2121},{"style":602},[2122],{"type":61,"value":712},{"type":55,"tag":408,"props":2124,"children":2125},{"class":410,"line":448},[2126,2131,2135,2140,2144,2149,2153,2157,2161,2165,2170,2174,2178],{"type":55,"tag":408,"props":2127,"children":2128},{"style":700},[2129],{"type":61,"value":2130},"    onConnect",{"type":55,"tag":408,"props":2132,"children":2133},{"style":602},[2134],{"type":61,"value":726},{"type":55,"tag":408,"props":2136,"children":2137},{"style":602},[2138],{"type":61,"value":2139}," ()",{"type":55,"tag":408,"props":2141,"children":2142},{"style":679},[2143],{"type":61,"value":1807},{"type":55,"tag":408,"props":2145,"children":2146},{"style":608},[2147],{"type":61,"value":2148}," console",{"type":55,"tag":408,"props":2150,"children":2151},{"style":602},[2152],{"type":61,"value":117},{"type":55,"tag":408,"props":2154,"children":2155},{"style":700},[2156],{"type":61,"value":988},{"type":55,"tag":408,"props":2158,"children":2159},{"style":718},[2160],{"type":61,"value":707},{"type":55,"tag":408,"props":2162,"children":2163},{"style":602},[2164],{"type":61,"value":637},{"type":55,"tag":408,"props":2166,"children":2167},{"style":629},[2168],{"type":61,"value":2169},"connected",{"type":55,"tag":408,"props":2171,"children":2172},{"style":602},[2173],{"type":61,"value":637},{"type":55,"tag":408,"props":2175,"children":2176},{"style":718},[2177],{"type":61,"value":766},{"type":55,"tag":408,"props":2179,"children":2180},{"style":602},[2181],{"type":61,"value":753},{"type":55,"tag":408,"props":2183,"children":2184},{"class":410,"line":457},[2185,2190,2194,2198,2202,2206,2210,2214,2218,2222,2227,2231,2235],{"type":55,"tag":408,"props":2186,"children":2187},{"style":700},[2188],{"type":61,"value":2189},"    onDisconnect",{"type":55,"tag":408,"props":2191,"children":2192},{"style":602},[2193],{"type":61,"value":726},{"type":55,"tag":408,"props":2195,"children":2196},{"style":602},[2197],{"type":61,"value":2139},{"type":55,"tag":408,"props":2199,"children":2200},{"style":679},[2201],{"type":61,"value":1807},{"type":55,"tag":408,"props":2203,"children":2204},{"style":608},[2205],{"type":61,"value":2148},{"type":55,"tag":408,"props":2207,"children":2208},{"style":602},[2209],{"type":61,"value":117},{"type":55,"tag":408,"props":2211,"children":2212},{"style":700},[2213],{"type":61,"value":988},{"type":55,"tag":408,"props":2215,"children":2216},{"style":718},[2217],{"type":61,"value":707},{"type":55,"tag":408,"props":2219,"children":2220},{"style":602},[2221],{"type":61,"value":637},{"type":55,"tag":408,"props":2223,"children":2224},{"style":629},[2225],{"type":61,"value":2226},"disconnected",{"type":55,"tag":408,"props":2228,"children":2229},{"style":602},[2230],{"type":61,"value":637},{"type":55,"tag":408,"props":2232,"children":2233},{"style":718},[2234],{"type":61,"value":766},{"type":55,"tag":408,"props":2236,"children":2237},{"style":602},[2238],{"type":61,"value":753},{"type":55,"tag":408,"props":2240,"children":2241},{"class":410,"line":465},[2242,2247,2251,2255,2260,2264,2268,2272,2276,2280,2284,2288,2292],{"type":55,"tag":408,"props":2243,"children":2244},{"style":700},[2245],{"type":61,"value":2246},"    onError",{"type":55,"tag":408,"props":2248,"children":2249},{"style":602},[2250],{"type":61,"value":726},{"type":55,"tag":408,"props":2252,"children":2253},{"style":602},[2254],{"type":61,"value":1783},{"type":55,"tag":408,"props":2256,"children":2257},{"style":1786},[2258],{"type":61,"value":2259},"error",{"type":55,"tag":408,"props":2261,"children":2262},{"style":602},[2263],{"type":61,"value":766},{"type":55,"tag":408,"props":2265,"children":2266},{"style":679},[2267],{"type":61,"value":1807},{"type":55,"tag":408,"props":2269,"children":2270},{"style":608},[2271],{"type":61,"value":2148},{"type":55,"tag":408,"props":2273,"children":2274},{"style":602},[2275],{"type":61,"value":117},{"type":55,"tag":408,"props":2277,"children":2278},{"style":700},[2279],{"type":61,"value":2259},{"type":55,"tag":408,"props":2281,"children":2282},{"style":718},[2283],{"type":61,"value":707},{"type":55,"tag":408,"props":2285,"children":2286},{"style":608},[2287],{"type":61,"value":2259},{"type":55,"tag":408,"props":2289,"children":2290},{"style":718},[2291],{"type":61,"value":766},{"type":55,"tag":408,"props":2293,"children":2294},{"style":602},[2295],{"type":61,"value":753},{"type":55,"tag":408,"props":2297,"children":2298},{"class":410,"line":474},[2299,2303,2307],{"type":55,"tag":408,"props":2300,"children":2301},{"style":602},[2302],{"type":61,"value":1918},{"type":55,"tag":408,"props":2304,"children":2305},{"style":718},[2306],{"type":61,"value":766},{"type":55,"tag":408,"props":2308,"children":2309},{"style":602},[2310],{"type":61,"value":642},{"type":55,"tag":408,"props":2312,"children":2313},{"class":410,"line":482},[2314],{"type":55,"tag":408,"props":2315,"children":2316},{"emptyLinePlaceholder":433},[2317],{"type":61,"value":436},{"type":55,"tag":408,"props":2319,"children":2320},{"class":410,"line":491},[2321,2326,2330,2335,2339],{"type":55,"tag":408,"props":2322,"children":2323},{"style":679},[2324],{"type":61,"value":2325},"  async",{"type":55,"tag":408,"props":2327,"children":2328},{"style":679},[2329],{"type":61,"value":2081},{"type":55,"tag":408,"props":2331,"children":2332},{"style":700},[2333],{"type":61,"value":2334}," startConversation",{"type":55,"tag":408,"props":2336,"children":2337},{"style":602},[2338],{"type":61,"value":1694},{"type":55,"tag":408,"props":2340,"children":2341},{"style":602},[2342],{"type":61,"value":1812},{"type":55,"tag":408,"props":2344,"children":2345},{"class":410,"line":499},[2346,2351,2356,2360,2365,2369,2374,2378,2382,2387,2391,2395,2399,2403],{"type":55,"tag":408,"props":2347,"children":2348},{"style":596},[2349],{"type":61,"value":2350},"    await",{"type":55,"tag":408,"props":2352,"children":2353},{"style":608},[2354],{"type":61,"value":2355}," navigator",{"type":55,"tag":408,"props":2357,"children":2358},{"style":602},[2359],{"type":61,"value":117},{"type":55,"tag":408,"props":2361,"children":2362},{"style":608},[2363],{"type":61,"value":2364},"mediaDevices",{"type":55,"tag":408,"props":2366,"children":2367},{"style":602},[2368],{"type":61,"value":117},{"type":55,"tag":408,"props":2370,"children":2371},{"style":700},[2372],{"type":61,"value":2373},"getUserMedia",{"type":55,"tag":408,"props":2375,"children":2376},{"style":718},[2377],{"type":61,"value":707},{"type":55,"tag":408,"props":2379,"children":2380},{"style":602},[2381],{"type":61,"value":1952},{"type":55,"tag":408,"props":2383,"children":2384},{"style":718},[2385],{"type":61,"value":2386}," audio",{"type":55,"tag":408,"props":2388,"children":2389},{"style":602},[2390],{"type":61,"value":726},{"type":55,"tag":408,"props":2392,"children":2393},{"style":942},[2394],{"type":61,"value":945},{"type":55,"tag":408,"props":2396,"children":2397},{"style":602},[2398],{"type":61,"value":616},{"type":55,"tag":408,"props":2400,"children":2401},{"style":718},[2402],{"type":61,"value":766},{"type":55,"tag":408,"props":2404,"children":2405},{"style":602},[2406],{"type":61,"value":642},{"type":55,"tag":408,"props":2408,"children":2409},{"class":410,"line":508},[2410,2415,2419,2423,2427,2431,2435,2440,2444,2448,2452,2456,2460,2464,2469,2473,2477,2482,2486,2490,2494,2498,2502,2507],{"type":55,"tag":408,"props":2411,"children":2412},{"style":679},[2413],{"type":61,"value":2414},"    const",{"type":55,"tag":408,"props":2416,"children":2417},{"style":602},[2418],{"type":61,"value":605},{"type":55,"tag":408,"props":2420,"children":2421},{"style":608},[2422],{"type":61,"value":1957},{"type":55,"tag":408,"props":2424,"children":2425},{"style":602},[2426],{"type":61,"value":616},{"type":55,"tag":408,"props":2428,"children":2429},{"style":602},[2430],{"type":61,"value":1830},{"type":55,"tag":408,"props":2432,"children":2433},{"style":596},[2434],{"type":61,"value":798},{"type":55,"tag":408,"props":2436,"children":2437},{"style":700},[2438],{"type":61,"value":2439}," fetch",{"type":55,"tag":408,"props":2441,"children":2442},{"style":718},[2443],{"type":61,"value":707},{"type":55,"tag":408,"props":2445,"children":2446},{"style":602},[2447],{"type":61,"value":637},{"type":55,"tag":408,"props":2449,"children":2450},{"style":629},[2451],{"type":61,"value":1765},{"type":55,"tag":408,"props":2453,"children":2454},{"style":602},[2455],{"type":61,"value":637},{"type":55,"tag":408,"props":2457,"children":2458},{"style":718},[2459],{"type":61,"value":766},{"type":55,"tag":408,"props":2461,"children":2462},{"style":602},[2463],{"type":61,"value":117},{"type":55,"tag":408,"props":2465,"children":2466},{"style":700},[2467],{"type":61,"value":2468},"then",{"type":55,"tag":408,"props":2470,"children":2471},{"style":718},[2472],{"type":61,"value":707},{"type":55,"tag":408,"props":2474,"children":2475},{"style":602},[2476],{"type":61,"value":707},{"type":55,"tag":408,"props":2478,"children":2479},{"style":1786},[2480],{"type":61,"value":2481},"res",{"type":55,"tag":408,"props":2483,"children":2484},{"style":602},[2485],{"type":61,"value":766},{"type":55,"tag":408,"props":2487,"children":2488},{"style":679},[2489],{"type":61,"value":1807},{"type":55,"tag":408,"props":2491,"children":2492},{"style":608},[2493],{"type":61,"value":1798},{"type":55,"tag":408,"props":2495,"children":2496},{"style":602},[2497],{"type":61,"value":117},{"type":55,"tag":408,"props":2499,"children":2500},{"style":700},[2501],{"type":61,"value":1943},{"type":55,"tag":408,"props":2503,"children":2504},{"style":718},[2505],{"type":61,"value":2506},"())",{"type":55,"tag":408,"props":2508,"children":2509},{"style":602},[2510],{"type":61,"value":642},{"type":55,"tag":408,"props":2512,"children":2513},{"class":410,"line":517},[2514],{"type":55,"tag":408,"props":2515,"children":2516},{"emptyLinePlaceholder":433},[2517],{"type":61,"value":436},{"type":55,"tag":408,"props":2519,"children":2520},{"class":410,"line":526},[2521,2525,2529,2533,2538,2542],{"type":55,"tag":408,"props":2522,"children":2523},{"style":596},[2524],{"type":61,"value":2350},{"type":55,"tag":408,"props":2526,"children":2527},{"style":608},[2528],{"type":61,"value":2106},{"type":55,"tag":408,"props":2530,"children":2531},{"style":602},[2532],{"type":61,"value":117},{"type":55,"tag":408,"props":2534,"children":2535},{"style":700},[2536],{"type":61,"value":2537},"startSession",{"type":55,"tag":408,"props":2539,"children":2540},{"style":718},[2541],{"type":61,"value":707},{"type":55,"tag":408,"props":2543,"children":2544},{"style":602},[2545],{"type":61,"value":712},{"type":55,"tag":408,"props":2547,"children":2548},{"class":410,"line":535},[2549,2554,2558,2562],{"type":55,"tag":408,"props":2550,"children":2551},{"style":718},[2552],{"type":61,"value":2553},"      conversationToken",{"type":55,"tag":408,"props":2555,"children":2556},{"style":602},[2557],{"type":61,"value":726},{"type":55,"tag":408,"props":2559,"children":2560},{"style":608},[2561],{"type":61,"value":1957},{"type":55,"tag":408,"props":2563,"children":2564},{"style":602},[2565],{"type":61,"value":753},{"type":55,"tag":408,"props":2567,"children":2568},{"class":410,"line":544},[2569,2574,2578],{"type":55,"tag":408,"props":2570,"children":2571},{"style":718},[2572],{"type":61,"value":2573},"      overrides",{"type":55,"tag":408,"props":2575,"children":2576},{"style":602},[2577],{"type":61,"value":726},{"type":55,"tag":408,"props":2579,"children":2580},{"style":602},[2581],{"type":61,"value":1812},{"type":55,"tag":408,"props":2583,"children":2584},{"class":410,"line":553},[2585,2590,2594,2598,2602,2606,2610,2615,2619],{"type":55,"tag":408,"props":2586,"children":2587},{"style":718},[2588],{"type":61,"value":2589},"        agent",{"type":55,"tag":408,"props":2591,"children":2592},{"style":602},[2593],{"type":61,"value":726},{"type":55,"tag":408,"props":2595,"children":2596},{"style":602},[2597],{"type":61,"value":605},{"type":55,"tag":408,"props":2599,"children":2600},{"style":718},[2601],{"type":61,"value":935},{"type":55,"tag":408,"props":2603,"children":2604},{"style":602},[2605],{"type":61,"value":726},{"type":55,"tag":408,"props":2607,"children":2608},{"style":602},[2609],{"type":61,"value":626},{"type":55,"tag":408,"props":2611,"children":2612},{"style":629},[2613],{"type":61,"value":2614},"Hello! How can I help you today?",{"type":55,"tag":408,"props":2616,"children":2617},{"style":602},[2618],{"type":61,"value":637},{"type":55,"tag":408,"props":2620,"children":2621},{"style":602},[2622],{"type":61,"value":914},{"type":55,"tag":408,"props":2624,"children":2625},{"class":410,"line":562},[2626],{"type":55,"tag":408,"props":2627,"children":2628},{"style":602},[2629],{"type":61,"value":2630},"      },\n",{"type":55,"tag":408,"props":2632,"children":2633},{"class":410,"line":570},[2634,2639,2643],{"type":55,"tag":408,"props":2635,"children":2636},{"style":602},[2637],{"type":61,"value":2638},"    }",{"type":55,"tag":408,"props":2640,"children":2641},{"style":718},[2642],{"type":61,"value":766},{"type":55,"tag":408,"props":2644,"children":2645},{"style":602},[2646],{"type":61,"value":642},{"type":55,"tag":408,"props":2648,"children":2650},{"class":410,"line":2649},20,[2651],{"type":55,"tag":408,"props":2652,"children":2653},{"style":602},[2654],{"type":61,"value":2655},"  }\n",{"type":55,"tag":408,"props":2657,"children":2659},{"class":410,"line":2658},21,[2660],{"type":55,"tag":408,"props":2661,"children":2662},{"emptyLinePlaceholder":433},[2663],{"type":61,"value":436},{"type":55,"tag":408,"props":2665,"children":2667},{"class":410,"line":2666},22,[2668,2673,2678,2683,2688,2693,2698,2703,2708,2713,2717],{"type":55,"tag":408,"props":2669,"children":2670},{"style":596},[2671],{"type":61,"value":2672},"  return",{"type":55,"tag":408,"props":2674,"children":2675},{"style":602},[2676],{"type":61,"value":2677}," \u003C",{"type":55,"tag":408,"props":2679,"children":2680},{"style":718},[2681],{"type":61,"value":2682},"button",{"type":55,"tag":408,"props":2684,"children":2685},{"style":679},[2686],{"type":61,"value":2687}," onClick",{"type":55,"tag":408,"props":2689,"children":2690},{"style":602},[2691],{"type":61,"value":2692},"={",{"type":55,"tag":408,"props":2694,"children":2695},{"style":608},[2696],{"type":61,"value":2697},"startConversation",{"type":55,"tag":408,"props":2699,"children":2700},{"style":602},[2701],{"type":61,"value":2702},"}>",{"type":55,"tag":408,"props":2704,"children":2705},{"style":608},[2706],{"type":61,"value":2707},"Start conversation",{"type":55,"tag":408,"props":2709,"children":2710},{"style":602},[2711],{"type":61,"value":2712},"\u003C\u002F",{"type":55,"tag":408,"props":2714,"children":2715},{"style":718},[2716],{"type":61,"value":2682},{"type":55,"tag":408,"props":2718,"children":2719},{"style":602},[2720],{"type":61,"value":2721},">;\n",{"type":55,"tag":408,"props":2723,"children":2725},{"class":410,"line":2724},23,[2726],{"type":55,"tag":408,"props":2727,"children":2728},{"style":602},[2729],{"type":61,"value":2730},"}\n",{"type":55,"tag":64,"props":2732,"children":2733},{},[2734,2736,2742,2744,2750,2752,2758,2760,2766,2768,2774,2776,2782],{"type":61,"value":2735},"If a WebRTC browser session stalls or logs ",{"type":55,"tag":94,"props":2737,"children":2739},{"className":2738},[],[2740],{"type":61,"value":2741},"\u002Frtc\u002Fv1",{"type":61,"value":2743}," 404s, ",{"type":55,"tag":94,"props":2745,"children":2747},{"className":2746},[],[2748],{"type":61,"value":2749},"v1 RTC path not found",{"type":61,"value":2751},", or ",{"type":55,"tag":94,"props":2753,"children":2755},{"className":2754},[],[2756],{"type":61,"value":2757},"could not establish pc connection",{"type":61,"value":2759},", pin ",{"type":55,"tag":94,"props":2761,"children":2763},{"className":2762},[],[2764],{"type":61,"value":2765},"livekit-client",{"type":61,"value":2767}," to ",{"type":55,"tag":94,"props":2769,"children":2771},{"className":2770},[],[2772],{"type":61,"value":2773},"2.16.1",{"type":61,"value":2775}," in the app's ",{"type":55,"tag":94,"props":2777,"children":2779},{"className":2778},[],[2780],{"type":61,"value":2781},"package.json",{"type":61,"value":2783}," until the upstream LiveKit compatibility issue is resolved:",{"type":55,"tag":398,"props":2785,"children":2788},{"className":2786,"code":2787,"language":1943,"meta":402,"style":402},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"overrides\": {\n    \"livekit-client\": \"2.16.1\"\n  }\n}\n",[2789],{"type":55,"tag":94,"props":2790,"children":2791},{"__ignoreMap":402},[2792,2799,2823,2857,2864],{"type":55,"tag":408,"props":2793,"children":2794},{"class":410,"line":411},[2795],{"type":55,"tag":408,"props":2796,"children":2797},{"style":602},[2798],{"type":61,"value":712},{"type":55,"tag":408,"props":2800,"children":2801},{"class":410,"line":420},[2802,2807,2811,2815,2819],{"type":55,"tag":408,"props":2803,"children":2804},{"style":602},[2805],{"type":61,"value":2806},"  \"",{"type":55,"tag":408,"props":2808,"children":2809},{"style":679},[2810],{"type":61,"value":1070},{"type":55,"tag":408,"props":2812,"children":2813},{"style":602},[2814],{"type":61,"value":637},{"type":55,"tag":408,"props":2816,"children":2817},{"style":602},[2818],{"type":61,"value":726},{"type":55,"tag":408,"props":2820,"children":2821},{"style":602},[2822],{"type":61,"value":1812},{"type":55,"tag":408,"props":2824,"children":2825},{"class":410,"line":429},[2826,2831,2836,2840,2844,2848,2852],{"type":55,"tag":408,"props":2827,"children":2828},{"style":602},[2829],{"type":61,"value":2830},"    \"",{"type":55,"tag":408,"props":2832,"children":2834},{"style":2833},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2835],{"type":61,"value":2765},{"type":55,"tag":408,"props":2837,"children":2838},{"style":602},[2839],{"type":61,"value":637},{"type":55,"tag":408,"props":2841,"children":2842},{"style":602},[2843],{"type":61,"value":726},{"type":55,"tag":408,"props":2845,"children":2846},{"style":602},[2847],{"type":61,"value":626},{"type":55,"tag":408,"props":2849,"children":2850},{"style":629},[2851],{"type":61,"value":2773},{"type":55,"tag":408,"props":2853,"children":2854},{"style":602},[2855],{"type":61,"value":2856},"\"\n",{"type":55,"tag":408,"props":2858,"children":2859},{"class":410,"line":439},[2860],{"type":55,"tag":408,"props":2861,"children":2862},{"style":602},[2863],{"type":61,"value":2655},{"type":55,"tag":408,"props":2865,"children":2866},{"class":410,"line":448},[2867],{"type":55,"tag":408,"props":2868,"children":2869},{"style":602},[2870],{"type":61,"value":2730},{"type":55,"tag":119,"props":2872,"children":2874},{"id":2873},"references",[2875],{"type":61,"value":2876},"References",{"type":55,"tag":131,"props":2878,"children":2879},{},[2880,2887,2894],{"type":55,"tag":135,"props":2881,"children":2882},{},[2883],{"type":55,"tag":85,"props":2884,"children":2885},{"href":87},[2886],{"type":61,"value":90},{"type":55,"tag":135,"props":2888,"children":2889},{},[2890],{"type":55,"tag":85,"props":2891,"children":2892},{"href":104},[2893],{"type":61,"value":107},{"type":55,"tag":135,"props":2895,"children":2896},{},[2897],{"type":55,"tag":85,"props":2898,"children":2899},{"href":112},[2900],{"type":61,"value":115},{"type":55,"tag":2902,"props":2903,"children":2904},"style",{},[2905],{"type":61,"value":2906},"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":2908,"total":482},[2909,2920,2934,2945,2957,2965,2978,2990,3001],{"slug":190,"name":190,"fn":2910,"description":2911,"org":2912,"tags":2913,"stars":26,"repoUrl":27,"updatedAt":2919},"build ElevenLabs voice agents","Build voice AI agents with ElevenLabs. Use when creating voice assistants, customer service bots, interactive voice characters, or any real-time voice conversation experience.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2914,2916,2917,2918],{"name":2915,"slug":190,"type":15},"Agents",{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":24,"slug":25,"type":15},"2026-07-24T05:40:07.822247",{"slug":33,"name":33,"fn":2921,"description":2922,"org":2923,"tags":2924,"stars":26,"repoUrl":27,"updatedAt":2933},"generate music with ElevenLabs","Generate music using ElevenLabs Music API. Use when creating instrumental tracks, songs with lyrics, background music, jingles, or any AI-generated music composition. Supports prompt-based generation, composition plans for granular control, and detailed output with metadata.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2925,2928,2929,2932],{"name":2926,"slug":2927,"type":15},"AI Infrastructure","ai-infrastructure",{"name":17,"slug":18,"type":15},{"name":2930,"slug":2931,"type":15},"Creative","creative",{"name":9,"slug":8,"type":15},"2026-07-24T05:40:08.812767",{"slug":2935,"name":2935,"fn":2936,"description":2937,"org":2938,"tags":2939,"stars":26,"repoUrl":27,"updatedAt":2944},"setup-api-key","set up ElevenLabs API key","Guides users through setting up an ElevenLabs API key for ElevenLabs MCP tools. Use when the user needs to configure an ElevenLabs API key, when ElevenLabs tools fail due to missing API key, or when the user mentions needing access to ElevenLabs. First checks whether ELEVENLABS_API_KEY is already configured and valid, and only runs full setup when needed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2940,2941],{"name":9,"slug":8,"type":15},{"name":2942,"slug":2943,"type":15},"Environment Variables","environment-variables","2026-04-06T18:09:34.705989",{"slug":2946,"name":2946,"fn":2947,"description":2948,"org":2949,"tags":2950,"stars":26,"repoUrl":27,"updatedAt":2956},"sound-effects","generate sound effects with ElevenLabs","Generate sound effects from text descriptions using ElevenLabs. Use when creating sound effects, generating audio textures, producing ambient sounds, cinematic impacts, UI sounds, or any audio that isn't speech. Supports looping, duration control, and prompt influence tuning.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2951,2952,2953,2954],{"name":17,"slug":18,"type":15},{"name":2930,"slug":2931,"type":15},{"name":9,"slug":8,"type":15},{"name":2955,"slug":2946,"type":15},"Sound Effects","2026-04-06T18:09:39.77459",{"slug":4,"name":4,"fn":5,"description":6,"org":2958,"tags":2959,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2960,2961,2962,2963,2964],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"name":24,"slug":25,"type":15},{"slug":2966,"name":2966,"fn":2967,"description":2968,"org":2969,"tags":2970,"stars":26,"repoUrl":27,"updatedAt":2977},"speech-to-text","transcribe audio with ElevenLabs","Transcribe audio to text using ElevenLabs Scribe v2. Use when converting audio\u002Fvideo to text, generating subtitles, transcribing meetings, or processing spoken content.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2971,2972,2973,2974],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":24,"slug":25,"type":15},{"name":2975,"slug":2976,"type":15},"Transcription","transcription","2026-07-24T05:40:06.834756",{"slug":2979,"name":2979,"fn":2980,"description":2981,"org":2982,"tags":2983,"stars":26,"repoUrl":27,"updatedAt":2989},"text-to-speech","convert text to speech with ElevenLabs","Convert text to speech using ElevenLabs voice AI. Use when generating audio from text, creating voiceovers, building voice apps, or synthesizing speech in 70+ languages.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2984,2985,2986,2987],{"name":2926,"slug":2927,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":2988,"slug":2979,"type":15},"Text-to-Speech","2026-04-06T18:09:38.521103",{"slug":2991,"name":2991,"fn":2992,"description":2993,"org":2994,"tags":2995,"stars":26,"repoUrl":27,"updatedAt":3000},"voice-changer","transform audio recordings with voice conversion","Transform the voice in an audio recording into a different target voice while preserving emotion, timing, and delivery using the ElevenLabs Voice Changer (speech-to-speech) API. Use when converting one voice to another, changing the speaker\u002Fnarrator of an existing recording, dubbing a voice-over in a different voice, creating character voices from a scratch performance, anonymizing a speaker, or any \"voice conversion \u002F voice transfer \u002F speech-to-speech\" task. Make sure to use this skill whenever the user mentions voice changing, voice conversion, speech-to-speech, swapping a voice in audio, re-voicing a clip, or applying a different voice to an existing recording — even if they don't explicitly say \"voice changer\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[2996,2997,2998,2999],{"name":2926,"slug":2927,"type":15},{"name":17,"slug":18,"type":15},{"name":2930,"slug":2931,"type":15},{"name":9,"slug":8,"type":15},"2026-05-02T05:22:50.99428",{"slug":3002,"name":3002,"fn":3003,"description":3004,"org":3005,"tags":3006,"stars":26,"repoUrl":27,"updatedAt":3010},"voice-isolator","isolate voices and remove background noise","Remove background noise and isolate vocals\u002Fspeech from audio using ElevenLabs Voice Isolator (audio isolation) API. Use when cleaning up noisy recordings, removing music or background ambience from dialogue, isolating speech from field recordings, preparing audio for transcription, extracting vocals, or any \"denoise \u002F clean up \u002F isolate voice\" task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3007,3008,3009],{"name":17,"slug":18,"type":15},{"name":2930,"slug":2931,"type":15},{"name":9,"slug":8,"type":15},"2026-04-23T05:01:58.01956",{"items":3012,"total":482},[3013,3020,3027,3032,3039,3047,3054],{"slug":190,"name":190,"fn":2910,"description":2911,"org":3014,"tags":3015,"stars":26,"repoUrl":27,"updatedAt":2919},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3016,3017,3018,3019],{"name":2915,"slug":190,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":24,"slug":25,"type":15},{"slug":33,"name":33,"fn":2921,"description":2922,"org":3021,"tags":3022,"stars":26,"repoUrl":27,"updatedAt":2933},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3023,3024,3025,3026],{"name":2926,"slug":2927,"type":15},{"name":17,"slug":18,"type":15},{"name":2930,"slug":2931,"type":15},{"name":9,"slug":8,"type":15},{"slug":2935,"name":2935,"fn":2936,"description":2937,"org":3028,"tags":3029,"stars":26,"repoUrl":27,"updatedAt":2944},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3030,3031],{"name":9,"slug":8,"type":15},{"name":2942,"slug":2943,"type":15},{"slug":2946,"name":2946,"fn":2947,"description":2948,"org":3033,"tags":3034,"stars":26,"repoUrl":27,"updatedAt":2956},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3035,3036,3037,3038],{"name":17,"slug":18,"type":15},{"name":2930,"slug":2931,"type":15},{"name":9,"slug":8,"type":15},{"name":2955,"slug":2946,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":3040,"tags":3041,"stars":26,"repoUrl":27,"updatedAt":28},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3042,3043,3044,3045,3046],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"name":21,"slug":22,"type":15},{"name":24,"slug":25,"type":15},{"slug":2966,"name":2966,"fn":2967,"description":2968,"org":3048,"tags":3049,"stars":26,"repoUrl":27,"updatedAt":2977},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3050,3051,3052,3053],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":24,"slug":25,"type":15},{"name":2975,"slug":2976,"type":15},{"slug":2979,"name":2979,"fn":2980,"description":2981,"org":3055,"tags":3056,"stars":26,"repoUrl":27,"updatedAt":2989},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3057,3058,3059,3060],{"name":2926,"slug":2927,"type":15},{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":2988,"slug":2979,"type":15}]