stablyai/orca · error · Error
Update the paired desktop Orca app to use mobile voice setti
Error message
Update the paired desktop Orca app to use mobile voice settings.
What it means
Mapped error from fetchDictationSetup when the paired desktop runtime is too old to know about the mobile speech API. isLegacyDesktopSpeechSetupError fires when the error message references speech.models.list AND the code is method_not_found (or the message says 'not available to mobile clients'). Rather than leak the raw denial, the client surfaces an upgrade instruction.
Source
Thrown at mobile/src/dictation/mobile-dictation-setup.ts:38
): boolean {
const message = error?.message ?? ''
return (
message.includes('speech.models.list') &&
(error?.code === 'method_not_found' || message.includes('not available to mobile clients'))
)
}
export function isDictationSetupRequiredError(message: string): boolean {
return SETUP_REQUIRED_CODES.has(message) || message.startsWith('voice_model_not_ready:')
}
export async function fetchDictationSetup(
client: Pick<RpcClient, 'sendRequest'>
): Promise<MobileSpeechSetup> {
const response = await fetchDictationSetupResponse(client)
if (!response.ok) {
if (isLegacyDesktopSpeechSetupError(response.error)) {
throw new Error(LEGACY_DESKTOP_SPEECH_SETUP_MESSAGE)
}
throw new Error(response.error?.message || 'Failed to load dictation models')
}
return (response as RpcSuccess).result as MobileSpeechSetup
}
async function fetchDictationSetupResponse(client: Pick<RpcClient, 'sendRequest'>) {
try {
return await client.sendRequest('speech.models.list', null)
} catch (error) {
if (!(error instanceof LogicalClientCutoverError)) {
throw error
}
// Why: this read can safely repeat on the authenticated replacement; mutation
// RPCs must still surface cutover so callers never replay unknown commits.
return client.sendRequest('speech.models.list', null)
}
}View on GitHub (pinned to 1136503c6a)
Solutions
- Prompt the user to update the paired Orca desktop to a build that implements speech.models.list / speech.models.download / speech.models.delete / speech.dictation.setup.
- After the desktop updates, re-pair or reconnect the host so the capability negotiation re-runs, then call fetchDictationSetup again.
- If updating is not possible, disable the dictation entry point on that host via isLegacyDesktopSpeechSetupError so users do not hit a dead-end toast.
Example fix
// before — caller shows raw error
try { await fetchDictationSetup(client) } catch (e) { showError(e.message) }
// after — caller maps the legacy message to upgrade UX
try {
await fetchDictationSetup(client)
} catch (e) {
if (e.message === LEGACY_DESKTOP_SPEECH_SETUP_MESSAGE) {
openDesktopUpgradeSheet()
} else {
showError(e.message)
}
} Defensive patterns
Strategy: validation
Validate before calling
// Probe capability before calling fetchDictationSetup
const status = await client.sendRequest('status.get', undefined)
if (!status.ok || !(status as any).result?.capabilities?.speech) {
showDesktopUpgradePrompt()
return
} Type guard
function isLegacyDesktopSpeechError(err: unknown): boolean {
return err instanceof Error && err.message === 'Update the paired desktop Orca app to use mobile voice settings.'
} Try / catch
try {
await fetchDictationSetup(client)
} catch (err) {
if (isLegacyDesktopSpeechError(err)) {
openDesktopUpgradeSheet()
return
}
throw err
} Prevention
- Advertise the required desktop build version in the mobile release notes; gate the dictation UI on status.get capability if available.
- Cache the legacy-desktop finding per host so repeated taps do not re-round-trip speech.models.list.
- When pairing a new host, run a capability probe and disable the mic entry point if speech is unsupported.
When it happens
Trigger: client.sendRequest('speech.models.list', null) fails because the desktop host returns method_not_found for speech.models.list (the method predates the desktop build), or returns a message containing 'not available to mobile clients'. The mobile app is paired against an older Orca desktop that does not implement the speech.models.* allowlist.
Common situations: User upgraded the mobile app but not the desktop app; user paired against a desktop running a pre-speech-runtime build; the desktop's speech capability flag is off but the build is new enough to deny explicitly.
Related errors
- Failed to load dictation models
- Failed to start download
- Failed to delete model
- Failed to update dictation settings
- ${RPC error message}
AI-assisted analysis of stablyai/orca@1136503c6a (2026-08-12).
Data as JSON: /api/errors/e2500d411e1d1de1.
Report an issue: GitHub.