decolua/9router · warning
FUSION Panel ${model} failed
Error message
FUSION Panel ${model} failed What it means
In the FUSION combo service, each panel model is called in parallel and its response collected. When a panel's HTTP response is not ok (res.ok false), the panel is skipped with this warning rather than aborting the whole fusion request. It is a per-panel degradation log, not a fatal throw.
Source
Thrown at open-sse/services/combo.js:593
panelBody.messages = flattenToolHistory(panelBody.messages);
} else if (Array.isArray(panelBody.input)) {
panelBody.input = flattenToolHistory(panelBody.input);
}
const t0 = Date.now();
const calls = panel.map((m) => withTimeout(handleSingleModel(panelBody, m, true), cfg.panelHardTimeoutMs));
const settled = await collectPanel(calls, { ...cfg, minPanel });
log.info("FUSION", `fan-out collected in ${Date.now() - t0}ms`);
// 2. Collect successful answers.
const answers = [];
for (let i = 0; i < settled.length; i++) {
const res = settled[i];
const model = panel[i];
if (!res) { log.warn("FUSION", `Panel ${model} dropped (straggler/timeout)`); continue; }
if (res.__timeout) { log.warn("FUSION", `Panel ${model} timed out`); continue; }
if (res.__error) { log.warn("FUSION", `Panel ${model} threw`, { error: res.__error?.message || String(res.__error) }); continue; }
if (!res.ok) { log.warn("FUSION", `Panel ${model} failed`, { status: res.status }); continue; }
try {
const json = await res.clone().json();
const text = extractPanelText(json);
if (text) {
answers.push({ model, text });
log.info("FUSION", `Panel ${model} ok (${text.length} chars)`);
} else {
log.warn("FUSION", `Panel ${model} returned empty content`);
}
} catch (e) {
log.warn("FUSION", `Panel ${model} unparseable`, { error: e.message || String(e) });
}
}
// 3. Degrade gracefully when the panel is too thin to fuse.
if (answers.length === 0) {
log.warn("FUSION", "All panel models failed");
return new Response(View on GitHub (pinned to 90b52e06ff)
Solutions
- Check the `status` field in the warn log to see which HTTP status the panel got and fix that specific provider (key, quota, model name)
- Verify each panel model in the fusion config exists and is enabled for the configured account
- If 429: reduce panel size or request rate, or add more accounts for that provider
- If 401/403: re-authenticate or re-enter the API key for that provider in the dashboard
- If all panels fail, the request degrades to a 503 — see 'All fusion panel models failed'
Example fix
// before: panel references a retired model panel: ["claude-3-opus-20240229", "gpt-4o"] // after: use a valid, current model id panel: ["claude-sonnet-4-5", "gpt-4o"]
Defensive patterns
Strategy: fallback
Validate before calling
const panel = body.panel || [];
if (!panel.length) throw new Error('fusion panel is empty — nothing to call');
// optionally preflight each model with a cheap GET /models check Type guard
const isUsablePanelResponse = (res) => Boolean(res) && !res.__timeout && !res.__error && res.ok;
Try / catch
try {
const res = await fetchWithTimeout(url, { timeoutMs: PANEL_TIMEOUT });
if (!res.ok) console.warn(`panel ${model} failed: ${res.status}`); // already degraded, no throw
else return await res.json();
} catch (e) {
console.warn(`panel ${model} threw: ${e.message}`);
return null; // fusion continues with remaining panels
} Prevention
- Keep at least 2-3 independent providers in the fusion panel
- Monitor the per-panel warn logs for recurring status codes
- Rotate/refresh provider credentials before expiry
- Pin valid, current model ids in the panel config
When it happens
Trigger: A panel model upstream returned a non-2xx status (4xx/5xx) during parallel fan-out — e.g. upstream 429 rate limit, 401/403 bad/expired credentials, 404 unknown model alias, or 5xx upstream outage.
Common situations: One account in the panel hit its rate limit while others succeed; an API key was rotated/revoked; a model name in the fusion panel config no longer exists on its provider; provider outage causes 502/503.
Related errors
- MiMo bootstrap failed: ${response.status}
- NanoBanana status ${r.status}
- Runway status ${r.status}
- [AutoPing] ${provider}:${connection.id}: ping failed (reset
- Kiro tool input changed fragment type
AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30).
Data as JSON: /api/errors/808cc4ddd998a87d.
Report an issue: GitHub.