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
- Restart the Runtime (`codewhale web`) so browser and Runtime versions match
- Inspect the raw response of the provider models endpoint and confirm it returns {models:[], total:<safe int>}
- Check for a reverse proxy or service worker serving a stale/corrupt response for /v1 endpoints
- 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
- Pin Runtime and browser bundle to the same build/version
- Never mock /v1 endpoints with hand-shaped payloads differing from the real schema
- Check proxied responses are still application/json
- Watch for provider catalogs whose totals can exceed client caps
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
- A provider and page loader are required.
- The provider catalog changed; restart loading its models.
- The provider catalog exceeds
- The Runtime returned a cursor beyond its provider model…
- The Runtime returned an incomplete provider model catalog.
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)