Spaces:
Running
Running
# Ported from https://github.com/pavelzbornik/whisperX-FastAPI/blob/main/app/models.py | |
from enum import Enum | |
from pydantic import BaseModel | |
from typing import Optional, List | |
from uuid import uuid4 | |
from datetime import datetime | |
from sqlalchemy.types import Enum as SQLAlchemyEnum | |
from typing import Any | |
from sqlmodel import SQLModel, Field, JSON, Column | |
class ResultType(str, Enum): | |
JSON = "json" | |
FILEPATH = "filepath" | |
class TaskStatus(str, Enum): | |
PENDING = "pending" | |
IN_PROGRESS = "in_progress" | |
COMPLETED = "completed" | |
FAILED = "failed" | |
CANCELLED = "cancelled" | |
QUEUED = "queued" | |
PAUSED = "paused" | |
RETRYING = "retrying" | |
def __str__(self): | |
return self.value | |
class TaskType(str, Enum): | |
TRANSCRIPTION = "transcription" | |
VAD = "vad" | |
BGM_SEPARATION = "bgm_separation" | |
def __str__(self): | |
return self.value | |
class TaskStatusResponse(BaseModel): | |
"""`TaskStatusResponse` is a wrapper class that hides sensitive information from `Task`""" | |
identifier: str = Field(..., description="Unique identifier for the queued task that can be used for tracking") | |
status: TaskStatus = Field(..., description="Current status of the task") | |
task_type: Optional[TaskType] = Field( | |
default=None, | |
description="Type/category of the task" | |
) | |
result_type: Optional[ResultType] = Field( | |
default=ResultType.JSON, | |
description="Result type whether it's a filepath or JSON" | |
) | |
result: Optional[Any] = Field( | |
default=None, | |
description="JSON data representing the result of the task" | |
) | |
task_params: Optional[dict] = Field( | |
default=None, | |
description="Parameters of the task" | |
) | |
error: Optional[str] = Field( | |
default=None, | |
description="Error message, if any, associated with the task" | |
) | |
duration: Optional[float] = Field( | |
default=None, | |
description="Duration of the task execution" | |
) | |
class Task(SQLModel, table=True): | |
""" | |
Table to store tasks information. | |
Attributes: | |
- id: Unique identifier for each task (Primary Key). | |
- uuid: Universally unique identifier for each task. | |
- status: Current status of the task. | |
- result: JSON data representing the result of the task. | |
- result_type: Type of the data whether it is normal JSON data or filepath. | |
- file_name: Name of the file associated with the task. | |
- task_type: Type/category of the task. | |
- duration: Duration of the task execution. | |
- error: Error message, if any, associated with the task. | |
- created_at: Date and time of creation. | |
- updated_at: Date and time of last update. | |
""" | |
__tablename__ = "tasks" | |
id: Optional[int] = Field( | |
default=None, | |
primary_key=True, | |
description="Unique identifier for each task (Primary Key)" | |
) | |
uuid: str = Field( | |
default_factory=lambda: str(uuid4()), | |
description="Universally unique identifier for each task" | |
) | |
status: Optional[TaskStatus] = Field( | |
default=None, | |
sa_column=Field(sa_column=SQLAlchemyEnum(TaskStatus)), | |
description="Current status of the task", | |
) | |
result: Optional[dict] = Field( | |
default_factory=dict, | |
sa_column=Column(JSON), | |
description="JSON data representing the result of the task" | |
) | |
result_type: Optional[ResultType] = Field( | |
default=ResultType.JSON, | |
sa_column=Field(sa_column=SQLAlchemyEnum(ResultType)), | |
description="Result type whether it's a filepath or JSON" | |
) | |
file_name: Optional[str] = Field( | |
default=None, | |
description="Name of the file associated with the task" | |
) | |
url: Optional[str] = Field( | |
default=None, | |
description="URL of the file associated with the task" | |
) | |
audio_duration: Optional[float] = Field( | |
default=None, | |
description="Duration of the audio in seconds" | |
) | |
language: Optional[str] = Field( | |
default=None, | |
description="Language of the file associated with the task" | |
) | |
task_type: Optional[TaskType] = Field( | |
default=None, | |
sa_column=Field(sa_column=SQLAlchemyEnum(TaskType)), | |
description="Type/category of the task" | |
) | |
task_params: Optional[dict] = Field( | |
default_factory=dict, | |
sa_column=Column(JSON), | |
description="Parameters of the task" | |
) | |
duration: Optional[float] = Field( | |
default=None, | |
description="Duration of the task execution" | |
) | |
error: Optional[str] = Field( | |
default=None, | |
description="Error message, if any, associated with the task" | |
) | |
created_at: datetime = Field( | |
default_factory=datetime.utcnow, | |
description="Date and time of creation" | |
) | |
updated_at: datetime = Field( | |
default_factory=datetime.utcnow, | |
sa_column_kwargs={"onupdate": datetime.utcnow}, | |
description="Date and time of last update" | |
) | |
def to_response(self) -> "TaskStatusResponse": | |
return TaskStatusResponse( | |
identifier=self.uuid, | |
status=self.status, | |
task_type=self.task_type, | |
result_type=self.result_type, | |
result=self.result, | |
task_params=self.task_params, | |
error=self.error, | |
duration=self.duration | |
) | |
class TasksResult(BaseModel): | |
tasks: List[Task] | |