99 lines
3.4 KiB
Python
99 lines
3.4 KiB
Python
"""
|
|
Lyric Background Tasks
|
|
|
|
가사 생성 관련 백그라운드 태스크를 정의합니다.
|
|
"""
|
|
|
|
from sqlalchemy import select
|
|
|
|
from app.database.session import BackgroundSessionLocal
|
|
from app.lyric.models import Lyric
|
|
from app.utils.chatgpt_prompt import ChatgptService
|
|
|
|
|
|
async def generate_lyric_background(
|
|
task_id: str,
|
|
prompt: str,
|
|
language: str,
|
|
) -> None:
|
|
"""백그라운드에서 ChatGPT를 통해 가사를 생성하고 Lyric 테이블을 업데이트합니다.
|
|
|
|
Args:
|
|
task_id: 프로젝트 task_id
|
|
prompt: ChatGPT에 전달할 프롬프트
|
|
language: 가사 언어
|
|
"""
|
|
print(f"[generate_lyric_background] START - task_id: {task_id}")
|
|
|
|
try:
|
|
# ChatGPT 서비스 초기화 (프롬프트는 이미 생성되어 있음)
|
|
service = ChatgptService(
|
|
customer_name="", # 프롬프트가 이미 생성되었으므로 빈 값
|
|
region="",
|
|
detail_region_info="",
|
|
language=language,
|
|
)
|
|
|
|
# ChatGPT를 통해 가사 생성
|
|
print(f"[generate_lyric_background] ChatGPT generation started - task_id: {task_id}")
|
|
result = await service.generate(prompt=prompt)
|
|
print(f"[generate_lyric_background] ChatGPT generation completed - task_id: {task_id}")
|
|
|
|
# 실패 응답 검사 (ERROR 또는 ChatGPT 거부 응답)
|
|
failure_patterns = [
|
|
"ERROR:",
|
|
"I'm sorry",
|
|
"I cannot",
|
|
"I can't",
|
|
"I apologize",
|
|
"I'm unable",
|
|
"I am unable",
|
|
"I'm not able",
|
|
"I am not able",
|
|
]
|
|
is_failure = any(
|
|
pattern.lower() in result.lower() for pattern in failure_patterns
|
|
)
|
|
|
|
# Lyric 테이블 업데이트 (백그라운드 전용 세션 사용)
|
|
async with BackgroundSessionLocal() as session:
|
|
query_result = await session.execute(
|
|
select(Lyric)
|
|
.where(Lyric.task_id == task_id)
|
|
.order_by(Lyric.created_at.desc())
|
|
.limit(1)
|
|
)
|
|
lyric = query_result.scalar_one_or_none()
|
|
|
|
if lyric:
|
|
if is_failure:
|
|
print(f"[generate_lyric_background] FAILED - task_id: {task_id}, error: {result}")
|
|
lyric.status = "failed"
|
|
lyric.lyric_result = result
|
|
else:
|
|
print(f"[generate_lyric_background] SUCCESS - task_id: {task_id}")
|
|
lyric.status = "completed"
|
|
lyric.lyric_result = result
|
|
|
|
await session.commit()
|
|
else:
|
|
print(f"[generate_lyric_background] Lyric NOT FOUND in DB - task_id: {task_id}")
|
|
|
|
except Exception as e:
|
|
print(f"[generate_lyric_background] EXCEPTION - task_id: {task_id}, error: {e}")
|
|
# 실패 시 Lyric 테이블 업데이트
|
|
async with BackgroundSessionLocal() as session:
|
|
query_result = await session.execute(
|
|
select(Lyric)
|
|
.where(Lyric.task_id == task_id)
|
|
.order_by(Lyric.created_at.desc())
|
|
.limit(1)
|
|
)
|
|
lyric = query_result.scalar_one_or_none()
|
|
|
|
if lyric:
|
|
lyric.status = "failed"
|
|
lyric.lyric_result = f"Error: {str(e)}"
|
|
await session.commit()
|
|
print(f"[generate_lyric_background] FAILED - task_id: {task_id}, status updated to failed")
|