hired#
Public API for the hired package. Import the main user-facing functions and classes.
- class hired.ATSChecker[source]#
Bases:
objectCheck resume for ATS compatibility.
Examples
>>> from hired.ats_checker import ATSChecker >>> >>> checker = ATSChecker() >>> report = checker.check_resume(resume_dict) >>> print(report.get_summary()) >>> >>> # Check against specific job >>> report = checker.check_resume(resume_dict, job_result)
- class hired.ATSReport(overall_score, issues=<factory>, keyword_match_score=0.0, matched_keywords=<factory>, missing_keywords=<factory>)[source]#
Bases:
objectReport from ATS compatibility check.
- class hired.AlignmentReport(**data)[source]#
Bases:
BaseModelA complete, verdict-first alignment analysis for one JD.
- class hired.Application(job_title, company, id=None, job_url=None, location=None, salary_range=None, resume_path=None, cover_letter_path=None, status='draft', applied_date=None, created_at=None, updated_at=None, follow_up_date=None, last_contact_date=None, notes='', contacts='', interview_dates='', match_score=None, source=None, source_data='')[source]#
Bases:
objectRepresents a job application.
- class hired.ApplicationTracker(db_path=None)[source]#
Bases:
objectTrack job applications in a SQLite database.
Examples
>>> tracker = ApplicationTracker() >>> >>> # Add application from job search >>> app_id = tracker.add_application( ... job=job_result, ... resume_path="resume.pdf", ... status="applied" ... ) >>> >>> # Update status >>> tracker.update_status(app_id, "interview") >>> >>> # Get all applications in interview stage >>> interviews = tracker.get_applications(status="interview") >>> >>> # Get statistics >>> stats = tracker.get_statistics()
- add_application(job=None, **kwargs)[source]#
Add a new application.
- Parameters:
- Return type:
- Returns:
ID of created application
Examples
>>> # From JobResult >>> app_id = tracker.add_application( ... job=job_result, ... resume_path="resume.pdf", ... status="applied" ... ) >>> >>> # Manual entry >>> app_id = tracker.add_application( ... job_title="Software Engineer", ... company="TechCorp", ... status="applied" ... )
- get_application(app_id)[source]#
Get application by ID.
- Parameters:
app_id (
int) – Application ID- Return type:
- Returns:
Application object or None if not found
- get_applications(status=None, company=None, limit=None)[source]#
Get applications with optional filtering.
- get_follow_ups_due(days=7)[source]#
Get applications that need follow-up.
- Parameters:
days (
int) – Number of days to look ahead- Return type:
- Returns:
List of Application objects needing follow-up
- class hired.CandidateKnowledgeBase(user='me', *, store=None)[source]#
Bases:
objectAccumulated, open-world knowledge about a single candidate (user-level).
>>> import tempfile, os >>> os.environ['HIRED_DATA_DIR'] = tempfile.mkdtemp() >>> kb = CandidateKnowledgeBase() # default candidate "me" >>> from hired.candidate.base import Fact, FactCategory >>> _ = kb.add_fact(Fact(statement='Built ML pipelines in Python', ... category=FactCategory.SKILL, tags=['python', 'ml'])) >>> [f.statement for f in kb.facts(category=FactCategory.SKILL)] ['Built ML pipelines in Python'] >>> [f.statement for f in kb.facts(tags=['ml'])] ['Built ML pipelines in Python']
- add_note(subject, text=None, *, files=None)[source]#
Record volunteered info about a subject into its dossier.
textis appended to the dossier’soverview.md;files(a{name: bytes}mapping) are attached as detail/media. Returns the dossier. This is the “by the way, I also did X” entry point — a single sentence or a whole folder both land here.- Return type:
- add_source(src, *, name=None)[source]#
Store a raw source (file path or bytes) and record its content digest.
Returns the source key (its name in the raw store). The digest (in
state.json) lets a later refresh detect new/changed sources without re-reading everything. Facts extracted from a source cite it by this key.- Return type:
- facts(*, category=None, tags=None, status=FactStatus.ASSERTED, include_negations=True)[source]#
Iterate facts, optionally filtered by category/tags/status.
By default only
ASSERTEDfacts are returned (superseded ones are hidden).tagsmatches facts containing any of the given tags.
- jd(jd_id, *, company=None, label=None)[source]#
Get-or-create the workspace for an engagement (1+ JDs of one company).
company/labelare recorded in the engagement’smetawhen given.- Return type:
- needs_refresh()[source]#
True when uningested source/Q&A material exists (refresh warranted).
- Return type:
- record_qa(entry, *, derived_facts=None)[source]#
Append a clarifying Q&A exchange; optionally distill it into facts.
When
derived_facts(atomic fact records extracted from the answer) are given, they are ingested withSourceKind.QAprovenance (source_id= the Q&A id, quotes verified against the answer) and back-linked via the entry’sderived_fact_ids— so a Q&A answer becomes reusable, discoverable knowledge rather than being buried in the history.- Return type:
- refresh(mode='soft', *, ingest_fn=None, apply=True)[source]#
Refresh
infofrom changed sources + undistilled Q&A.ingest_fn(item)supplies extraction (intelligence is external); withapply=Falsethe result is a non-destructive preview. Seehired.candidate.refresh.- Return type:
- regenerate_synopsis()[source]#
Rebuild and persist a human-readable synopsis from current facts.
This is a projection — always derived from the fact store, never hand-edited — so it can be regenerated at any time without loss.
- Return type:
- save_upload(name, data)[source]#
Store a raw uploaded document by filename (see
add_source()).- Return type:
- supersede(old_fact_id, new_fact)[source]#
Replace
old_fact_idwithnew_fact(invalidate, don’t delete).- Return type:
- class hired.CoverLetterData(applicant_name, applicant_email, company_name, position_title, applicant_phone=None, applicant_address=None, hiring_manager_name=None, opening_paragraph='', body_paragraphs=None, closing_paragraph='', date=None)[source]#
Bases:
objectData structure for cover letter generation.
- class hired.DefaultAIAgent(*, model='default', api_key=None)[source]#
Bases:
objectDefault AI agent implementation (mock).
- class hired.JDWorkspace(kb, jd_id, *, store=None)[source]#
Bases:
objectReports, company research, interview-prep briefings, and parsed jobs for one engagement.
>>> import tempfile, os >>> os.environ['HIRED_DATA_DIR'] = tempfile.mkdtemp() >>> from hired.candidate import CandidateKnowledgeBase >>> kb = CandidateKnowledgeBase() >>> ws = kb.jd('acme', company='Acme, Inc.', label='Acme roles') >>> ws.save_report('staff-ds', {'verdict': {'recommendation': 'apply'}}) >>> ws.get_report('staff-ds')['verdict']['recommendation'] 'apply' >>> ws.meta['company'] 'Acme, Inc.'
- save_briefing(key, data)[source]#
Persist an interview-prep research briefing (keyed by subject/job).
- Return type:
- class hired.JobAnalyzer(job)[source]#
Bases:
objectAnalyze job postings to extract key information for resume tailoring.
- class hired.JobMatcher(candidate_skills=None, candidate_keywords=None, required_skills=None, min_salary=None, max_salary=None, preferred_locations=None, remote_only=False)[source]#
Bases:
objectMatch candidate profiles against job postings.
Examples
>>> matcher = JobMatcher(candidate_skills=['python', 'django', 'aws']) >>> scores = matcher.score_jobs(job_results) >>> top_jobs = matcher.get_top_matches(job_results, n=10)
- get_recommendations(jobs, top_n=5)[source]#
Get human-readable recommendations based on job matches.
- identify_skill_gaps(jobs)[source]#
Identify skills frequently requested but not possessed by candidate.
- class hired.JobResult(title, source, company=None, company_url=None, job_url=None, location=None, is_remote=None, description=None, job_type=None, compensation=None, date_posted=None, date_updated=None, application_deadline=None, skills=<factory>, benefits=<factory>, emails=<factory>, raw_data=<factory>)[source]#
Bases:
objectStandardized job result across all sources.
This provides a unified interface regardless of which source the job was retrieved from.
- class hired.JobSearchSource[source]#
Bases:
ABCAbstract base class for job search sources.
All job search sources must implement this interface to be registered in the system.
- abstract property display_name: str#
Return the display name of this source (e.g., ‘Indeed’, ‘USAJobs’).
- abstractmethod get_setup_instructions()[source]#
Return setup instructions for this source.
Should include:
Where to get API keys if needed
Environment variables or config file settings
URLs for documentation
- Return type:
- Returns:
Multi-line string with setup instructions.
- abstractmethod is_configured()[source]#
Check if this source is properly configured.
- Return type:
- Returns:
True if the source is ready to use, False otherwise.
- abstractmethod search(criteria)[source]#
Search for jobs using the given criteria.
- Parameters:
criteria (
SearchCriteria) – SearchCriteria object with search parameters- Return type:
- Returns:
List of JobResult objects
- Raises:
SourceConfigError – If the source is not properly configured
Exception – For other errors during search
- validate_configured()[source]#
Validate that the source is configured, raise error if not.
- Raises:
SourceConfigError – If the source is not properly configured
- Return type:
- class hired.JobSources(registry=None)[source]#
Bases:
objectMain facade for accessing job search sources.
Provides both mapping interface (dict-like access) and attribute access to registered job sources.
Examples
>>> sources = JobSources() >>> # List all available sources >>> sources.list() ['jobspy', 'usajobs', 'adzuna']
>>> # Access via attribute >>> results = sources.jobspy.search(SearchCriteria(query="python developer"))
>>> # Access via mapping >>> results = sources['indeed'].search(SearchCriteria(query="data scientist"))
>>> # Search across multiple sources >>> results = sources.search_all( ... SearchCriteria(query="software engineer", location="San Francisco") ... )
- get_source(name)[source]#
Get a source by name.
- search(source_name, criteria)[source]#
Search using a specific source.
- Parameters:
source_name (
str) – Name of the source to usecriteria (
SearchCriteria) – Search criteria
- Return type:
- Returns:
List of JobResult objects
- search_all(criteria, sources=None, skip_unconfigured=True)[source]#
Search across multiple sources.
- Parameters:
criteria (
SearchCriteria) – Search criteriasources (
Optional[List[str]]) – Optional list of source names. If None, uses all available sources.skip_unconfigured (
bool) – If True, skip sources that are not configured
- Return type:
- Returns:
Combined list of JobResult objects from all sources
- class hired.LLMConfig(model, temperature=0.7, max_tokens=None, top_p=1.0, provider='openai', api_key=None, base_url=None, extra_params=<factory>)[source]#
Bases:
objectConfiguration for LLM model selection and parameters.
>>> config = LLMConfig(model="gpt-4", temperature=0.7) >>> config.model 'gpt-4'
- class hired.LLMResumeAgent(*, model='gpt-4o-mini', client=None, api_key=None)[source]#
Bases:
objectAI agent that tailors a candidate’s profile to a job via an LLM.
Opt-in alternative to
DefaultAIAgent(which is a pass-through). It is dependency-injected and lazy:openaiis imported only when an agent is used without an injectedclient, so importinghirednever requiresopenai, and no API key is read at construction time. Inject aclient(anything exposing the OpenAI-stylechat.completions.create) to test without network or secrets.>>> class _FakeClient: ... class chat: ... class completions: ... @staticmethod ... def create(**_): ... ...
- class hired.MatchScore(job, overall_score, skill_match_score, keyword_match_score, matched_skills=<factory>, missing_skills=<factory>, matched_keywords=<factory>, compensation_match=None, location_match=None)[source]#
Bases:
objectScore for a job match.
- class hired.RenderingConfig(format='pdf', theme='default', custom_css=None, custom_template=None)[source]#
Bases:
objectConfiguration for resume rendering.
- class hired.Requirement(**data)[source]#
Bases:
BaseModelOne atomic requirement extracted verbatim from a job description.
- class hired.RequirementRecord(**data)[source]#
Bases:
BaseModelThe analysis of one requirement against the candidate’s knowledge.
- hired.ResumeContent#
alias of
ResumeSchemaExtended
- class hired.ResumeExpertAgent(*, llm_config=None, model_registry=None)[source]#
Bases:
objectAutonomous agent that uses ResumeSession as a tool.
Operates in auto mode, making decisions about expansion, distillation, search, and generation operations to produce complete resumes.
>>> config = LLMConfig(model="gpt-4") >>> agent = ResumeExpertAgent(llm_config=config) >>> agent.llm_config.model 'gpt-4'
- create_resume(session, *, mode='standard', max_iterations=5)[source]#
Autonomously create resume using session as tool.
Operates in plan-and-execute pattern:
Analyze job and candidate info
Plan resume creation strategy
Execute operations (expand, distill, match)
Generate resume
Critique and refine
- Return type:
- execute_plan(session, plan, *, interactive=False, approval_callback=None)[source]#
Execute a plan step by step.
- class hired.ResumeSchemaExtended(**data)[source]#
Bases:
ResumeSchemaExtended version of ResumeSchema that allows extra fields for custom sections.
This class inherits all the validation and structure from ResumeSchema but allows additional fields to be stored for custom sections.
- class hired.ResumeSession(job_info, candidate_info, *, mode=OperationMode.MANUAL, system_prompt=None, max_recent_turns=10, llm_config=None, model_registry=None, auto_persist=True, data_dir=None, name=None)[source]#
Bases:
objectStateful conversation session for resume creation.
Provides manual chat interface where users give natural language instructions to perform expansion, distillation, search, and generation operations. Maintains conversation history and structured state.
>>> config = LLMConfig("gpt-4") >>> session = ResumeSession( ... job_info="Senior ML Engineer at TechCo", ... candidate_info="5 years Python, ML experience", ... llm_config=config ... ) >>> session.llm_config.model 'gpt-4'
- chat(user_message)[source]#
Process user instruction and return assistant response.
This is the main interface for manual mode operation. Automatically persists session after each turn if auto_persist enabled.
- Return type:
- classmethod list_persisted(data_dir=None)[source]#
List all persisted sessions.
>>> for session_info in ResumeSession.list_persisted(): ... print(session_info['session_id'])
- classmethod load(session_id, *, data_dir=None, llm_config=None)[source]#
Load session from persistent storage.
- Return type:
>>> session = ResumeSession.load("abc123def456") >>> session.session_id if session else None 'abc123def456'
- property metadata: dict[str, Any]#
Return a small metadata dict for quick inspection.
Includes: session_id, name, created_at (iso), n_turns, mode, model
- save(data_dir=None)[source]#
Manually save session to persistent storage.
Returns path to saved session file.
- Return type:
- property snapshots: list[SessionSnapshot]#
Get all session snapshots.
- property state: SessionState#
Get current session state.
- class hired.SearchCriteria(query, location=None, country=None, city=None, state=None, postal_code=None, distance_miles=None, job_type=None, is_remote=None, posted_within_days=None, results_wanted=20, offset=0, min_salary=None, max_salary=None, keywords=<factory>, exclude_keywords=<factory>, source_params=<factory>)[source]#
Bases:
objectStandardized search criteria across all sources.
Different sources may not support all criteria, but this provides a consistent interface for users.
- hired.check_resume_ats(resume_content, job=None)[source]#
Quick utility to check resume ATS compatibility.
- Parameters:
- Return type:
- Returns:
ATSReport
Examples
>>> from hired import mk_content_for_resume >>> from hired.ats_checker import check_resume_ats >>> >>> resume = mk_content_for_resume(candidate_info, job_info) >>> report = check_resume_ats(resume.model_dump(), job_result) >>> print(report.get_summary())
- hired.classify(record)[source]#
Fill
gap_sizeandbucket(andneeds_clarification) in place.Returns the same record for convenience.
- Return type:
- hired.generate_cover_letter_content(candidate_info, job_info, tone='professional')[source]#
Generate cover letter content from candidate and job information.
- Parameters:
- Return type:
- Returns:
CoverLetterData object with generated content
Examples
>>> data = generate_cover_letter_content( ... candidate_info={'basics': {'name': 'Jane Doe', 'email': 'jane@example.com'}}, ... job_info={'title': 'Software Engineer', 'company': 'TechCorp'}, ... )
- hired.mk_content_for_resume(candidate_info_src, job_info_src, *, agent=None, validate=True, strict=False)[source]#
Generate resume content from candidate and job information.
- Parameters:
candidate_info_src (
Union[ContentSource,str,dict[str,Any]]) – Candidate information as ContentSource, file path, or dictjob_info_src (
Union[ContentSource,str,dict[str,Any],JobResult]) – Job information as ContentSource, file path, dict, or JobResultagent (
Optional[Any]) – Optional AI agent for content generationvalidate (
bool) – Whether to validate the generated contentstrict (
bool) – Whether to use strict validation
- Return type:
- Returns:
ResumeSchemaExtended object with generated content
Examples
>>> # Using file paths >>> content = mk_content_for_resume("candidate.json", "job.txt") >>> >>> # Using JobResult from job search >>> from hired import JobSources, SearchCriteria >>> sources = JobSources() >>> jobs = sources.jobspy.search(SearchCriteria(query="python developer")) >>> content = mk_content_for_resume(candidate_dict, jobs[0])
- hired.mk_cover_letter(candidate_info, job_info, *, tone='professional', format='text', output_path=None)[source]#
Generate and render a cover letter.
- Parameters:
candidate_info (
Dict[str,Any]) – Candidate information (resume dict or basics)job_info (
Union[Dict[str,Any],JobResult]) – Job information (dict, text, or JobResult)tone (
str) – Tone of the letter (‘professional’, ‘enthusiastic’, ‘formal’)format (
str) – Output format (‘text’, ‘html’, ‘markdown’)output_path (
Optional[str]) – Optional path to save the cover letter
- Return type:
- Returns:
Rendered cover letter as string
Examples
>>> from hired import mk_cover_letter, JobSources, SearchCriteria >>> >>> # From job search result >>> sources = JobSources() >>> jobs = sources.jobspy.search(SearchCriteria(query="software engineer")) >>> >>> letter = mk_cover_letter( ... candidate_info={'basics': {'name': 'Jane Doe', 'email': 'jane@example.com'}}, ... job_info=jobs[0], ... format='html' ... )
- hired.mk_resume(content, rendering=None, *, output_path=None, strict=False)[source]#
Render resume content to final format.
- Return type:
- hired.quick_match(candidate_skills, jobs, top_n=10)[source]#
Quick utility function to match jobs against candidate skills.
- Parameters:
- Return type:
- Returns:
List of top MatchScore objects
Examples
>>> from hired import JobSources, SearchCriteria >>> from hired.matching import quick_match >>> >>> sources = JobSources() >>> jobs = sources.jobspy.search(SearchCriteria(query="python developer")) >>> >>> matches = quick_match( ... candidate_skills=['python', 'django', 'postgresql'], ... jobs=jobs, ... top_n=5 ... ) >>> >>> for match in matches: ... print(match.get_summary())
Modules
JD-vs-candidate alignment: classify each requirement honestly into four buckets. |
|
ATS (Applicant Tracking System) compatibility checker. |
|
Core data models and protocols for the hired package. |
|
Candidate knowledge domain: accumulate open-world facts about a candidate. |
|
Configuration management using Mapping interfaces. |
|
Content generation logic and AI agent implementations. |
|
Cover letter generation functionality. |
|
Utilities for working with job postings and matching them to resumes. |
|
Job matching and scoring utilities. |
|
dol-based persistence foundation for hired (Storage v2). |
|
Rendering pipeline and theme management. |
|
Renderer implementations package. |
|
Resume Generation System - Core Architecture |
|
Pydantic models for resume json schema |
|
Job search functionality for the hired package. |
|
High-level orchestration functions - the main API. |
|
Application tracking system for managing job applications. |
|
Utilities for external dependencies and general helpers. |