33 lines
1.1 KiB
Python
33 lines
1.1 KiB
Python
"""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
|