One request shape for every speech provider

October 20, 2026 · release

@voicethere/agent 0.10.0 · @voicethere/cli 0.16.9

The speech that runs inside VoiceThere, with no API keys, now has the provider id voicethere. It used to show up as local-sherpa in some places and cluster-sherpa in others, and both still work as aliases wherever a provider is accepted. API responses, the dashboard, conversation history and the agent log now say voicethere.

The bigger change is for agent code. setVoiceLanguage and prepareVoiceLanguage in @voicethere/agent 0.10.0 take one request shape whether you switch to VoiceThere speech or to a cloud vendor:

import { setVoiceLanguage } from "@voicethere/agent";

await setVoiceLanguage(sessionId, {
  language: "de",
  sttVendor: { provider: "deepgram", model: "nova-3" },
  ttsVendor: { provider: "voicethere" },
});

Leave out a model, voice or language and you get that provider's default for the language you asked for. When a switch cannot happen, the call resolves with a reason and a message that tells you the fix, for example missing_credentials with "Add the AGENT_OPENAI_API_KEY project secret for provider "openai"." The same text lands in the agent log on the voice.settings_change_failed line.

The old top-level voice and stt fields still work when you use them alone. Mix one with the matching vendor object and you get conflicting_fields.

Similar posts

← All posts