183 lines
6.3 KiB
Python
183 lines
6.3 KiB
Python
"""
|
|
Lyric API Schemas
|
|
|
|
이 모듈은 가사 관련 API 엔드포인트에서 사용되는 Pydantic 스키마를 정의합니다.
|
|
|
|
사용 예시:
|
|
from app.lyric.schemas.lyric import (
|
|
LyricStatusResponse,
|
|
LyricDetailResponse,
|
|
LyricListItem,
|
|
)
|
|
from app.utils.pagination import PaginatedResponse
|
|
|
|
# 라우터에서 response_model로 사용
|
|
@router.get("/lyric/{task_id}", response_model=LyricDetailResponse)
|
|
async def get_lyric(task_id: str):
|
|
...
|
|
|
|
# 페이지네이션 응답 (공통 스키마 사용)
|
|
@router.get("/songs", response_model=PaginatedResponse[SongListItem])
|
|
async def list_songs(...):
|
|
...
|
|
"""
|
|
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from pydantic import BaseModel, ConfigDict, Field
|
|
|
|
|
|
class GenerateLyricRequest(BaseModel):
|
|
"""가사 생성 요청 스키마
|
|
|
|
Usage:
|
|
POST /lyric/generate
|
|
Request body for generating lyrics.
|
|
|
|
Example Request:
|
|
{
|
|
"task_id": "0694b716-dbff-7219-8000-d08cb5fce431",
|
|
"customer_name": "스테이 머뭄",
|
|
"region": "군산",
|
|
"detail_region_info": "군산 신흥동 말랭이 마을",
|
|
"language": "Korean"
|
|
}
|
|
"""
|
|
|
|
model_config = ConfigDict(
|
|
json_schema_extra={
|
|
"example": {
|
|
"task_id": "0694b716-dbff-7219-8000-d08cb5fce431",
|
|
"customer_name": "스테이 머뭄",
|
|
"region": "군산",
|
|
"detail_region_info": "군산 신흥동 말랭이 마을",
|
|
"language": "Korean",
|
|
}
|
|
}
|
|
)
|
|
|
|
task_id: str = Field(
|
|
..., description="작업 고유 식별자 (이미지 업로드 시 생성된 task_id)"
|
|
)
|
|
customer_name: str = Field(..., description="고객명/가게명")
|
|
region: str = Field(..., description="지역명")
|
|
detail_region_info: Optional[str] = Field(None, description="상세 지역 정보")
|
|
language: str = Field(
|
|
default="Korean",
|
|
description="가사 출력 언어 (Korean, English, Chinese, Japanese, Thai, Vietnamese)",
|
|
)
|
|
|
|
|
|
class GenerateLyricResponse(BaseModel):
|
|
"""가사 생성 응답 스키마
|
|
|
|
Usage:
|
|
POST /lyric/generate
|
|
Returns the generated lyrics.
|
|
|
|
Note:
|
|
실패 조건:
|
|
- ChatGPT API 오류
|
|
- ChatGPT 거부 응답 (I'm sorry, I cannot, I can't, I apologize 등)
|
|
- 응답에 ERROR: 포함
|
|
"""
|
|
|
|
model_config = ConfigDict(
|
|
json_schema_extra={
|
|
"example": {
|
|
"success": True,
|
|
"task_id": "0694b716-dbff-7219-8000-d08cb5fce431",
|
|
"lyric": "인스타 감성의 스테이 머뭄\n군산 신흥동 말랭이 마을에서\n여유로운 하루를 보내며\n추억을 만들어가요",
|
|
"language": "Korean",
|
|
"error_message": None,
|
|
}
|
|
}
|
|
)
|
|
|
|
success: bool = Field(..., description="생성 성공 여부")
|
|
task_id: Optional[str] = Field(None, description="작업 고유 식별자 (uuid7)")
|
|
lyric: Optional[str] = Field(None, description="생성된 가사 (성공 시)")
|
|
language: str = Field(..., description="가사 언어")
|
|
error_message: Optional[str] = Field(None, description="에러 메시지 (실패 시, ChatGPT 거부 응답 포함)")
|
|
|
|
|
|
class LyricStatusResponse(BaseModel):
|
|
"""가사 상태 조회 응답 스키마
|
|
|
|
Usage:
|
|
GET /lyric/status/{task_id}
|
|
Returns the current processing status of a lyric generation task.
|
|
"""
|
|
|
|
model_config = ConfigDict(
|
|
json_schema_extra={
|
|
"example": {
|
|
"task_id": "0694b716-dbff-7219-8000-d08cb5fce431",
|
|
"status": "completed",
|
|
"message": "가사 생성이 완료되었습니다.",
|
|
}
|
|
}
|
|
)
|
|
|
|
task_id: str = Field(..., description="작업 고유 식별자")
|
|
status: str = Field(..., description="처리 상태 (processing, completed, failed)")
|
|
message: str = Field(..., description="상태 메시지")
|
|
|
|
|
|
class LyricDetailResponse(BaseModel):
|
|
"""가사 상세 조회 응답 스키마
|
|
|
|
Usage:
|
|
GET /lyric/{task_id}
|
|
Returns the generated lyric content for a specific task.
|
|
"""
|
|
|
|
model_config = ConfigDict(
|
|
json_schema_extra={
|
|
"example": {
|
|
"id": 1,
|
|
"task_id": "0694b716-dbff-7219-8000-d08cb5fce431",
|
|
"project_id": 1,
|
|
"status": "completed",
|
|
"lyric_prompt": "고객명: 스테이 머뭄, 지역: 군산...",
|
|
"lyric_result": "인스타 감성의 스테이 머뭄\n군산 신흥동 말랭이 마을에서\n여유로운 하루를 보내며\n추억을 만들어가요",
|
|
"created_at": "2024-01-15T12:00:00",
|
|
}
|
|
}
|
|
)
|
|
|
|
id: int = Field(..., description="가사 ID")
|
|
task_id: str = Field(..., description="작업 고유 식별자")
|
|
project_id: int = Field(..., description="프로젝트 ID")
|
|
status: str = Field(..., description="처리 상태")
|
|
lyric_prompt: str = Field(..., description="가사 생성 프롬프트")
|
|
lyric_result: Optional[str] = Field(None, description="생성된 가사")
|
|
created_at: Optional[datetime] = Field(None, description="생성 일시")
|
|
|
|
|
|
class LyricListItem(BaseModel):
|
|
"""가사 목록 아이템 스키마
|
|
|
|
Usage:
|
|
Used as individual items in paginated lyric list responses.
|
|
"""
|
|
|
|
model_config = ConfigDict(
|
|
json_schema_extra={
|
|
"example": {
|
|
"id": 1,
|
|
"task_id": "0694b716-dbff-7219-8000-d08cb5fce431",
|
|
"status": "completed",
|
|
"lyric_result": "인스타 감성의 스테이 머뭄\n군산 신흥동 말랭이 마을에서...",
|
|
"created_at": "2024-01-15T12:00:00",
|
|
}
|
|
}
|
|
)
|
|
|
|
id: int = Field(..., description="가사 ID")
|
|
task_id: str = Field(..., description="작업 고유 식별자")
|
|
status: str = Field(..., description="처리 상태")
|
|
lyric_result: Optional[str] = Field(None, description="생성된 가사 (미리보기)")
|
|
created_at: Optional[datetime] = Field(None, description="생성 일시")
|