janhq/jan · error · Error

Failed to fetch supported backends: ${error instanceof Error

Error message

Failed to fetch supported backends: ${error instanceof Error ? error.message : error}

What it means

Wrapping error thrown when listSupportedBackends itself throws — the inner error (network failure, parse failure, API error) is caught and re-thrown with a 'Failed to fetch supported backends' prefix and the original message. This is distinct from error 5 which fires when the call succeeds but returns an empty list.

Source

Thrown at extensions/llamacpp-extension/src/index.ts:1438

    this.isConfiguringBackends = true

    try {
      let version_backends: { version: string; backend: string }[] = []

      try {
        version_backends = await listSupportedBackends(
          this.config.check_for_updates !== false
        )
        if (version_backends.length === 0) {
          throw new Error(
            'No supported backend binaries found for this system. Backend selection and auto-update will be unavailable.'
          )
        } else {
          version_backends.sort((a, b) => b.version.localeCompare(a.version))
        }
      } catch (error) {
        throw new Error(
          `Failed to fetch supported backends: ${
            error instanceof Error ? error.message : error
          }`
        )
      }

      // Get stored backend preference
      const storedBackendType = await this.getStoredBackendType()
      let bestAvailableBackendString = ''

      // "Recommended" is computed against upstream releases only — a
      // user-side-loaded backend (Install from File) must not bias the
      // suggestion. If we have no remote data (check_for_updates off or
      // offline), there is no honest recommendation to surface.
      const remoteOnly =
        this.config.check_for_updates !== false
          ? await fetchRemoteBackends()
          : []

View on GitHub (pinned to fad3f12a14)

Solutions

  1. Retry after confirming network connectivity — transient rate limits and CDN hiccups are the most common cause.
  2. Set a GitHub API token in the environment to raise the rate-limit ceiling if running in CI.
  3. Switch the configured source between 'github' and 'cdn' to bypass a failing endpoint.
  4. Pre-cache backend manifests locally if the environment is offline or behind a strict firewall.
Defensive patterns

Strategy: retry

Try / catch

async function fetchBackendsWithRetry(maxAttempts = 3): Promise<typeof backends> {
  for (let i = 0; i < maxAttempts; i++) {
    try {
      return await listSupportedBackends(true)
    } catch (e) {
      if (i === maxAttempts - 1) throw e
      await new Promise(r => setTimeout(r, 1000 * (i + 1)))
    }
  }
  throw new Error('unreachable')
}

Prevention

When it happens

Trigger: listSupportedBackends throws: GitHub API rate limit (403), network timeout/DNS failure, malformed JSON in the fetched manifest, CDN returning an error page, or an internal assertion in the manifest parser.

Common situations: GitHub unauthenticated API rate limit in CI; corporate firewall blocking api.github.com or the CDN; CDN outage during a release window; proxy returning an HTML error page that fails JSON parsing.

Related errors


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