FastAPI + React + PostgreSQL salary benchmarking tool with AI research pipeline. - Seed data for 25+ New York roles (junior/mid/senior levels) - Single + bulk lookup with location alias mapping (NYC -> New York, etc.) - Research pipeline: Serper -> Firecrawl -> Cohere Rerank -> Claude analysis - Editable validation UI for AI-proposed benchmarks - CSV export, Montserrat font, black/white/#FFC407 design - Fully Dockerized (app + db + frontend) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
55 lines
1 KiB
Python
55 lines
1 KiB
Python
from pydantic import BaseModel
|
|
|
|
|
|
class BenchmarkOut(BaseModel):
|
|
role: str
|
|
location: str
|
|
level: str
|
|
salary: int
|
|
source: str
|
|
validated: bool
|
|
confidence_score: float | None = None
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class SingleLookupParams(BaseModel):
|
|
title: str
|
|
location: str
|
|
|
|
|
|
class BulkLookupRequest(BaseModel):
|
|
location: str
|
|
titles: list[str]
|
|
|
|
|
|
class BulkLookupResponse(BaseModel):
|
|
found: dict[str, list[BenchmarkOut]]
|
|
not_found: list[str]
|
|
|
|
|
|
class ResearchRequest(BaseModel):
|
|
title: str
|
|
location: str
|
|
|
|
|
|
class BulkResearchRequest(BaseModel):
|
|
location: str
|
|
titles: list[str]
|
|
|
|
|
|
class ResearchStatusOut(BaseModel):
|
|
session_id: str
|
|
status: str
|
|
proposed_benchmarks: dict | None = None
|
|
claude_analysis: dict | None = None
|
|
error_message: str | None = None
|
|
|
|
|
|
class BenchmarkAdjustment(BaseModel):
|
|
salary: int | None = None
|
|
|
|
|
|
class ValidateRequest(BaseModel):
|
|
approved: bool
|
|
adjustments: dict[str, BenchmarkAdjustment] | None = None
|