Skip to content

Commit c270c3d

Browse files
agents,phone,conversations: post-ship review fixes + fresh defaults (v0.3.1)
Codex (gpt-5.4, xhigh) post-ship review of v0.3.0 caught six concrete bugs + a batch of stale defaults and outdated copy. All fixed here. Review report at docs/reference/post-ship-review-v0.3.0.md. Response-shape bugs - `agents llms`: now reads `llms[].llm` (not non-existent `llm_id`) and displays the fields that actually exist — max_context_limit, max_tokens_limit, supports_{image,document,parallel_tool}_input, available_reasoning_efforts, deprecation_info. Human-mode table was rendering blank IDs before; JSON mode always worked. - `agents knowledge search`: now reads the spec-correct KnowledgeBaseContentSearchResult shape (document.{id,name,type} + search_snippet[].{value,is_hit} + score) and bolds matching snippet segments. Previous wiring looked for flat document_name / content that never existed. Outbound-call body drift - `phone call --dynamic-variables` deep-merges into any existing client-data.dynamic_variables map instead of wholesale replacement. Help text had promised merge; code now matches. - `phone call --record` errors client-side on SIP-trunk numbers (exit 3). The OpenAPI spec only defines call_recording_enabled on the Twilio outbound-call body; SIP was silently dropping the field. - `phone call --ringing-timeout-secs` clap-validated to 1..=999 per TelephonyCallConfig.ringing_timeout_secs spec range. Shared client plumbing - New `ElevenLabsClient::get_bytes` for binary-body GETs. Used by `conversations audio`. Replaces a private helper that had drifted from `check_status` (no detail.message extraction, no redaction parity). Same secret-redacting + short-message error shape as every other command. Fresh defaults (cross-checked against the vendored OpenAPI spec + the April 2026 ElevenLabs models doc) - `agents create --llm`: gemini-3.1-flash-lite-preview → gemini-2.5-flash. Matches PromptAgentAPIModel.llm spec default. - `agents create --max-duration-seconds`: 300 → 600. Matches ConversationConfig.max_duration_seconds spec default. - AGENT_TTS_MODEL_IDS reordered: eleven_flash_v2_5 first (recommended), eleven_turbo_v2{,_5} last and marked DEPRECATED in gotchas/help. - Two stale `gemini-3.1-flash-preview` help examples replaced with `gemini-2.5-flash` (the preview isn't in the LLM enum). - Dropped "Creator+ at the time of writing" unverified tier claims; we now say "requires a plan with expressive TTS" and surface the API's own error string as the fallback. Docs hygiene - README: homebrew tap 199-biotechnologies/tap → paperfoot/tap; drop "grounded against elevenlabs-js v2.43" claim in favour of a pointer to the vendored OpenAPI spec; command summary lists every v0.3.0 addition (agents llms/signed-url/knowledge, conversations audio, phone call --client-data / --record / --ringing-timeout-secs). - docs/reference/spec-audit-v0.2.2.md renamed to spec-audit-pre-v0.3.0.md with a banner flagging it as historical. - docs/reference/README.md fixed: removed broken reference to a non-existent audit-prompt.md; added "Historical audits" index linking the two captured reports. Test suite still green (36 suites). cargo fmt + cargo clippy clean. CHANGELOG: [0.3.1] — 2026-04-21.
1 parent ba0b86d commit c270c3d

16 files changed

Lines changed: 452 additions & 126 deletions

CHANGELOG.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,92 @@
33
All notable changes to `elevenlabs-cli` are listed here.
44
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning is [SemVer](https://semver.org).
55

6+
## [0.3.1] — 2026-04-21
7+
8+
Post-ship review of v0.3.0 (Codex, gpt-5.4 xhigh) caught six real bugs +
9+
a batch of stale defaults. All fixed here. Review report vendored at
10+
`docs/reference/post-ship-review-v0.3.0.md`.
11+
12+
### Fixed — response-shape bugs in the new v0.3.0 commands
13+
14+
- `agents llms` now parses the real response shape. The spec's
15+
`LLMListResponseModel` returns `llms[].llm` (plus `max_tokens_limit`,
16+
`max_context_limit`, `supports_image_input`, `supports_document_input`,
17+
`supports_parallel_tool_calls`, `available_reasoning_efforts`,
18+
`deprecation_info`). The initial wiring looked for `llm_id` / `id` /
19+
`display_name` / `provider` — which don't exist — so the human-mode
20+
table was rendering blank IDs. JSON mode always worked.
21+
- `agents knowledge search` now parses the real response shape. The
22+
spec's `KnowledgeBaseContentSearchResult` returns
23+
`document.{id,name,type}` + `search_snippet[].{value,is_hit}` + `score`.
24+
The initial wiring looked for flat `document_name` / `document_id` +
25+
`content` / `chunk` — fields that don't exist. TTY output now renders
26+
doc name + type + id, bolds the matching snippet segments, and shows
27+
the relevance score.
28+
29+
### Fixed — outbound-call body drift
30+
31+
- **P0** `phone call --dynamic-variables` no longer replaces the full
32+
`dynamic_variables` object when passed alongside `--client-data`.
33+
Previous behaviour dropped any keys present in
34+
`--client-data.dynamic_variables` that weren't also in
35+
`--dynamic-variables`. Now deep-merges (incoming wins on key clash,
36+
unrelated keys preserved). Help text promised a merge — now the code
37+
matches.
38+
- **P0** `phone call --record` is now rejected client-side on SIP-trunk
39+
numbers. The OpenAPI spec only defines `call_recording_enabled` on
40+
the Twilio outbound-call body; SIP silently dropped the field. Exit 3
41+
with a concrete suggestion when the provider isn't Twilio.
42+
- `phone call --ringing-timeout-secs` is now range-validated in clap
43+
(1-999, matching `TelephonyCallConfig.ringing_timeout_secs` in the
44+
spec). Bad values fail fast with an exit-3 clap error instead of a
45+
422 at the server.
46+
47+
### Fixed — shared client plumbing
48+
49+
- `conversations audio` now goes through a new `ElevenLabsClient::get_bytes`
50+
method that reuses `check_status` — so large error pages, proxy HTML,
51+
and `detail.message`-style bodies get the same short, secret-redacted
52+
error shape every other command produces. v0.3.0's private helper in
53+
`conversations.rs` had drifted from `check_status` by skipping the
54+
message extractor.
55+
56+
### Changed — defaults now track the OpenAPI spec + public docs
57+
58+
- `agents create --llm` default: `gemini-3.1-flash-lite-preview`
59+
`gemini-2.5-flash`. Matches `PromptAgentAPIModel.llm` default in the
60+
current OpenAPI spec and the April 2026 ElevenLabs blog post naming
61+
Gemini 2.5 Flash as the recommended default for Conversational AI.
62+
- `agents create --max-duration-seconds` default: 300 → 600. Matches
63+
`ConversationConfig.max_duration_seconds` default in the OpenAPI spec.
64+
- The `AGENT_TTS_MODEL_IDS` allowlist is unchanged (server-enforced)
65+
but re-ordered with `eleven_flash_v2_5` first and
66+
`eleven_turbo_v2{_5,}` at the end, now marked **DEPRECATED** in the
67+
gotchas / help copy per the public models docs.
68+
- Two stale `gemini-3.1-flash-preview` help examples replaced with
69+
`gemini-2.5-flash` (the preview model isn't in the `LLM` enum).
70+
71+
### Changed — doc copy hygiene
72+
73+
- Dropped "Creator+ at the time of writing" tier language from
74+
`agents create --help`, `agents update --help`, `agent-info`, and
75+
`cli.rs`. The expressive-mode docs don't name a tier and tiers have
76+
shifted; we now just say "requires a plan with expressive TTS — if
77+
the API returns 'Expressive TTS is not allowed', upgrade".
78+
- README: homebrew tap switched from the deprecated
79+
`199-biotechnologies/tap` to `paperfoot/tap`. The "grounded against
80+
elevenlabs-js v2.43 SDK" statement is replaced by a pointer to the
81+
vendored `docs/reference/openapi.elevenlabs.json` snapshot.
82+
- README command summary now lists every v0.3.0 addition (`agents llms`,
83+
`agents signed-url`, `agents knowledge {list,search,refresh}`,
84+
`conversations audio`, and the new `phone call` override flags).
85+
- `docs/reference/spec-audit-v0.2.2.md` renamed to
86+
`spec-audit-pre-v0.3.0.md` with a banner flagging it as historical
87+
and pointing at the v0.3.0 post-ship review.
88+
- `docs/reference/README.md` fixed: removed a broken reference to a
89+
non-existent `audit-prompt.md`; added a "Historical audits" section
90+
linking the two captured reports.
91+
692
## [0.3.0] — 2026-04-21
793

894
Driven by an OpenAPI spec audit (Codex, GPT-5.4 xhigh) against the

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "elevenlabs"
3-
version = "0.3.0"
3+
version = "0.3.1"
44
edition = "2024"
55
rust-version = "1.85"
66
description = "Agent-friendly CLI for the ElevenLabs AI audio platform (TTS, STT, voices, agents, music)"

README.md

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ elevenlabs phone call agent_xxx --from-id phnum_yyy --to +14155551234
4545

4646
Every command auto-switches between **coloured human output** (terminal) and **JSON envelopes** (piped / `--json`). Exit codes are semantic (`0=ok, 1=transient, 2=config, 3=bad input, 4=rate limited`). Errors carry a machine-readable `code` and an actionable `suggestion` an AI agent can follow literally.
4747

48-
**Grounded against the official [elevenlabs-js v2.43 SDK](https://github.com/elevenlabs/elevenlabs-js)** — every request/response type in this CLI was verified against the Fern-generated schema that ElevenLabs ships for their own SDK.
48+
**Grounded against the live OpenAPI spec** — every request/response type is verified against the vendored snapshot at [`docs/reference/openapi.elevenlabs.json`](docs/reference/openapi.elevenlabs.json), refreshable in one command via [`./docs/reference/refresh.sh`](docs/reference/refresh.sh).
4949

5050
---
5151

@@ -56,8 +56,9 @@ Every command auto-switches between **coloured human output** (terminal) and **J
5656
cargo install elevenlabs # crate name is `elevenlabs`, binary name is `elevenlabs`
5757

5858
# Homebrew (macOS, Linux)
59-
brew tap 199-biotechnologies/tap
59+
brew tap paperfoot/tap
6060
brew install elevenlabs
61+
# (old tap `199-biotechnologies/tap` is deprecated — `brew untap` it after switching)
6162

6263
# Prebuilt binaries — Linux, macOS (x86_64 + arm64), Windows
6364
curl -L https://github.com/paperfoot/elevenlabs-cli/releases/latest/download/elevenlabs-$(uname -s)-$(uname -m).tar.gz | tar xz
@@ -271,21 +272,30 @@ elevenlabs agents show <agent_id> # alias: get
271272
elevenlabs agents create <name>
272273
--system-prompt "..."
273274
[--first-message "Hi, how can I help?"]
274-
[--voice-id ID] [--language en] [--llm gemini-3.1-flash-lite-preview]
275+
[--voice-id ID] [--language en] [--llm gemini-2.5-flash]
275276
[--temperature 0.5] [--model-id eleven_flash_v2_5]
276-
[--expressive-mode] [--max-duration-seconds 300]
277+
[--expressive-mode] [--max-duration-seconds 600]
278+
[--voicemail-detection] [--voicemail-message "..."]
277279
elevenlabs agents update <agent_id> --patch patch.json
278-
elevenlabs agents delete <agent_id> # alias: rm
280+
elevenlabs agents duplicate <agent_id> [--name "Clone"]
281+
elevenlabs agents delete <agent_id> # alias: rm
282+
elevenlabs agents llms # list the backend-accepted LLM allowlist
283+
elevenlabs agents signed-url <agent_id> # short-lived widget/web URL
279284
elevenlabs agents add-knowledge <agent_id> <name> (--url URL | --file PATH | --text "...")
285+
elevenlabs agents knowledge list [--search TERM] # aliases: ls
286+
elevenlabs agents knowledge search <query> [--document-id ID] [--limit 10]
287+
elevenlabs agents knowledge refresh <document_id>
280288

281-
# --model-id allowlist: eleven_turbo_v2, eleven_turbo_v2_5, eleven_flash_v2,
282-
# eleven_flash_v2_5, eleven_multilingual_v2, eleven_v3_conversational.
283-
# Pass `eleven_v3` and you'll get an exit-3 error — that's the dialogue/ttv
284-
# model, not the realtime agent model. Use eleven_v3_conversational instead.
285-
# --expressive-mode auto-upgrades to eleven_v3_conversational.
289+
# --model-id allowlist: eleven_flash_v2_5 (recommended), eleven_flash_v2,
290+
# eleven_multilingual_v2, eleven_v3_conversational. eleven_turbo_v2_5 and
291+
# eleven_turbo_v2 are accepted but deprecated — prefer flash equivalents.
292+
# Passing `eleven_v3` is caught pre-flight (exit 3) — that's the dialogue/ttv
293+
# model, not the realtime agent model. --expressive-mode auto-upgrades to
294+
# eleven_v3_conversational.
286295

287296
elevenlabs conversations list [--agent-id ID] [--page-size 30] [--cursor TOKEN]
288297
elevenlabs conversations show <conversation_id>
298+
elevenlabs conversations audio <conversation_id> [-o call.mp3]
289299
```
290300
291301
</details>
@@ -296,7 +306,10 @@ elevenlabs conversations show <conversation_id>
296306
```bash
297307
elevenlabs phone list
298308
elevenlabs phone call <agent_id> --from-id <phone_number_id> --to +14155551234
299-
[--dynamic-variables '{"name":"Alex"}'] # or @vars.json
309+
[--dynamic-variables '{"name":"Alex"}'] # or @vars.json
310+
[--client-data '{"conversation_config_override": {...}}']
311+
[--record] # Twilio only
312+
[--ringing-timeout-secs 25] # 1-999
300313
```
301314
302315
</details>

docs/reference/README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,13 @@ upstream API change or before opening a coverage-audit PR.
2626
# Compare CLI coverage to spec:
2727
diff <(awk '{print $1, $2}' docs/reference/endpoints-inventory.txt | sort -u) \
2828
<(awk '{print $1, $2}' docs/reference/cli-endpoints.txt | sort -u)
29-
30-
# Or let Codex do it (see docs/reference/audit-prompt.md for the brief
31-
# we used to seed an audit in 2026-04).
3229
```
3330

31+
## Historical audits
32+
33+
- [`spec-audit-pre-v0.3.0.md`](spec-audit-pre-v0.3.0.md) — Codex audit of
34+
v0.2.2 that drove the v0.3.0 release (2026-04-21).
35+
- [`post-ship-review-v0.3.0.md`](post-ship-review-v0.3.0.md) — follow-up
36+
review of the v0.3.0 work that drove v0.3.1 (same day).
37+
3438
Upstream-spec URL: https://api.elevenlabs.io/openapi.json

0 commit comments

Comments
 (0)