Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when setting up a local ElevenLabs dev environment for a TTS/voice project and you need SDK mocking, hot reload, quota-aware iteration, and audio-output testing that does not burn character quota during development. Trigger with "elevenlabs dev setup", "elevenlabs local development", "elevenlabs dev environment", "develop with elevenlabs", "test elevenlabs locally".
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 22% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 37% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 236% | 0% |
Set up a fast, cost-effective local development workflow for ElevenLabs audio projects. The loop centers on three moves — mock the SDK so unit tests never burn character quota, gate real API calls behind an explicit ELEVENLABS_INTEGRATION=1 flag, and select a cheaper model in dev while keeping the high-quality model for production — with tsx watch hot reload and a quota checker to round out the cycle.
Follow the high-level flow below to scaffold the project, then drill into references/implementation.md for the full code of every step and references/examples.md for worked end-to-end runs.
Before starting, confirm your environment is ready:
elevenlabs-install-auth setup is complete, so the SDK(@elevenlabs/elevenlabs-js) is installed and ELEVENLABS_API_KEY is available in .env.local.
npm or pnpm.vitest installed as the test runner (recommended) — it powers the mocklayer and the integration-test guard.
Work through the six steps in order. Each is summarized here; the full code for every step lives in references/implementation.md.
src/elevenlabs/ (client, config, tts),tests/__mocks__/ and tests/fixtures/sample.mp3, a git-ignored output/, and .env.local / .env.example. Full tree in the reference.
config.ts thatpicks the model and output format by NODE_ENV. This is the essential skeleton:
typescript // src/elevenlabs/config.ts export function loadConfig() { const env = process.env.NODE_ENV || "development"; return { apiKey: process.env.ELEVENLABS_API_KEY || "", // cheaper/faster in dev, best quality in prod modelId: env === "production" ? "eleven_multilingual_v2" // 1.0 credits/char : "eleven_flash_v2_5", // 0.5 credits/char, ~75ms defaultVoiceId: process.env.ELEVENLABS_VOICE_ID || "21m00Tcm4TlvDq8ikWAM", outputFormat: "mp3_22050_32", // smaller files for dev }; }
tests/__mocks__/elevenlabs.ts that returns thesample.mp3 fixture from textToSpeech.convert/stream and stubs voices.getAll and user.get, so unit tests cost nothing.
dev (tsx watch), test, test:watch,test:integration, generate, and quota scripts to package.json.
src/check-quota.ts that readsuser.subscription and exits non-zero when fewer than 1000 characters remain, so a low balance fails fast.
tests/tts.test.ts where the real-APItest is it.skipIf(!useRealApi) and only runs under ELEVENLABS_INTEGRATION=1; the mocked test always runs.
See references/implementation.md for the complete, copy-pasteable code for each step.
tsx watchELEVENLABS_INTEGRATION=1)| Error | Cause | Solution | |-------|-------|----------| | MODULE_NOT_FOUND | SDK not installed | npm install @elevenlabs/elevenlabs-js | | Mock returns undefined | Mock not wired | Check vi.mock path matches import | | Integration test fails | No API key | Set ELEVENLABS_API_KEY in .env.local | | Quota exceeded in dev | Running real API calls | Use mock layer; run npm run quota first |
Four worked runs of the loop — full walkthroughs in references/examples.md:
npm run test drives the service through the mockclient, passes offline, and never touches the API or your quota.
npm run quota prints Characters: 500 / 10,000 (5.0%used) and exits 1 when fewer than 1000 characters remain, blocking a paid run before it starts.
npm run test:integration setsELEVENLABS_INTEGRATION=1, flipping the it.skipIf(!useRealApi) test on so the real API is hit only when you ask for it.
npm run dev (tsx watch) restarts on save; withthe dev model (eleven_flash_v2_5) and mocks, each loop stays fast and free.
Once the dev loop is running, move on to production-ready code: see the elevenlabs-sdk-patterns skill for streaming, retries, and voice-management patterns you can layer on top of this environment.
Other measured skills in the registry, with their headline benchmark lift.