{"record":{"id":"e6a812e764960441","repo":"ruvnet/ruflo","slug":"openai-response-status","errorCode":"OPENAI_${response.status}","errorMessage":"${message}","messagePattern":"\\$\\{message\\}","errorType":"exception","errorClass":"LLMProviderError","httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/providers/src/openai-provider.ts","lineNumber":480,"sourceCode":"    }\n\n    const message = errorData.error?.message || 'Unknown error';\n\n    switch (response.status) {\n      case 401:\n        throw new AuthenticationError(message, 'openai', errorData);\n      case 429:\n        const retryAfter = response.headers.get('retry-after');\n        throw new RateLimitError(\n          message,\n          'openai',\n          retryAfter ? parseInt(retryAfter) : undefined,\n          errorData\n        );\n      case 404:\n        throw new ModelNotFoundError(this.config.model, 'openai', errorData);\n      default:\n        throw new LLMProviderError(\n          message,\n          `OPENAI_${response.status}`,\n          'openai',\n          response.status,\n          response.status >= 500,\n          errorData\n        );\n    }\n  }\n}\n","sourceCodeStart":462,"sourceCodeEnd":491,"githubUrl":"https://github.com/ruvnet/ruflo/blob/fa13ee4ad60ac2090b1480656eb233521790d640/v3/@claude-flow/providers/src/openai-provider.ts#L462-L491","documentation":"OpenAIProvider's fallback mapping for any status other than 401/429/404: LLMProviderError with code OPENAI_<status>, retryable=true only when status >= 500. The message is OpenAI's error.error.message ('Unknown error' if the body was not JSON).","triggerScenarios":"complete() receiving 400 (invalid arguments, context-length exceeded, unsupported parameter for the model), 403, or 5xx such as 503 'engine overloaded' / 500 from OpenAI.","commonSituations":"Prompt + completion exceeding the model's context window (400 'maximum context length'); parameter not supported by the chosen model; transient 5xx during OpenAI incidents.","solutions":["Read error.statusCode, message, and error.details - OpenAI's message names the offending field or overload state","For 400 context-length: shorten the prompt or switch to a larger-context model; for other 400s remove the unsupported parameter","For 5xx (retryable=true): retry with backoff or fail over to another provider via the ProviderManager","If 5xx persists, check status.openai.com before retrying harder"],"exampleFix":"// before\nconst res = await provider.complete({ ...req, maxTokens: 8192 }); // OPENAI_400: context length\n\n// after - trim input to fit the model's context window\nconst res = await provider.complete({ ...req, prompt: truncate(req.prompt, 120_000), maxTokens: 4096 });","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"import { LLMProviderError, isLLMProviderError } from './types.js';\nfunction isOpenAIApiError(e: unknown): e is LLMProviderError {\n  return isLLMProviderError(e) && e.provider === 'openai' && e.code.startsWith('OPENAI_');\n}","tryCatchPattern":"try {\n  return await provider.complete(req);\n} catch (e) {\n  if (isOpenAIApiError(e)) {\n    if (e.retryable) return retryWithBackoff(() => provider.complete(req)); // 5xx only\n    throw new BadRequestError(`openai rejected request (${e.statusCode}): ${e.message}`, { cause: e });\n  }\n  throw e;\n}","preventionTips":["Branch on error.retryable (true only for status >= 500) rather than blanket retries","Count tokens client-side and trim prompts to the model's context window before sending","Log statusCode + details on 4xx - OpenAI's message identifies the invalid parameter"],"tags":["http-error","openai","api-error","status-mapping","context-length"],"backgroundTag":"http-error-response","analyzedSha":"fa13ee4ad60ac2090b1480656eb233521790d640","analyzedAt":"2026-08-18T21:34:22.708Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}