- 接入数据库驱动的七维风险评分第一阶段逻辑\n- 增加主模型失败后的 DeepSeek 语义、流式和预防建议兜底\n- 将 AI 预防建议改为基于评分、历史异常和标准规则动态生成\n- 增加无历史案例时的标准库兜底校验和通用规则匹配\n- 修复未知供应商识别及测试占位名称过滤\n- 增加后端滚动日志文件配置和 LLM 请求日志\n- 历史会话直接读取已保存结果,避免重新调用模型和重算风险\n- 补充评分、供应商识别和 LLM 协议测试
102 lines
2.8 KiB
Python
102 lines
2.8 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(default_factory=list, max_length=50)
|
|
product_category: str | None = Field(default=None, max_length=100)
|
|
material_type: str | None = Field(default=None, max_length=200)
|
|
supplier: str | None = Field(default=None, max_length=300)
|
|
factory: str | None = Field(default=None, max_length=300)
|
|
stage_new: str | None = Field(default=None, max_length=100)
|
|
defect_level: str | None = Field(default=None, max_length=10)
|
|
|
|
|
|
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
|
|
status: str = "database"
|
|
reason: str | None = None
|
|
sample_size: int | None = None
|
|
raw_value: float | int | None = None
|
|
|
|
|
|
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,
|
|
)
|