"""任务相关的 Pydantic Schema""" from typing import Optional, List from pydantic import BaseModel, Field, field_validator, model_validator from enum import Enum from datetime import datetime class SequenceType(str, Enum): NUCL = "nucl" PROT = "prot" ORFS = "orfs" READS = "reads" class PlatformType(str, Enum): ILLUMINA = "illumina" PACBIO = "pacbio" OXFORD = "oxford" HYBRID = "hybrid" class JobStatus(str, Enum): PENDING = "pending" QUEUED = "queued" RUNNING = "running" COMPLETED = "completed" FAILED = "failed" class JobCreateRequest(BaseModel): """创建任务请求参数""" # 序列类型 sequence_type: SequenceType = Field(default=SequenceType.NUCL, description="输入序列类型") # 基因组参数 scaf_suffix: Optional[str] = Field(".fna", description="基因组文件后缀") # 执行参数 threads: int = Field(default=4, ge=1, le=32, description="线程数") # 分析参数 min_identity: float = Field(default=0.8, ge=0.0, le=1.0, description="最小相似度") min_coverage: float = Field(default=0.6, ge=0.0, le=1.0, description="最小覆盖度") allow_unknown_families: bool = Field(default=False, description="允许未知家族") require_index_hit: bool = Field(default=True, description="要求索引命中") # CRISPR-Cas 参数 crispr_fusion: bool = Field(default=False, description="启用 CRISPR-Cas 融合分析") crispr_weight: float = Field(default=0.0, ge=0.0, le=1.0, description="CRISPR-Cas 评分权重") class JobResponse(BaseModel): """任务响应模型""" id: str status: JobStatus input_files: List[str] sequence_type: str threads: int # 进度信息 current_stage: Optional[str] = None progress_percent: int = 0 queue_position: Optional[int] = None # 结果信息 result_url: Optional[str] = None error_message: Optional[str] = None # 时间信息 created_at: datetime started_at: Optional[datetime] = None completed_at: Optional[datetime] = None # CRISPR 参数回显 crispr_fusion: Optional[bool] = False crispr_weight: Optional[float] = 0.0 class Config: from_attributes = True