# -*- coding: utf-8 -*- """ 请求数据模型 定义 API 请求的数据结构 """ from typing import Optional from pydantic import BaseModel, Field class ROIParams(BaseModel): """ ROI (感兴趣区域) 参数 使用归一化坐标 (0.0 ~ 1.0) """ x: float = Field( default=0.0, ge=0.0, le=1.0, description="ROI 左上角 X 坐标 (归一化)", ) y: float = Field( default=0.0, ge=0.0, le=1.0, description="ROI 左上角 Y 坐标 (归一化)", ) width: float = Field( default=1.0, gt=0.0, le=1.0, description="ROI 宽度 (归一化)", ) height: float = Field( default=1.0, gt=0.0, le=1.0, description="ROI 高度 (归一化)", ) class OCRRequestParams(BaseModel): """ OCR 请求参数 (用于 multipart/form-data) """ lang: str = Field( default="ch", description="识别语言,支持 'ch'(中文), 'en'(英文) 等", ) use_gpu: bool = Field( default=False, description="是否使用 GPU 加速", ) drop_score: float = Field( default=0.5, ge=0.0, le=1.0, description="置信度阈值,低于此值的结果将被过滤", ) roi_x: Optional[float] = Field( default=None, ge=0.0, le=1.0, description="ROI 左上角 X 坐标 (归一化)", ) roi_y: Optional[float] = Field( default=None, ge=0.0, le=1.0, description="ROI 左上角 Y 坐标 (归一化)", ) roi_width: Optional[float] = Field( default=None, gt=0.0, le=1.0, description="ROI 宽度 (归一化)", ) roi_height: Optional[float] = Field( default=None, gt=0.0, le=1.0, description="ROI 高度 (归一化)", ) return_annotated_image: bool = Field( default=False, description="是否返回标注后的图片 (Base64)", ) def has_roi(self) -> bool: """检查是否设置了 ROI 参数""" return all( v is not None for v in [self.roi_x, self.roi_y, self.roi_width, self.roi_height] ) def get_roi(self) -> Optional[ROIParams]: """获取 ROI 参数对象""" if not self.has_roi(): return None return ROIParams( x=self.roi_x, y=self.roi_y, width=self.roi_width, height=self.roi_height, ) class OCRRequestBase64(BaseModel): """ OCR 请求 (Base64 JSON 格式) """ image_base64: str = Field( ..., description="Base64 编码的图片数据,支持 Data URL 格式", ) lang: str = Field( default="ch", description="识别语言,支持 'ch'(中文), 'en'(英文) 等", ) use_gpu: bool = Field( default=False, description="是否使用 GPU 加速", ) drop_score: float = Field( default=0.5, ge=0.0, le=1.0, description="置信度阈值,低于此值的结果将被过滤", ) roi: Optional[ROIParams] = Field( default=None, description="ROI 区域参数", ) return_annotated_image: bool = Field( default=False, description="是否返回标注后的图片 (Base64)", )