laurent22/joplin · error · Error
Model not found at path ${modelPath}
Error message
Model not found at path ${modelPath} What it means
Thrown by the whisper provider's `build` when the model folder exists but the `model.bin` file inside it does not. This check runs after `config.json` is read and parsed, just before opening the Whisper session.
Source
Thrown at packages/app-mobile/services/voiceTyping/whisper.ts:266
logger.debug('Creating Whisper session from path', modelFolderPath);
if (!await shim.fsDriver().exists(modelFolderPath)) throw new Error(`No model found at path: ${JSON.stringify(modelFolderPath)}`);
if (Setting.value('env') === Env.Dev) {
try {
await testWhisper();
} catch (error) {
logger.error('Testing error', error);
await shim.showErrorDialog(`Test failure: ${error}`);
}
}
const modelPath = join(modelFolderPath, 'model.bin');
const configJsonPath = join(modelFolderPath, 'config.json');
const configJson = JSON.parse(await shim.fsDriver().readFile(configJsonPath, 'utf-8'));
const config = new WhisperConfig(configJson);
if (!await shim.fsDriver().exists(modelPath)) {
throw new Error(`Model not found at path ${modelPath}`);
}
logger.debug('Starting whisper session', config.supportsShortAudioCtx ? '(short audio context)' : '');
const session = openSession({
modelPath, locale, prompt: getPrompt(locale, config.prompts), shortAudioContext: config.supportsShortAudioCtx,
});
return new Whisper(session, callbacks, config);
},
modelName: 'whisper',
};
export default whisper;
View on GitHub (pinned to 2654b33620)
Solutions
- Re-download: call `clearDownloads()` then `download()` to get a complete bundle.
- Verify the extracted folder contains `model.bin` after download (the unzip step expects exactly one inner entry).
- Free device storage before retrying.
Example fix
// before
const session = await provider.build({ modelPath, callbacks, locale });
// after
if (!await shim.fsDriver().exists(join(modelPath, 'model.bin'))) {
await voiceTyping.clearDownloads();
await voiceTyping.download();
}
const session = await provider.build({ modelPath, callbacks, locale }); Defensive patterns
Strategy: validation
Validate before calling
const modelBin = join(modelPath, 'model.bin');
if (!await shim.fsDriver().exists(modelBin)) {
logger.warn('model.bin missing; re-downloading bundle');
await voiceTyping.clearDownloads();
await voiceTyping.download();
} Type guard
null
Try / catch
try {
return await provider.build({ modelPath, callbacks, locale });
} catch (error) {
if (/Model not found at path/i.test(error.message)) {
await voiceTyping.clearDownloads();
await voiceTyping.download();
return provider.build({ modelPath, callbacks, locale });
}
throw error;
} Prevention
- Confirm the unzip step extracted model.bin before build.
- Re-download on partial extraction.
- Free device storage before retrying.
When it happens
Trigger: The folder is present (so error 94 does not fire) but `model.bin` was deleted, never extracted from the zip, or named differently. Happens when a partial download/unzip left the folder with only `config.json`.
Common situations: Unzip extracted only `config.json`; the zip's inner filename differed from `model.bin`; an external cleaner removed large files from cache; partial extraction after an interrupt.
Related errors
- No model found at path: ${JSON.stringify(modelFolderPath)}
- No supported provider found!
- Error! Destination already exists
- No note with id ${id}
- The active profile cannot be deleted. Switch to a different
AI-assisted analysis of laurent22/joplin@2654b33620 (2026-08-12).
Data as JSON: /api/errors/925de8de46302347.
Report an issue: GitHub.