2026-09-04 10:20:40 +08:00

92 lines
2.3 KiB
Python

"""Risk prediction request and response contracts."""
from pydantic import Field
from app.domain.risk_engine import RiskLevel
from app.schemas.common import ApiSchema
class RiskIndicator(ApiSchema):
name: str = Field(min_length=1, max_length=64)
value: float = Field(ge=0, le=100)
weight: float = Field(default=1, gt=0, le=100)
class RiskAssessmentRequest(ApiSchema):
subject_id: str = Field(min_length=1, max_length=128)
indicators: list[RiskIndicator] = Field(min_length=1, max_length=50)
class RiskFactorResult(ApiSchema):
name: str
value: float
weight: float
contribution: float
class CategoryWarning(ApiSchema):
category: str
anomaly_count: int
risk_level: str
similar_category: str | None = None
similar_count: int | None = None
suggestion: str | None = None
class SupplierFrequency(ApiSchema):
supplier_name: str | None = None
cooperation_count: int | None = None
anomaly_count: int | None = None
alpha: float = 1.0
tier: str | None = None
suggestion: str | None = None
class StandardJudgment(ApiSchema):
category: str
risk_point: str
rule: str
source: str | None = None
status: str = "待检测"
class RiskDimensionScore(ApiSchema):
dimension: str
score: float
weight: float
class SimilarCase(ApiSchema):
date: str | None = None
product: str | None = None
problem: str | None = None
solution: str | None = None
class RiskAssessmentResult(ApiSchema):
subject_id: str
score: float
level: RiskLevel
model_version: str
factors: list[RiskFactorResult]
risk_badge: str | None = None
alert_text: str | None = None
category_warning: CategoryWarning | None = None
supplier_freq: SupplierFrequency | None = None
standard_judgment: list[StandardJudgment] = Field(default_factory=list)
dimension_scores: list[RiskDimensionScore] = Field(default_factory=list)
similar_cases: list[SimilarCase] = Field(default_factory=list)
ai_suggestions: list[str] = Field(default_factory=list)
class ModelInfo(ApiSchema):
model_version: str
score_range: str = "0-100"
levels: tuple[RiskLevel, ...] = (
RiskLevel.LOW,
RiskLevel.MODERATELY_LOW,
RiskLevel.MEDIUM,
RiskLevel.HIGH,
RiskLevel.VERY_HIGH,
)