Skip to content
TutujinAPI

Recruiting and HR assistant

Recruiting and HR use three kinds of models together: a small model parses resumes into structured fields, a mainstream model checks each candidate against the hiring manager’s written criteria and drafts interview questions, and another mainstream model answers employee questions from the handbook. The models only organize and pre-sort; people decide who is interviewed and who is hired. For 3,000 resumes and 2,000 handbook questions a month, at live prices in each model’s cheapest group, model costs are about ¥61.19 a month.

Prices updated Nov 13, 2026, 1:33 AM

Monthly cost estimate

Assumptions: 3,000 resumes a month, each parsed with about 2,500 input tokens (about 2,000 resume, 500 field instructions) and 800 output tokens, and screened with about 2,500 input and 500 output tokens; 300 candidates go to interview, with about 2,500 input and 1,200 output tokens to draft their questions; employees ask 2,000 questions a month, each with about 3,000 tokens of policy text and a 300-token answer.

¥61.19per month

  • Resume parsing¥6.51
  • Screening against criteria¥37.8
  • Interview questions¥6.13
  • Handbook Q&A¥10.75
See the usage assumed

The business problem

One opening often draws hundreds of resumes in every format: PDF, Word, pages exported from job boards. HR opens them one by one, copies education, experience and skills into a spreadsheet and compares them with the job requirements, leaving little time to talk to candidates.

Asking an LLM to “pick the best person” is a bad idea: the standard is opaque, the same resume can get a different verdict when asked twice, and name, gender, age or a photo, none of which bear on the job, may sway the model.

A safer setup: people set the criteria and write them down as clear items; the model judges each item and quotes the resume; code does the sorting with fixed rules; personal details unrelated to the job are removed before screening; and a recruiter looks at every candidate and makes the decision.

Recommended models

Recommended models are picked from the live catalog; prices are each model's cheapest group, updated Nov 13, 2026, 1:33 AM. Click a model to see every group's price.

  • Resume parsing (small model)

    input ¥0.196 / output ¥2.1 per 1M tokensChina Models group

    Turns resume text into JSON with fixed fields: education, experience, skills and certificates. Fixed fields and no heavy reasoning mean a small model is enough, and its low price adds up at volume. Convert image or scanned resumes to text first, or switch to an alternative that accepts images.

  • Job matching and interview questions (mainstream model)

    input ¥2.8 / output ¥11.2 per 1M tokensChina Models group

    Checks the structured resume against each criterion as met, not met or unclear, quoting the resume as evidence; for candidates going to interview, drafts follow-up questions based on the criteria and their actual experience. It has to follow instructions consistently, so it uses a mainstream model.

  • Employee handbook Q&A (mainstream model)

    input ¥1.12 / output ¥6.72 per 1M tokensChina Models group

    When employees ask about leave, expenses or attendance, the relevant passages are retrieved from the handbook and policies first, and the model answers only from them, citing the source. Long input, short output; retrieval works as in the knowledge-base solution.

Reference architecture

  1. 1

    Write clear job criteria

    The hiring manager writes the requirements as a few checkable criteria, split into must-haves and nice-to-haves, such as “at least 3 years of B2B sales experience”. Every candidate for the job is judged on the same list, and changes are versioned.

  2. 2

    Parse resumes

    Extract the text of PDF and Word resumes in code; the small model returns JSON with fixed fields. Code checks date formats and required fields, and failures go to manual entry.

  3. 3

    Remove unrelated details, then screen

    Before screening, code removes name, contact details, photo, gender, age, hometown and other fields unrelated to the job; the mainstream model sees only experience and skills and gives a verdict with evidence for each criterion.

  4. 4

    Code sorts, people review

    Code sorts candidates into “review first” and “gaps to confirm” depending on whether every must-have is met. The model gives no overall score and rejects no one; a recruiter looks at every candidate.

  5. 5

    Prepare interviews

    For candidates going to interview, the model drafts follow-up questions from the criteria and the specific experience on the resume; interviewers edit them before use.

  6. 6

    Handbook Q&A

    Index the handbook, attendance and expense policies as in the knowledge-base solution; retrieve the relevant passages for each question and answer only from the policy text with the source. Questions about individual pay, performance or employment disputes go to HR.

Cost estimate

Assumptions: 3,000 resumes a month, each parsed with about 2,500 input tokens (about 2,000 resume, 500 field instructions) and 800 output tokens, and screened with about 2,500 input and 500 output tokens; 300 candidates go to interview, with about 2,500 input and 1,200 output tokens to draft their questions; employees ask 2,000 questions a month, each with about 3,000 tokens of policy text and a 300-token answer.

ItemModelUsage assumedCost
Resume parsingqwen-flash3,000 × (2,500 input + 800 output tokens)¥6.51
Screening against criteriadeepseek-v4.1-flash3,000 × (2,500 input + 500 output tokens)¥37.8
Interview questionsdeepseek-v4.1-flash300 × (2,500 input + 1,200 output tokens)¥6.13
Handbook Q&Aqwen3.5-plus2,000 × (3,000 input + 300 output tokens)¥10.75
Total (per month)¥61.19

