Files
deepdata/runtime/deepdata-python/app/module/cleaning/schema/cleaning.py
T
沃巴蒂 ff22ed3a8b feat(deepdata): 引入修改密码、文件预览组件与清洗算子增强,deepflow 改名为 deep-flow
本次同步 09-12 至 09-28 的代码变更,主要内容:

新增功能
- 修改密码:后端新增 ChangePasswordRequest DTO 与UserController/UserService
  对应接口,前端新增 ChangePasswordDialog 并在 Header 接入入口
- 文件预览组件重构:file-preview 目录拆分出 VideoPreview(支持 blobUrl 直传)、
  ImagePreview、AudioPreview,index.tsx 统一调度各类型预览器
- 新增 my_ops 算子模块:markitdown_parser、mineru_pdf_parser、text_quality_evaluator
- 新增 tools/minio-file-server MinIO 文件服务

功能增强
- 数据清洗:cleaning_task_service/scheduler/routes 重构,
  data_juicer_executor 与 wrapper 增强,OperatorTable/LogsTable/TaskDetail 同步调整
- 数据标注:annotation sync.py、project.py 接口与schema 更新
- 数据采集、算子市场、首页与菜单路由相关页面调整
- DataJuicer 算子接入(useOperatorOperations、dj_ops_schema)

结构调整
- deepflow/ 更名为 deep-flow/(419 个文件重命名)
- 新增 helm 部署编排、GitHub Actions 之外的自建镜像构建脚本

未纳入本次提交
- scripts-backup/、runtime/python-executor-backup/、components_backup/(备份目录)
- *.backup*、__pycache__ 产物
- zh_core_web_sm-3.8.0-py3-none-any.whl(46MB 构建产物)
- DataX/(内嵌独立仓库,远程亦未收录其源码)
2026-10-03 22:44:56 +08:00

