janhq/jan · error

Import of " " did not complete

Error message

Import of "${FALLBACK_EMBEDDING_MODEL_ID}" did not complete

What it means

bootstrapDefaultEmbedder() in the llamacpp extension downloads the fallback embedding model (via downloadAll with modelPath FALLBACK_EMBEDDING_MODEL_URL) and then verifies the install with hasEmbedderInstalled(). Because a cancelled or stopped download resolves without throwing, this check is the real guard: if the install cannot be confirmed, the import is considered incomplete and this error is thrown so bootstrap does not record the one-shot done flag.

Solutions

  1. Check disk space and network connectivity, then restart the app so bootstrap retries the download
  2. Verify the model files under the provider's models directory; delete any partial download so it re-downloads cleanly
  3. Confirm the extension's data folder is not being wiped between runs (the one-shot flag must not be recorded before install)
  4. Download the model manually via the UI/CLI and re-run bootstrap

Example fix

// before (silently resolves on cancel)
await downloadAll({ modelPath: FALLBACK_EMBEDDING_MODEL_URL })
// after (check completion before recording done)
await downloadAll({ modelPath: FALLBACK_EMBEDDING_MODEL_URL })
if (!(await this.hasEmbedderInstalled())) throw new Error('Import incomplete')
Defensive patterns

Strategy: retry

Validate before calling

// before relying on bootstrap
if (!(await extension.hasEmbedderInstalled())) await bootstrapDefaultEmbedder()

Try / catch

try {
  await bootstrapDefaultEmbedder()
} catch (e) {
  if (e.message.includes('did not complete')) {
    await cleanPartialDownload(); await bootstrapDefaultEmbedder() // retry once
  } else throw e
}

Prevention

When it happens

Trigger: The fallback embedding model download was cancelled, stopped, or failed mid-transfer, then hasEmbedderInstalled() still returns false; disk was full; the model files were deleted after download but before the check; a network interruption aborted the download silently.

Common situations: User quits the app during first-run model pre-install; flaky network kills the GGUF download; antivirus quarantines the downloaded model file; the models directory was cleared manually between runs.

Related errors


AI-assisted analysis of janhq/jan@7205d770c1 (2026-09-17). Data as JSON: /api/errors/1654811b2378c7b9. Report an issue: GitHub.

Appendix: source

Thrown at extensions/llamacpp-extension/src/index.ts:582

   * resizes models_max via an idle restart (nothing is loaded yet at startup).
   * The persisted flag keeps this from resurrecting a model the user deleted,
   * and is only set on success so a failed download retries next launch.
   */
  private async bootstrapDefaultEmbedder(): Promise<void> {
    try {
      if (await getBackendSetting(EMBEDDER_BOOTSTRAP_KEY)) return
      if (!(await this.hasEmbedderInstalled())) {
        // Set only around the actual fetch, and only when there is one to do:
        // an install that is already present must not flash a pending state.
        this.embedderBootstrapping = true
        await this.import(FALLBACK_EMBEDDING_MODEL_ID, {
          modelPath: FALLBACK_EMBEDDING_MODEL_URL,
        })
        // A stopped or cancelled download resolves without throwing, so the
        // install has to be confirmed before the one-shot flag is recorded --
        // otherwise bootstrap marks itself done and never retries.
        if (!(await this.hasEmbedderInstalled())) {
          throw new Error(
            `Import of "${FALLBACK_EMBEDDING_MODEL_ID}" did not complete`
          )
        }
        logger.info(
          `Pre-installed fallback embedding model "${FALLBACK_EMBEDDING_MODEL_ID}" at startup`
        )
      }
      await setBackendSetting(EMBEDDER_BOOTSTRAP_KEY, 'true')
      this.embedderBootstrapError = undefined
    } catch (e) {
      this.embedderBootstrapError = e instanceof Error ? e.message : String(e)
      logger.warn(
        'Fallback embedder bootstrap failed (will import on demand):',
        e
      )
    } finally {
      // In `finally` so a thrown import cannot leave the checklist reporting
      // "downloading" for the rest of the session.

View on GitHub (pinned to 7205d770c1)