Files
resume-agent/backend/app/resume_api_models.py

69 lines
1.9 KiB
Python

"""Pydantic contracts for resume content, editing, and optimization APIs."""
from __future__ import annotations
from datetime import datetime
from typing import Any, Literal
from pydantic import BaseModel, ConfigDict, Field
class BusinessResume(BaseModel):
id: str
session_id: str
revision: int
content: dict[str, Any]
created_at: datetime
updated_at: datetime
class ResumePatchOperation(BaseModel):
model_config = ConfigDict(extra="forbid")
type: Literal[
"update_basics", "update_entry", "update_bullet", "delete_entry", "delete_bullet",
"update_skill_groups", "update_profile_summary"
]
entry_id: str | None = None
bullet_id: str | None = None
fields: dict[str, Any] | None = None
text: str | None = None
skills: list[str] | None = Field(default=None, max_length=80)
class ResumePatchRequest(BaseModel):
model_config = ConfigDict(extra="forbid")
expected_revision: int = Field(ge=1)
operation: ResumePatchOperation
class OptimizeRequest(BaseModel):
model_config = ConfigDict(extra="forbid")
entry_id: str = Field(min_length=1, max_length=64)
instruction: str | None = Field(default=None, max_length=200)
class OptimizeEntryRequest(BaseModel):
model_config = ConfigDict(extra="forbid")
entry_id: str = Field(min_length=1, max_length=64)
class SkillRecommendationRequest(BaseModel):
model_config = ConfigDict(extra="forbid")
question: str = Field(min_length=2, max_length=240)
class SkillRecommendationCandidate(BaseModel):
skill: str = Field(min_length=1, max_length=48)
category: str = Field(min_length=1, max_length=48)
reason: str = Field(min_length=1, max_length=160)
evidence_supported: bool = False
class SkillRecommendationResponse(BaseModel):
candidates: list[SkillRecommendationCandidate] = Field(default_factory=list, max_length=12)