Calculated from live prices in each model's cheapest group, updated Nov 13, 2026, 1:33 AM.

Model usage only: the applicant tracking system, storage and human review are not included. Retrieval (embedding) for handbook Q&A costs very little and is left out; see the knowledge-base solution for how to price it. Twice the resumes means roughly twice the first two lines.

Sample code

A small model parses the resume into fixed fields; name and contact details are removed before screening; the mainstream model judges each criterion with a quote from the resume; code sorts candidates into queues, and a recruiter reviews them all.

Sample code (Python, resume parsing and criteria screening)
import json
import os
from openai import OpenAI

client = OpenAI(base_url="https://www.tutujin.com/v1", api_key=os.environ["TUTUJIN_API_KEY"])

FIELDS = {
    "name": "", "phone": "", "email": "",
    "education": [{"school": "", "degree": "", "major": "", "graduated": "YYYY-MM"}],
    "experience": [{"company": "", "title": "", "start": "YYYY-MM", "end": "YYYY-MM or now", "highlights": [""]}],
    "skills": [""],
    "certificates": [""],
}
# Written by the hiring manager; every candidate for this job is judged on the same list.
CRITERIA = [
    {"id": "C1", "must": True, "text": "At least 3 years of B2B sales experience"},
    {"id": "C2", "must": True, "text": "Has owned key accounts or a sales territory"},
    {"id": "C3", "must": False, "text": "Has sold software or SaaS"},
    {"id": "C4", "must": False, "text": "Has worked with overseas clients in English"},
]
NOT_FOR_SCREENING = ("name", "phone", "email")


def ask_json(model, system, user):
    resp = client.chat.completions.create(
        model=model,
        messages=[{"role": "system", "content": system}, {"role": "user", "content": user}],
        temperature=0,
    )
    raw = resp.choices[0].message.content
    return json.loads(raw[raw.find("{"): raw.rfind("}") + 1])


def parse_resume(text):
    return ask_json(
        "qwen-flash",
        "Copy the resume into JSON with exactly this shape: " + json.dumps(FIELDS)
        + ". Use empty values when something is not in the resume; never guess. Reply with JSON only.",
        text,
    )


def screen(profile):
    facts = {k: v for k, v in profile.items() if k not in NOT_FOR_SCREENING}
    result = ask_json(
        "deepseek-v4.1-flash",
        "You help a recruiter. For each criterion answer met, not_met or unclear, and quote the resume text "
        "that supports it. Judge only the listed criteria. "
        'Reply with JSON only: {"criteria": [{"id": "C1", "verdict": "met", "evidence": ""}]}',
        "Criteria:\n" + json.dumps(CRITERIA) + "\n\nCandidate:\n" + json.dumps(facts, ensure_ascii=False),
    )
    verdicts = {c["id"]: c["verdict"] for c in result["criteria"]}
    gaps = [c["id"] for c in CRITERIA if c["must"] and verdicts.get(c["id"]) != "met"]
    # The model never rejects anyone: it only sorts the queue, and a recruiter reviews every candidate.
    return {"queue": "review_gaps" if gaps else "review_first", "must_have_gaps": gaps, "criteria": result["criteria"]}


with open("resume.txt", encoding="utf-8") as f:
    profile = parse_resume(f.read())
print(json.dumps(screen(profile), ensure_ascii=False, indent=2))

Try this with one key

Sign up, create an API key in the console, and put your base_url and key into the code above. For company purchasing or invoices, add our WeChat support JsnonoChat.

Tutujin support WeChat QR code
WeChatJsnonoChat

Scan the code or search the WeChat ID to add us

FAQ

What does processing 3,000 resumes a month cost?

With every resume parsed and screened, interview questions for 300 candidates and 2,000 employee questions a month, the cheapest groups come to about ¥61.19 a month. Resume volume and the length of the criteria matter most.

Can the model decide whom to reject?

Not recommended. The model makes mistakes and can be swayed by how a resume is written. In the sample, the model only judges each criterion with evidence, code sorts the queue, a recruiter sees every candidate, and people decide who is interviewed and hired.

How do I keep the screening consistent for everyone?

Use the same written criteria and the same prompt for every candidate for a job, set temperature to 0, let code do the sorting with fixed rules instead of free-form scores from the model, remove personal details unrelated to the job before screening, spot-check results regularly and version the criteria when they change.

How should personal data in resumes be handled?

Resumes contain names, phone numbers and email addresses, and requests are forwarded through this service to the model provider for processing. Send only what parsing needs and strip identity and contact details before screening. For notifying candidates, consent and retention periods, assess your setup against the personal-data rules that apply to you and your company policies.

What if the handbook assistant gives a wrong answer?

Have the model answer only from the retrieved policy text and cite it, say it does not know and hand off to HR when the text does not cover the question, and always route questions about individual pay, performance or employment disputes to a person. Re-index the affected passages when a policy changes.