{"record":{"id":"1d226cd9d2bf29f6","repo":"langflow-ai/langflow","slug":"error-starting-build-process","errorCode":null,"errorMessage":"Error starting build process","messagePattern":"Error starting build process","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/frontend/src/utils/buildUtils.ts","lineNumber":358,"sourceCode":"      },\n      body: JSON.stringify(postData),\n      credentials: getFetchCredentials(),\n    });\n\n    if (!buildResponse.ok) {\n      if (buildResponse.status === 404) {\n        throw new Error(\"Flow not found\");\n      }\n      let errorDetail = \"Error starting build process\";\n      try {\n        const errorData = await buildResponse.json();\n        if (errorData.detail) {\n          errorDetail = errorData.detail;\n        }\n      } catch (parseError) {\n        console.debug(\"Could not parse error response body:\", parseError);\n      }\n      throw new Error(errorDetail);\n    }\n\n    const { job_id } = await buildResponse.json();\n\n    const cancelBuildUrl = customCancelBuildUrl(job_id, playgroundPage);\n\n    // Get the buildController from flowStore\n    const buildController = new AbortController();\n    buildController.signal.addEventListener(\"abort\", () => {\n      try {\n        fetch(cancelBuildUrl, {\n          method: \"POST\",\n          headers: {\n            \"Content-Type\": \"application/json\",\n          },\n          credentials: getFetchCredentials(),\n        });\n      } catch (error) {","sourceCodeStart":340,"sourceCodeEnd":376,"githubUrl":"https://github.com/langflow-ai/langflow/blob/976ec789d2886a86de109c044d089d68e96c9a35/src/frontend/src/utils/buildUtils.ts#L340-L376","documentation":"Default message thrown by buildUtils when the initial build POST fails with a non-404 status and the response body is either not JSON or has no `detail` field. When the backend does send a detail, that replaces this message — so seeing the literal text means the error body was empty/unparseable (e.g. an HTML error page from a proxy).","triggerScenarios":"Build POST returns 500 with an empty body, a 502/503 HTML page from a reverse proxy, or a 401 from an auth layer that does not use FastAPI's {detail} shape; the try/catch around response.json() then falls through to the default message.","commonSituations":"Backend crashed mid-request (connection reset yields non-JSON), proxy misconfiguration returning HTML error pages, auth middleware rejecting with a custom body, backend/frontend version mismatch after partial upgrade.","solutions":["Reproduce with browser devtools open and inspect the raw response body/status of the failing POST — the default message hides it","Check backend logs for the stack trace matching the request timestamp","If the body is an HTML proxy error, fix the proxy (upstream timeout, body size) rather than the app","If 401/403 with a non-FastAPI body, fix the auth layer or re-login"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const { job_id } = await startBuildJob(postData);\n} catch (e) {\n  // errorDetail may be the default text when the body wasn't FastAPI JSON\n  logToDiagnostics({ url: buildUrl, status: lastStatus, bodySnippet: await raw.text?.() });\n  if (/proxy|gateway|50[234]/.test(e.message)) inspectProxyConfig();\n  else throw e;\n}","preventionTips":["When you see the literal default message, inspect the raw response in devtools — the server body carried no `detail`","Ensure reverse proxies pass through JSON error bodies from the backend","Log the HTTP status alongside this message in your error reporter"],"tags":["frontend","build","http-error","proxy","diagnostics"],"backgroundTag":null,"analyzedSha":"976ec789d2886a86de109c044d089d68e96c9a35","analyzedAt":"2026-08-14T18:23:12.227Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}