from pydantic import BaseModel, Field, field_validator class CreateSessionRequest(BaseModel): """创建会话入参:选择病例、训练类别、模式和分数类型。""" case_id: int training_type: str = Field(pattern="^(case_analysis|diagnosis_treatment|consultation)$") mode: str = Field(pattern="^(novice|practice|teaching)$") score_type: str = Field(default="percentage", pattern="^(percentage|five_point)$") @field_validator("mode") @classmethod def normalize_mode(cls, value: str) -> str: """训练模式:兼容旧 novice 请求,实际按 practice 练习模式处理。""" return "practice" if value == "novice" else value class CreateSessionResponse(BaseModel): """创建会话响应:返回会话标识和 AI 病人开场白。""" session_id: int session_code: str status: str patient_opening: str class ChatRequest(BaseModel): """问诊消息入参:医生向 AI 病人发送的自然语言问题。""" message: str = Field(min_length=1, max_length=2000) class ChatResponse(BaseModel): """问诊消息响应:返回 AI 病人的非流式回复。""" reply: str latency_ms: int model: str fallback_used: bool = False class OrderItemResponse(BaseModel): """可申请检查项:只返回名称和类型,不返回结果。""" item_code: str item_name: str item_type: str class OrderItemsResponse(BaseModel): """可申请检查项列表响应。""" items: list[OrderItemResponse] class CreateOrderRequest(BaseModel): """检查申请入参:指定当前病例下的检查项目编码。""" item_code: str = Field(min_length=1, max_length=64) class CreateOrderResponse(BaseModel): """检查申请响应:返回数据库预设的结构化检查结果。""" item_code: str item_name: str item_type: str result_text: str result_structured: dict | None = None is_key: bool is_abnormal: bool context_written: bool = True already_ordered: bool = False class SessionStatusResponse(BaseModel): """会话状态响应:用于阶段流转接口。""" session_id: int status: str class SubmitDiagnosisRequest(BaseModel): """诊断提交入参:保存主要诊断、鉴别诊断和诊断依据。""" primary_diagnosis: str = Field(min_length=1, max_length=2000) differential_diagnoses: list[str] = Field(default_factory=list) diagnosis_basis: str = Field(min_length=1, max_length=5000) class SubmitDiagnosisResponse(BaseModel): """诊断提交响应:进入治疗阶段。""" status: str class SubmitTreatmentRequest(BaseModel): """治疗方案入参:保存治疗原则、措施、风险预案、沟通和随访。""" treatment_principle: str = Field(min_length=1, max_length=3000) treatment_measures: str = Field(min_length=1, max_length=5000) risk_plan: str | None = Field(default=None, max_length=3000) communication: str | None = Field(default=None, max_length=3000) follow_up: str | None = Field(default=None, max_length=3000) class SubmitTreatmentResponse(BaseModel): """治疗提交响应:进入评价阶段。""" status: str class HintRequest(BaseModel): """会话提示入参:基于当前会话上下文生成新手模式提醒。""" last_user_message: str | None = Field(default=None, max_length=2000) scope: str = Field(default="current_conversation", pattern="^current_conversation$") class HintResponse(BaseModel): """会话提示响应:返回缺失维度、下一步问题和轻量训练提示。""" hints: list[str] missing_dimensions: list[str] next_questions: list[str] recommended_orders: list[dict] = Field(default_factory=list)