-
Notifications
You must be signed in to change notification settings - Fork 0
Quickstart
From installation to a ranked shortlist in a few minutes.
Choose a provider and set an API key. configure() stores a process-global configuration that every other reveilio call reads from. It only needs to be called once.
import reveilio
reveilio.configure(
provider="gemini",
api_key="AIza...",
)If you prefer environment variables, set GEMINI_API_KEY, OPENAI_API_KEY, or the equivalent for your provider. Reveilio picks them up automatically.
A JobDescription is a lightweight wrapper around the raw JD text plus a lazily-computed structured parse. Create one from a file, from free text, or from in-memory bytes.
# From a file (.pdf, .docx, .doc, or .txt)
jd = reveilio.JobDescription.from_file("jd.pdf")
# From free text — pasted JDs or database rows
jd = reveilio.JobDescription.from_text("""
Senior Python Engineer, 5+ years, FastAPI, AWS, Postgres.
Must be comfortable with async code and production on-call.
""")
# From in-memory bytes — uploaded files in a web handler
jd = reveilio.JobDescription.from_bytes(uploaded.read(), filename=uploaded.name)💡 Tip:
JobDescriptioninstances are independent and reusable. Keep one per open role.
result = reveilio.analyze_resume("resumes/alice.pdf", jd)
print(result.overall_score) # 82.0
print(result.recommendation) # 'Shortlist'
print(result.candidate_data.name) # 'Alice Example'
print(result.detailed_scores["skills"])
# {'score': 90, 'reasoning': 'strong match on Python, FastAPI...'}You can pass a Resume object, a path, or free text:
reveilio.analyze_resume(reveilio.Resume.from_text(text), jd)
reveilio.analyze_resume("resumes/bob.docx", jd)
reveilio.analyze_resume("Bob, 8 years Java", jd) # treated as free textPoint reveilio at a folder. It picks up every supported resume, scores them in parallel, sorts by overall_score, and assigns a 1-based rank.
results = reveilio.analyze_folder("./resumes", jd, max_workers=4)
for r in results[:5]:
print(f"#{r.rank} {r.candidate_data.name:<25} {r.overall_score:>5.1f} {r.recommendation}")To include subfolders, pass recursive=True.
The same PDF exporter used in the original HR application ships with the package. Two formats:
# A detailed report for a single candidate
reveilio.save_report_pdf(result, "reports/alice.pdf")
# A ranking summary table for an entire batch
reveilio.save_batch_report_pdf(results, "reports/ranking.pdf")import reveilio
reveilio.configure(provider="openai", api_key="sk-...", model="gpt-4o-mini")
jd = reveilio.JobDescription.from_file("roles/senior_python.pdf")
results = reveilio.analyze_folder("applicants/2026-Q2/", jd)
shortlist = [r for r in results if r.recommendation == "Shortlist"]
print(f"{len(shortlist)} of {len(results)} candidates made the shortlist")
reveilio.save_batch_report_pdf(results, "reports/senior_python_ranking.pdf")
for r in shortlist:
reveilio.save_report_pdf(r, f"reports/{r.candidate_data.name}.pdf")Continue to Configuration & providers.
v0.1.1 · docs
Getting started
Core features
- Configuration & providers
- Job descriptions
- Resume parsing
- Scoring & analysis
- PDF reports
- Database storage
Using reveilio
Deployment
Deep dive