{"record":{"id":"895060ba206f774e","repo":"linshenkx/prompt-optimizer","slug":"generation-failed-895060","errorCode":"GENERATION_FAILED","errorMessage":"${errorMessage}","messagePattern":"\\$\\{errorMessage\\}","errorType":"error_code","errorClass":"ImageError","httpStatus":null,"severity":"error","filePath":"packages/core/src/services/image/adapters/grok.ts","lineNumber":345,"sourceCode":"    if (!response.ok) {\n      let errorMessage = `Grok API error: ${response.status} ${response.statusText}`\n      try {\n        const errorData = await response.json()\n        if (errorData.error?.message) {\n          errorMessage = errorData.error.message\n        }\n      } catch {\n        try {\n          const errorText = await response.text()\n          if (errorText) {\n            errorMessage = `${errorMessage}: ${errorText}`\n          }\n        } catch {\n          // ignore\n        }\n      }\n\n      throw new ImageError(IMAGE_ERROR_CODES.GENERATION_FAILED, errorMessage)\n    }\n\n    return await response.json()\n  }\n}\n","sourceCodeStart":327,"sourceCodeEnd":351,"githubUrl":"https://github.com/linshenkx/prompt-optimizer/blob/3e677b1d9f7e0493c142c175560531e7ae786dce/packages/core/src/services/image/adapters/grok.ts#L327-L351","documentation":"The Grok adapter's apiCall throws GENERATION_FAILED with an extracted errorMessage when the HTTP response is not ok. It first attempts to parse the error body for a message before falling back to the status text.","triggerScenarios":"Any non-2xx response from xAI's image API during generateImage/generateImageEdit — 401 invalid API key, 404 wrong model or endpoint, 429 rate limit, 5xx server errors. The parsed error body message is embedded in the thrown ImageError.","commonSituations":"Expired or wrong API key, using a model name not available on xAI, free-tier rate limits, or transient 5xx from xAI infrastructure.","solutions":["Read the embedded message — it is the API's own error text (e.g. 'Invalid API key')","Verify API key and model ID in ImageModelConfig","Retry with backoff on 429/5xx responses","Check xAI status/limits if errors persist"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"if (!config.apiKey) throw new Error('xAI API key required')","typeGuard":"function isGrokHttpFailure(e: unknown): e is ImageError {\n  return e instanceof ImageError && e.code === IMAGE_ERROR_CODES.GENERATION_FAILED\n}","tryCatchPattern":"try { ... } catch (e) {\n  if (isGrokHttpFailure(e)) {\n    if (/rate limit|429/i.test(e.message)) return retryWithBackoff(fn)\n    throw e\n  }\n}","preventionTips":["Validate API key and model ID before the call","Retry 429/5xx with exponential backoff","Keep per-minute request budgets under xAI limits"],"tags":["grok","http-error","api-key","rate-limit"],"backgroundTag":"image-generation-api-failed","analyzedSha":"3e677b1d9f7e0493c142c175560531e7ae786dce","analyzedAt":"2026-08-27T21:29:16.709Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}