* Add npm as an install option for the ElevenLabs CLI
The CLI is now published on npm as @elevenlabs/cli. List
`npm install -g @elevenlabs/cli` as the first install option in every
skill's installation guide and in the README, alongside the existing
Homebrew, Scoop, and shell-installer methods.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Remove LiveKit client pinning guidance from skills
The livekit-client version pin is now handled within the ElevenLabs SDK,
so the temporary package.json override workaround sections are obsolete.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
The CLI is now published on npm as @elevenlabs/cli. List
`npm install -g @elevenlabs/cli` as the first install option in every
skill's installation guide and in the README, alongside the existing
Homebrew, Scoop, and shell-installer methods.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* Default to the ElevenLabs CLI for all REST API examples
The ElevenLabs CLI just shipped, so every skill that documented raw REST
usage (cURL against api.elevenlabs.io) now shows the equivalent
`elevenlabs` command instead. All commands were verified against CLI
v1.0.0-alpha.2 with --dry-run to confirm they produce the same
method/URL/body as the curl calls they replace.
- Convert cURL sections to CLI in text-to-speech, speech-to-text,
sound-effects, music, voice-changer, voice-isolator, dubbing, and
agents (including the procedure/branch walkthrough and outbound calls)
- Lead every installation guide with a uniform "CLI (Recommended)"
section (Homebrew, Scoop, shell installer) and auth via
ELEVENLABS_API_KEY or `elevenlabs auth login`
- No example passes an API key on the command line; the CLI reads the
env var automatically
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Catch remaining cURL references missed by case-sensitive search
Rename the cURL payload-builder section in writing-procedures.md to CLI
(it feeds `elevenlabs agents procedures create --json`), point README
and agents/SKILL.md at the CLI instead of raw REST, and update the
changelog-maintenance skill to keep CLI examples consistent going
forward.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Fix stale keyterms limits in dubbing docs
The API OpenAPI spec and the public API reference both say keyterms
accepts up to 1000 terms of at most 50 characters and 5 words each
(verified via `elevenlabs dubbing project create --spec` and the
speech-to-text API reference); the tables said 100 terms of 200 chars.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Top-level skills are per platform, so procedures belong inside the agents
skill rather than as a skill of their own.
- Drop the top-level agent-procedures skill; README.md and evals/run_all.py
return to their previous state.
- Add a Procedures section to agents/SKILL.md covering the semantics a caller
needs before writing any procedure call: drafts do not reach the live agent
until publish, a branch-HEAD GET returns 404 until first publish, compile
only when deterministic procedures changed, and draft updates replace the
whole body.
- Add agents/references/using-procedure-api.md and
agents/references/writing-procedures.md.
- Extend the agents description so procedure queries route to this skill.
- Fold the procedure changelog triggers into the agents row of
update-skills-from-changelog.
- Move the procedure evals into the agents suite. Every expectation was
checked to discriminate under check_expectation: a correct response passes
and a deliberately wrong one fails. Cases relying on reference content or
asserting the absence of a step were dropped, since the harness injects
only SKILL.md and keyword grading cannot express absence.
* Add dubbing skill for the Dubbing Projects API (dubbing_v2)
Covers the new /v1/dubbing/project REST endpoints end-to-end: project
creation, source-transcript review and editing, adding target languages,
refining translations, and regeneration. Includes functional and trigger
evals and registers the skill in the eval runner and README.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Remove prerelease and workspace-gating notes from dubbing skill
The skill ships after the Dubbing Projects API is officially released,
so gating caveats and roadmap language no longer apply. The warning
about the legacy client.dubbing SDK methods stays.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Make legacy-SDK guard in dubbing eval machine-enforceable
The grader only enforced quoted (NOT '...') terms in JS import contexts,
so the unquoted "not the legacy client.dubbing" phrase in eval 1 was
never checked. Split it into its own expectation with quoted terms, and
teach find_forbidden_reference to treat dotted terms (method paths like
client.dubbing) as literal forbidden substrings, since import-context
matching can't catch SDK method usage.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Fix dubbing legacy API eval guard
* Detect legacy dubbing child routes
* Generalize legacy-endpoint guard and fix child-route detection
Replace the /v1/dubbing special case in find_forbidden_reference with a
generic mechanism: quoted paths in the same expectation that extend a
path-based NOT term act as allowed child routes. Path terms are now
forbidden including child routes (so legacy /v1/dubbing/{id}/audio/...
is caught), while /v1/dubbing/project and its children are exempt.
Also fixes a false positive in the previous lookahead: /project followed
by a closing quote failed the [/?#]|$ boundary check, so every correct
solution ending a URL at /v1/dubbing/project was flagged as legacy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Ignore advisory forbidden references
* Update dubbing skill for GA docs and make eval grading SDK-tolerant
The official Dubbing v2 docs (elevenlabs-dx#2547) show the SDKs now
support the Projects API under dubbing.project.*, so the skill switches
from REST-only guidance to SDK-first examples (Python + JS) with cURL
retained, and picks up the other doc changes: transcript editing and
regeneration are enterprise-only, cloning_strength defaults to 7, and
target_language can queue the first language at project creation.
The two functional eval failures in the 20260805 run were grader
fragility, not skill bugs — both generated scripts were correct, but
expectation phrasing didn't survive keyword grading (a URL split across
two f-string lines, and prose like "sends only the changed field").
Expectations are rephrased around tokens present in both SDK and REST
solutions, and the legacy-SDK guard terms change from 'client.dubbing'/
'elevenlabs.dubbing' (which would flag the new dubbing.project.*
namespace) to method-specific terms: dubbing.create(, dubbing.get(,
dubbing.audio, dubbing.dub_a_video.
Verified: functional evals now 17/17.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Fix advisory legacy reference detection
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
The 2026-08-04 automation run on a cold cloud runner timed out agents
eval-1 at 300s, zeroing all five of its expectations, while local runs
peak around 200s. 450s absorbs cold-start toolchain overhead (npm/CLI
setup by the nested agent) without doubling worst-case runtime; the
process-group kill still terminates timed-out runs cleanly.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* Fix eval harness bugs and repair eval definitions after per-eval review
Full review of all functional evals and trigger queries with fresh-context
agents against actual run artifacts. Of 15 failing expectations at the ~80%
baseline, none were genuine skill-quality failures.
Harness (evals/run_all.py):
- Resolve --output-dir to absolute: a relative path was re-resolved by
cursor-agent against the eval cwd (doubled path), failing every
functional eval instantly
- Grade outputs/ recursively: nested files (agent_configs/*.json, TS
subprojects) were invisible to grading, causing 4 false fails
- Kill the whole process group on timeout: cursor-agent grandchildren
holding the stdout pipe made subprocess.run block forever
Eval definitions:
- Rewrite 8 execution-style prompts to script-writing form (the sandbox
has no ELEVENLABS_API_KEY; "generate X.mp3" caused refusals, raw-REST
fallbacks, and one live agent deployment)
- Retexture 25 expectations so the keyword grader checks load-bearing
tokens instead of passing/failing vacuously
- Remove 1 ungradeable expectation (music eval-2 duration: agents
legitimately use music_length_ms or composition-plan section durations)
- Replace/sharpen 5 trigger queries (negatives that were structurally
unfair in the one-skill-installed eval workspace)
Skill content bugs surfaced by false passes:
- speech-to-text: fix invalid convert.with_raw_response(...) chain
(raises AttributeError; verified against elevenlabs 2.60.0)
- text-to-speech: fix audio.pipe(...) on the web ReadableStream returned
by JS SDK 2.x (bridge via Readable.fromWeb)
- voice-changer: description now excludes voice cloning (was the only
hard trigger failure)
- setup-api-key: fix duplicate step numbering
Verified: triggers 156/156 (68 rerun live), functional 123/124.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Fix speech engine mic expectation token
* Remove comma from getUserMedia token so the whitespace-split grader can match it
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Make functional-eval timeout kill portable to Windows
os.killpg/signal.SIGKILL and setsid-based process groups are POSIX-only;
use taskkill /F /T on Windows and only pass start_new_session on POSIX.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Stabilize eval expectations
* Fix remaining flaky evals surfaced by rerun
- Harmonize the ElevenLabs() constructor expectation in the four
remaining files (speech-to-text, voice-isolator, music, sound-effects):
nested agents alternate between ElevenLabs() and ElevenLabs(api_key=...)
run to run; anchor on 'ElevenLabs(' which matches both
- setup-api-key eval-2 'provides steps' false-failed a response that gave
a full numbered create-key walkthrough (semantic check needed 2
indicator words, response had 1); reworded to stable tokens
- Add missing/401/cause to the causes semantic indicators: in the keyless
eval workspace, 'no key configured' is the correct 401 diagnosis and
should count as suggesting a cause
- agents SKILL.md description: qualify 'customer service bots' as
voice-based and exclude text-only chatbots — the claude-API chatbot
negative was a coin flip because the description invited text-bot reads
- setup-api-key trigger: replace the ElevenLabs Scribe capability
negative (still ElevenLabs-topical, flaky in the one-skill workspace)
with a deepgram key-setup question — same boundary, structurally fair
All updated expectations statically verified against artifacts from all
four 2026-08-03 runs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Require exact filenames in eval expectations
* Stabilize three more grader false-fails from third rerun
- speech-to-text eval-1: 'Prints or returns result.text' failed a correct
script that used getattr(result, "text") + print(text); anchor on
'print(' and 'text' instead of the literal attribute chain
- sound-effects eval-1: quote-attached tokens ('thunder / rain') in a
pre-existing expectation can never match the whitespace-split grader;
unquoted rewording verified against all four runs
- setup-api-key eval-2: remove 'Suggests common causes' — every run
phrases the (correct) 401 diagnosis differently and the adjacent
'Reports that ELEVENLABS_API_KEY is not configured...' expectation
already covers it
- speech-engine eval-2: proactively fix the comma-attached
onTranscript(transcript, signal, session) signature tokens found by a
full punctuation audit (would false-fail on TS-typed signatures); all
other flagged tokens are graded by pattern checks and are safe
All rewordings statically verified PASS against artifacts from all four
2026-08-03 runs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Require the SDK explicitly in prompts that grade SDK usage
Fourth rerun failed all three SDK-pattern expectations in speech-to-text
eval-1 at once: the nested agent wrote a Python script that shells out to
curl against the REST API. With no SDK installed in the sandbox, dodging
an unverifiable import is reasonable behavior whenever the prompt only
says "using ElevenLabs" — the same root cause as the earlier
sound-effects raw-urllib failure.
Swept all prompts whose expectations grade SDK usage and pinned the five
with the gap (speech-to-text 1-3, text-to-speech 2, music 1) to name the
SDK explicitly. Explanatory "show me how" prompts and the Speech Engine
server (SDK-only APIs) left as-is.
Live-verified: speech-to-text 14/14 and text-to-speech 16/16 after the
change.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Procedures reached the Python and JavaScript SDKs in 2.60.0, so document them
next to the existing curl examples: the endpoint-to-method mapping for all nine
operations, the argument shapes that differ by language, and the compile and
publish flow.
Give each fact one home. SKILL.md carries the CRUD and publish sequence;
references/writing-procedures.md sends the reader to the public procedure docs
and summarizes them for authoring content, under the field names that go in
trigger and content.
Correct two claims that do not hold against the API. A procedure may open with
a branch step, which the docs say it may not. Compiling concerns structured
procedures only, so a branch that only saw free-form edits publishes with no
compile and no workflow in the body.
Drop the structured-content constraint rules that compile already enforces and
that go stale as the schema moves, keeping the step shape needed to author
without an API call. In their place, state the loop: save the draft, compile,
repair what it reports, publish the compiled workflow.
Trim the evals to one case per documented trap and drop the trigger queries
that duplicated another's signal.
Rename use-procedure-api to agent-procedures so the skill name describes
the domain rather than the transport.
Document the content schema the API accepts: free-form inline reference
markup, the deterministic step types, and the branch step rules. Move
craft guidance into references/writing-procedures.md.
Drop the validate-structured-procedure endpoint, which is not public, and
state that compile is the validation step for structured content. Spell
out that compile is branch-level and that a publish omitting the compiled
workflow silently keeps the stale one.
Add agents/ negative trigger cases for procedure queries so the two
skills do not compete.
The parameter is being dropped from the docs; finetune_id and the rest
of the Music Finetunes documentation remain unchanged.
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>