{"record":{"id":"287fb1c6a38935a9","repo":"decolua/9router","slug":"fusion-panel-model-timed-out","errorCode":null,"errorMessage":"FUSION Panel ${model} timed out","messagePattern":"FUSION Panel (.+?) timed out","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"open-sse/services/combo.js","lineNumber":591,"sourceCode":"  // Flatten tool turns to prose so panel models keep context without emitting tool_calls.\n  if (Array.isArray(panelBody.messages)) {\n    panelBody.messages = flattenToolHistory(panelBody.messages);\n  } else if (Array.isArray(panelBody.input)) {\n    panelBody.input = flattenToolHistory(panelBody.input);\n  }\n\n  const t0 = Date.now();\n  const calls = panel.map((m) => withTimeout(handleSingleModel(panelBody, m, true), cfg.panelHardTimeoutMs));\n  const settled = await collectPanel(calls, { ...cfg, minPanel });\n  log.info(\"FUSION\", `fan-out collected in ${Date.now() - t0}ms`);\n\n  // 2. Collect successful answers.\n  const answers = [];\n  for (let i = 0; i < settled.length; i++) {\n    const res = settled[i];\n    const model = panel[i];\n    if (!res) { log.warn(\"FUSION\", `Panel ${model} dropped (straggler/timeout)`); continue; }\n    if (res.__timeout) { log.warn(\"FUSION\", `Panel ${model} timed out`); continue; }\n    if (res.__error) { log.warn(\"FUSION\", `Panel ${model} threw`, { error: res.__error?.message || String(res.__error) }); continue; }\n    if (!res.ok) { log.warn(\"FUSION\", `Panel ${model} failed`, { status: res.status }); continue; }\n    try {\n      const json = await res.clone().json();\n      const text = extractPanelText(json);\n      if (text) {\n        answers.push({ model, text });\n        log.info(\"FUSION\", `Panel ${model} ok (${text.length} chars)`);\n      } else {\n        log.warn(\"FUSION\", `Panel ${model} returned empty content`);\n      }\n    } catch (e) {\n      log.warn(\"FUSION\", `Panel ${model} unparseable`, { error: e.message || String(e) });\n    }\n  }\n\n  // 3. Degrade gracefully when the panel is too thin to fuse.\n  if (answers.length === 0) {","sourceCodeStart":573,"sourceCodeEnd":609,"githubUrl":"https://github.com/decolua/9router/blob/90b52e06ffd666b7929554211474d01588f6b1f8/open-sse/services/combo.js#L573-L609","documentation":"In the FUSION (judge) flow of combo.js, each panel model's request is raced with a timeout; a panel entry marked `__timeout` (or missing, a straggler) is dropped from the answer pool and 'Panel <model> timed out' is logged. Fusion continues with the remaining panel answers — the request itself does not fail unless no panel answers survive. The message reflects a per-model time limit, not a hard error.","triggerScenarios":"A panel model's upstream took longer than the fusion panel timeout (large prompts, slow provider, streaming stall); the panel promise lost the race and got a __timeout marker; network path to that provider is slow or the model is very long-context.","commonSituations":"Including a slow local model (ollama on CPU) in a fusion panel with cloud models; provider cold-start latency; long system prompts pushing generation past the deadline; regional network degradation; a hung upstream connection that never errors but never completes.","solutions":["Replace or remove the slow model from the fusion panel — fusion tolerates fewer answers.","Increase the fusion panel timeout in open-sse/config/runtimeConfig.js if your slowest member is legitimately slow.","Check the provider's latency/health independently; a consistently timing-out member adds nothing.","Reduce prompt size so panel members complete within the window.","Ensure the slow provider isn't routed through a broken proxy (proxyFetch) or retrying internally."],"exampleFix":"// before\n{ name: 'fusion', models: ['openai/gpt-4o', 'ollama/70b-cpu'] } // ollama always times out\n// after\n{ name: 'fusion', models: ['openai/gpt-4o', 'anthropic/claude-sonnet'] }","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Benchmark panel models and exclude those exceeding the fusion timeout budget.","Keep panel members on comparable-latency tiers (cloud-only, or raise the timeout for local models).","Keep prompts modest so slowest members finish in time.","Check proxyFetch/proxy configuration for providers with slow network paths."],"tags":["fusion","timeout","combo","latency"],"backgroundTag":"upstream-timeout","analyzedSha":"90b52e06ffd666b7929554211474d01588f6b1f8","analyzedAt":"2026-08-30T21:05:45.952Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}