Files
fastapi/app/schemas/session.py
T

128 lines
3.7 KiB
Python
Raw Normal View History

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)