{"record":{"id":"15f21be4166380d0","repo":"nikivdev/code","slug":"openai-returned-empty-commit-message","errorCode":null,"errorMessage":"OpenAI returned empty commit message","messagePattern":"OpenAI returned empty commit message","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/commit.rs","lineNumber":12964,"sourceCode":"                    if status.is_client_error() {\n                        bail!(\"OpenAI API error {}: {}\", status, text);\n                    }\n                    last_error = Some(format!(\"OpenAI API error {}: {}\", status, text));\n                    continue;\n                }\n\n                let parsed: ChatResponse =\n                    resp.json().context(\"failed to parse OpenAI response\")?;\n\n                let message = parsed\n                    .choices\n                    .first()\n                    .and_then(|c| c.message.as_ref())\n                    .map(|m| m.content.trim().to_string())\n                    .unwrap_or_default();\n\n                if message.is_empty() {\n                    bail!(\"OpenAI returned empty commit message\");\n                }\n\n                return Ok(trim_quotes(&message));\n            }\n            Err(e) => {\n                last_error = Some(format!(\"failed to call OpenAI API: {}\", e));\n                if attempt < MAX_RETRIES - 1 {\n                    println!(\"API call failed, will retry...\");\n                }\n            }\n        }\n    }\n\n    bail!(\n        \"{}\",\n        last_error.unwrap_or_else(|| \"OpenAI API failed after retries\".to_string())\n    )\n}","sourceCodeStart":12946,"sourceCodeEnd":12982,"githubUrl":"https://github.com/nikivdev/code/blob/a747e741ae92c09071d0ae946ab48488adcff1ce/src/commit.rs#L12946-L12982","documentation":"Thrown when the OpenAI API returns a successful response but `choices[0].message.content` is empty or absent after trimming, so no commit message can be extracted.","triggerScenarios":"OpenAI returns 200 with an empty `choices[0].message.content` — content filter triggered (`finish_reason: content_filter`), max_tokens too small, or the model returned no content in the message field.","commonSituations":"Content filter on the diff content; very small max_tokens setting; model returning empty on huge diffs; response schema drift so `message` deserializes to None.","solutions":["Increase max_tokens in the request payload.","Log the raw response JSON and check the `finish_reason` field (e.g. content_filter).","Reduce the diff size sent to the model.","Switch to a different model if content filtering repeatedly triggers."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// Reduce oversized diffs before sending to avoid empty/filtered output\nif diff.len() > 50_000 {\n    return Err(anyhow!(\"diff too large for OpenAI request\"));\n}","typeGuard":"fn openai_content_present(resp: &ChatResponse) -> bool {\n    resp.choices.first()\n        .and_then(|c| c.message.as_ref())\n        .map(|m| !m.content.trim().is_empty())\n        .unwrap_or(false)\n}","tryCatchPattern":"match result {\n    Err(e) if e.to_string().contains(\"OpenAI returned empty\") => {\n        eprintln!(\"Empty OpenAI content (check finish_reason); using fallback\");\n        fallback_to_manual_message()\n    }\n    other => other,\n}","preventionTips":["Set max_tokens high enough for a commit message.","Inspect `finish_reason` for content_filter and adjust prompts accordingly.","Truncate large diffs before sending.","Keep a manual/alternate provider as fallback."],"tags":["ai","openai","empty-output","api"],"backgroundTag":"ai-empty-response","analyzedSha":"a747e741ae92c09071d0ae946ab48488adcff1ce","analyzedAt":"2026-09-01T22:43:55.719Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}