92 lines
4.1 KiB
Python
92 lines
4.1 KiB
Python
"""Employment LLM prompt builders.
|
|
|
|
Pure module: no FastAPI imports and no HTTPException.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
NO_COMPANY="no company was mentioned"
|
|
EDUCATION="No Education Mentioned"
|
|
CURRENT_TITLE="No JOB POSITION MENTIONED"
|
|
NO_LINKEDIN="no linkedin url mentioned"
|
|
NO_PHONE="no phone number mentioned"
|
|
|
|
|
|
def prompt():
|
|
return f"""You are an HR-ATS recruiting assistant.
|
|
|
|
You are given CV/resume text. Identify the candidate's CURRENT employer company
|
|
name, their education (degree / school), their current job title, their
|
|
LinkedIn profile URL, and their phone number when present.
|
|
|
|
Rules:
|
|
- Return only the company name that appears in the resume text for the ongoing / most recent role.
|
|
- Return only education that appears in the resume text.
|
|
- Return only job title that appears in the resume text.
|
|
- The company string you return MUST appear verbatim (or as a clear substring) in the resume text.
|
|
- The education string you return MUST appear verbatim (or as a clear substring) in the resume text.
|
|
- The job title string you return MUST appear verbatim (or as a clear substring) in the resume text.
|
|
- Do not invent a company. If none is mentioned, return exactly: {NO_COMPANY}
|
|
- Do not invent education. If none is mentioned, return exactly: {EDUCATION}
|
|
- Do not invent job title. If none is mentioned, return exactly: {CURRENT_TITLE}
|
|
|
|
linkedin_url (its own key — extract this separately from the other fields):
|
|
- Return the candidate's own public LinkedIn profile URL (linkedin.com/in/..., /pub/..., /mwlite/in/..., or lnkd.in/...).
|
|
- Reconstruct the URL if PDF extraction wrapped or spaced it (e.g. "linkedin.com/in/\\njane-doe" or "linkedin . com / in / jane-doe").
|
|
- Clickable icon links may appear as bare URLs on their own lines at the end of the text; use those.
|
|
- Copy the full slug. Never drop a trailing path segment.
|
|
- Do not return a company page (linkedin.com/company/...), a search URL, or a URL that is not LinkedIn.
|
|
- Do not invent a profile. If none is mentioned, return exactly: {NO_LINKEDIN}
|
|
|
|
phone (its own key — extract this separately; copy EVERY digit):
|
|
- Return the candidate's own mobile / phone exactly as written, including country code when present.
|
|
- Pakistani mobiles are 11 digits local (03XX-XXXXXXX / 03XX XXXXXXX) or +92 3XX XXXXXXX (12 digits with country code). Copy the last group in full — never stop after 7 or 8 digits.
|
|
- If PDF extraction wrapped the number across lines (e.g. "0321-5551\\n234"), join the groups into one complete number.
|
|
- Spaces, hyphens, and parentheses are allowed; do not delete trailing digits to "clean" the value.
|
|
- Do not invent a number. If none is mentioned, return exactly: {NO_PHONE}
|
|
|
|
Examples of CORRECT values (copy this completeness; these are format samples, not this candidate):
|
|
|
|
Example 1 — local 11-digit PK mobile, full LinkedIn:
|
|
Resume: "Ali Khan | 0321-5551234 | https://www.linkedin.com/in/ali-khan | Acme | BS CS | Engineer"
|
|
JSON:
|
|
{{
|
|
"current_employment": "Acme",
|
|
"education": "BS CS",
|
|
"current_title": "Engineer",
|
|
"linkedin_url": "https://www.linkedin.com/in/ali-khan",
|
|
"phone": "0321-5551234"
|
|
}}
|
|
|
|
Example 2 — +92 with spaces; every digit kept:
|
|
Resume: "Phone: +92 333 123 4567"
|
|
JSON phone must be "+92 333 123 4567" (12 digits after stripping separators: 923331234567). Not "+92 333 123" and not "+92 333 1234".
|
|
|
|
Example 3 — PDF wrapped the last three digits onto the next line:
|
|
Resume: "Mobile: 0300-1234\\n567"
|
|
JSON phone must be "0300-1234567" (11 digits). Returning "0300-1234" (last three missing) is wrong.
|
|
|
|
Example 4 — 4-3-4 grouping:
|
|
Resume: "Cell: 0301 234 5678"
|
|
JSON phone must be "0301 234 5678". Not "0301 234".
|
|
|
|
Example 5 — wrapped LinkedIn slug:
|
|
Resume: "linkedin.com/in/\\njane-doe-123"
|
|
JSON linkedin_url must be "https://www.linkedin.com/in/jane-doe-123". Not ".../jane-doe".
|
|
|
|
Respond with JSON only:
|
|
{{
|
|
"current_employment": "Company Name",
|
|
"education": "Degree / School",
|
|
"current_title": "Job Title",
|
|
"linkedin_url": "https://www.linkedin.com/in/slug",
|
|
"phone": "+92 300 1234567"
|
|
}}
|
|
"""
|
|
|
|
|
|
def user_prompt(resume_text:str) -> str:
|
|
return json.dumps({"resume_text":resume_text or ""},ensure_ascii=False)
|