{"record":{"id":"104e7d0b1a8af45d","repo":"HeyPuter/puter","slug":"unknown-error-104e7d","errorCode":"unknown_error","errorMessage":"Failed to extract image URL from OpenAI response","messagePattern":"Failed to extract image URL from OpenAI response","errorType":"http","errorClass":"HttpError","httpStatus":400,"severity":"error","filePath":"src/backend/drivers/ai-image/providers/openai/OpenAiImageProvider.ts","lineNumber":276,"sourceCode":"        if (outputCostInCents > 0) {\n            usageEntries.push({\n                usageType: `${usageType}:output`,\n                usageAmount: Math.max(usage.outputTokens, 1),\n                costOverride: this.#toMicroCents(outputCostInCents),\n            });\n        }\n        if (usageEntries.length) {\n            this.#meteringService.batchIncrementUsages(actor, usageEntries);\n        }\n\n        const url =\n            result.data?.[0]?.url ||\n            (result.data?.[0]?.b64_json\n                ? `data:image/png;base64,${result.data[0].b64_json}`\n                : null);\n\n        if (!url) {\n            throw new HttpError(\n                400,\n                'Failed to extract image URL from OpenAI response',\n                { legacyCode: 'unknown_error' },\n            );\n        }\n\n        return url;\n    }\n\n    #extractUsage(result: ImagesResponse): OpenAIImageUsage {\n        const usage = (result.usage ?? {}) as ImagesResponse.Usage &\n            Record<string, unknown>;\n        const inputTokens = this.#toSafeCount(usage.input_tokens);\n        const outputTokens = this.#toSafeCount(usage.output_tokens);\n\n        const inputDetails = (usage.input_tokens_details ??\n            {}) as unknown as Record<string, unknown>;\n        const inputTextTokens = this.#toSafeCount(inputDetails.text_tokens);","sourceCodeStart":258,"sourceCodeEnd":294,"githubUrl":"https://github.com/HeyPuter/puter/blob/908ec23eda38526170322c3edf71ba45ecb1ca95/src/backend/drivers/ai-image/providers/openai/OpenAiImageProvider.ts#L258-L294","documentation":"Thrown by OpenAiImageProvider.generate() (OpenAiImageProvider.ts:276) after a successful images.generate or images.edit call when result.data[0] has neither a `url` nor a `b64_json` field. Billing has already been recorded at this point. HTTP 400 unknown_error — the OpenAI response lacked the expected image payload.","triggerScenarios":"OpenAI returned data with an error/filter reason but no image; content policy filtered the result; the response shape changed across SDK/API versions; an empty data array or data[0] without image fields; the model returned a text refusal in a non-standard field.","commonSituations":"Prompt violated OpenAI content policy producing a filtered/empty result; SDK version drift; model returning b64 under a different key; transient API anomaly.","solutions":["Rephrase the prompt to avoid policy-violating content.","Inspect the full result.data[0] object in logs for filter/error fields.","Verify the `openai` npm package version is current and compatible with the model.","Retry once for transient cases."],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  return await provider.generate(params);\n} catch (e) {\n  if (e instanceof HttpError && e.message.includes('extract image URL from OpenAI')) {\n    return await provider.generate(params); // single retry\n  }\n  throw e;\n}","preventionTips":["Avoid policy-violating prompts that produce filtered/empty OpenAI results.","Keep the `openai` npm package current.","Log result.data[0] to spot filter/error fields when this recurs."],"tags":["openai","ai-image","upstream-response","content-filtering","unknown-error"],"backgroundTag":null,"analyzedSha":"908ec23eda38526170322c3edf71ba45ecb1ca95","analyzedAt":"2026-08-12T20:53:15.911Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}