kx_guo e8c122e542 完善风险评分、LLM兜底与会话历史加载
- 接入数据库驱动的七维风险评分第一阶段逻辑\n- 增加主模型失败后的 DeepSeek 语义、流式和预防建议兜底\n- 将 AI 预防建议改为基于评分、历史异常和标准规则动态生成\n- 增加无历史案例时的标准库兜底校验和通用规则匹配\n- 修复未知供应商识别及测试占位名称过滤\n- 增加后端滚动日志文件配置和 LLM 请求日志\n- 历史会话直接读取已保存结果,避免重新调用模型和重算风险\n- 补充评分、供应商识别和 LLM 协议测试
2026-09-04 18:02:39 +08:00

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,
)