"""이 숙소의 노래 — 가사 프롬프트와 응답 스키마.""" # Suno 가 받는 style 문자열. STYLE_CHOICES = [ "acoustic ballad", "city pop", "folk pop", "lo-fi", "bossa nova", "soft rock", "jazz", ] RESPONSE_SCHEMA = { "type": "object", "properties": { "title": {"type": "string", "description": "곡 제목. 상호를 그대로 쓰지 말고 한 구절로."}, "lyrics": {"type": "string", "description": "가사. [Verse]/[Chorus] 구조 태그를 포함한다."}, "style": {"type": "string", "description": f"장르·분위기. 다음 중 하나에서 시작한다: {', '.join(STYLE_CHOICES)}"}, }, "required": ["title", "lyrics", "style"], } def build_prompt(place_name: str, category_label: str, region: str, grounding: list[str], intro: str) -> str: """가사 프롬프트.""" material = "\n".join(f"- {line}" for line in grounding) or "- (확인된 항목 없음)" intro_block = f"\n[이 숙소 소개문]\n{intro.strip()}\n" if (intro or "").strip() else "" return f"""너는 작은 가게의 노래를 쓰는 작사가다. 아래 업소의 노래 가사를 쓴다. [업소] - 상호: {place_name} - 업종: {category_label} - 지역: {region or "(모름)"} [확인된 항목 — 이 안에서만 말한다] {material} {intro_block} [쓰는 법] - 한국어. 40초 안에 불리는 길이다 — [Verse] 한 덩이 + [Chorus] 한 덩이면 충분하다. - 구조 태그([Verse], [Chorus])를 반드시 넣는다. Suno 가 이 태그로 곡을 나눈다. - **없는 것을 말하지 않는다.** 위 목록에 없는 시설·풍경·서비스를 지어내지 않는다. 지역과 계절, 머무는 마음처럼 사실 확인이 필요 없는 정서는 자유롭게 쓴다. - **숫자를 넣지 않는다.** 요금·전화번호·주소·객실 수는 가사에 쓰지 않는다. 틀리면 손님이 손해를 보고, 노래는 고쳐 부르기 어렵다. - 광고 문구처럼 쓰지 않는다("최고", "1등", "예약하세요"). 손님이 흥얼거릴 노래다. - 상호는 후렴에 한 번쯤 자연스럽게 넣는다. [출력] title(곡 제목) · lyrics(가사) · style(장르·분위기) 를 JSON 으로 준다. style 은 이 업소의 분위기에 맞는 것을 고른다: {', '.join(STYLE_CHOICES)}. """