prepare fastapi root layout for server deployment
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user