149 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from typing import Optional, List, Dict, Any
from pydantic import BaseModel, Field
from datetime import datetime
from app.module.shared.schema.common import BaseResponseModel
class CleaningTaskStatus:
PENDING = "PENDING"
RUNNING = "RUNNING"
COMPLETED = "COMPLETED"
PARTIAL_SUCCESS = "PARTIAL_SUCCESS"
STOPPED = "STOPPED"
FAILED = "FAILED"
class OperatorInstanceDto(BaseResponseModel):
"""Operator instance DTO for task or template"""
id: str = Field(..., description="Operator ID")
name: Optional[str] = Field(None, description="Operator name")
description: Optional[str] = Field(None, description="Operator description")
inputs: Optional[str] = Field(None, description="Input types: text/image/audio/video/multimodal")
outputs: Optional[str] = Field(None, description="Output types: text/image/audio/video/multimodal")
categories: Optional[List[str]] = Field(None, description="Category IDs")
settings: Optional[Any] = Field(None, description="算子设置(JSON)")
overrides: Dict[str, Any] = Field(default_factory=dict, description="Operator parameter overrides")
class CleaningProcess(BaseResponseModel):
"""Task progress information"""
process: float = Field(..., description="Progress percentage (based on successful files)")
successRate: float = Field(..., description="Success rate percentage")
totalFileNum: int = Field(..., description="Total file count")
succeedFileNum: int = Field(..., description="Succeeded file count")
failedFileNum: int = Field(..., description="Failed file count")
finishedFileNum: int = Field(..., description="Successfully processed file count (excludes failed)")
@classmethod
def of(cls, total: int, succeed: int, failed: int) -> 'CleaningProcess':
"""Create progress info
- finishedFileNum: only counts successfully processed files (excludes failed)
- process: progress percentage based on successful files only
- successRate: percentage of finished files that succeeded
"""
# finished_file_num only counts successfully processed files
finished_file_num = succeed
if total == 0:
process = 0.0
else:
# Progress only counts successful files
process = round(succeed * 100.0 / total, 2)
# Calculate total processed (succeed + failed) for success rate
total_processed = succeed + failed
if total_processed == 0:
success_rate = 0.0
else:
success_rate = round(succeed * 100.0 / total_processed, 2)
return cls(
process=process,
successRate=success_rate,
totalFileNum=total,
succeedFileNum=succeed,
failedFileNum=failed,
finishedFileNum=finished_file_num,
)
class CleaningTaskDto(BaseResponseModel):
"""Cleaning task DTO"""
id: Optional[str] = Field(None, description="Task ID")
name: Optional[str] = Field(None, description="Task name")
description: Optional[str] = Field(None, description="Task description")
src_dataset_id: Optional[str] = Field(None, description="Source dataset ID")
src_dataset_name: Optional[str] = Field(None, description="Source dataset name")
dest_dataset_id: Optional[str] = Field(None, description="Destination dataset ID")
dest_dataset_name: Optional[str] = Field(None, description="Destination dataset name")
before_size: Optional[int] = Field(None, description="Data size before cleaning")
after_size: Optional[int] = Field(None, description="Data size after cleaning")
file_count: Optional[int] = Field(None, description="Total file count")
retry_count: Optional[int] = Field(None, description="Retry count")
status: Optional[str] = Field(None, description="Task status")
template_id: Optional[str] = Field(None, description="Template ID if created from template")
instance: Optional[List[OperatorInstanceDto]] = Field(None, description="Operator instances")
progress: Optional[CleaningProcess] = Field(None, description="Task progress")
created_at: Optional[datetime] = Field(None, description="Creation time")
started_at: Optional[datetime] = Field(None, description="Start time")
finished_at: Optional[datetime] = Field(None, description="Finish time")
class CreateCleaningTaskRequest(BaseResponseModel):
"""Request to create cleaning task"""
name: str = Field(..., description="Cleaning task name")
description: str = Field(..., description="Cleaning task description")
src_dataset_id: str = Field(..., description="Source dataset ID")
src_dataset_name: str = Field(..., description="Source dataset name")
dest_dataset_id: Optional[str] = Field(None, description="Destination dataset ID")
dest_dataset_name: str = Field(..., description="Destination dataset name, creates new dataset if destDatasetId is empty")
dest_dataset_type: str = Field(..., description="Destination dataset type: TEXT/IMAGE/VIDEO/AUDIO/OTHER")
template_id: Optional[str] = Field(None, description="Template ID (alternative to instance)")
instance: List[OperatorInstanceDto] = Field(default_factory=list, description="Operator list (alternative to templateId)")
class CleaningResultDto(BaseResponseModel):
"""Cleaning result DTO"""
instance_id: Optional[str] = Field(None, description="Instance ID")
src_file_id: Optional[str] = Field(None, description="Source file ID")
dest_file_id: Optional[str] = Field(None, description="Destination file ID")
src_name: Optional[str] = Field(None, description="Source file name")
dest_name: Optional[str] = Field(None, description="Destination file name")
src_type: Optional[str] = Field(None, description="Source file type")
dest_type: Optional[str] = Field(None, description="Destination file type")
src_size: Optional[int] = Field(None, description="Source file size")
dest_size: Optional[int] = Field(None, description="Destination file size")
status: Optional[str] = Field(None, description="Cleaning status")
result: Optional[str] = Field(None, description="Cleaning result message")
class CleaningTaskLog(BaseResponseModel):
"""Task log entry"""
level: str = Field(..., description="Log level: INFO, WARN, ERROR")
message: str = Field(..., description="Log message")
class CleaningTemplateDto(BaseResponseModel):
"""Cleaning template DTO"""
id: Optional[str] = Field(None, description="Template ID")
name: Optional[str] = Field(None, description="Template name")
description: Optional[str] = Field(None, description="Template description")
instance: List[OperatorInstanceDto] = Field(default_factory=list, description="Operator instances")
created_at: Optional[datetime] = Field(None, description="Creation time")
updated_at: Optional[datetime] = Field(None, description="Update time")
class CreateCleaningTemplateRequest(BaseResponseModel):
"""Request to create cleaning template"""
name: str = Field(..., description="Template name")
description: str = Field(..., description="Template description")
instance: List[OperatorInstanceDto] = Field(..., description="Operator instances")
class UpdateCleaningTemplateRequest(BaseResponseModel):
"""Request to update cleaning template"""
name: str = Field(..., description="Template name")
description: str = Field(..., description="Template description")
instance: List[OperatorInstanceDto] = Field(..., description="Operator instances")