Hmbown/CodeWhale · error

The Runtime returned an invalid provider model page.

Error message

The Runtime returned an invalid provider model page.

What it means

This error is thrown by the browser client's provider model pagination loader (collectProviderModelPages) when a page response from the Runtime fails shape validation: models must be an array of at most PROVIDER_MODELS_PAGE_SIZE entries, and total must be a safe non-negative integer no larger than MAX_PROVIDER_MODELS. It exists so a misbehaving Runtime cannot feed the UI malformed catalog data.

Solutions

  1. Restart the Runtime (`codewhale web`) so browser and Runtime versions match
  2. Inspect the raw response of the provider models endpoint and confirm it returns {models:[], total:<safe int>}
  3. Check for a reverse proxy or service worker serving a stale/corrupt response for /v1 endpoints
  4. Verify the runtime web bundle (app.mjs) and Runtime backend are from the same build

Example fix

// before: passing raw API output straight into UI logic
const models = await api(path);
render(models.models);
// after: validating the page shape before rendering
if (Array.isArray(page?.models) && Number.isSafeInteger(page?.total)) render(page.models);
else throw new Error('invalid provider model page');
Defensive patterns

Strategy: validation

Validate before calling

function isValidModelPage(page, pageSize) {
  return Array.isArray(page?.models) && page.models.length <= pageSize
    && Number.isSafeInteger(page?.total) && page.total >= 0;
}

Type guard

const isModelPage = (r) => Array.isArray(r?.models) && Number.isSafeInteger(r?.total) && r.total >= 0;

Try / catch

try { const page = await api(path); if (!isModelPage(page)) throw new Error('invalid provider model page'); } catch (e) { console.error('model page rejected:', e.message); }

Prevention

When it happens

Trigger: A call to the Runtime's provider models endpoint returns a response whose `models` is not an array, contains more than PROVIDER_MODELS_PAGE_SIZE entries, whose `total` is missing, non-numeric, non-safe-integer, negative, or exceeds MAX_PROVIDER_MODELS.

Common situations: A Runtime built from an older/newer revision returning a different page payload shape; a proxy or dev server returning an HTML error page; a hand-edited or mocked Runtime response; a Runtime bug emitting a bad total after catalog churn.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@73e0f67d83 (2026-09-22). Data as JSON: /api/errors/0d25fc84c1b742dc. Report an issue: GitHub.

Appendix: source

Thrown at crates/tui/src/runtime_web/app.mjs:674

  const entries = [];
  const seenCursors = new Set();
  let expectedTotal;
  let cursor = "";
  for (let page = 0; page < MAX_PROVIDER_MODEL_PAGES; page += 1) {
    const query = new URLSearchParams({ limit: String(PROVIDER_MODELS_PAGE_SIZE) });
    if (cursor) query.set("cursor", cursor);
    const response = await fetchPage(
      `/v1/providers/${encodeURIComponent(provider)}/models?${query.toString()}`,
    );
    if (String(response?.provider || "") !== provider) {
      throw new Error("The Runtime returned a model page for a different provider.");
    }
    if (!Array.isArray(response?.models)
      || response.models.length > PROVIDER_MODELS_PAGE_SIZE
      || !Number.isSafeInteger(response.total)
      || response.total < 0
      || response.total > MAX_PROVIDER_MODELS) {
      throw new Error("The Runtime returned an invalid provider model page.");
    }
    if (expectedTotal !== undefined && expectedTotal !== response.total) {
      throw new Error("The provider catalog changed; restart loading its models.");
    }
    expectedTotal = response.total;
    const pageEntries = response.models;
    if (entries.length + pageEntries.length > MAX_PROVIDER_MODELS) {
      throw new Error(`The provider catalog exceeds ${MAX_PROVIDER_MODELS} models.`);
    }
    entries.push(...pageEntries);

    const nextCursor = typeof response?.nextCursor === "string"
      ? response.nextCursor.trim()
      : "";
    if (!nextCursor) {
      if (entries.length !== expectedTotal) {
        throw new Error("The Runtime returned an incomplete provider model catalog.");
      }

View on GitHub (pinned to 73e0f67d83)