{"record":{"id":"87739d0ece77c49b","repo":"srbhr/Resume-Matcher","slug":"failed-to-generate-interview-preparation-please-t","errorCode":null,"errorMessage":"Failed to generate interview preparation. Please try again.","messagePattern":"Failed to generate interview preparation\\. Please try again\\.","errorType":"http","errorClass":"HTTPException","httpStatus":500,"severity":"error","filePath":"apps/backend/app/routers/resumes.py","lineNumber":1963,"sourceCode":"\n    resume_data = resume.get(\"processed_data\")\n    if not resume_data:\n        raise HTTPException(\n            status_code=400,\n            detail=\"Resume has no processed data. Please re-upload the resume.\",\n        )\n\n    language = get_content_language()\n\n    try:\n        interview_prep = await generate_interview_prep(\n            resume_data,\n            job[\"content\"],\n            language,\n        )\n    except Exception as e:\n        logger.exception(\"Interview preparation generation failed: %s\", e)\n        raise HTTPException(\n            status_code=500,\n            detail=\"Failed to generate interview preparation. Please try again.\",\n        )\n\n    await db.update_resume(\n        resume_id,\n        {\"interview_prep\": _serialize_interview_prep(interview_prep)},\n    )\n\n    return GenerateInterviewPrepResponse(\n        interview_prep=interview_prep,\n        message=\"Interview preparation generated successfully\",\n    )\n\n\n@router.get(\"/{resume_id}/job-description\")\nasync def get_job_description_for_resume(resume_id: str) -> dict:\n    \"\"\"Get the job description used to tailor this resume.","sourceCodeStart":1945,"sourceCodeEnd":1981,"githubUrl":"https://github.com/srbhr/Resume-Matcher/blob/116f9cc3b00e1ac91734a6c2679bf41ea64a0edc/apps/backend/app/routers/resumes.py#L1945-L1981","documentation":"HTTP 500 raised when the interview-prep generation service throws any exception. The handler logs the original error with logger.exception and converts it into a generic 500 so internal details (API keys, prompts, stack traces) are not leaked to the client. The real cause is in the server logs under 'Interview preparation generation failed'.","triggerScenarios":"The AI/LLM call inside the interview-prep generator raises — e.g. invalid/expired API key, rate limit, timeout, empty job['content'] or resume_data, or malformed prompt output that fails parsing.","commonSituations":"Missing or rotated LLM provider credentials in env; provider outage or 429 rate limiting; extremely large resume/job content exceeding context limits; unexpected response shape from the model breaking JSON parsing.","solutions":["Check backend logs for 'Interview preparation generation failed' to see the underlying exception.","Verify the LLM provider API key and quota (env vars, billing, rate limits).","Retry the request — transient provider timeouts/429s often resolve on retry with backoff.","Reduce resume/job description size if context-limit errors appear in the logs."],"exampleFix":"// before\nexcept Exception as e:\n    logger.exception(\"Interview preparation generation failed: %s\", e)\n    raise HTTPException(status_code=500, detail=\"Failed to generate interview preparation. Please try again.\")\n// after (retry transient failures before giving up)\nexcept TransientProviderError:\n    ...  # retry with backoff\nexcept Exception as e:\n    logger.exception(\"Interview preparation generation failed: %s\", e)\n    raise HTTPException(status_code=500, detail=\"Failed to generate interview preparation. Please try again.\")","handlingStrategy":"retry","validationCode":"const resume = await getResume(id);\nconst imp = resume?.improvement;\nif (!imp?.job_id) throw new SkipError('no job context for prep');\nif ((resume.processed_data?.raw_text || '').length === 0) throw new SkipError('empty resume text');","typeGuard":null,"tryCatchPattern":"try {\n  return await withBackoff(() => generateInterviewPrep(resumeId), {retries: 2});\n} catch (e) {\n  if (e.status === 500) showRetryableError('Generation failed — check provider status or try again later.');\n  else throw e;\n}","preventionTips":["Check backend logs ('Interview preparation generation failed') for the root cause before retrying blindly.","Monitor LLM provider status, quotas, and API-key validity.","Cap resume/job text size before sending to the generator to avoid context-limit failures.","Use exponential backoff for transient provider errors."],"tags":["http-500","llm","generation-failed","fastapi"],"backgroundTag":"ai-generation-failed","analyzedSha":"116f9cc3b00e1ac91734a6c2679bf41ea64a0edc","analyzedAt":"2026-08-28T22:51:40.999Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}