Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Upgrade ElevenLabs SDK versions and migrate between API model generations. Use when upgrading the elevenlabs-js or elevenlabs Python SDK, migrating from v1 to v2 models, or handling deprecations across the JS package rename and model ID changes. Trigger with: "upgrade elevenlabs", "elevenlabs migration", "elevenlabs breaking changes", "update elevenlabs SDK", "migrate elevenlabs model", "eleven_v3 migration".
.claude/skills/jeremylongshore-elevenlabs-upgrade-migration/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-10 | ✗→✓ | ▲ Improved | 123% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 109% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 154% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 128% | 0% |
Guide for upgrading the ElevenLabs SDK and migrating between model generations. Covers the JS SDK package rename (community elevenlabs → official @elevenlabs/elevenlabs-js), model ID changes across generations, voice-settings evolution, and API endpoint stability.
Work the seven steps below at a high level from this file; drill into references/migration-guide.md for the full command set and per-step code, and references/examples.md for three end-to-end worked scenarios.
All API calls authenticate with an account API key passed as the xi-api-key header. Store it in the ELEVENLABS_API_KEY environment variable — never inline a key in source. The SDK clients read the same value (process.env.ELEVENLABS_API_KEY in Node, api_key=... in Python).
ELEVENLABS_API_KEY exported in the environmentThe migration is a seven-step, branch-isolated workflow. Read package manifests and config with Read, apply import/model changes with Edit, add new config files (e.g. config/models.ts) with Write, and run the npm/pip/git commands via Bash. Full commands and code for each step are in references/migration-guide.md.
the models your account can reach.
elevenlabspackage, install @elevenlabs/elevenlabs-js, and update imports on an upgrade/elevenlabs-sdk branch.
migration table, and add a selectModel() helper that falls back off eleven_v3 when WebSocket streaming is required.
stability, similarity_boost, style,and speed against each model's capabilities.
/v1/ endpoints and adopt theenhanced /v2/voices search where useful.
requirements.txt, and movefrom the old module-level generate/set_api_key API to the client object.
The essential skeleton for the highest-leverage step (the JS package swap):
bashnpm uninstall elevenlabs npm install @elevenlabs/elevenlabs-js git checkout -b upgrade/elevenlabs-sdk
typescriptimport { ElevenLabsClient } from "@elevenlabs/elevenlabs-js"; const client = new ElevenLabsClient({ apiKey: process.env.ELEVENLABS_API_KEY, maxRetries: 3, timeoutInSeconds: 60, });
| Old Model | New Model | Migration Notes | |-----------|-----------|-----------------| | eleven_monolingual_v1 | eleven_multilingual_v2 | 29 languages; same voice IDs work | | eleven_multilingual_v1 | eleven_multilingual_v2 | Better emotional range; same API | | eleven_english_v1 | eleven_turbo_v2_5 | Lower latency; same voice_settings | | eleven_turbo_v2 | eleven_flash_v2_5 | Same quality, lower latency (~75ms) | | eleven_multilingual_v2 | eleven_v3 | Most expressive; 70+ languages; NO WebSocket support |
Full model-selection code, voice-settings and endpoint tables, the Python client migration, and the rollback procedure live in references/migration-guide.md.
Working through this skill produces:
upgrade/elevenlabs-sdk branch with the package swap and updated imports.package.json on @elevenlabs/elevenlabs-js, or apinned elevenlabs== line in requirements.txt.
config/models.ts) mapping quality/balanced/speedpreferences to current model IDs with a WebSocket-safe fallback.
200 from the TTS smoke test, and anon-empty voice-list count.
git revert) if validation fails.| Issue | Cause | Solution | |-------|-------|----------| | Cannot find module | Old package name | Update import to @elevenlabs/elevenlabs-js | | model_not_found | Deprecated model ID | Map to current model (see table) | | WebSocket fails after model change | eleven_v3 doesn't support WS | Use eleven_flash_v2_5 or eleven_multilingual_v2 | | Voice settings ignored | Wrong parameter names | Verify stability, similarity_boost, style, speed |
Three complete, copy-pasteable walkthroughs are in references/examples.md:
elevenlabs community package —branch, swap the package, update the client, and validate with a smoke test.
eleven_v3 while keeping streaming working via automatic downgrade.
object and pin the version for reproducible builds.
Minimal first example (the package swap and smoke test):
bashgit checkout -b upgrade/elevenlabs-sdk npm uninstall elevenlabs && npm install @elevenlabs/elevenlabs-js npm test curl -s -o /dev/null -w "%{http_code}" \ -X POST "https://api.elevenlabs.io/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM" \ -H "xi-api-key: ${ELEVENLABS_API_KEY}" \ -H "Content-Type: application/json" \ -d '{"text":"Upgrade test.","model_id":"eleven_flash_v2_5"}'
For CI integration during upgrades, see the elevenlabs-ci-integration skill, which wires the smoke test and voice-list check into a pipeline gate so a bad SDK or model bump fails the build before it ships.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 17,734 | 16,640 | -6% | 1 | 1 | 0% | 3,835 | 2,115 | -45% | 0 | 0 | — |
case-02 | fail→fail | 19,016 | 16,619 | -13% | 1 | 1 | 0% | 4,111 | 5,492 | +34% | 0 | 0 | — |
case-03 | fail→fail | 24,395 | 4,676 | -81% | 1 | 1 | 0% | 3,484 | 2,088 | -40% | 0 | 0 | — |
case-04 | pass→pass | 13,466 | 9,243 | -31% | 1 | 1 | 0% | 2,674 | 3,516 | +31% | 0 | 0 | — |
case-05 | pass→pass | 14,152 | 12,194 | -14% | 1 | 1 | 0% | 2,753 | 4,227 | +54% | 0 | 0 | — |
case-06 | pass→pass | 15,100 | 13,895 | -8% | 1 | 1 | 0% | 2,346 | 4,206 | +79% | 0 | 0 | — |
case-07 | pass→pass | 6,159 | 4,257 | -31% | 1 | 1 | 0% | 1,211 | 2,665 | +120% | 0 | 0 | — |
case-08 | pass→pass | 5,613 | 4,691 | -16% | 1 | 1 | 0% | 1,023 | 2,772 | +171% | 0 | 0 | — |
case-09 | pass→pass | 11,618 | 8,333 | -28% | 1 | 1 | 0% | 1,746 | 3,108 | +78% | 0 | 0 | — |
case-10 | fail→pass | 5,989 | 2,571 | -57% | 1 | 1 | 0% | 1,031 | 2,296 | +123% | 0 | 0 | — |
case-11 | fail→pass | 6,090 | 4,686 | -23% | 1 | 1 | 0% | 1,198 | 2,502 | +109% | 0 | 0 | — |
case-12 | fail→pass | 7,415 | 4,801 | -35% | 1 | 1 | 0% | 988 | 2,508 | +154% | 0 | 0 | — |
case-13 | pass→pass | 13,652 | 7,517 | -45% | 1 | 1 | 0% | 2,486 | 3,257 | +31% | 0 | 0 | — |
case-14 | pass→pass | 12,034 | 12,815 | +6% | 1 | 1 | 0% | 2,412 | 4,499 | +87% | 0 | 0 | — |
case-15 | fail→pass | 7,653 | 6,493 | -15% | 1 | 1 | 0% | 1,360 | 2,702 | +99% | 0 | 0 | — |
case-16 | fail→pass | 6,066 | 4,265 | -30% | 1 | 1 | 0% | 1,159 | 2,647 | +128% | 0 | 0 | — |
case-17 | pass→pass | 11,461 | 12,497 | +9% | 1 | 1 | 0% | 1,733 | 3,875 | +124% | 0 | 0 | — |
case-18 | pass→pass | 2,731 | 1,993 | -27% | 1 | 1 | 0% | 471 | 2,085 | +343% | 0 | 0 | — |
case-19 | pass→pass | 7,751 | 9,934 | +28% | 1 | 1 | 0% | 1,331 | 2,654 | +99% | 0 | 0 | — |
case-20 | fail→pass | 8,177 | 3,555 | -57% | 1 | 1 | 0% | 1,386 | 2,298 | +66% | 0 | 0 | — |
case-21 | fail→pass | 11,118 | 10,720 | -4% | 1 | 1 | 0% | 1,896 | 3,496 | +84% | 0 | 0 | — |
case-22 | fail→pass | 13,211 | 4,799 | -64% | 1 | 1 | 0% | 2,487 | 2,812 | +13% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 20 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.