"""Risk-model configuration API contracts.""" from datetime import datetime from pydantic import Field, model_validator from app.domain.model_config import DEFAULT_WEIGHTS from app.schemas.common import ApiSchema class ModelWeightConfigData(ApiSchema): weights: dict[str, float] frequency_coefficient: float frequency_cap: float updated_by: str | None = None updated_at: datetime | None = None class ModelWeightConfigUpdate(ApiSchema): weights: dict[str, float] frequency_coefficient: float = Field(ge=0, le=1) frequency_cap: float = Field(ge=1, le=3) @model_validator(mode="after") def validate_weights(self) -> "ModelWeightConfigUpdate": if set(self.weights) != set(DEFAULT_WEIGHTS): raise ValueError("权重必须完整包含七个固定维度") if any(value <= 0 or value > 100 for value in self.weights.values()): raise ValueError("每个维度权重必须大于0且不超过100") if abs(sum(self.weights.values()) - 100) > 0.01: raise ValueError("七个维度权重合计必须为100%") return self