janhq/jan · error · Error
No installed "${backendType}" backend found. Install that ba
Error message
No installed "${backendType}" backend found. Install that backend first, then add the CUDA runtime. What it means
Thrown by installCudaRuntime after the archive name parsed successfully (backendType extracted from the filename) but getLocalInstalledBackends() filtered to that backendType returns zero entries. The CUDA runtime is supplementary - it only makes sense to install it on top of an already-installed backend of the same type, because it is decompressed directly into that backend's build/bin directory.
Source
Thrown at extensions/llamacpp-extension/src/index.ts:2976
(!path.endsWith('tar.gz') && !path.endsWith('zip'))
) {
throw new Error(`Invalid path or file ${path}`)
}
const archiveName = await basename(path)
const match = /^cudart-llama-bin-(.+?)\.(?:tar\.gz|zip)$/.exec(archiveName)
if (!match || !match[1]) {
throw new Error(
`Not a CUDA runtime archive: ${archiveName}. Expected cudart-llama-bin-<backend>.(zip|tar.gz)`
)
}
const backendType = match[1]
const targets = (await getLocalInstalledBackends()).filter(
(b) => b.backend === backendType
)
if (targets.length === 0) {
throw new Error(
`No installed "${backendType}" backend found. Install that backend first, then add the CUDA runtime.`
)
}
let installed = 0
for (const t of targets) {
const binDir = await joinPath([
await getBackendDir(t.backend, t.version),
'build',
'bin',
])
if (!(await fs.existsSync(binDir))) continue
await invoke('decompress', { path, outputDir: binDir })
installed++
}
if (installed === 0) {
throw new Error(
`Found ${backendType} backend(s) but none had a build/bin directory to install into.`View on GitHub (pinned to fad3f12a14)
Solutions
- Install the matching backend first (e.g. install the vulkan or cuda backend), then call installCudaRuntime again.
- Verify the <backend> segment of the archive name matches an entry returned by getLocalInstalledBackends() exactly (case, spelling, hyphenation).
- If the backend is installed but not detected, re-run backend provisioning / refresh the installed-backends list before retrying.
- Double-check the archive corresponds to the backend variant you actually intend to accelerate (cuda vs vulkan vs cpu).
Example fix
// before
await ext.installCudaRuntime('/d/cudart-llama-bin-vulkan.zip') // throws: no vulkan backend
// after
await ext.installBackend('vulkan', version) // ensure backend present first
const installed = await getLocalInstalledBackends()
if (!installed.some(b => b.backend === 'vulkan')) throw new Error('vulkan still missing')
await ext.installCudaRuntime('/d/cudart-llama-bin-vulkan.zip') Defensive patterns
Strategy: validation
Validate before calling
// Verify a backend of the parsed type is installed before installing the runtime
import { basename } from 'path'
const m = /^cudart-llama-bin-(.+?)\.(?:tar\.gz|zip)$/.exec(basename(path))!
const installed = await getLocalInstalledBackends()
if (!installed.some(b => b.backend === m[1])) {
throw new Error(`Install backend '${m[1]}' before applying its CUDA runtime`)
} Type guard
interface InstalledBackend { backend: string; version: string }
function backendTypeOfArchive(name: string): string | null {
const m = /^cudart-llama-bin-(.+?)\.(?:tar\.gz|zip)$/.exec(name)
return m ? m[1] : null
} Try / catch
try { await ext.installCudaRuntime(path) }
catch (e) {
if (/No installed.+backend found/.test(String(e))) { await ext.installBackend(backendType, ver); await ext.installCudaRuntime(path) }
else throw e
} Prevention
- Always install the backend in the same flow that installs its CUDA runtime.
- Order setup steps: backend first, runtime second.
- Surface the dependency in the UI so the runtime step is disabled until a backend exists.
When it happens
Trigger: Calling installCudaRuntime('cudart-llama-bin-vulkan.zip') when no vulkan backend is recorded as installed; backendType string from the filename has different casing/spelling than what getLocalInstalledBackends records (e.g. cuda-12 vs cuda12); user installed the CPU backend but is trying to apply a cuda runtime archive; backend was uninstalled between the download and this call.
Common situations: User follows the CUDA runtime step without first completing the backend install step in the setup wizard. Backend registry (getLocalInstalledBackends) is stale or the backend install failed silently. Version mismatch: the installed backend is recorded under a different identifier than the one encoded in the cudart archive name.
Related errors
- Not a CUDA runtime archive: ${archiveName}. Expected cudart-
- Invalid backend string: ${targetBackendString} supplied to u
- Invalid backend string format: "${targetBackendString}". Exp
- Invalid path or file ${path}
- Failed to parse archive name: ${archiveName}. Expected forma
AI-assisted analysis of janhq/jan@fad3f12a14 (2026-08-12).
Data as JSON: /api/errors/2e5bfe55dcceb6e9.
Report an issue: GitHub.