128 lines
3.7 KiB
Python
128 lines
3.7 KiB
Python
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)
|