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.
- Switching language mid-conversation has the full request table and every failure message.
- VoiceThere voice covers the built-in speech and its catalog ids.
- Get the update from
@voicethere/agenton npm.