feat(phase7): add asset classification workflow

This commit is contained in:
Xiaoxia AI
2026-06-17 18:29:48 +08:00
parent 8aeb46aded
commit db1ebc4e9d
12 changed files with 484 additions and 330 deletions
+8
View File
@@ -2,6 +2,7 @@ from fastapi import APIRouter
from app.api.routes.asset_libraries import router as asset_libraries_router
from app.api.routes.assets import router as assets_router
from app.api.routes.classification_jobs import router as classification_jobs_router
from app.api.routes.health import router as health_router
from app.api.routes.ingest_jobs import router as ingest_jobs_router
from app.api.routes.project_management import router as project_management_router
@@ -45,6 +46,13 @@ api_router.include_router(
tags=["导入任务"],
)
# Classification Jobs
api_router.include_router(
classification_jobs_router,
prefix="/classification-jobs",
tags=["分类任务"],
)
# Upload
api_router.include_router(
upload_router,
@@ -0,0 +1,57 @@
from datetime import datetime, timezone
from fastapi import APIRouter, Depends, HTTPException
from app.core.celery_app import celery_app
from app.dependencies import get_classification_job_repository
from app.schemas.classification_job import ClassificationJobResponse, SubmitClassificationJobRequest
from packages.adapters.sqlalchemy_impl import SQLAlchemyClassificationJobRepository
from packages.application import SubmitClassificationJobCommand, SubmitClassificationJobUseCase
router = APIRouter()
@router.get("/{job_id}", response_model=ClassificationJobResponse)
def get_classification_job(
job_id: str,
classification_job_repository: SQLAlchemyClassificationJobRepository = Depends(get_classification_job_repository),
) -> ClassificationJobResponse:
job = classification_job_repository.get(job_id)
if job is None:
raise HTTPException(status_code=404, detail=f"ClassificationJob {job_id} not found")
return ClassificationJobResponse(
id=job.id,
workspace_id=job.workspace_id,
project_id=job.project_id,
asset_id=job.asset_id,
status=job.status.value,
classification=job.classification,
confidence=job.confidence,
error_message=job.error_message,
)
@router.post("", response_model=ClassificationJobResponse)
def submit_classification_job(
request: SubmitClassificationJobRequest,
classification_job_repository: SQLAlchemyClassificationJobRepository = Depends(get_classification_job_repository),
) -> ClassificationJobResponse:
use_case = SubmitClassificationJobUseCase(classification_job_repository)
job = use_case.execute(
SubmitClassificationJobCommand(
workspace_id=request.workspace_id,
project_id=request.project_id,
asset_id=request.asset_id,
)
)
celery_app.send_task("worker.classify_asset", args=[job.id])
return ClassificationJobResponse(
id=job.id,
workspace_id=job.workspace_id,
project_id=job.project_id,
asset_id=job.asset_id,
status=job.status.value,
classification=job.classification,
confidence=job.confidence,
error_message=job.error_message,
)