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

  1. Re-download: call `clearDownloads()` then `download()` to get a complete bundle.
  2. Verify the extracted folder contains `model.bin` after download (the unzip step expects exactly one inner entry).
  3. 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

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


AI-assisted analysis of laurent22/joplin@2654b33620 (2026-08-12). Data as JSON: /api/errors/925de8de46302347. Report an issue: GitHub.