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
- Update the llamacpp extension to a version implementing `installBackend`.
- Disable shadowing extensions.
- 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
- Prefer `typeof fn === 'function'` over `'fn' in obj`.
- Keep the llamacpp extension version in sync with the host app.
- Avoid the fuzzy matcher resolving to a non-llamacpp extension.
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
- Extension does not support backend updates
- Extension does not support CUDA runtime installation
- llamacpp extension not available
- llamacpp extension not available
- LlamaCpp extension not found
AI-assisted analysis of janhq/jan@fad3f12a14 (2026-08-12).
Data as JSON: /api/errors/a522f83ce955626c.
Report an issue: GitHub.