From f00d76ef45e03131aca0b4a7fba030cf16cca527 Mon Sep 17 00:00:00 2001 From: August Date: Mon, 31 Aug 2026 15:32:33 +0000 Subject: [PATCH 01/12] feat(docs): publish the changelog with an August backfill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the changelog as a Fern changelog folder under Platform, linked from the navbar, backfilled with the customer-facing documentation changes from August 2026. This is phase 1 of the changelog effort: the page and its content only. The collection, classification, and rendering pipeline that produced most of these entries stays on august-20260813-auto-changelog and lands separately, so the published changelog can be reviewed without the machinery behind it. Entries for 2026-08-05 through 2026-08-19 come from that pipeline's batches. The 2026-08-28 entry (Brand Identity Verification, #543) is hand-written — it merged after the last batch window closed. Co-Authored-By: Claude Opus 5 (1M context) --- fern/docs.yml | 3 ++ .../platform/changelog/2026-08-05.mdx | 16 +++++++++ .../platform/changelog/2026-08-06.mdx | 12 +++++++ .../platform/changelog/2026-08-10.mdx | 13 +++++++ .../platform/changelog/2026-08-13.mdx | 13 +++++++ .../platform/changelog/2026-08-17.mdx | 12 +++++++ .../platform/changelog/2026-08-19.mdx | 35 +++++++++++++++++++ .../platform/changelog/2026-08-28.mdx | 15 ++++++++ fern/products/platform/changelog/overview.mdx | 9 +++++ fern/products/platform/platform.yml | 3 ++ 10 files changed, 131 insertions(+) create mode 100644 fern/products/platform/changelog/2026-08-05.mdx create mode 100644 fern/products/platform/changelog/2026-08-06.mdx create mode 100644 fern/products/platform/changelog/2026-08-10.mdx create mode 100644 fern/products/platform/changelog/2026-08-13.mdx create mode 100644 fern/products/platform/changelog/2026-08-17.mdx create mode 100644 fern/products/platform/changelog/2026-08-19.mdx create mode 100644 fern/products/platform/changelog/2026-08-28.mdx create mode 100644 fern/products/platform/changelog/overview.mdx diff --git a/fern/docs.yml b/fern/docs.yml index 7ba739f4ad..180e8b9953 100644 --- a/fern/docs.yml +++ b/fern/docs.yml @@ -133,6 +133,9 @@ navbar-links: - type: minimal text: llms.txt href: https://signalwire.com/docs/llms.txt + - type: minimal + text: Changelog + href: https://signalwire.com/docs/platform/changelog - type: minimal text: Log in href: https://signalwire.com/signin diff --git a/fern/products/platform/changelog/2026-08-05.mdx b/fern/products/platform/changelog/2026-08-05.mdx new file mode 100644 index 0000000000..0be298e7d3 --- /dev/null +++ b/fern/products/platform/changelog/2026-08-05.mdx @@ -0,0 +1,16 @@ +--- +tags: ["platform"] +--- + +## Six new text-to-speech engines + +Groq, Mistral, Grok, Smallest.ai, Fish Audio, and Speechify are documented as text-to-speech engines, each with its models, voices, and usage. The `groq-tts` engine replaces the retired `playai-turbo`. Rime's `arcana` model is deprecated in favor of `coda`. + +New pages: + +- [Groq](/docs/platform/voice/tts/groq-tts) +- [Mistral](/docs/platform/voice/tts/mistral) +- [Grok](/docs/platform/voice/tts/grok) +- [Smallest.ai](/docs/platform/voice/tts/smallest) +- [Fish Audio](/docs/platform/voice/tts/fish) +- [Speechify](/docs/platform/voice/tts/speechify) diff --git a/fern/products/platform/changelog/2026-08-06.mdx b/fern/products/platform/changelog/2026-08-06.mdx new file mode 100644 index 0000000000..e926d3608a --- /dev/null +++ b/fern/products/platform/changelog/2026-08-06.mdx @@ -0,0 +1,12 @@ +--- +tags: ["platform"] +--- + +## E911 registration is self-service through the REST API + +You can now register an emergency address and enable E911 on a number yourself, instead of filing a support ticket. The E911 guide covers creating a carrier-validated address, assigning it to a number, and waiting for `e911_status` to become `active`, with examples rendered from the API spec. + +Updated pages: + +- [E911](/docs/platform/e911) +- [Port phone numbers to SignalWire](/docs/platform/porting-into-signalwire) diff --git a/fern/products/platform/changelog/2026-08-10.mdx b/fern/products/platform/changelog/2026-08-10.mdx new file mode 100644 index 0000000000..889683e0a9 --- /dev/null +++ b/fern/products/platform/changelog/2026-08-10.mdx @@ -0,0 +1,13 @@ +--- +tags: ["platform"] +--- + +## New guide for AI tool calling + +A new tool calling guide covers the mental model where the AI agent runs the conversation and your code owns the business logic, how a SWAIG function works, and a complete order-status agent in both SWML and the Python Server SDK. The best practices guide is rewritten around writing for realtime voice, speech-recognition hints, and testing with post-prompt reports. + +Updated pages: + +- [Tool calling](/docs/platform/ai/tool-calling) +- [Best practices for creating a SignalWire AI agent](/docs/platform/ai/best-practices) +- [SignalWire AI](/docs/platform/ai) diff --git a/fern/products/platform/changelog/2026-08-13.mdx b/fern/products/platform/changelog/2026-08-13.mdx new file mode 100644 index 0000000000..5396aa094c --- /dev/null +++ b/fern/products/platform/changelog/2026-08-13.mdx @@ -0,0 +1,13 @@ +--- +tags: ["apis"] +--- + +## AI post-prompt and debug webhooks fully documented + +The REST API reference now defines the AI post-prompt callback, the AI debug webhook, and the Bedrock post-prompt callback — including roughly 20 previously undocumented post-prompt fields and the 47 event types the debug stream can carry. The SWML ai and amazon_bedrock pages embed these definitions, so the payload lists track the spec instead of drifting. + +Updated pages: + +- [`ai` method reference](/docs/swml/reference/calling/ai) +- [`ai.params` reference](/docs/swml/reference/calling/ai/params) +- [`amazon_bedrock` method reference](/docs/swml/reference/calling/amazon-bedrock) diff --git a/fern/products/platform/changelog/2026-08-17.mdx b/fern/products/platform/changelog/2026-08-17.mdx new file mode 100644 index 0000000000..68998a3123 --- /dev/null +++ b/fern/products/platform/changelog/2026-08-17.mdx @@ -0,0 +1,12 @@ +--- +tags: ["apis"] +--- + +## Chat with an AI agent over the REST API + +New documentation for the AI chat API: hold a text conversation with the same AI agent a phone call would reach, over a JSON-RPC endpoint with six methods. A guide covers both connection paths, the Python Server SDK reference documents the new AIChatClient and ChatGateway classes, and the error codes page gains the JSON-RPC error table. + +New pages: + +- [AIChatClient](/docs/server-sdks/reference/python/agents/ai-chat-client) +- [ChatGateway](/docs/server-sdks/reference/python/agents/chat-gateway) diff --git a/fern/products/platform/changelog/2026-08-19.mdx b/fern/products/platform/changelog/2026-08-19.mdx new file mode 100644 index 0000000000..dd86888f60 --- /dev/null +++ b/fern/products/platform/changelog/2026-08-19.mdx @@ -0,0 +1,35 @@ +--- +tags: ["platform","swml"] +--- + +## New SWML reference for ai.multilingual + +The new ai.multilingual reference documents how one AI agent detects the language a caller speaks and answers in it, switching whenever the caller does — you give it a voice per language and it selects the match. Voice examples across the docs now always name their TTS engine, since a bare voice ID only works while it matches the platform default, which can change. + +Updated pages: + +- [`ai.multilingual` reference](/docs/swml/reference/calling/ai/multilingual) +- [`ai.languages` reference](/docs/swml/reference/calling/ai/languages) +- [`ai.params` reference](/docs/swml/reference/calling/ai/params) +- [`ai` method reference](/docs/swml/reference/calling/ai) + +## AI section adds analytics and quickstart guides + +Two new guides land in the AI section: Conversation analytics, covering how to analyze conversations with post-prompt reports and troubleshoot live calls with debug webhooks, and a Quickstart. The AI overview, prompt engineering, best practices, and content redaction pages are rewritten and consolidated around them. + +Updated pages: + +- [Conversation analytics](/docs/platform/ai/analytics) +- [Quickstart](/docs/platform/ai/quickstart) +- [System-directed AI](/docs/platform/ai) +- [Prompt engineering](/docs/platform/ai/prompt-engineering) +- [Handling sensitive content](/docs/platform/ai/content-redaction) + +## Verify SWML request signatures + +A new guide documents the HMAC signature SignalWire sends in the X-Signalwire-Signature header with every request for a SWML document, and shows how to verify it in Node, Python, or Ruby so your endpoint can reject forged requests. The signing isn't new — the documentation is, and the handle-incoming-calls guide now points to it. + +Updated pages: + +- [Verify SWML request signatures](/docs/swml/guides/webhook-security) +- [Handle incoming calls from code](/docs/swml/guides/remote-server) diff --git a/fern/products/platform/changelog/2026-08-28.mdx b/fern/products/platform/changelog/2026-08-28.mdx new file mode 100644 index 0000000000..84d7ae8b65 --- /dev/null +++ b/fern/products/platform/changelog/2026-08-28.mdx @@ -0,0 +1,15 @@ +--- +tags: ["platform"] +--- + +## Brand Identity Verification documented as its own gate + +10DLC registration has two separate approval gates, and the docs described only one. A new section covers Brand Identity Verification: what The Campaign Registry checks against third-party identity data, the `pending`, `unverified`, and `completed` states, and the `brand_activated` and `brand_unverified` status callbacks. Campaigns cannot be created until a Brand reaches `completed`, which is upstream of DCA election entirely. + +The section also explains why a Brand with every field correct can still come back unverified — a recently issued EIN, a non-US entity, or 501(c) tax-exempt status — and gives the three remedies: correct and resubmit, appeal with supporting documentation, or external vetting. + +Updated pages: + +- [Campaign Service Providers](/docs/platform/messaging/campaign-registry/campaign-service-providers) +- [Registration](/docs/platform/messaging/campaign-registry/registration) +- [The Campaign Registry](/docs/platform/messaging/campaign-registry) diff --git a/fern/products/platform/changelog/overview.mdx b/fern/products/platform/changelog/overview.mdx new file mode 100644 index 0000000000..3034a06a39 --- /dev/null +++ b/fern/products/platform/changelog/overview.mdx @@ -0,0 +1,9 @@ +--- +title: "Changelog" +description: New pages, API reference updates, and corrections to the SignalWire documentation, newest first. +max-toc-depth: 3 +--- + +What changed in the SignalWire documentation: new guides, new endpoints and fields in the API reference, and behavior changes worth knowing about. + +To follow along in a feed reader, append `.rss` to this page's URL. diff --git a/fern/products/platform/platform.yml b/fern/products/platform/platform.yml index 195e7ecf9e..0a97d7b1f0 100644 --- a/fern/products/platform/platform.yml +++ b/fern/products/platform/platform.yml @@ -21,6 +21,9 @@ navigation: - page: Get started path: ./pages/getting-started.mdx icon: fa-regular fa-home + - changelog: ./changelog + title: Changelog + icon: regular clock - folder: ./pages/platform/setup title: Setup title-source: frontmatter From 1b935b3a4a038c6436dd61346980c198851313f0 Mon Sep 17 00:00:00 2001 From: August Date: Mon, 31 Aug 2026 17:43:05 +0000 Subject: [PATCH 02/12] docs(changelog): rewrite the backfill as a product changelog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The August entries were written as a documentation changelog — titles like "New guide for AI tool calling" and "AI post-prompt and debug webhooks fully documented" describe authoring activity rather than what a customer can do. This is a product changelog, and Product, Marketing, and PMs are being onboarded to write against it, so the eight entries are the pattern they will copy on day one. Follows Fern's own convention: short noun-phrase titles, the capability in the first sentence, one to three sentences, links inline instead of a trailing "Updated pages:" list. The substantive change is a breaking change the backfill omitted. On 2026-08-13 the implicit TTS engine moved from gcloud to elevenlabs, so every AI agent that never set a voice changed voice. The 08-17 fix routes bare Google-shaped IDs back to gcloud but does not restore the no-voice default, and bare Azure names still resolve to gcloud. That is now the lead entry for 08-13, behind a titled Warning. The one clause that previously covered this area framed it as documentation hygiene. Other corrections found against specs/ history and the engine source: - Only groq-tts is new among the six TTS engines; playai-turbo was already failing in production rather than being retired while working. - Rime coda gained sampling parameters, which affects callers already naming it directly. - SWML request signing is three years old on the voice path but only dates to June 2026 on messaging. - The AI chat guide is still a .draft and not in nav, so the 08-17 entry no longer claims it exists. - The 08-19 AI reorganization removed pages; the entry now says old URLs redirect, which is what a reader holding a bookmark needs. "Already available" is kept only where leaving it out would mislead — a security control that might read as newly added, payload fields that might read as newly arriving, a compliance gate that might read as a new requirement. A capability nobody was told about is new to the reader however long it shipped ago. Adds _template.mdx for PM authors and a Changelog section to CLAUDE.md carrying the same conventions. Verified: yarn fern-md-check passes on 2832 files; yarn fern-check is back to the expected auth-gated redirects error; every /docs link checked against the target page's own slug frontmatter. Co-Authored-By: Claude Opus 5 (1M context) --- CLAUDE.md | 23 ++++++++ .../platform/changelog/2026-08-05.mdx | 25 +++++---- .../platform/changelog/2026-08-06.mdx | 11 ++-- .../platform/changelog/2026-08-10.mdx | 12 ++--- .../platform/changelog/2026-08-13.mdx | 22 +++++--- .../platform/changelog/2026-08-17.mdx | 9 ++-- .../platform/changelog/2026-08-19.mdx | 32 ++++------- .../platform/changelog/2026-08-28.mdx | 14 ++--- .../products/platform/changelog/_template.mdx | 53 +++++++++++++++++++ fern/products/platform/changelog/overview.mdx | 6 ++- 10 files changed, 135 insertions(+), 72 deletions(-) create mode 100644 fern/products/platform/changelog/_template.mdx diff --git a/CLAUDE.md b/CLAUDE.md index e5a8d5376e..860fed16d3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,6 +12,29 @@ Fern-powered documentation site. Two sources of truth: MDX pages under `fern/pro A SWML-only `.tsp` edit still moves `fern/apis/signalwire-rest/openapi.yaml`, because the REST tree imports the SWML models. Run `yarn build:specs` before committing even a SWML-only change, and expect a large REST diff in a SWML PR. +## Changelog + +`fern/products/platform/changelog/` is a **product** changelog, written for customers and +authored by Product, Marketing, and PMs as well as docs. Copy `_template.mdx` to +`YYYY-MM-DD.mdx` — the date the change reached customers, not the day you wrote it. Several +changes on one date share a file, one `##` heading each. + +- **Never make the documentation the subject.** Banned: "now documented", "the docs now + cover", "previously undocumented", "fully documented", "finally". Write what the reader + can now do or now knows. +- **Titles are short noun phrases**, sentence case, no end punctuation — "Conversation + analytics", not "New guide for conversation analytics". +- One to three sentences, second person, present tense. No marketing adjectives, no emoji. +- A capability nobody was told about is new to the reader however long it shipped ago; don't + hedge it with a ship date. Open "Already available — " only where omitting it would + mislead (a security control, payload fields, a compliance gate). +- **Links inline in prose, never a trailing "Updated pages:" list.** Copy every URL from the + target page's own `slug:` frontmatter, prefixed `/docs//`. Never guess one. +- Breaking changes lead with a titled `` — an untitled callout flattens to plain + prose in the Markdown export and the reader loses the signal. + +Entries are customer-facing, so everything under "Everything here is customer-facing" applies. + ## Everything here is customer-facing Assume no prior knowledge, and never expose internal implementation detail — backend endpoints, transports, engine-side params. Every fact traces to source, a spec, the dashboard, or a ticket; if you can't verify one, write `[NEEDS SOURCE: what's missing]` instead of guessing. diff --git a/fern/products/platform/changelog/2026-08-05.mdx b/fern/products/platform/changelog/2026-08-05.mdx index 0be298e7d3..86fc8fb13c 100644 --- a/fern/products/platform/changelog/2026-08-05.mdx +++ b/fern/products/platform/changelog/2026-08-05.mdx @@ -1,16 +1,21 @@ --- -tags: ["platform"] +tags: ["voice", "tts"] --- -## Six new text-to-speech engines +## Six more text-to-speech engines -Groq, Mistral, Grok, Smallest.ai, Fish Audio, and Speechify are documented as text-to-speech engines, each with its models, voices, and usage. The `groq-tts` engine replaces the retired `playai-turbo`. Rime's `arcana` model is deprecated in favor of `coda`. +Choose [Groq](/docs/platform/voice/tts/groq-tts), [Mistral](/docs/platform/voice/tts/mistral), [Grok](/docs/platform/voice/tts/grok), [Smallest.ai](/docs/platform/voice/tts/smallest), [Fish Audio](/docs/platform/voice/tts/fish), or [Speechify](/docs/platform/voice/tts/speechify) as your TTS engine, each with its own models and voices. -New pages: +Name the engine in your voice string — `groq-tts.autumn`, `speechify.` — so your choice survives a change to the platform default. -- [Groq](/docs/platform/voice/tts/groq-tts) -- [Mistral](/docs/platform/voice/tts/mistral) -- [Grok](/docs/platform/voice/tts/grok) -- [Smallest.ai](/docs/platform/voice/tts/smallest) -- [Fish Audio](/docs/platform/voice/tts/fish) -- [Speechify](/docs/platform/voice/tts/speechify) +## `playai-turbo` is now `groq-tts` + +Groq retired PlayAI in December 2025 and the model stopped answering, so calls on `playai-turbo` were already failing. The engine is renamed `groq-tts` and repointed at Canopy Labs' Orpheus, defaulting to `canopylabs/orpheus-v1-english`. + +Selecting `canopylabs/orpheus-arabic-saudi` requires accepting Canopy Labs' model terms in the [Groq console](https://console.groq.com/) first — requests fail until you do. See [Groq](/docs/platform/voice/tts/groq-tts) for the voice list. + +## Rime `arcana` is served by `coda` + +Rime retired `arcana`. Requests naming it are served by `coda`, so existing configurations keep working untouched. If you already name `coda` directly, it now receives the same sampling parameters as other Rime models — `repetition_penalty`, `temperature`, `top_p`, and `max_tokens`. + +See [Rime](/docs/platform/voice/tts/rime). diff --git a/fern/products/platform/changelog/2026-08-06.mdx b/fern/products/platform/changelog/2026-08-06.mdx index e926d3608a..316df8a66d 100644 --- a/fern/products/platform/changelog/2026-08-06.mdx +++ b/fern/products/platform/changelog/2026-08-06.mdx @@ -1,12 +1,9 @@ --- -tags: ["platform"] +tags: ["voice", "e911"] --- -## E911 registration is self-service through the REST API +## E911 registration over the REST API -You can now register an emergency address and enable E911 on a number yourself, instead of filing a support ticket. The E911 guide covers creating a carrier-validated address, assigning it to a number, and waiting for `e911_status` to become `active`, with examples rendered from the API spec. +Register an emergency address and enable E911 on a US phone number yourself, instead of filing a support ticket. Create a carrier-validated address, assign it to the number, then poll until `e911_status` reads `active`. -Updated pages: - -- [E911](/docs/platform/e911) -- [Port phone numbers to SignalWire](/docs/platform/porting-into-signalwire) +Start with the [E911 guide](/docs/platform/e911). diff --git a/fern/products/platform/changelog/2026-08-10.mdx b/fern/products/platform/changelog/2026-08-10.mdx index 889683e0a9..8962d6baa5 100644 --- a/fern/products/platform/changelog/2026-08-10.mdx +++ b/fern/products/platform/changelog/2026-08-10.mdx @@ -1,13 +1,11 @@ --- -tags: ["platform"] +tags: ["ai"] --- -## New guide for AI tool calling +## Tool calling -A new tool calling guide covers the mental model where the AI agent runs the conversation and your code owns the business logic, how a SWAIG function works, and a complete order-status agent in both SWML and the Python Server SDK. The best practices guide is rewritten around writing for realtime voice, speech-recognition hints, and testing with post-prompt reports. +The AI agent runs the conversation; your code owns the business logic. A SWAIG function is where the two meet — the agent decides when to call it, you decide what it does. The [tool calling guide](/docs/platform/ai/tool-calling) builds a complete order-status agent in both SWML and the Python Server SDK. -Updated pages: +## Prompting for realtime voice -- [Tool calling](/docs/platform/ai/tool-calling) -- [Best practices for creating a SignalWire AI agent](/docs/platform/ai/best-practices) -- [SignalWire AI](/docs/platform/ai) +What changes when a prompt is spoken rather than read: sentence length, speech-recognition hints for names and product terms, and checking results with post-prompt reports. See [best practices](/docs/platform/ai/best-practices). diff --git a/fern/products/platform/changelog/2026-08-13.mdx b/fern/products/platform/changelog/2026-08-13.mdx index 5396aa094c..037022bea1 100644 --- a/fern/products/platform/changelog/2026-08-13.mdx +++ b/fern/products/platform/changelog/2026-08-13.mdx @@ -1,13 +1,21 @@ --- -tags: ["apis"] +tags: ["ai", "voice", "tts", "apis"] --- -## AI post-prompt and debug webhooks fully documented +## Default TTS engine changed to ElevenLabs -The REST API reference now defines the AI post-prompt callback, the AI debug webhook, and the Bedrock post-prompt callback — including roughly 20 previously undocumented post-prompt fields and the 47 event types the debug stream can carry. The SWML ai and amazon_bedrock pages embed these definitions, so the payload lists track the spec instead of drifting. + +An `ai` verb with no `voice` set now speaks with ElevenLabs `mark`. It previously used Google `en-US-Neural2-J`. Name the engine and the voice explicitly to pin what your agent sounds like. + -Updated pages: +The implicit engine — the one applied when a voice string names none — moved from `gcloud` to `elevenlabs` on 13 August. Since 17 August, a bare Google-shaped ID such as `en-US-Neural2-C` is routed back to `gcloud`, so those configurations work as before. -- [`ai` method reference](/docs/swml/reference/calling/ai) -- [`ai.params` reference](/docs/swml/reference/calling/ai/params) -- [`amazon_bedrock` method reference](/docs/swml/reference/calling/amazon-bedrock) +Bare names for other engines are not. An Azure name like `en-US-JennyNeural` has the same shape and also resolves to `gcloud`. A bare name matching no ElevenLabs voice gets the default ElevenLabs voice substituted, so you hear the wrong voice rather than silence. Name the engine every time: `gcloud.en-US-Neural2-A`, `elevenlabs.Rachel`, `azure.en-US-AvaNeural`. + +This reaches into [`ai.languages`](/docs/swml/reference/calling/ai/languages) too — an entry naming no engine of its own inherits the top-level one. + +## Post-prompt and debug webhook payloads + +Already available — these callbacks have fired since 2023. The AI post-prompt callback, the AI debug webhook, and the Bedrock post-prompt callback are specified field by field in the REST API reference: around 20 post-prompt fields, and the 47 event types the debug stream can carry. Build against the payload instead of reading it off a live call. + +The [`ai.params`](/docs/swml/reference/calling/ai/params) and [`amazon_bedrock`](/docs/swml/reference/calling/amazon-bedrock) references carry the same definitions. diff --git a/fern/products/platform/changelog/2026-08-17.mdx b/fern/products/platform/changelog/2026-08-17.mdx index 68998a3123..5c394a3b7c 100644 --- a/fern/products/platform/changelog/2026-08-17.mdx +++ b/fern/products/platform/changelog/2026-08-17.mdx @@ -1,12 +1,9 @@ --- -tags: ["apis"] +tags: ["ai", "apis"] --- ## Chat with an AI agent over the REST API -New documentation for the AI chat API: hold a text conversation with the same AI agent a phone call would reach, over a JSON-RPC endpoint with six methods. A guide covers both connection paths, the Python Server SDK reference documents the new AIChatClient and ChatGateway classes, and the error codes page gains the JSON-RPC error table. +Hold a text conversation with the same AI agent a phone call would reach, over a JSON-RPC endpoint with six methods. The agent keeps its prompt, its tools, and its post-prompt reporting. -New pages: - -- [AIChatClient](/docs/server-sdks/reference/python/agents/ai-chat-client) -- [ChatGateway](/docs/server-sdks/reference/python/agents/chat-gateway) +The Python Server SDK wraps the endpoint in [`AIChatClient`](/docs/server-sdks/reference/python/agents/ai-chat-client) and [`ChatGateway`](/docs/server-sdks/reference/python/agents/chat-gateway). JSON-RPC failures are listed with the rest of the [error codes](/docs/apis/error-codes). diff --git a/fern/products/platform/changelog/2026-08-19.mdx b/fern/products/platform/changelog/2026-08-19.mdx index dd86888f60..02f1e0c0d3 100644 --- a/fern/products/platform/changelog/2026-08-19.mdx +++ b/fern/products/platform/changelog/2026-08-19.mdx @@ -1,35 +1,21 @@ --- -tags: ["platform","swml"] +tags: ["ai", "swml", "security"] --- -## New SWML reference for ai.multilingual +## One AI agent, many languages -The new ai.multilingual reference documents how one AI agent detects the language a caller speaks and answers in it, switching whenever the caller does — you give it a voice per language and it selects the match. Voice examples across the docs now always name their TTS engine, since a bare voice ID only works while it matches the platform default, which can change. +Give an agent a voice per language and it detects what the caller speaks, answers in it, and switches whenever the caller does. `multilingual` and `languages` are mutually exclusive: set both and SignalWire uses `multilingual`, ignoring `languages` entirely. -Updated pages: +See [`ai.multilingual`](/docs/swml/reference/calling/ai/multilingual). -- [`ai.multilingual` reference](/docs/swml/reference/calling/ai/multilingual) -- [`ai.languages` reference](/docs/swml/reference/calling/ai/languages) -- [`ai.params` reference](/docs/swml/reference/calling/ai/params) -- [`ai` method reference](/docs/swml/reference/calling/ai) +## Conversation analytics -## AI section adds analytics and quickstart guides +Analyze finished conversations with post-prompt reports, and troubleshoot live calls with debug webhooks. See [Conversation analytics](/docs/platform/ai/analytics), or start from the [AI quickstart](/docs/platform/ai/quickstart). -Two new guides land in the AI section: Conversation analytics, covering how to analyze conversations with post-prompt reports and troubleshoot live calls with debug webhooks, and a Quickstart. The AI overview, prompt engineering, best practices, and content redaction pages are rewritten and consolidated around them. - -Updated pages: - -- [Conversation analytics](/docs/platform/ai/analytics) -- [Quickstart](/docs/platform/ai/quickstart) -- [System-directed AI](/docs/platform/ai) -- [Prompt engineering](/docs/platform/ai/prompt-engineering) -- [Handling sensitive content](/docs/platform/ai/content-redaction) +The AI section was reorganized around these two pages. `/ai/capabilities`, `/ai/no-code-agents`, and the prompt-engineering subpages now redirect — update any saved links. ## Verify SWML request signatures -A new guide documents the HMAC signature SignalWire sends in the X-Signalwire-Signature header with every request for a SWML document, and shows how to verify it in Node, Python, or Ruby so your endpoint can reject forged requests. The signing isn't new — the documentation is, and the handle-incoming-calls guide now points to it. - -Updated pages: +Already available — SignalWire signs every request for a SWML document with an HMAC in the `X-Signalwire-Signature` header. Verify it in Node, Python, or Ruby so your endpoint can reject forged requests. -- [Verify SWML request signatures](/docs/swml/guides/webhook-security) -- [Handle incoming calls from code](/docs/swml/guides/remote-server) +Signing has been in place on the voice path since 2023; on the messaging path it started in June 2026. See [Verify SWML request signatures](/docs/swml/guides/webhook-security). diff --git a/fern/products/platform/changelog/2026-08-28.mdx b/fern/products/platform/changelog/2026-08-28.mdx index 84d7ae8b65..e16f022ad5 100644 --- a/fern/products/platform/changelog/2026-08-28.mdx +++ b/fern/products/platform/changelog/2026-08-28.mdx @@ -1,15 +1,9 @@ --- -tags: ["platform"] +tags: ["messaging", "compliance"] --- -## Brand Identity Verification documented as its own gate +## Brand Identity Verification -10DLC registration has two separate approval gates, and the docs described only one. A new section covers Brand Identity Verification: what The Campaign Registry checks against third-party identity data, the `pending`, `unverified`, and `completed` states, and the `brand_activated` and `brand_unverified` status callbacks. Campaigns cannot be created until a Brand reaches `completed`, which is upstream of DCA election entirely. +Not a new requirement — 10DLC registration has always had two separate approval gates, not one. Before a Campaign can exist at all, The Campaign Registry checks your EIN, Brand legal name, and EIN issuing country against third-party identity data. That gate sits upstream of DCA election. A Brand reads `pending`, `unverified`, or `completed`, and the `brand_activated` and `brand_unverified` callbacks tell you when it moves. -The section also explains why a Brand with every field correct can still come back unverified — a recently issued EIN, a non-US entity, or 501(c) tax-exempt status — and gives the three remedies: correct and resubmit, appeal with supporting documentation, or external vetting. - -Updated pages: - -- [Campaign Service Providers](/docs/platform/messaging/campaign-registry/campaign-service-providers) -- [Registration](/docs/platform/messaging/campaign-registry/registration) -- [The Campaign Registry](/docs/platform/messaging/campaign-registry) +A Brand with every field correct can still come back unverified — a recently issued EIN, a non-US entity, or 501(c) tax-exempt status. Three remedies: correct and resubmit, appeal with supporting documentation, or external vetting. Read [Campaign Service Providers](/docs/platform/messaging/campaign-registry/campaign-service-providers) if you file with TCR directly, or [Registration](/docs/platform/messaging/campaign-registry/registration) if SignalWire manages your Brand. diff --git a/fern/products/platform/changelog/_template.mdx b/fern/products/platform/changelog/_template.mdx new file mode 100644 index 0000000000..1df36379b2 --- /dev/null +++ b/fern/products/platform/changelog/_template.mdx @@ -0,0 +1,53 @@ +--- +tags: ["ai"] +--- + +{/* + Copy this file to YYYY-MM-DD.mdx and delete these comments. + + DATE The day the change reached customers — not the day you wrote the entry. + One file per date. Several changes on one date go in the same file, + each under its own `##` heading, most important first. + + TAGS Product areas a reader would filter by. Pick one or two: + voice · messaging · ai · video · fabric · sdks + swml · apis · tts · e911 · compliance · security + + TITLE A short noun phrase naming the thing. Sentence case, no end punctuation. + Good: Conversation analytics · Brand Identity Verification + Default TTS engine changed to ElevenLabs + Bad: New guide for tool calling · Analytics fully documented + We're excited to announce analytics! + + BODY One to three sentences. Second person, present tense, active voice. + Open on what the reader can now do, or on the fact itself — never on + the page that describes it. Two short paragraphs are fine when the + change genuinely carries that much (a deprecation, a compliance gate). + + Never write about the documentation. Banned: "now documented", + "the docs now cover", "previously undocumented", "fully documented". + No marketing adjectives, no emoji, no exclamation marks. + + A capability nobody was told about is new to the reader, however long + it has been in production. Do not hedge it with a ship date. + Say "Already available — " only when leaving it out would mislead: + a security control the reader might think just appeared, payload + fields they might think started arriving, a compliance gate they + might read as a new requirement. + + LINKS Inline, in the prose. Never a trailing "Updated pages:" list. + Copy every URL from the target page's own `slug:` frontmatter, + prefixed with /docs//. Never guess a URL. + + ACTION If there is somewhere to go or something to change, close with it. + + BREAKING Lead with a titled . An untitled callout flattens into plain + prose in the Markdown export and the reader loses the signal. +*/} + +## Short noun phrase naming the thing + +What the reader can now do, stated first. One to three sentences. Link the primary +destination [inline](/docs/platform/changelog), not in a list at the bottom. + +Close with where to start, if there is somewhere to go. diff --git a/fern/products/platform/changelog/overview.mdx b/fern/products/platform/changelog/overview.mdx index 3034a06a39..21bc368aa6 100644 --- a/fern/products/platform/changelog/overview.mdx +++ b/fern/products/platform/changelog/overview.mdx @@ -1,9 +1,11 @@ --- title: "Changelog" -description: New pages, API reference updates, and corrections to the SignalWire documentation, newest first. +description: New capabilities, changed defaults, and deprecations across the SignalWire platform, newest first. max-toc-depth: 3 --- -What changed in the SignalWire documentation: new guides, new endpoints and fields in the API reference, and behavior changes worth knowing about. +What's new and what changed across SignalWire: new capabilities, new endpoints and SWML properties, changed defaults, and deprecations. + +An entry earns a place here when it changes what you can build, or how something you already built behaves. To follow along in a feed reader, append `.rss` to this page's URL. From bd11134708c82b8520bbee7a38a0f704ebe9bb34 Mon Sep 17 00:00:00 2001 From: August Date: Mon, 31 Aug 2026 17:57:31 +0000 Subject: [PATCH 03/12] fix(docs): move the changelog to /docs/changelog --- CLAUDE.md | 2 +- fern/docs.yml | 2 +- fern/products/{platform => home}/changelog/2026-08-05.mdx | 0 fern/products/{platform => home}/changelog/2026-08-06.mdx | 0 fern/products/{platform => home}/changelog/2026-08-10.mdx | 0 fern/products/{platform => home}/changelog/2026-08-13.mdx | 0 fern/products/{platform => home}/changelog/2026-08-17.mdx | 0 fern/products/{platform => home}/changelog/2026-08-19.mdx | 0 fern/products/{platform => home}/changelog/2026-08-28.mdx | 0 fern/products/{platform => home}/changelog/_template.mdx | 2 +- fern/products/{platform => home}/changelog/overview.mdx | 0 fern/products/home/home.yml | 3 +++ fern/products/platform/platform.yml | 3 --- 13 files changed, 6 insertions(+), 6 deletions(-) rename fern/products/{platform => home}/changelog/2026-08-05.mdx (100%) rename fern/products/{platform => home}/changelog/2026-08-06.mdx (100%) rename fern/products/{platform => home}/changelog/2026-08-10.mdx (100%) rename fern/products/{platform => home}/changelog/2026-08-13.mdx (100%) rename fern/products/{platform => home}/changelog/2026-08-17.mdx (100%) rename fern/products/{platform => home}/changelog/2026-08-19.mdx (100%) rename fern/products/{platform => home}/changelog/2026-08-28.mdx (100%) rename fern/products/{platform => home}/changelog/_template.mdx (97%) rename fern/products/{platform => home}/changelog/overview.mdx (100%) diff --git a/CLAUDE.md b/CLAUDE.md index 860fed16d3..17ba9c3c29 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,7 +14,7 @@ A SWML-only `.tsp` edit still moves `fern/apis/signalwire-rest/openapi.yaml`, be ## Changelog -`fern/products/platform/changelog/` is a **product** changelog, written for customers and +`fern/products/home/changelog/` is a **product** changelog, written for customers and authored by Product, Marketing, and PMs as well as docs. Copy `_template.mdx` to `YYYY-MM-DD.mdx` — the date the change reached customers, not the day you wrote it. Several changes on one date share a file, one `##` heading each. diff --git a/fern/docs.yml b/fern/docs.yml index 180e8b9953..1aed1ec6cc 100644 --- a/fern/docs.yml +++ b/fern/docs.yml @@ -135,7 +135,7 @@ navbar-links: href: https://signalwire.com/docs/llms.txt - type: minimal text: Changelog - href: https://signalwire.com/docs/platform/changelog + href: https://signalwire.com/docs/changelog - type: minimal text: Log in href: https://signalwire.com/signin diff --git a/fern/products/platform/changelog/2026-08-05.mdx b/fern/products/home/changelog/2026-08-05.mdx similarity index 100% rename from fern/products/platform/changelog/2026-08-05.mdx rename to fern/products/home/changelog/2026-08-05.mdx diff --git a/fern/products/platform/changelog/2026-08-06.mdx b/fern/products/home/changelog/2026-08-06.mdx similarity index 100% rename from fern/products/platform/changelog/2026-08-06.mdx rename to fern/products/home/changelog/2026-08-06.mdx diff --git a/fern/products/platform/changelog/2026-08-10.mdx b/fern/products/home/changelog/2026-08-10.mdx similarity index 100% rename from fern/products/platform/changelog/2026-08-10.mdx rename to fern/products/home/changelog/2026-08-10.mdx diff --git a/fern/products/platform/changelog/2026-08-13.mdx b/fern/products/home/changelog/2026-08-13.mdx similarity index 100% rename from fern/products/platform/changelog/2026-08-13.mdx rename to fern/products/home/changelog/2026-08-13.mdx diff --git a/fern/products/platform/changelog/2026-08-17.mdx b/fern/products/home/changelog/2026-08-17.mdx similarity index 100% rename from fern/products/platform/changelog/2026-08-17.mdx rename to fern/products/home/changelog/2026-08-17.mdx diff --git a/fern/products/platform/changelog/2026-08-19.mdx b/fern/products/home/changelog/2026-08-19.mdx similarity index 100% rename from fern/products/platform/changelog/2026-08-19.mdx rename to fern/products/home/changelog/2026-08-19.mdx diff --git a/fern/products/platform/changelog/2026-08-28.mdx b/fern/products/home/changelog/2026-08-28.mdx similarity index 100% rename from fern/products/platform/changelog/2026-08-28.mdx rename to fern/products/home/changelog/2026-08-28.mdx diff --git a/fern/products/platform/changelog/_template.mdx b/fern/products/home/changelog/_template.mdx similarity index 97% rename from fern/products/platform/changelog/_template.mdx rename to fern/products/home/changelog/_template.mdx index 1df36379b2..491bd476c8 100644 --- a/fern/products/platform/changelog/_template.mdx +++ b/fern/products/home/changelog/_template.mdx @@ -48,6 +48,6 @@ tags: ["ai"] ## Short noun phrase naming the thing What the reader can now do, stated first. One to three sentences. Link the primary -destination [inline](/docs/platform/changelog), not in a list at the bottom. +destination [inline](/docs/changelog), not in a list at the bottom. Close with where to start, if there is somewhere to go. diff --git a/fern/products/platform/changelog/overview.mdx b/fern/products/home/changelog/overview.mdx similarity index 100% rename from fern/products/platform/changelog/overview.mdx rename to fern/products/home/changelog/overview.mdx diff --git a/fern/products/home/home.yml b/fern/products/home/home.yml index d8b2188b29..cf2f0fc3a2 100644 --- a/fern/products/home/home.yml +++ b/fern/products/home/home.yml @@ -1,4 +1,7 @@ navigation: - page: Home path: ./pages/welcome.mdx + - changelog: ./changelog + title: Changelog + icon: regular clock diff --git a/fern/products/platform/platform.yml b/fern/products/platform/platform.yml index 0a97d7b1f0..195e7ecf9e 100644 --- a/fern/products/platform/platform.yml +++ b/fern/products/platform/platform.yml @@ -21,9 +21,6 @@ navigation: - page: Get started path: ./pages/getting-started.mdx icon: fa-regular fa-home - - changelog: ./changelog - title: Changelog - icon: regular clock - folder: ./pages/platform/setup title: Setup title-source: frontmatter From 8db59ad0609855c8d8b91fdd62a0ce3fafb89f97 Mon Sep 17 00:00:00 2001 From: August Date: Mon, 31 Aug 2026 18:23:03 +0000 Subject: [PATCH 04/12] fix(changelog): relative navbar link, remove sidebar/toc --- fern/docs.yml | 2 +- fern/products/home/changelog/2026-08-05.mdx | 1 + fern/products/home/changelog/2026-08-06.mdx | 1 + fern/products/home/changelog/2026-08-10.mdx | 1 + fern/products/home/changelog/2026-08-13.mdx | 1 + fern/products/home/changelog/2026-08-17.mdx | 1 + fern/products/home/changelog/2026-08-19.mdx | 1 + fern/products/home/changelog/2026-08-28.mdx | 1 + fern/products/home/changelog/_template.mdx | 1 + fern/products/home/changelog/overview.mdx | 4 +--- 10 files changed, 10 insertions(+), 4 deletions(-) diff --git a/fern/docs.yml b/fern/docs.yml index e6d92961ce..63db695bf2 100644 --- a/fern/docs.yml +++ b/fern/docs.yml @@ -135,7 +135,7 @@ navbar-links: href: https://signalwire.com/docs/llms.txt - type: minimal text: Changelog - href: https://signalwire.com/docs/changelog + href: /docs/changelog - type: minimal text: Log in href: https://signalwire.com/signin diff --git a/fern/products/home/changelog/2026-08-05.mdx b/fern/products/home/changelog/2026-08-05.mdx index 86fc8fb13c..069b354fd0 100644 --- a/fern/products/home/changelog/2026-08-05.mdx +++ b/fern/products/home/changelog/2026-08-05.mdx @@ -1,5 +1,6 @@ --- tags: ["voice", "tts"] +layout: page --- ## Six more text-to-speech engines diff --git a/fern/products/home/changelog/2026-08-06.mdx b/fern/products/home/changelog/2026-08-06.mdx index 316df8a66d..8bc5d92c0a 100644 --- a/fern/products/home/changelog/2026-08-06.mdx +++ b/fern/products/home/changelog/2026-08-06.mdx @@ -1,5 +1,6 @@ --- tags: ["voice", "e911"] +layout: page --- ## E911 registration over the REST API diff --git a/fern/products/home/changelog/2026-08-10.mdx b/fern/products/home/changelog/2026-08-10.mdx index 8962d6baa5..afb0b68a97 100644 --- a/fern/products/home/changelog/2026-08-10.mdx +++ b/fern/products/home/changelog/2026-08-10.mdx @@ -1,5 +1,6 @@ --- tags: ["ai"] +layout: page --- ## Tool calling diff --git a/fern/products/home/changelog/2026-08-13.mdx b/fern/products/home/changelog/2026-08-13.mdx index 037022bea1..b29de5723d 100644 --- a/fern/products/home/changelog/2026-08-13.mdx +++ b/fern/products/home/changelog/2026-08-13.mdx @@ -1,5 +1,6 @@ --- tags: ["ai", "voice", "tts", "apis"] +layout: page --- ## Default TTS engine changed to ElevenLabs diff --git a/fern/products/home/changelog/2026-08-17.mdx b/fern/products/home/changelog/2026-08-17.mdx index 5c394a3b7c..43ae8fba35 100644 --- a/fern/products/home/changelog/2026-08-17.mdx +++ b/fern/products/home/changelog/2026-08-17.mdx @@ -1,5 +1,6 @@ --- tags: ["ai", "apis"] +layout: page --- ## Chat with an AI agent over the REST API diff --git a/fern/products/home/changelog/2026-08-19.mdx b/fern/products/home/changelog/2026-08-19.mdx index 02f1e0c0d3..5f08c4510a 100644 --- a/fern/products/home/changelog/2026-08-19.mdx +++ b/fern/products/home/changelog/2026-08-19.mdx @@ -1,5 +1,6 @@ --- tags: ["ai", "swml", "security"] +layout: page --- ## One AI agent, many languages diff --git a/fern/products/home/changelog/2026-08-28.mdx b/fern/products/home/changelog/2026-08-28.mdx index e16f022ad5..d02414c630 100644 --- a/fern/products/home/changelog/2026-08-28.mdx +++ b/fern/products/home/changelog/2026-08-28.mdx @@ -1,5 +1,6 @@ --- tags: ["messaging", "compliance"] +layout: page --- ## Brand Identity Verification diff --git a/fern/products/home/changelog/_template.mdx b/fern/products/home/changelog/_template.mdx index 491bd476c8..65be9eba68 100644 --- a/fern/products/home/changelog/_template.mdx +++ b/fern/products/home/changelog/_template.mdx @@ -1,5 +1,6 @@ --- tags: ["ai"] +layout: page --- {/* diff --git a/fern/products/home/changelog/overview.mdx b/fern/products/home/changelog/overview.mdx index 21bc368aa6..f516bfa4b2 100644 --- a/fern/products/home/changelog/overview.mdx +++ b/fern/products/home/changelog/overview.mdx @@ -1,11 +1,9 @@ --- title: "Changelog" description: New capabilities, changed defaults, and deprecations across the SignalWire platform, newest first. -max-toc-depth: 3 +layout: page --- What's new and what changed across SignalWire: new capabilities, new endpoints and SWML properties, changed defaults, and deprecations. -An entry earns a place here when it changes what you can build, or how something you already built behaves. - To follow along in a feed reader, append `.rss` to this page's URL. From 7fb23515c1c97b350f7de3561dbfffe6e37b275b Mon Sep 17 00:00:00 2001 From: August Date: Mon, 31 Aug 2026 18:42:39 +0000 Subject: [PATCH 05/12] fix(docs): give the changelog its own product so its sidebar is empty --- CLAUDE.md | 2 +- fern/docs.yml | 6 ++++++ fern/products/changelog/changelog.yml | 2 ++ fern/products/{home => changelog}/changelog/2026-08-05.mdx | 1 - fern/products/{home => changelog}/changelog/2026-08-06.mdx | 1 - fern/products/{home => changelog}/changelog/2026-08-10.mdx | 1 - fern/products/{home => changelog}/changelog/2026-08-13.mdx | 1 - fern/products/{home => changelog}/changelog/2026-08-17.mdx | 1 - fern/products/{home => changelog}/changelog/2026-08-19.mdx | 1 - fern/products/{home => changelog}/changelog/2026-08-28.mdx | 1 - fern/products/{home => changelog}/changelog/_template.mdx | 1 - fern/products/{home => changelog}/changelog/overview.mdx | 2 +- fern/products/home/home.yml | 3 --- 13 files changed, 10 insertions(+), 13 deletions(-) create mode 100644 fern/products/changelog/changelog.yml rename fern/products/{home => changelog}/changelog/2026-08-05.mdx (99%) rename fern/products/{home => changelog}/changelog/2026-08-06.mdx (96%) rename fern/products/{home => changelog}/changelog/2026-08-10.mdx (97%) rename fern/products/{home => changelog}/changelog/2026-08-13.mdx (99%) rename fern/products/{home => changelog}/changelog/2026-08-17.mdx (97%) rename fern/products/{home => changelog}/changelog/2026-08-19.mdx (98%) rename fern/products/{home => changelog}/changelog/2026-08-28.mdx (98%) rename fern/products/{home => changelog}/changelog/_template.mdx (99%) rename fern/products/{home => changelog}/changelog/overview.mdx (95%) diff --git a/CLAUDE.md b/CLAUDE.md index 17ba9c3c29..8873dfefb1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,7 +14,7 @@ A SWML-only `.tsp` edit still moves `fern/apis/signalwire-rest/openapi.yaml`, be ## Changelog -`fern/products/home/changelog/` is a **product** changelog, written for customers and +`fern/products/changelog/changelog/` is a **product** changelog, written for customers and authored by Product, Marketing, and PMs as well as docs. Copy `_template.mdx` to `YYYY-MM-DD.mdx` — the date the change reached customers, not the day you wrote it. Several changes on one date share a file, one `##` heading each. diff --git a/fern/docs.yml b/fern/docs.yml index 63db695bf2..ec6cc0e274 100644 --- a/fern/docs.yml +++ b/fern/docs.yml @@ -44,6 +44,12 @@ products: icon: fa-regular fa-home subtitle: Overview and getting started + - display-name: Changelog + slug: changelog + path: products/changelog/changelog.yml + icon: fa-regular fa-clock + subtitle: What's new across the platform + # Column 1 (Products) - display-name: Platform slug: platform diff --git a/fern/products/changelog/changelog.yml b/fern/products/changelog/changelog.yml new file mode 100644 index 0000000000..a46186d802 --- /dev/null +++ b/fern/products/changelog/changelog.yml @@ -0,0 +1,2 @@ +navigation: + - changelog: ./changelog diff --git a/fern/products/home/changelog/2026-08-05.mdx b/fern/products/changelog/changelog/2026-08-05.mdx similarity index 99% rename from fern/products/home/changelog/2026-08-05.mdx rename to fern/products/changelog/changelog/2026-08-05.mdx index 069b354fd0..86fc8fb13c 100644 --- a/fern/products/home/changelog/2026-08-05.mdx +++ b/fern/products/changelog/changelog/2026-08-05.mdx @@ -1,6 +1,5 @@ --- tags: ["voice", "tts"] -layout: page --- ## Six more text-to-speech engines diff --git a/fern/products/home/changelog/2026-08-06.mdx b/fern/products/changelog/changelog/2026-08-06.mdx similarity index 96% rename from fern/products/home/changelog/2026-08-06.mdx rename to fern/products/changelog/changelog/2026-08-06.mdx index 8bc5d92c0a..316df8a66d 100644 --- a/fern/products/home/changelog/2026-08-06.mdx +++ b/fern/products/changelog/changelog/2026-08-06.mdx @@ -1,6 +1,5 @@ --- tags: ["voice", "e911"] -layout: page --- ## E911 registration over the REST API diff --git a/fern/products/home/changelog/2026-08-10.mdx b/fern/products/changelog/changelog/2026-08-10.mdx similarity index 97% rename from fern/products/home/changelog/2026-08-10.mdx rename to fern/products/changelog/changelog/2026-08-10.mdx index afb0b68a97..8962d6baa5 100644 --- a/fern/products/home/changelog/2026-08-10.mdx +++ b/fern/products/changelog/changelog/2026-08-10.mdx @@ -1,6 +1,5 @@ --- tags: ["ai"] -layout: page --- ## Tool calling diff --git a/fern/products/home/changelog/2026-08-13.mdx b/fern/products/changelog/changelog/2026-08-13.mdx similarity index 99% rename from fern/products/home/changelog/2026-08-13.mdx rename to fern/products/changelog/changelog/2026-08-13.mdx index b29de5723d..037022bea1 100644 --- a/fern/products/home/changelog/2026-08-13.mdx +++ b/fern/products/changelog/changelog/2026-08-13.mdx @@ -1,6 +1,5 @@ --- tags: ["ai", "voice", "tts", "apis"] -layout: page --- ## Default TTS engine changed to ElevenLabs diff --git a/fern/products/home/changelog/2026-08-17.mdx b/fern/products/changelog/changelog/2026-08-17.mdx similarity index 97% rename from fern/products/home/changelog/2026-08-17.mdx rename to fern/products/changelog/changelog/2026-08-17.mdx index 43ae8fba35..5c394a3b7c 100644 --- a/fern/products/home/changelog/2026-08-17.mdx +++ b/fern/products/changelog/changelog/2026-08-17.mdx @@ -1,6 +1,5 @@ --- tags: ["ai", "apis"] -layout: page --- ## Chat with an AI agent over the REST API diff --git a/fern/products/home/changelog/2026-08-19.mdx b/fern/products/changelog/changelog/2026-08-19.mdx similarity index 98% rename from fern/products/home/changelog/2026-08-19.mdx rename to fern/products/changelog/changelog/2026-08-19.mdx index 5f08c4510a..02f1e0c0d3 100644 --- a/fern/products/home/changelog/2026-08-19.mdx +++ b/fern/products/changelog/changelog/2026-08-19.mdx @@ -1,6 +1,5 @@ --- tags: ["ai", "swml", "security"] -layout: page --- ## One AI agent, many languages diff --git a/fern/products/home/changelog/2026-08-28.mdx b/fern/products/changelog/changelog/2026-08-28.mdx similarity index 98% rename from fern/products/home/changelog/2026-08-28.mdx rename to fern/products/changelog/changelog/2026-08-28.mdx index d02414c630..e16f022ad5 100644 --- a/fern/products/home/changelog/2026-08-28.mdx +++ b/fern/products/changelog/changelog/2026-08-28.mdx @@ -1,6 +1,5 @@ --- tags: ["messaging", "compliance"] -layout: page --- ## Brand Identity Verification diff --git a/fern/products/home/changelog/_template.mdx b/fern/products/changelog/changelog/_template.mdx similarity index 99% rename from fern/products/home/changelog/_template.mdx rename to fern/products/changelog/changelog/_template.mdx index 65be9eba68..491bd476c8 100644 --- a/fern/products/home/changelog/_template.mdx +++ b/fern/products/changelog/changelog/_template.mdx @@ -1,6 +1,5 @@ --- tags: ["ai"] -layout: page --- {/* diff --git a/fern/products/home/changelog/overview.mdx b/fern/products/changelog/changelog/overview.mdx similarity index 95% rename from fern/products/home/changelog/overview.mdx rename to fern/products/changelog/changelog/overview.mdx index f516bfa4b2..cdd94b3584 100644 --- a/fern/products/home/changelog/overview.mdx +++ b/fern/products/changelog/changelog/overview.mdx @@ -1,7 +1,7 @@ --- title: "Changelog" description: New capabilities, changed defaults, and deprecations across the SignalWire platform, newest first. -layout: page +max-toc-depth: 3 --- What's new and what changed across SignalWire: new capabilities, new endpoints and SWML properties, changed defaults, and deprecations. diff --git a/fern/products/home/home.yml b/fern/products/home/home.yml index cf2f0fc3a2..d8b2188b29 100644 --- a/fern/products/home/home.yml +++ b/fern/products/home/home.yml @@ -1,7 +1,4 @@ navigation: - page: Home path: ./pages/welcome.mdx - - changelog: ./changelog - title: Changelog - icon: regular clock From b52b93c831e37b6adf16e98a02083decbba872f8 Mon Sep 17 00:00:00 2001 From: August Date: Tue, 1 Sep 2026 12:10:25 +0000 Subject: [PATCH 06/12] fix(docs): stop the changelog URL doubling to /docs/changelog/changelog --- fern/products/changelog/changelog.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/fern/products/changelog/changelog.yml b/fern/products/changelog/changelog.yml index a46186d802..3dbb6c1cf0 100644 --- a/fern/products/changelog/changelog.yml +++ b/fern/products/changelog/changelog.yml @@ -1,2 +1,3 @@ navigation: - changelog: ./changelog + slug: "" From e9c232cdce63a1ad0672dbef75f37bff4ccef09e Mon Sep 17 00:00:00 2001 From: August Date: Tue, 1 Sep 2026 12:11:02 +0000 Subject: [PATCH 07/12] style(docs): hide the changelog from the product selector and its own sidebar --- fern/brand-overrides.css | 11 +++++++++++ fern/styles.css | 13 ++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/fern/brand-overrides.css b/fern/brand-overrides.css index e1deb249fc..16c10cc890 100644 --- a/fern/brand-overrides.css +++ b/fern/brand-overrides.css @@ -43,6 +43,17 @@ body { background: var(--bg-surface); } +/* --- Changelog: hide its lone sidebar link --- + The changelog is its own product with a single nav entry, so Fern renders + one "Changelog" link into an otherwise empty sidebar. The page is reached + from the navbar, making the link redundant. Hiding it leaves the same empty + sidebar the homepage has. Fern offers no config for this: `hidden: true` on + the nav entry removes the route, not the link, and ChangelogConfiguration + has no skip-slug. --- */ +.fern-sidebar-link[href="/docs/changelog"] { + display: none; +} + /* --- Tables: brand-aligned header and borders --- */ .fern-markdown table th { background: var(--table-header-bg); diff --git a/fern/styles.css b/fern/styles.css index c411bf8256..c90db284b3 100644 --- a/fern/styles.css +++ b/fern/styles.css @@ -278,7 +278,8 @@ a[href*="god.gw.postman.com"] > img { * Column 2 (SDKs): Server SDKs, Browser SDK * Column 3 (APIs): APIs, SWML * - * Home is hidden. Compatibility API appears as a footer link. + * Home and Changelog are hidden — the Changelog is reached from the navbar link. + * Compatibility API appears as a footer link. */ /* Custom SVG product icons — match Font Awesome icon sizing. @@ -315,8 +316,9 @@ a[href*="god.gw.postman.com"] > img { row-gap: 0.5rem; padding: 3rem 1.25rem 0.4rem; - /* Hide Home */ - > a[href="/docs"] { + /* Hide Home and Changelog */ + > a[href="/docs"], + > a[href="/docs/changelog"] { display: none; } @@ -427,8 +429,9 @@ a[href*="god.gw.postman.com"] > img { /* --- Mobile (< 1024 px) --- */ @media (max-width: 1023px) { - /* Hide Home */ - .fern-product-selector-radio-group > a[href="/docs"] { + /* Hide Home and Changelog */ + .fern-product-selector-radio-group > a[href="/docs"], + .fern-product-selector-radio-group > a[href="/docs/changelog"] { display: none !important; } From 208a86dc164276dc562efaddfa8a66f73438bfe5 Mon Sep 17 00:00:00 2001 From: August Date: Wed, 2 Sep 2026 13:34:03 +0000 Subject: [PATCH 08/12] fix(docs): move changelog into Platform product, rewrite entries --- fern/brand-overrides.css | 11 ---- fern/docs.yml | 8 +-- fern/products/changelog/changelog.yml | 3 - .../changelog/changelog/2026-08-05.mdx | 21 ------ .../changelog/changelog/2026-08-10.mdx | 11 ---- .../changelog/changelog/2026-08-13.mdx | 21 ------ .../changelog/changelog/2026-08-19.mdx | 21 ------ .../changelog/changelog/2026-08-28.mdx | 9 --- .../changelog/changelog/_template.mdx | 53 --------------- .../platform/changelog/2026-08-05.mdx | 30 +++++++++ .../changelog/2026-08-06.mdx | 4 +- .../platform/changelog/2026-08-13.mdx | 13 ++++ .../changelog/2026-08-17.mdx | 4 +- .../platform/changelog/2026-08-19.mdx | 9 +++ .../products/platform/changelog/_template.mdx | 66 +++++++++++++++++++ .../changelog/overview.mdx | 0 fern/products/platform/platform.yml | 8 +++ fern/styles.css | 13 ++-- 18 files changed, 136 insertions(+), 169 deletions(-) delete mode 100644 fern/products/changelog/changelog.yml delete mode 100644 fern/products/changelog/changelog/2026-08-05.mdx delete mode 100644 fern/products/changelog/changelog/2026-08-10.mdx delete mode 100644 fern/products/changelog/changelog/2026-08-13.mdx delete mode 100644 fern/products/changelog/changelog/2026-08-19.mdx delete mode 100644 fern/products/changelog/changelog/2026-08-28.mdx delete mode 100644 fern/products/changelog/changelog/_template.mdx create mode 100644 fern/products/platform/changelog/2026-08-05.mdx rename fern/products/{changelog => platform}/changelog/2026-08-06.mdx (80%) create mode 100644 fern/products/platform/changelog/2026-08-13.mdx rename fern/products/{changelog => platform}/changelog/2026-08-17.mdx (57%) create mode 100644 fern/products/platform/changelog/2026-08-19.mdx create mode 100644 fern/products/platform/changelog/_template.mdx rename fern/products/{changelog => platform}/changelog/overview.mdx (100%) diff --git a/fern/brand-overrides.css b/fern/brand-overrides.css index 16c10cc890..e1deb249fc 100644 --- a/fern/brand-overrides.css +++ b/fern/brand-overrides.css @@ -43,17 +43,6 @@ body { background: var(--bg-surface); } -/* --- Changelog: hide its lone sidebar link --- - The changelog is its own product with a single nav entry, so Fern renders - one "Changelog" link into an otherwise empty sidebar. The page is reached - from the navbar, making the link redundant. Hiding it leaves the same empty - sidebar the homepage has. Fern offers no config for this: `hidden: true` on - the nav entry removes the route, not the link, and ChangelogConfiguration - has no skip-slug. --- */ -.fern-sidebar-link[href="/docs/changelog"] { - display: none; -} - /* --- Tables: brand-aligned header and borders --- */ .fern-markdown table th { background: var(--table-header-bg); diff --git a/fern/docs.yml b/fern/docs.yml index ec6cc0e274..36887195ff 100644 --- a/fern/docs.yml +++ b/fern/docs.yml @@ -44,12 +44,6 @@ products: icon: fa-regular fa-home subtitle: Overview and getting started - - display-name: Changelog - slug: changelog - path: products/changelog/changelog.yml - icon: fa-regular fa-clock - subtitle: What's new across the platform - # Column 1 (Products) - display-name: Platform slug: platform @@ -141,7 +135,7 @@ navbar-links: href: https://signalwire.com/docs/llms.txt - type: minimal text: Changelog - href: /docs/changelog + href: /docs/platform/changelog - type: minimal text: Log in href: https://signalwire.com/signin diff --git a/fern/products/changelog/changelog.yml b/fern/products/changelog/changelog.yml deleted file mode 100644 index 3dbb6c1cf0..0000000000 --- a/fern/products/changelog/changelog.yml +++ /dev/null @@ -1,3 +0,0 @@ -navigation: - - changelog: ./changelog - slug: "" diff --git a/fern/products/changelog/changelog/2026-08-05.mdx b/fern/products/changelog/changelog/2026-08-05.mdx deleted file mode 100644 index 86fc8fb13c..0000000000 --- a/fern/products/changelog/changelog/2026-08-05.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -tags: ["voice", "tts"] ---- - -## Six more text-to-speech engines - -Choose [Groq](/docs/platform/voice/tts/groq-tts), [Mistral](/docs/platform/voice/tts/mistral), [Grok](/docs/platform/voice/tts/grok), [Smallest.ai](/docs/platform/voice/tts/smallest), [Fish Audio](/docs/platform/voice/tts/fish), or [Speechify](/docs/platform/voice/tts/speechify) as your TTS engine, each with its own models and voices. - -Name the engine in your voice string — `groq-tts.autumn`, `speechify.` — so your choice survives a change to the platform default. - -## `playai-turbo` is now `groq-tts` - -Groq retired PlayAI in December 2025 and the model stopped answering, so calls on `playai-turbo` were already failing. The engine is renamed `groq-tts` and repointed at Canopy Labs' Orpheus, defaulting to `canopylabs/orpheus-v1-english`. - -Selecting `canopylabs/orpheus-arabic-saudi` requires accepting Canopy Labs' model terms in the [Groq console](https://console.groq.com/) first — requests fail until you do. See [Groq](/docs/platform/voice/tts/groq-tts) for the voice list. - -## Rime `arcana` is served by `coda` - -Rime retired `arcana`. Requests naming it are served by `coda`, so existing configurations keep working untouched. If you already name `coda` directly, it now receives the same sampling parameters as other Rime models — `repetition_penalty`, `temperature`, `top_p`, and `max_tokens`. - -See [Rime](/docs/platform/voice/tts/rime). diff --git a/fern/products/changelog/changelog/2026-08-10.mdx b/fern/products/changelog/changelog/2026-08-10.mdx deleted file mode 100644 index 8962d6baa5..0000000000 --- a/fern/products/changelog/changelog/2026-08-10.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -tags: ["ai"] ---- - -## Tool calling - -The AI agent runs the conversation; your code owns the business logic. A SWAIG function is where the two meet — the agent decides when to call it, you decide what it does. The [tool calling guide](/docs/platform/ai/tool-calling) builds a complete order-status agent in both SWML and the Python Server SDK. - -## Prompting for realtime voice - -What changes when a prompt is spoken rather than read: sentence length, speech-recognition hints for names and product terms, and checking results with post-prompt reports. See [best practices](/docs/platform/ai/best-practices). diff --git a/fern/products/changelog/changelog/2026-08-13.mdx b/fern/products/changelog/changelog/2026-08-13.mdx deleted file mode 100644 index 037022bea1..0000000000 --- a/fern/products/changelog/changelog/2026-08-13.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -tags: ["ai", "voice", "tts", "apis"] ---- - -## Default TTS engine changed to ElevenLabs - - -An `ai` verb with no `voice` set now speaks with ElevenLabs `mark`. It previously used Google `en-US-Neural2-J`. Name the engine and the voice explicitly to pin what your agent sounds like. - - -The implicit engine — the one applied when a voice string names none — moved from `gcloud` to `elevenlabs` on 13 August. Since 17 August, a bare Google-shaped ID such as `en-US-Neural2-C` is routed back to `gcloud`, so those configurations work as before. - -Bare names for other engines are not. An Azure name like `en-US-JennyNeural` has the same shape and also resolves to `gcloud`. A bare name matching no ElevenLabs voice gets the default ElevenLabs voice substituted, so you hear the wrong voice rather than silence. Name the engine every time: `gcloud.en-US-Neural2-A`, `elevenlabs.Rachel`, `azure.en-US-AvaNeural`. - -This reaches into [`ai.languages`](/docs/swml/reference/calling/ai/languages) too — an entry naming no engine of its own inherits the top-level one. - -## Post-prompt and debug webhook payloads - -Already available — these callbacks have fired since 2023. The AI post-prompt callback, the AI debug webhook, and the Bedrock post-prompt callback are specified field by field in the REST API reference: around 20 post-prompt fields, and the 47 event types the debug stream can carry. Build against the payload instead of reading it off a live call. - -The [`ai.params`](/docs/swml/reference/calling/ai/params) and [`amazon_bedrock`](/docs/swml/reference/calling/amazon-bedrock) references carry the same definitions. diff --git a/fern/products/changelog/changelog/2026-08-19.mdx b/fern/products/changelog/changelog/2026-08-19.mdx deleted file mode 100644 index 02f1e0c0d3..0000000000 --- a/fern/products/changelog/changelog/2026-08-19.mdx +++ /dev/null @@ -1,21 +0,0 @@ ---- -tags: ["ai", "swml", "security"] ---- - -## One AI agent, many languages - -Give an agent a voice per language and it detects what the caller speaks, answers in it, and switches whenever the caller does. `multilingual` and `languages` are mutually exclusive: set both and SignalWire uses `multilingual`, ignoring `languages` entirely. - -See [`ai.multilingual`](/docs/swml/reference/calling/ai/multilingual). - -## Conversation analytics - -Analyze finished conversations with post-prompt reports, and troubleshoot live calls with debug webhooks. See [Conversation analytics](/docs/platform/ai/analytics), or start from the [AI quickstart](/docs/platform/ai/quickstart). - -The AI section was reorganized around these two pages. `/ai/capabilities`, `/ai/no-code-agents`, and the prompt-engineering subpages now redirect — update any saved links. - -## Verify SWML request signatures - -Already available — SignalWire signs every request for a SWML document with an HMAC in the `X-Signalwire-Signature` header. Verify it in Node, Python, or Ruby so your endpoint can reject forged requests. - -Signing has been in place on the voice path since 2023; on the messaging path it started in June 2026. See [Verify SWML request signatures](/docs/swml/guides/webhook-security). diff --git a/fern/products/changelog/changelog/2026-08-28.mdx b/fern/products/changelog/changelog/2026-08-28.mdx deleted file mode 100644 index e16f022ad5..0000000000 --- a/fern/products/changelog/changelog/2026-08-28.mdx +++ /dev/null @@ -1,9 +0,0 @@ ---- -tags: ["messaging", "compliance"] ---- - -## Brand Identity Verification - -Not a new requirement — 10DLC registration has always had two separate approval gates, not one. Before a Campaign can exist at all, The Campaign Registry checks your EIN, Brand legal name, and EIN issuing country against third-party identity data. That gate sits upstream of DCA election. A Brand reads `pending`, `unverified`, or `completed`, and the `brand_activated` and `brand_unverified` callbacks tell you when it moves. - -A Brand with every field correct can still come back unverified — a recently issued EIN, a non-US entity, or 501(c) tax-exempt status. Three remedies: correct and resubmit, appeal with supporting documentation, or external vetting. Read [Campaign Service Providers](/docs/platform/messaging/campaign-registry/campaign-service-providers) if you file with TCR directly, or [Registration](/docs/platform/messaging/campaign-registry/registration) if SignalWire manages your Brand. diff --git a/fern/products/changelog/changelog/_template.mdx b/fern/products/changelog/changelog/_template.mdx deleted file mode 100644 index 491bd476c8..0000000000 --- a/fern/products/changelog/changelog/_template.mdx +++ /dev/null @@ -1,53 +0,0 @@ ---- -tags: ["ai"] ---- - -{/* - Copy this file to YYYY-MM-DD.mdx and delete these comments. - - DATE The day the change reached customers — not the day you wrote the entry. - One file per date. Several changes on one date go in the same file, - each under its own `##` heading, most important first. - - TAGS Product areas a reader would filter by. Pick one or two: - voice · messaging · ai · video · fabric · sdks - swml · apis · tts · e911 · compliance · security - - TITLE A short noun phrase naming the thing. Sentence case, no end punctuation. - Good: Conversation analytics · Brand Identity Verification - Default TTS engine changed to ElevenLabs - Bad: New guide for tool calling · Analytics fully documented - We're excited to announce analytics! - - BODY One to three sentences. Second person, present tense, active voice. - Open on what the reader can now do, or on the fact itself — never on - the page that describes it. Two short paragraphs are fine when the - change genuinely carries that much (a deprecation, a compliance gate). - - Never write about the documentation. Banned: "now documented", - "the docs now cover", "previously undocumented", "fully documented". - No marketing adjectives, no emoji, no exclamation marks. - - A capability nobody was told about is new to the reader, however long - it has been in production. Do not hedge it with a ship date. - Say "Already available — " only when leaving it out would mislead: - a security control the reader might think just appeared, payload - fields they might think started arriving, a compliance gate they - might read as a new requirement. - - LINKS Inline, in the prose. Never a trailing "Updated pages:" list. - Copy every URL from the target page's own `slug:` frontmatter, - prefixed with /docs//. Never guess a URL. - - ACTION If there is somewhere to go or something to change, close with it. - - BREAKING Lead with a titled . An untitled callout flattens into plain - prose in the Markdown export and the reader loses the signal. -*/} - -## Short noun phrase naming the thing - -What the reader can now do, stated first. One to three sentences. Link the primary -destination [inline](/docs/changelog), not in a list at the bottom. - -Close with where to start, if there is somewhere to go. diff --git a/fern/products/platform/changelog/2026-08-05.mdx b/fern/products/platform/changelog/2026-08-05.mdx new file mode 100644 index 0000000000..80182ae8e0 --- /dev/null +++ b/fern/products/platform/changelog/2026-08-05.mdx @@ -0,0 +1,30 @@ +--- +tags: ["tts", "voice"] +--- + +## Six new text-to-speech engines + +You can now use the [Groq](/docs/platform/voice/tts/groq-tts), +[Mistral](/docs/platform/voice/tts/mistral), +[Grok](/docs/platform/voice/tts/grok), +[Smallest.ai](/docs/platform/voice/tts/smallest), +[Fish Audio](/docs/platform/voice/tts/fish), and +[Speechify](/docs/platform/voice/tts/speechify) +TTS engines on the SignalWire platform. + +## `playai-turbo` is now `groq-tts` + +Groq retired PlayAI in December 2025. +The engine is renamed `groq-tts` and repointed at Canopy Labs' Orpheus, defaulting to `canopylabs/orpheus-v1-english`. + +Arabic voices are available by selecting `canopylabs/orpheus-arabic-saudi`, or the shorthand `arabic`. +See [Groq](/docs/platform/voice/tts/groq-tts) for the voice list. + +## Rime's `arcana` model is deprecated, falls back to `coda` + +Rime retired its `arcana` model. +Applications that invoke it will fall back to `coda`, which shares voice names. + +Additionally, the `coda` model now uses the same sampling parameters as other Rime models: `repetition_penalty`, `temperature`, `top_p`, and `max_tokens`. + +See [Rime](/docs/platform/voice/tts/rime). diff --git a/fern/products/changelog/changelog/2026-08-06.mdx b/fern/products/platform/changelog/2026-08-06.mdx similarity index 80% rename from fern/products/changelog/changelog/2026-08-06.mdx rename to fern/products/platform/changelog/2026-08-06.mdx index 316df8a66d..c4e1267576 100644 --- a/fern/products/changelog/changelog/2026-08-06.mdx +++ b/fern/products/platform/changelog/2026-08-06.mdx @@ -1,8 +1,8 @@ --- -tags: ["voice", "e911"] +tags: ["e911", "voice"] --- -## E911 registration over the REST API +## E911 self-service added to the REST API Register an emergency address and enable E911 on a US phone number yourself, instead of filing a support ticket. Create a carrier-validated address, assign it to the number, then poll until `e911_status` reads `active`. diff --git a/fern/products/platform/changelog/2026-08-13.mdx b/fern/products/platform/changelog/2026-08-13.mdx new file mode 100644 index 0000000000..e477af645e --- /dev/null +++ b/fern/products/platform/changelog/2026-08-13.mdx @@ -0,0 +1,13 @@ +--- +tags: ["ai", "tts", "voice"] +--- + +## Default TTS engine changed from Google to ElevenLabs + +A voice string that names no engine now resolves against ElevenLabs instead of `gcloud`. Since 17 August a bare Google-shaped ID such as `en-US-Neural2-C` is routed back to `gcloud`, so those configurations work as before. Bare names for other engines are not: an Azure name like `en-US-JennyNeural` has the same shape and also resolves to `gcloud`, and a bare name matching no ElevenLabs voice gets the default ElevenLabs voice substituted, so you hear the wrong voice rather than silence. + + +An `ai` verb with no `voice` set now speaks with ElevenLabs `mark`. It previously used Google `en-US-Neural2-J`. + + +Name the engine every time: `gcloud.en-US-Neural2-A`, `elevenlabs.Rachel`, `azure.en-US-AvaNeural`. This reaches into [`ai.languages`](/docs/swml/reference/calling/ai/languages) too — an entry naming no engine of its own inherits the top-level one. diff --git a/fern/products/changelog/changelog/2026-08-17.mdx b/fern/products/platform/changelog/2026-08-17.mdx similarity index 57% rename from fern/products/changelog/changelog/2026-08-17.mdx rename to fern/products/platform/changelog/2026-08-17.mdx index 5c394a3b7c..5193370cc9 100644 --- a/fern/products/changelog/changelog/2026-08-17.mdx +++ b/fern/products/platform/changelog/2026-08-17.mdx @@ -2,8 +2,8 @@ tags: ["ai", "apis"] --- -## Chat with an AI agent over the REST API +## AI agent chat added over HTTP -Hold a text conversation with the same AI agent a phone call would reach, over a JSON-RPC endpoint with six methods. The agent keeps its prompt, its tools, and its post-prompt reporting. +You can now chat by text with an AI agent that was previously reachable only by voice, over a JSON-RPC endpoint with six methods. The agent keeps its prompt, its tools, and its post-prompt reporting. The Python Server SDK wraps the endpoint in [`AIChatClient`](/docs/server-sdks/reference/python/agents/ai-chat-client) and [`ChatGateway`](/docs/server-sdks/reference/python/agents/chat-gateway). JSON-RPC failures are listed with the rest of the [error codes](/docs/apis/error-codes). diff --git a/fern/products/platform/changelog/2026-08-19.mdx b/fern/products/platform/changelog/2026-08-19.mdx new file mode 100644 index 0000000000..2eee03f109 --- /dev/null +++ b/fern/products/platform/changelog/2026-08-19.mdx @@ -0,0 +1,9 @@ +--- +tags: ["ai", "swml"] +--- + +## `ai.multilingual` added for per-language voices + +Give an AI agent a voice per language and it detects what the caller speaks, answers in it, and switches whenever the caller does. `multilingual` and `languages` are mutually exclusive: set both and SignalWire uses `multilingual`, ignoring `languages` entirely. + +See [`ai.multilingual`](/docs/swml/reference/calling/ai/multilingual). diff --git a/fern/products/platform/changelog/_template.mdx b/fern/products/platform/changelog/_template.mdx new file mode 100644 index 0000000000..8d14ddb867 --- /dev/null +++ b/fern/products/platform/changelog/_template.mdx @@ -0,0 +1,66 @@ +--- +tags: ["ai"] +--- + +{/* + Copy this file to YYYY-MM-DD.mdx and delete these comments. + + DATE The day the change reached customers — not the day you wrote the entry. + One file per date. Several changes on one date go in the same file, + each under its own `##` heading, most important first. + + TAGS Product areas only, alphabetical. They render as chips on the index + and feed the tag filter, so keep the list short — a tag matching one + entry filters nothing. + voice · messaging · ai · video · fabric · sdks + swml · apis · tts · e911 · compliance · security + The kind of change does NOT go here. Put it in the title. + + TITLE Say what was added, changed, removed, or deprecated — in the words + of the title, since no tag carries it. A reader + skimming the index should not have to open the entry to get + the gist. + Good: Six new text-to-speech engines + `playai-turbo` is now `groq-tts` + Default TTS engine changed from Google to ElevenLabs + E911 self-service added to the REST API + Bad: Tool calling (what about it?) + One AI agent, many languages (reads like marketing) + AI section improvements (says nothing) + Webhook payloads documented (documentation is not a change) + + BODY Lead with the reader's capability, concretely, in the first clause — + what they can do, or what now behaves differently. That first line is + the whole entry for anyone skimming. "You can now …" is one way to + get there, not a required opening; an imperative usually reads better + and stays out of the way ("Pick Groq, Mistral, or Grok as your TTS + engine", "Register an emergency address yourself"). Vary it — a page + of identical openings stops being read. + One to three sentences, second person, present tense. Two short + paragraphs are fine when the change genuinely carries that much. + + No marketing adjectives, no emoji, no exclamation marks. + + WHAT DOES NOT GET AN ENTRY + A new guide, a new reference page, or documentation for something + that already shipped. Not even for an important feature — the + changelog records platform changes, not documentation work. + The narrow exception is a capability customers had no way to + discover at all, where publishing it is effectively the release. + + LINKS Inline, in the prose. Never a trailing "Updated pages:" list. + Copy every URL from the target page's own `slug:` frontmatter, + prefixed with /docs//. Never guess a URL. + + BREAKING Say so in the title, then open with a plain text paragraph and a titled + — Fern previews each entry by its opening content, and a + callout in that slot renders badly. Title the callout: an untitled + one flattens into plain prose in the Markdown export. +*/} + +## Say what was added, changed, or removed + +You can now do the thing, stated first. One to three sentences. Link the primary +destination [inline](/docs/platform/changelog), not in a list at the bottom. + +Close with where to start, if there is somewhere to go. diff --git a/fern/products/changelog/changelog/overview.mdx b/fern/products/platform/changelog/overview.mdx similarity index 100% rename from fern/products/changelog/changelog/overview.mdx rename to fern/products/platform/changelog/overview.mdx diff --git a/fern/products/platform/platform.yml b/fern/products/platform/platform.yml index 195e7ecf9e..d898ca9879 100644 --- a/fern/products/platform/platform.yml +++ b/fern/products/platform/platform.yml @@ -1,6 +1,11 @@ tabs: platform: display-name: Platform + # The changelog's URL segment comes from this nav entry, not page frontmatter, + # and a nav-entry `slug` replaces only its own segment — so without this the + # changelog lands at /platform/platform/changelog. Every other page under this + # tab sets its own frontmatter slug, which already bypasses the tab segment. + skip-slug: true icon: fa-regular fa-planet-ringed calling: display-name: Calling @@ -21,6 +26,9 @@ navigation: - page: Get started path: ./pages/getting-started.mdx icon: fa-regular fa-home + - changelog: ./changelog + title: Changelog + icon: fa-regular fa-clock - folder: ./pages/platform/setup title: Setup title-source: frontmatter diff --git a/fern/styles.css b/fern/styles.css index c90db284b3..c411bf8256 100644 --- a/fern/styles.css +++ b/fern/styles.css @@ -278,8 +278,7 @@ a[href*="god.gw.postman.com"] > img { * Column 2 (SDKs): Server SDKs, Browser SDK * Column 3 (APIs): APIs, SWML * - * Home and Changelog are hidden — the Changelog is reached from the navbar link. - * Compatibility API appears as a footer link. + * Home is hidden. Compatibility API appears as a footer link. */ /* Custom SVG product icons — match Font Awesome icon sizing. @@ -316,9 +315,8 @@ a[href*="god.gw.postman.com"] > img { row-gap: 0.5rem; padding: 3rem 1.25rem 0.4rem; - /* Hide Home and Changelog */ - > a[href="/docs"], - > a[href="/docs/changelog"] { + /* Hide Home */ + > a[href="/docs"] { display: none; } @@ -429,9 +427,8 @@ a[href*="god.gw.postman.com"] > img { /* --- Mobile (< 1024 px) --- */ @media (max-width: 1023px) { - /* Hide Home and Changelog */ - .fern-product-selector-radio-group > a[href="/docs"], - .fern-product-selector-radio-group > a[href="/docs/changelog"] { + /* Hide Home */ + .fern-product-selector-radio-group > a[href="/docs"] { display: none !important; } From a80477ba0c0df49d0118a5ed02d8f19e94468c04 Mon Sep 17 00:00:00 2001 From: August Date: Wed, 2 Sep 2026 13:59:39 +0000 Subject: [PATCH 09/12] fix(docs): cleanup --- CLAUDE.md | 34 ++++++++++++------- .../pages/calling/voice/TTS/groq-tts.mdx | 6 ---- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 8873dfefb1..91858c9e5a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,24 +14,34 @@ A SWML-only `.tsp` edit still moves `fern/apis/signalwire-rest/openapi.yaml`, be ## Changelog -`fern/products/changelog/changelog/` is a **product** changelog, written for customers and +`fern/products/platform/changelog/` is a **product** changelog, written for customers and authored by Product, Marketing, and PMs as well as docs. Copy `_template.mdx` to `YYYY-MM-DD.mdx` — the date the change reached customers, not the day you wrote it. Several changes on one date share a file, one `##` heading each. -- **Never make the documentation the subject.** Banned: "now documented", "the docs now - cover", "previously undocumented", "fully documented", "finally". Write what the reader - can now do or now knows. -- **Titles are short noun phrases**, sentence case, no end punctuation — "Conversation - analytics", not "New guide for conversation analytics". -- One to three sentences, second person, present tense. No marketing adjectives, no emoji. -- A capability nobody was told about is new to the reader however long it shipped ago; don't - hedge it with a ship date. Open "Already available — " only where omitting it would - mislead (a security control, payload fields, a compliance gate). +- **Titles say what was added, changed, removed, or deprecated** — in words, since no tag + carries the kind. Sentence case, no end punctuation. + A reader skimming the index shouldn't have to open the entry. "Tool calling guide added", + not "Tool calling"; "Default TTS engine changed from Google to ElevenLabs", not "TTS + update". No marketing phrasing ("One AI agent, many languages"). +- **Lead with the capability, concretely, in the first clause** — the opening line is the + whole entry for anyone skimming. An imperative usually beats a formula ("Pick Groq or + Mistral as your TTS engine"); "You can now …" is one option, not a house opening, and a + run of identical openings stops being read. One to three sentences, second person. +- **Tag product areas only, alphabetical** — `voice`, `messaging`, `ai`, `video`, `fabric`, + `sdks`, `swml`, `apis`, `tts`, `e911`, `compliance`, `security`. Chips render on the index + and feed the tag filter, so keep the list short; a tag matching one entry filters nothing. + The kind of change belongs in the title, not in a tag. +- **Documentation work gets no entry at all.** A new guide, a new reference page, or writing + up something that already shipped is not a changelog entry, however important the feature. + The only exception is a capability customers had no way to discover, where publishing it is + effectively the release. When in doubt, leave it out. +- **Every `##` section opens with a text paragraph**, never a component — Fern previews each + entry by its opening content and a callout there renders badly. A breaking change puts a + titled `` after that paragraph; an untitled callout flattens to plain prose in the + Markdown export. - **Links inline in prose, never a trailing "Updated pages:" list.** Copy every URL from the target page's own `slug:` frontmatter, prefixed `/docs//`. Never guess one. -- Breaking changes lead with a titled `` — an untitled callout flattens to plain - prose in the Markdown export and the reader loses the signal. Entries are customer-facing, so everything under "Everything here is customer-facing" applies. diff --git a/fern/products/platform/pages/calling/voice/TTS/groq-tts.mdx b/fern/products/platform/pages/calling/voice/TTS/groq-tts.mdx index c72eb77861..062d78a7d9 100644 --- a/fern/products/platform/pages/calling/voice/TTS/groq-tts.mdx +++ b/fern/products/platform/pages/calling/voice/TTS/groq-tts.mdx @@ -27,12 +27,6 @@ See [Groq's text-to-speech documentation](https://console.groq.com/docs/text-to- | `canopylabs/orpheus-v1-english` | **Default.** English voices | | `canopylabs/orpheus-arabic-saudi` | Arabic (Saudi dialect) voices. The shorthand `arabic` also selects this model | - -The Arabic model requires accepting Canopy Labs' model terms in the -[Groq console](https://console.groq.com/) for the account making the requests. -Requests fail until the terms are accepted. - - ## Voices From bbe35e5b39557d511d12c26d5a9841096ce4c46b Mon Sep 17 00:00:00 2001 From: August Date: Wed, 2 Sep 2026 14:24:08 +0000 Subject: [PATCH 10/12] docs(changelog): remove invalid _template file --- CLAUDE.md | 44 ++++++------- .../products/platform/changelog/_template.mdx | 66 ------------------- 2 files changed, 22 insertions(+), 88 deletions(-) delete mode 100644 fern/products/platform/changelog/_template.mdx diff --git a/CLAUDE.md b/CLAUDE.md index 91858c9e5a..5ea16cc492 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,32 +14,32 @@ A SWML-only `.tsp` edit still moves `fern/apis/signalwire-rest/openapi.yaml`, be ## Changelog -`fern/products/platform/changelog/` is a **product** changelog, written for customers and -authored by Product, Marketing, and PMs as well as docs. Copy `_template.mdx` to -`YYYY-MM-DD.mdx` — the date the change reached customers, not the day you wrote it. Several -changes on one date share a file, one `##` heading each. - +`fern/products/platform/changelog/` is a **product** changelog for customers, authored by +Product, Marketing, and PMs as well as docs. One file per date, `YYYY-MM-DD.mdx`, dated when +the change reached customers — not when it was written. Several changes on one date share a +file, one `##` heading each, most important first. `overview.mdx` is the index page. + +- **Documentation work gets no entry.** A new guide, a new reference page, or writing up + something that already shipped is not a change, however important the feature. The only + exception is a capability customers had no way to discover, where publishing it is + effectively the release. When in doubt, leave it out. - **Titles say what was added, changed, removed, or deprecated** — in words, since no tag - carries the kind. Sentence case, no end punctuation. - A reader skimming the index shouldn't have to open the entry. "Tool calling guide added", - not "Tool calling"; "Default TTS engine changed from Google to ElevenLabs", not "TTS - update". No marketing phrasing ("One AI agent, many languages"). -- **Lead with the capability, concretely, in the first clause** — the opening line is the - whole entry for anyone skimming. An imperative usually beats a formula ("Pick Groq or - Mistral as your TTS engine"); "You can now …" is one option, not a house opening, and a - run of identical openings stops being read. One to three sentences, second person. + carries the kind. Sentence case, no end punctuation. A reader skimming the index shouldn't + have to open the entry: "Default TTS engine changed from Google to ElevenLabs", not "TTS + update"; "E911 self-service added to the REST API", not "E911". Not "One AI agent, many + languages" (marketing), not "Webhook payloads documented" (documentation is not a change). +- **Lead with the capability in the first clause** — that line is the whole entry for anyone + skimming. An imperative usually beats a formula ("Pick Groq or Mistral as your TTS + engine"); "You can now …" is one option, not a house opening. One to three sentences, + second person, present tense. No marketing adjectives, no emoji, no exclamation marks. - **Tag product areas only, alphabetical** — `voice`, `messaging`, `ai`, `video`, `fabric`, `sdks`, `swml`, `apis`, `tts`, `e911`, `compliance`, `security`. Chips render on the index and feed the tag filter, so keep the list short; a tag matching one entry filters nothing. - The kind of change belongs in the title, not in a tag. -- **Documentation work gets no entry at all.** A new guide, a new reference page, or writing - up something that already shipped is not a changelog entry, however important the feature. - The only exception is a capability customers had no way to discover, where publishing it is - effectively the release. When in doubt, leave it out. -- **Every `##` section opens with a text paragraph**, never a component — Fern previews each - entry by its opening content and a callout there renders badly. A breaking change puts a - titled `` after that paragraph; an untitled callout flattens to plain prose in the - Markdown export. + The kind of change goes in the title, never in a tag. +- **Open every `##` section with a text paragraph**, never a component — Fern previews an + entry by its opening content and a callout there renders badly. A breaking change says so + in the title and puts a titled `` after that paragraph; an untitled callout + flattens to plain prose in the Markdown export. - **Links inline in prose, never a trailing "Updated pages:" list.** Copy every URL from the target page's own `slug:` frontmatter, prefixed `/docs//`. Never guess one. diff --git a/fern/products/platform/changelog/_template.mdx b/fern/products/platform/changelog/_template.mdx deleted file mode 100644 index 8d14ddb867..0000000000 --- a/fern/products/platform/changelog/_template.mdx +++ /dev/null @@ -1,66 +0,0 @@ ---- -tags: ["ai"] ---- - -{/* - Copy this file to YYYY-MM-DD.mdx and delete these comments. - - DATE The day the change reached customers — not the day you wrote the entry. - One file per date. Several changes on one date go in the same file, - each under its own `##` heading, most important first. - - TAGS Product areas only, alphabetical. They render as chips on the index - and feed the tag filter, so keep the list short — a tag matching one - entry filters nothing. - voice · messaging · ai · video · fabric · sdks - swml · apis · tts · e911 · compliance · security - The kind of change does NOT go here. Put it in the title. - - TITLE Say what was added, changed, removed, or deprecated — in the words - of the title, since no tag carries it. A reader - skimming the index should not have to open the entry to get - the gist. - Good: Six new text-to-speech engines - `playai-turbo` is now `groq-tts` - Default TTS engine changed from Google to ElevenLabs - E911 self-service added to the REST API - Bad: Tool calling (what about it?) - One AI agent, many languages (reads like marketing) - AI section improvements (says nothing) - Webhook payloads documented (documentation is not a change) - - BODY Lead with the reader's capability, concretely, in the first clause — - what they can do, or what now behaves differently. That first line is - the whole entry for anyone skimming. "You can now …" is one way to - get there, not a required opening; an imperative usually reads better - and stays out of the way ("Pick Groq, Mistral, or Grok as your TTS - engine", "Register an emergency address yourself"). Vary it — a page - of identical openings stops being read. - One to three sentences, second person, present tense. Two short - paragraphs are fine when the change genuinely carries that much. - - No marketing adjectives, no emoji, no exclamation marks. - - WHAT DOES NOT GET AN ENTRY - A new guide, a new reference page, or documentation for something - that already shipped. Not even for an important feature — the - changelog records platform changes, not documentation work. - The narrow exception is a capability customers had no way to - discover at all, where publishing it is effectively the release. - - LINKS Inline, in the prose. Never a trailing "Updated pages:" list. - Copy every URL from the target page's own `slug:` frontmatter, - prefixed with /docs//. Never guess a URL. - - BREAKING Say so in the title, then open with a plain text paragraph and a titled - — Fern previews each entry by its opening content, and a - callout in that slot renders badly. Title the callout: an untitled - one flattens into plain prose in the Markdown export. -*/} - -## Say what was added, changed, or removed - -You can now do the thing, stated first. One to three sentences. Link the primary -destination [inline](/docs/platform/changelog), not in a list at the bottom. - -Close with where to start, if there is somewhere to go. From d16e4dc3ac01f4d76eb3066722904cc7ddf921a6 Mon Sep 17 00:00:00 2001 From: August Lindgren-Ruby Date: Thu, 3 Sep 2026 11:57:15 -0400 Subject: [PATCH 11/12] changelog: rewrites --- fern/products/platform/changelog/2026-08-05.mdx | 5 +++-- fern/products/platform/changelog/2026-08-06.mdx | 8 ++++++-- fern/products/platform/changelog/2026-08-13.mdx | 9 ++++----- fern/products/platform/changelog/2026-08-17.mdx | 10 +++++++--- fern/products/platform/changelog/2026-08-19.mdx | 8 ++++++-- fern/products/platform/changelog/overview.mdx | 2 +- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/fern/products/platform/changelog/2026-08-05.mdx b/fern/products/platform/changelog/2026-08-05.mdx index 80182ae8e0..053d4f4259 100644 --- a/fern/products/platform/changelog/2026-08-05.mdx +++ b/fern/products/platform/changelog/2026-08-05.mdx @@ -17,7 +17,7 @@ TTS engines on the SignalWire platform. Groq retired PlayAI in December 2025. The engine is renamed `groq-tts` and repointed at Canopy Labs' Orpheus, defaulting to `canopylabs/orpheus-v1-english`. -Arabic voices are available by selecting `canopylabs/orpheus-arabic-saudi`, or the shorthand `arabic`. +Arabic voices are available by selecting the `canopylabs/orpheus-arabic-saudi` model, or its shorthand `arabic`. See [Groq](/docs/platform/voice/tts/groq-tts) for the voice list. ## Rime's `arcana` model is deprecated, falls back to `coda` @@ -25,6 +25,7 @@ See [Groq](/docs/platform/voice/tts/groq-tts) for the voice list. Rime retired its `arcana` model. Applications that invoke it will fall back to `coda`, which shares voice names. -Additionally, the `coda` model now uses the same sampling parameters as other Rime models: `repetition_penalty`, `temperature`, `top_p`, and `max_tokens`. +Additionally, the `coda` model now uses the same sampling parameters as other Rime models: +`repetition_penalty`, `temperature`, `top_p`, and `max_tokens`. See [Rime](/docs/platform/voice/tts/rime). diff --git a/fern/products/platform/changelog/2026-08-06.mdx b/fern/products/platform/changelog/2026-08-06.mdx index c4e1267576..088d944aff 100644 --- a/fern/products/platform/changelog/2026-08-06.mdx +++ b/fern/products/platform/changelog/2026-08-06.mdx @@ -4,6 +4,10 @@ tags: ["e911", "voice"] ## E911 self-service added to the REST API -Register an emergency address and enable E911 on a US phone number yourself, instead of filing a support ticket. Create a carrier-validated address, assign it to the number, then poll until `e911_status` reads `active`. +Registering an emergency address and enabling E911 on a US phone number is now self-service, +and no longer requires a support ticket. -Start with the [E911 guide](/docs/platform/e911). +Create a carrier-validated address, assign it to the number, then poll until `e911_status` reads `active`. + +To get started, read the [E911 guide](/docs/platform/e911) +and review the [API reference](/docs/apis/rest/e-911-addresses/assign-e-911-address). \ No newline at end of file diff --git a/fern/products/platform/changelog/2026-08-13.mdx b/fern/products/platform/changelog/2026-08-13.mdx index e477af645e..052cdd3a85 100644 --- a/fern/products/platform/changelog/2026-08-13.mdx +++ b/fern/products/platform/changelog/2026-08-13.mdx @@ -4,10 +4,9 @@ tags: ["ai", "tts", "voice"] ## Default TTS engine changed from Google to ElevenLabs -A voice string that names no engine now resolves against ElevenLabs instead of `gcloud`. Since 17 August a bare Google-shaped ID such as `en-US-Neural2-C` is routed back to `gcloud`, so those configurations work as before. Bare names for other engines are not: an Azure name like `en-US-JennyNeural` has the same shape and also resolves to `gcloud`, and a bare name matching no ElevenLabs voice gets the default ElevenLabs voice substituted, so you hear the wrong voice rather than silence. +[Voice id strings](docs/platform/voice/tts#use-voice-identifier-strings) +that don't specify an engine now resolves against `elevenlabs` instead of `gcloud`. - -An `ai` verb with no `voice` set now speaks with ElevenLabs `mark`. It previously used Google `en-US-Neural2-J`. + +Default engines can change. Ensure your agent continues using its configured voice by always declaring the engine explicitly. - -Name the engine every time: `gcloud.en-US-Neural2-A`, `elevenlabs.Rachel`, `azure.en-US-AvaNeural`. This reaches into [`ai.languages`](/docs/swml/reference/calling/ai/languages) too — an entry naming no engine of its own inherits the top-level one. diff --git a/fern/products/platform/changelog/2026-08-17.mdx b/fern/products/platform/changelog/2026-08-17.mdx index 5193370cc9..2234a8ceb5 100644 --- a/fern/products/platform/changelog/2026-08-17.mdx +++ b/fern/products/platform/changelog/2026-08-17.mdx @@ -2,8 +2,12 @@ tags: ["ai", "apis"] --- -## AI agent chat added over HTTP +## AI agent text chat added -You can now chat by text with an AI agent that was previously reachable only by voice, over a JSON-RPC endpoint with six methods. The agent keeps its prompt, its tools, and its post-prompt reporting. +You can now chat by text with AI agents that were previously reachable only by voice. +In the REST API, AI Chat is a single, unified JSON-RPC-style +[Send AI chat methods](/docs/apis/rest/ai-chat/chat-methods) endpoint with six methods. -The Python Server SDK wraps the endpoint in [`AIChatClient`](/docs/server-sdks/reference/python/agents/ai-chat-client) and [`ChatGateway`](/docs/server-sdks/reference/python/agents/chat-gateway). JSON-RPC failures are listed with the rest of the [error codes](/docs/apis/error-codes). +The Python Server SDK wraps the endpoint in [`AIChatClient`](/docs/server-sdks/reference/python/agents/ai-chat-client) +and [`ChatGateway`](/docs/server-sdks/reference/python/agents/chat-gateway). +JSON-RPC errors are listed with the rest of the [error codes](/docs/apis/error-codes). diff --git a/fern/products/platform/changelog/2026-08-19.mdx b/fern/products/platform/changelog/2026-08-19.mdx index 2eee03f109..8674e4e464 100644 --- a/fern/products/platform/changelog/2026-08-19.mdx +++ b/fern/products/platform/changelog/2026-08-19.mdx @@ -2,8 +2,12 @@ tags: ["ai", "swml"] --- -## `ai.multilingual` added for per-language voices +## Multilingual agents that switch languages and voices in real time -Give an AI agent a voice per language and it detects what the caller speaks, answers in it, and switches whenever the caller does. `multilingual` and `languages` are mutually exclusive: set both and SignalWire uses `multilingual`, ignoring `languages` entirely. +The new `multilingual` AI parameter accepts an array of language-voice pairs. +The AI agent continuously detects the other party's language, +and switches to the configured TTS voice (and language) whenever it changes. + +The `multilingual` and `languages` objects within the AI method are mutually exclusive. See [`ai.multilingual`](/docs/swml/reference/calling/ai/multilingual). diff --git a/fern/products/platform/changelog/overview.mdx b/fern/products/platform/changelog/overview.mdx index cdd94b3584..c58e374fa5 100644 --- a/fern/products/platform/changelog/overview.mdx +++ b/fern/products/platform/changelog/overview.mdx @@ -4,6 +4,6 @@ description: New capabilities, changed defaults, and deprecations across the Sig max-toc-depth: 3 --- -What's new and what changed across SignalWire: new capabilities, new endpoints and SWML properties, changed defaults, and deprecations. +What's new and what changed across the SignalWire platform. To follow along in a feed reader, append `.rss` to this page's URL. From 0cc3b81082ad92d29a4dd61a537f6ca18d655f12 Mon Sep 17 00:00:00 2001 From: August Date: Thu, 3 Sep 2026 18:05:40 +0000 Subject: [PATCH 12/12] fix(changelog): bad link --- fern/products/platform/changelog/2026-08-13.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fern/products/platform/changelog/2026-08-13.mdx b/fern/products/platform/changelog/2026-08-13.mdx index 052cdd3a85..3e2b975d18 100644 --- a/fern/products/platform/changelog/2026-08-13.mdx +++ b/fern/products/platform/changelog/2026-08-13.mdx @@ -4,7 +4,7 @@ tags: ["ai", "tts", "voice"] ## Default TTS engine changed from Google to ElevenLabs -[Voice id strings](docs/platform/voice/tts#use-voice-identifier-strings) +[Voice id strings](/docs/platform/voice/tts#use-voice-identifier-strings) that don't specify an engine now resolves against `elevenlabs` instead of `gcloud`.