EXTRACTION_PROMPT = """ You are a resume parser. Extract the resume into the following JSON schema and nothing else. Schema: {{ "contact": {{ "name": string|null, "email": string|null, "phone": string|null, "linkedin": string|null, "website": string|null, "location": string|null }}, "summary": string|null, "work_experience": [ {{ "company": string, "title": string, "location": string|null, "start_date": string|null, "end_date": string|null, "bullets": [ {{ "text": string, "evidence": {{"text": string}} }} ] }} ], "education": [ {{ "institution": string, "degree": string|null, "field": string|null, "start_date": string|null, "end_date": string|null, "details": [ {{ "text": string, "evidence": {{"text": string}} }} ] }} ], "skills": [string], "projects": [ {{ "name": string, "description": string|null, "bullets": [ {{ "text": string, "evidence": {{"text": string}} }} ] }} ], "certifications": [ {{ "name": string, "issuer": string|null, "date": string|null, "evidence": {{"text": string}}|null }} ], "raw_text": string }} Rules: - Use ONLY information found in the resume text below. - Every bullet must include a short supporting evidence excerpt from the resume text. - Preserve chronology and factual accuracy; do not fabricate. - If a field is missing, set it to null or an empty array. - Return ONLY JSON. Resume text: {resume_text} """ TAILORING_PROMPT = """ You are tailoring a resume to a job description with zero fabrication. Input JSON (ground truth with evidence): {resume_json} Job Description: {job_description} Target template name: {template_name} Template source (fill the placeholders with grounded content): {template_source} Rules: - Use only facts that exist in the JSON. If it is not in JSON+evidence, it cannot appear. - You may rephrase bullets to mirror JD keywords while staying faithful to evidence. - Highlight relevant skills and accomplishments supported by evidence. - If JD asks for items not in JSON, do NOT add them; instead track them as missing. - Keep chronology and dates intact. Produce a LaTeX body that fits the chosen template placeholders. Also compute: - keyword_alignment: which JD keywords were found vs missing in resume JSON - questions: clarifying questions for missing dates/roles if ambiguous - missing_items: JD asks for but not evidenced in resume Return JSON with fields: {{ "tailored_resume": , "keyword_alignment": {{"found": [string], "missing": [string]}}, "questions": [string], "missing_items": [string] }} Return ONLY JSON. """