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