janhq/jan · error · Error

Extension does not support backend installation

Error message

Extension does not support backend installation

What it means

Thrown when an extension was found for backend installation but it lacks the `installBackend` method. Capability gate via `'installBackend' in extension`. Means the matched extension is wrong (shadow) or is an older llamacpp version without manual-install support.

Source

Thrown at web-app/src/hooks/useBackendUpdater.ts:429

      if (!llamacppExtension) {
        // Try to find by type or other properties
        const possibleExtension = allExtensions.find(
          (ext) =>
            ext.constructor.name.toLowerCase().includes('llamacpp') ||
            (ext.type &&
              ext.type()?.toString().toLowerCase().includes('inference'))
        )

        if (!possibleExtension) {
          throw new Error('LlamaCpp extension not found')
        }

        extensionToUse = possibleExtension
      }

      if (!extensionToUse || !('installBackend' in extensionToUse)) {
        throw new Error('Extension does not support backend installation')
      }

      // Call the extension's installBackend method
      const extension = extensionToUse as LlamacppExtension
      await extension.installBackend?.(filePath)

      // Refresh backend list to update UI. Prefer the narrow
      // refreshBackendOptions (just rewrites the dropdown options); fall
      // back to the heavy configureBackends path for older extensions.
      if (extension.refreshBackendOptions) {
        await extension.refreshBackendOptions()
      } else {
        await extension.configureBackends?.()
      }
    } catch (error) {
      console.error('Error installing backend:', error)
      throw error
    }

View on GitHub (pinned to fad3f12a14)

Solutions

  1. Update the llamacpp extension to a version implementing `installBackend`.
  2. Disable shadowing extensions.
  3. Prefer the exact name lookup over the fuzzy fallback.

Example fix

// before
if (!extensionToUse || !('installBackend' in extensionToUse)) {
  throw new Error('Extension does not support backend installation')
}

// after
if (!extensionToUse || typeof extensionToUse.installBackend !== 'function') {
  throw new Error(
    'Installed llamacpp extension does not support manual backend installation. Update it.'
  )
}
Defensive patterns

Strategy: type-guard

Validate before calling

if (!extensionToUse || typeof extensionToUse.installBackend !== 'function') {
  toast.error('Incompatible extension', { description: 'Update the llamacpp extension to support manual backend install.' })
  return
}

Type guard

function supportsBackendInstall(ext: unknown): ext is { installBackend(filePath: string): Promise<void> } {
  return !!ext && typeof (ext as any).installBackend === 'function'
}

Try / catch

if (!supportsBackendInstall(extensionToUse)) {
  toast.error('Extension does not support backend installation', { description: 'Update the llamacpp extension.' })
  return
}

Prevention

When it happens

Trigger: Fuzzy matcher picked a non-llamacpp inference extension, or the installed llamacpp extension predates the `installBackend` API. Same shape as error 129 but for the install capability.

Common situations: Old extension version; third-party inference extension shadowing the name match; partial upgrade where the extension binary is stale.

Related errors


AI-assisted analysis of janhq/jan@fad3f12a14 (2026-08-12). Data as JSON: /api/errors/a522f83ce955626c. Report an issue: GitHub.