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

  1. Install the matching backend first (e.g. install the vulkan or cuda backend), then call installCudaRuntime again.
  2. Verify the <backend> segment of the archive name matches an entry returned by getLocalInstalledBackends() exactly (case, spelling, hyphenation).
  3. If the backend is installed but not detected, re-run backend provisioning / refresh the installed-backends list before retrying.
  4. 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

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


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