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

  1. 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)
  2. Verify each panel model in the fusion config exists and is enabled for the configured account
  3. If 429: reduce panel size or request rate, or add more accounts for that provider
  4. If 401/403: re-authenticate or re-enter the API key for that provider in the dashboard
  5. 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

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


AI-assisted analysis of decolua/9router@90b52e06ff (2026-08-30). Data as JSON: /api/errors/808cc4ddd998a87d. Report an issue: GitHub.