stablyai/orca · error · Error
Failed to update dictation settings
Error message
Failed to update dictation settings
What it means
Fallback error from setDictationConfig when speech.dictation.setup fails and the host returned no error.message. This RPC commits the user's enabled/modelId/dictationMode preferences, so a failure means the desktop refused to apply the new dictation configuration.
Source
Thrown at mobile/src/dictation/mobile-dictation-setup.ts:85
export async function deleteDictationModel(
client: Pick<RpcClient, 'sendRequest'>,
modelId: string
): Promise<MobileSpeechSetup> {
const response = await client.sendRequest('speech.models.delete', { modelId })
if (!response.ok) {
throw new Error(response.error?.message || 'Failed to delete model')
}
return (response as RpcSuccess).result as MobileSpeechSetup
}
export async function setDictationConfig(
client: Pick<RpcClient, 'sendRequest'>,
params: { enabled?: boolean; modelId?: string; dictationMode?: 'toggle' | 'hold' }
): Promise<MobileSpeechSetup> {
const response = await client.sendRequest('speech.dictation.setup', params)
if (!response.ok) {
throw new Error(response.error?.message || 'Failed to update dictation settings')
}
return (response as RpcSuccess).result as MobileSpeechSetup
}
// A model is mid-download (or extracting) and the sheet should keep polling.
export function isModelInFlight(model: MobileSpeechModel): boolean {
return model.status === 'downloading' || model.status === 'extracting'
}
// Whether dictation can be used right now: enabled + a selected model that's ready.
export function isDictationReady(setup: MobileSpeechSetup): boolean {
if (!setup.enabled || !setup.selectedModelId) {
return false
}
const selected = setup.models.find((m) => m.id === setup.selectedModelId)
return selected?.status === 'ready'
}
View on GitHub (pinned to 1136503c6a)
Solutions
- Before calling setDictationConfig, confirm via fetchDictationSetup that modelId points to a model with status 'ready' (use isModelInFlight to gate).
- Restrict dictationMode to the documented union ('toggle' | 'hold') and confirm the host build advertises both.
- Retry once after reconnecting if the failure looks transport-related; persist the intended config locally so it can be re-applied.
- Inspect desktop logs for the underlying config write failure.
Example fix
// before
const response = await client.sendRequest('speech.dictation.setup', params)
if (!response.ok) {
throw new Error(response.error?.message || 'Failed to update dictation settings')
}
// after — pre-validate model readiness
const setup = await fetchDictationSetup(client)
if (params.modelId) {
const m = setup.models.find((x) => x.id === params.modelId)
if (!m || m.status !== 'ready') throw new Error('Selected model is not ready')
}
const response = await client.sendRequest('speech.dictation.setup', params)
if (!response.ok) {
throw new Error(response.error?.message || 'Failed to update dictation settings')
} Defensive patterns
Strategy: validation
Validate before calling
// Pre-validate the modelId points to a ready model
const setup = await fetchDictationSetup(client)
if (params.modelId) {
const m = setup.models.find((x) => x.id === params.modelId)
if (!m || m.status !== 'ready') throw new Error('Selected model is not ready')
}
if (params.dictationMode && !['toggle','hold'].includes(params.dictationMode)) {
throw new Error('Invalid dictation mode')
} Type guard
function isDictationConfigUpdateError(err: unknown): boolean {
return err instanceof Error && err.message === 'Failed to update dictation settings'
} Try / catch
try {
return await setDictationConfig(client, params)
} catch (err) {
if (isDictationConfigUpdateError(err)) {
showConfigUpdateFailedToast()
return await fetchDictationSetup(client)
}
throw err
} Prevention
- Always pass a ready model's id; gate the UI on isModelInFlight returning false.
- Restrict dictationMode to the documented union; do not let arbitrary strings reach the RPC.
- Persist the intended config locally so it can be re-applied after a transient host failure.
When it happens
Trigger: client.sendRequest('speech.dictation.setup', params) returns {ok:false} with no message; causes: params.modelId does not reference a ready model, params.dictationMode is not in the host's allowed set on that build, host config write failed, the host is mid-cutover and rejected the mutation.
Common situations: User enables dictation and selects a model that is still 'downloading' or 'extracting'; user passes a dictationMode the desktop build does not support; the desktop's speech config file is read-only.
Related errors
- Update the paired desktop Orca app to use mobile voice setti
- Failed to load dictation models
- Failed to start download
- Failed to delete model
- ${RPC error message}
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/2070a7ebdc03572f.
Report an issue: GitHub.