feat: add dual-track API endpoints for document processing
- Add ProcessingTrackEnum, ProcessingOptions, ProcessingMetadata schemas - Add DocumentAnalysisResponse for document type detection - Update /start endpoint with dual-track query parameters - Add /analyze endpoint for document type detection with confidence scores - Add /metadata endpoint for processing track information - Add /download/unified endpoint for UnifiedDocument format export - Update tasks.md to mark Section 6 API updates as completed 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,14 @@ class TaskStatusEnum(str, Enum):
|
||||
FAILED = "failed"
|
||||
|
||||
|
||||
class ProcessingTrackEnum(str, Enum):
|
||||
"""Processing track enumeration for dual-track processing"""
|
||||
OCR = "ocr" # PaddleOCR PP-StructureV3 for scanned documents
|
||||
DIRECT = "direct" # PyMuPDF for editable PDFs
|
||||
HYBRID = "hybrid" # Mixed processing
|
||||
AUTO = "auto" # Auto-detect best track
|
||||
|
||||
|
||||
class TaskCreate(BaseModel):
|
||||
"""Task creation request"""
|
||||
filename: Optional[str] = Field(None, description="Original filename")
|
||||
@@ -117,3 +125,64 @@ class UploadResponse(BaseModel):
|
||||
file_size: int = Field(..., description="File size in bytes")
|
||||
file_type: str = Field(..., description="File MIME type")
|
||||
status: TaskStatusEnum = Field(..., description="Initial task status")
|
||||
|
||||
|
||||
# ===== Dual-Track Processing Schemas =====
|
||||
|
||||
class ProcessingOptions(BaseModel):
|
||||
"""Processing options for dual-track OCR"""
|
||||
use_dual_track: bool = Field(default=True, description="Enable dual-track processing")
|
||||
force_track: Optional[ProcessingTrackEnum] = Field(None, description="Force specific track (ocr/direct)")
|
||||
language: str = Field(default="ch", description="OCR language code")
|
||||
include_layout: bool = Field(default=True, description="Include layout analysis")
|
||||
include_images: bool = Field(default=True, description="Extract and save images")
|
||||
confidence_threshold: Optional[float] = Field(None, ge=0, le=1, description="OCR confidence threshold")
|
||||
|
||||
|
||||
class AnalyzeRequest(BaseModel):
|
||||
"""Document analysis request"""
|
||||
use_dual_track: bool = Field(default=True, description="Enable dual-track processing")
|
||||
force_track: Optional[ProcessingTrackEnum] = Field(None, description="Force specific track")
|
||||
language: str = Field(default="ch", description="OCR language")
|
||||
include_layout: bool = Field(default=True, description="Include layout analysis")
|
||||
|
||||
|
||||
class DocumentAnalysisResponse(BaseModel):
|
||||
"""Document type analysis response"""
|
||||
task_id: str
|
||||
filename: str
|
||||
recommended_track: ProcessingTrackEnum
|
||||
confidence: float = Field(..., ge=0, le=1, description="Detection confidence")
|
||||
reason: str = Field(..., description="Reason for recommendation")
|
||||
document_info: dict = Field(default_factory=dict, description="Document metadata")
|
||||
is_editable: bool = Field(..., description="Whether document has extractable text")
|
||||
text_coverage: Optional[float] = Field(None, description="Percentage of text coverage")
|
||||
page_count: Optional[int] = Field(None, description="Number of pages")
|
||||
|
||||
|
||||
class ProcessingMetadata(BaseModel):
|
||||
"""Processing metadata included in responses"""
|
||||
processing_track: ProcessingTrackEnum
|
||||
processing_time_seconds: float
|
||||
language: str
|
||||
page_count: int
|
||||
total_elements: int
|
||||
total_text_regions: int
|
||||
total_tables: int
|
||||
total_images: int
|
||||
average_confidence: Optional[float] = None
|
||||
unified_format: bool = True
|
||||
|
||||
|
||||
class TaskResponseWithMetadata(TaskResponse):
|
||||
"""Extended task response with processing metadata"""
|
||||
processing_track: Optional[ProcessingTrackEnum] = None
|
||||
processing_metadata: Optional[ProcessingMetadata] = None
|
||||
|
||||
|
||||
class ExportOptions(BaseModel):
|
||||
"""Export format options"""
|
||||
format: str = Field(default="json", description="Export format: json, markdown, pdf, unified")
|
||||
include_metadata: bool = Field(default=True, description="Include processing metadata")
|
||||
include_statistics: bool = Field(default=True, description="Include document statistics")
|
||||
legacy_format: bool = Field(default=False, description="Use legacy JSON format for compatibility")
|
||||
|
||||
Reference in New Issue
Block a user