Skip to main content
Fonoster 0.30 is a new release that doesn’t keep the old interfaces working. Use this page to update what you built on 0.27 or earlier: application settings, Autopilot agents, Voice SDK apps, CLI scripts and webhooks. For most old fields, the API answers with an error that names the new one, for example type EXTERNAL was renamed to STREAM. Fix what it names and send the request again. The API ignores endpoint, textToSpeech and speechToText without an error, so check those yourself.
On Fonoster Cloud, your saved agents, numbers and settings were moved for you. You only update your code, files and scripts. If you run Fonoster yourself, upgrade your install first (see the Self-hosting section).

What changed at a glance

Update your applications

An application is now a stream or an Autopilot agent. Speech settings moved from the vendor objects into speech, and use catalog IDs.
1

Rename the type

Change EXTERNAL to STREAM. AUTOPILOT stays the same.
2

Replace the endpoint with a URL

A stream is now a WebSocket server. Set url to its ws:// or wss:// address. Fonoster no longer reads endpoint, so an application with only an endpoint gets no calls.Autopilot agents need no URL: Fonoster runs them.
3

Set the protocol

If you used flavor, rename it to protocol. native is now fonoster. Leave it out to get fonoster. Autopilot agents always use fonoster.
4

Move the speech settings

Replace textToSpeech and speechToText with speech. Fonoster ignores the old objects, so a voice you set there is lost. Name each voice and model by its catalog ID, <provider>/<id>. To list them, run fonoster providers:catalog --kind voice.
This is the same stream before and after:
Creating a stream returns its signing secret once. Save it: your server needs it (see Rewrite your Voice SDK app).

Update your Autopilot agents

The agent’s settings still live under intelligence.config, with conversationSettings and languageModel. A few fields changed:
  • Model. Put the provider and the model in one catalog ID: provider: groq and model: llama-3.3-70b-versatile become model: groq/openai/gpt-oss-120b. Groq retired Llama 3.3 70B, so agents that still name it run on groq/openai/gpt-oss-120b.
  • Keys and endpoints. Delete apiKey and baseUrl. Fonoster uses its own provider accounts, or yours if you add a key under Vendor keys (see Use your own vendor keys).
  • Voice activity detection. Delete vad and maxSpeechWaitTimeout. Fonoster now decides when the caller has finished talking. To make the agent wait longer or answer sooner, set conversationSettings.patience to low, normal or high (see Turn-taking and barge-in).
  • Events hook. Delete eventsHook, and subscribe a workspace webhook instead (see Replace the events hook).
  • Audio filters. Delete audioFilters. There is no per-agent setting for it.
In a CLI file, put the agent under an assistant key and the speech settings under speech:
Create it as before:

Update your CLI scripts

Two applications:create and applications:update flags were renamed. The old names stop the command with an error that names the new one.

Rewrite your Voice SDK app

Your app is no longer a gRPC server. For every call, Fonoster opens one signed WebSocket to your app’s url, and your handler gets a single argument: the session.
1

Update the package

Install the latest Voice SDK:
For Python, use pip install fonoster-voice (see Use the Python Voice SDK).
2

Change the handler

Import VoiceServer by name, pass the signing secret, and take the session. You no longer call answer(): the call is answered when your app connects.
3

Set the signing secret

The server won’t start without a signing secret, and it refuses connections that Fonoster didn’t sign. Set APP_SIGNING_SECRET to the secret you got when you created the stream. If you lost it, make a new one:
A new secret takes effect at once, with no overlap. Your app refuses calls until you deploy the new secret, so rotate during a quiet period.
4

Replace the methods that changed

Use this table to replace what your handler calls:Voice SDK reference has every method and event.
If your app speaks Twilio Media Streams, such as a Pipecat bot, you don’t need the Voice SDK. Set the application’s protocol to twilio and its url to your bot (see Bring your Twilio or Pipecat app).

Replace the events hook

The Autopilot events hook and its conversation.started and conversation.ended events are gone. Subscribe a workspace webhook to the events that replace them: Workspace webhooks work for every application, not only Autopilot agents:
If you subscribe to an old event name, Fonoster refuses it and names the replacement. See Webhooks.

Get recordings from the call record

Recording is no longer a step in your code. Set the application’s recording policy to off, on or consent (a consent prompt plays first). See Record calls and ask for consent. Recording URLs built from the app ref and an ID no longer exist. Each call’s recording is part of its call record. List your calls with the CLI, then download a call’s recording by its call ref:
You can also get it from the call’s page under Calls, or from the HTTP API at GET /api/records/{callRef}/recording. See Call records.

Check your work

  1. Create or update each application. Fix any old field the API names, and check that no endpoint, textToSpeech or speechToText is left.
  2. Call each application, from Talk to agent in the dashboard or from a number.
  3. Open the call under Calls and check the transcript.