db 저장 가사까지 구현
parent
83a72aaa46
commit
cafe6a894e
|
|
@ -87,6 +87,13 @@ class Project(Base):
|
|||
comment="상세 지역 정보",
|
||||
)
|
||||
|
||||
language: Mapped[str] = mapped_column(
|
||||
String(50),
|
||||
nullable=False,
|
||||
default="Korean",
|
||||
comment="출력 언어 (Korean, English, Chinese, Japanese, Thai, Vietnamese)",
|
||||
)
|
||||
|
||||
created_at: Mapped[datetime] = mapped_column(
|
||||
DateTime,
|
||||
nullable=False,
|
||||
|
|
|
|||
|
|
@ -28,8 +28,10 @@ from typing import Optional
|
|||
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
||||
from sqlalchemy import func, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from uuid_extensions import uuid7
|
||||
|
||||
from app.database.session import get_session
|
||||
from app.home.models import Project
|
||||
from app.lyric.models import Lyric
|
||||
from app.lyric.schemas.lyric import (
|
||||
GenerateLyricRequest,
|
||||
|
|
@ -231,6 +233,7 @@ async def get_lyrics_paginated(
|
|||
|
||||
## 반환 정보
|
||||
- **success**: 생성 성공 여부
|
||||
- **task_id**: 작업 고유 식별자
|
||||
- **lyric**: 생성된 가사
|
||||
- **language**: 가사 언어
|
||||
- **prompt_used**: 사용된 프롬프트
|
||||
|
|
@ -255,39 +258,82 @@ POST /lyric/generate
|
|||
)
|
||||
async def generate_lyric(
|
||||
request_body: GenerateLyricRequest,
|
||||
session: AsyncSession = Depends(get_session),
|
||||
) -> GenerateLyricResponse:
|
||||
"""고객 정보를 기반으로 가사를 생성합니다."""
|
||||
task_id = str(uuid7())
|
||||
|
||||
try:
|
||||
# 1. ChatGPT 서비스 초기화 및 프롬프트 생성
|
||||
service = ChatgptService(
|
||||
customer_name=request_body.customer_name,
|
||||
region=request_body.region,
|
||||
detail_region_info=request_body.detail_region_info or "",
|
||||
language=request_body.language,
|
||||
)
|
||||
|
||||
prompt = service.build_lyrics_prompt()
|
||||
|
||||
# 2. Project 테이블에 데이터 저장
|
||||
project = Project(
|
||||
store_name=request_body.customer_name,
|
||||
region=request_body.region,
|
||||
task_id=task_id,
|
||||
detail_region_info=request_body.detail_region_info,
|
||||
language=request_body.language,
|
||||
)
|
||||
session.add(project)
|
||||
await session.commit()
|
||||
await session.refresh(project) # commit 후 project.id 동기화
|
||||
|
||||
# 3. Lyric 테이블에 데이터 저장 (status: processing)
|
||||
lyric = Lyric(
|
||||
project_id=project.id,
|
||||
task_id=task_id,
|
||||
status="processing",
|
||||
lyric_prompt=prompt,
|
||||
lyric_result=None,
|
||||
language=request_body.language,
|
||||
)
|
||||
session.add(lyric)
|
||||
await session.commit() # processing 상태를 확실히 저장 (다른 트랜잭션에서 조회 가능)
|
||||
await session.refresh(lyric) # commit 후 객체 상태 동기화
|
||||
|
||||
# 4. ChatGPT를 통해 가사 생성
|
||||
result = await service.generate(prompt=prompt)
|
||||
|
||||
# ERROR가 포함되어 있으면 실패 처리
|
||||
# 5. ERROR가 포함되어 있으면 실패 처리
|
||||
if "ERROR:" in result:
|
||||
lyric.status = "failed"
|
||||
lyric.lyric_result = result
|
||||
await session.commit()
|
||||
|
||||
return GenerateLyricResponse(
|
||||
success=False,
|
||||
task_id=task_id,
|
||||
lyric=None,
|
||||
language=request_body.language,
|
||||
prompt_used=prompt,
|
||||
error_message=result,
|
||||
)
|
||||
|
||||
# 6. 성공 시 Lyric 테이블 업데이트 (status: completed)
|
||||
lyric.status = "completed"
|
||||
lyric.lyric_result = result
|
||||
await session.commit()
|
||||
|
||||
return GenerateLyricResponse(
|
||||
success=True,
|
||||
task_id=task_id,
|
||||
lyric=result,
|
||||
language=request_body.language,
|
||||
prompt_used=prompt,
|
||||
error_message=None,
|
||||
)
|
||||
except Exception as e:
|
||||
await session.rollback()
|
||||
return GenerateLyricResponse(
|
||||
success=False,
|
||||
task_id=task_id,
|
||||
lyric=None,
|
||||
language=request_body.language,
|
||||
prompt_used=None,
|
||||
|
|
|
|||
|
|
@ -84,6 +84,13 @@ class Lyric(Base):
|
|||
comment="생성된 가사 결과",
|
||||
)
|
||||
|
||||
language: Mapped[str] = mapped_column(
|
||||
String(50),
|
||||
nullable=False,
|
||||
default="Korean",
|
||||
comment="가사 출력 언어 (Korean, English, Chinese, Japanese, Thai, Vietnamese)",
|
||||
)
|
||||
|
||||
created_at: Mapped[datetime] = mapped_column(
|
||||
DateTime,
|
||||
nullable=True,
|
||||
|
|
|
|||
|
|
@ -75,6 +75,7 @@ class GenerateLyricResponse(BaseModel):
|
|||
Example Response:
|
||||
{
|
||||
"success": true,
|
||||
"task_id": "019123ab-cdef-7890-abcd-ef1234567890",
|
||||
"lyric": "생성된 가사...",
|
||||
"language": "Korean",
|
||||
"prompt_used": "..."
|
||||
|
|
@ -82,6 +83,7 @@ class GenerateLyricResponse(BaseModel):
|
|||
"""
|
||||
|
||||
success: bool = Field(..., description="생성 성공 여부")
|
||||
task_id: Optional[str] = Field(None, description="작업 고유 식별자")
|
||||
lyric: Optional[str] = Field(None, description="생성된 가사")
|
||||
language: str = Field(..., description="가사 언어")
|
||||
prompt_used: Optional[str] = Field(None, description="사용된 프롬프트")
|
||||
|
|
|
|||
Loading…
Reference in New Issue