different-ai/openwork · error

Failed to load the provider catalog (${response.status}).

Error message

Failed to load the provider catalog (${response.status}).

What it means

requestLlmProviderCatalog performs GET /v1/llm-provider-catalog and throws this error when the response status is not ok, preferring a server-provided message via getErrorMessage. It guards the catalog fetch that populates the provider picker in the editor screen.

Source

Thrown at ee/apps/den-web/app/(den)/dashboard/_components/llm-provider-data.tsx:468

  if (!response.ok) {
    throw new Error(getErrorMessage(payload, `Endpoint test failed (${response.status}).`));
  }
  const result = isRecord(payload) ? asProbeResult(payload.result) : null;
  if (!result) {
    throw new Error("Endpoint test returned an unexpected response.");
  }
  const verifications = isRecord(payload) && Array.isArray(payload.verifications)
    ? payload.verifications
        .map(asModelVerification)
        .filter((entry): entry is LlmProviderModelVerification => entry !== null)
    : [];
  return { ...result, verifications };
}

export async function requestLlmProviderCatalog(orgId: string) {
  const { response, payload } = await requestJson(`/v1/llm-provider-catalog`, { method: "GET" }, 20000);
  if (!response.ok) {
    throw new Error(getErrorMessage(payload, `Failed to load the provider catalog (${response.status}).`));
  }

  return isRecord(payload) && Array.isArray(payload.providers)
    ? payload.providers.map(asCatalogProviderSummary).filter((entry): entry is DenModelsDevProviderSummary => entry !== null)
    : [];
}

export async function requestLlmProviderCatalogDetail(orgId: string, providerId: string) {
  const { response, payload } = await requestJson(
    `/v1/llm-provider-catalog/${encodeURIComponent(providerId)}`,
    { method: "GET" },
    20000,
  );

  if (!response.ok) {
    throw new Error(getErrorMessage(payload, `Failed to load provider details (${response.status}).`));
  }

View on GitHub (pinned to 2b7df46e8a)

Solutions

  1. Check response.status: 401 → re-authenticate; 404 → verify server version has the catalog route; 5xx → inspect backend/upstream models.dev fetch logs.
  2. Retry the request after confirming backend health.
  3. Verify auth headers/org context are sent with the GET.
  4. If upstream (models.dev) is down, check the server's caching/fallback for catalog data.

Example fix

// before
throw new Error(getErrorMessage(payload, `Failed to load the provider catalog (${response.status}).`));
// after (retry transient failures once)
if (response.status >= 500) {
  const retry = await requestJson(`/v1/llm-provider-catalog`, { method: "GET" }, 20000);
  if (retry.response.ok) return parseCatalog(retry.payload);
}
throw new Error(getErrorMessage(payload, `Failed to load the provider catalog (${response.status}).`));
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const catalog = await requestLlmProviderCatalog(orgId);
} catch (err) {
  const msg = err instanceof Error ? err.message : String(err);
  if (/\((401|403)\)/.test(msg)) promptReauth();
  else showCatalogError(`${msg} — retry shortly`);
}

Prevention

When it happens

Trigger: GET /v1/llm-provider-catalog returns 401 (no session), 403, 404 (route not deployed), 429, or 5xx; the 20s requestJson timeout elapsed so requestJson itself throws before this (note: this error is only for non-ok responses that do return).

Common situations: Expired dashboard session; server deployment older than the catalog endpoint; models.dev-backed catalog service failing upstream causing 502/503; rate limiting after repeated catalog refreshes.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of different-ai/openwork@2b7df46e8a (2026-09-01). Data as JSON: /api/errors/9f137ad7c046bf0a. Report an issue: GitHub.