janhq/jan · error · Error

Extension does not support backend updates

Error message

Extension does not support backend updates

What it means

Thrown when an extension was found (either by name or via the fuzzy fallback) but it lacks the `getSettings` or `updateBackend` methods — i.e. it is not the llamacpp extension or is an older/incompatible version. The `'method' in object` duck-type check is the capability gate.

Source

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

          (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 ||
        !('getSettings' in extensionToUse) ||
        !('updateBackend' in extensionToUse)
      ) {
        throw new Error('Extension does not support backend updates')
      }

      const extension = extensionToUse as LlamacppExtension

      // Use the exact target backend from checkBackendForUpdates if available,
      // to avoid mismatches between old/new backend name formats
      let targetBackendString = updateState.updateInfo.targetBackend

      if (targetBackendString) {
        // Validate and normalize the provided target backend string
        const rawParts = targetBackendString.split('/')
        const versionPart = rawParts[0]?.trim()
        const backendTypePart = rawParts[1]?.trim()

        if (rawParts.length !== 2 || !versionPart || !backendTypePart) {
          // Malformed targetBackend; fall back to constructing from current settings
          const currentBackendType = await getCurrentBackendTypeFromSettings(
            extension

View on GitHub (pinned to fad3f12a14)

Solutions

  1. Update the llamacpp extension to a version that implements `updateBackend`.
  2. Disable other extensions whose names/type strings could shadow the fuzzy matcher.
  3. Prefer the exact `getByName('llamacpp-extension')` result and only fall back with a stricter type check.

Example fix

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

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

Strategy: type-guard

Validate before calling

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

Type guard

function supportsBackendUpdates(ext: unknown): ext is LlamacppExtension {
  return !!ext && typeof (ext as any).getSettings === 'function' && typeof (ext as any).updateBackend === 'function'
}

Try / catch

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

Prevention

When it happens

Trigger: The fuzzy matcher picked the wrong extension (its constructor name coincidentally contained 'llamacpp' or its type contained 'inference') but that extension does not implement backend updates; or the installed llamacpp extension is an old version predating `updateBackend`.

Common situations: Another inference extension shadows llamacpp; extension version mismatch after partial upgrade; a custom/third-party extension named similarly but lacking the API.

Related errors


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