import os import time import streamlit as st import google.generativeai as genai from streamlit_extras.colored_header import colored_header from streamlit_extras.add_vertical_space import add_vertical_space from streamlit_extras.stoggle import stoggle # Google Gemini API Key genai.configure(api_key=os.environ["GEMINI_API_KEY"]) # Model Configuration generation_config = { "temperature": 0.8, # 창의성 증가 "top_p": 0.95, "top_k": 64, "max_output_tokens": 8192, "response_mime_type": "text/plain", } model = genai.GenerativeModel( model_name="gemini-2.0-flash", generation_config=generation_config, ) def generate_pairing_recommendation(input_text, input_type, situation): """ 입력받은 안주 또는 주류에 어울리는 페어링 정보를 생성합니다. 상황/분위기를 고려하여 한국인의 취향에 맞는 주류나 안주를 추천합니다. 주류 페어링 전문가와 요리 전문가의 관점을 통합하여 추천합니다. Args: input_text (str): 안주 또는 주류 정보 input_type (str): 입력 종류 ('안주' 또는 '주류') situation (str): 상황 또는 분위기 정보 Returns: str: 생성된 페어링 정보 """ SYSTEM_PROMPT = f""" **주류 페어링 마스터입니다!** 🍇🎉 입력하신 {input_type} '{input_text}'에 어울리는 최고의 페어링을 찾아드리겠습니다. '{situation}' 상황에 딱 맞는, 최상의 미식 경험을 위한 맞춤 추천을 제공합니다. 다음과 같은 요소들을 종합적으로 고려하여 최적의 페어링을 제안합니다. * **상황 및 분위기:** '{situation}'에 맞춰 로맨틱한 분위기, 활기찬 분위기, 편안한 분위기 등을 고려합니다. * **미식적 조화:** 안주와 주류의 맛, 향, 질감, 온도의 조화를 분석하여 서로의 풍미를 상승시키는 조합을 찾습니다. * **창의적인 페어링:** 뻔한 조합 대신 예상치 못한 조합을 제안하여 새로운 미식 경험을 선사합니다. * **한국인의 취향:** 한국인의 입맛과 선호도를 고려한 맞춤 추천을 제공합니다. * **전문가의 팁:** 안주 조리 방법, 주류 서빙 온도, 페어링을 더욱 즐겁게 만드는 팁 등 전문가의 팁을 제공합니다. * **다양한 선택지:** 최소 4가지 이상의 다양한 페어링을 추천합니다. * **상세한 설명:** 각 페어링에 대한 추천 이유와 함께 안주와 주류에 대한 자세한 정보 (종류, 재료, 맛, 향, 질감, 온도, 원산지, 제조법, 추천 점수 등) 를 제공합니다. **페어링 구성 요소:** 1. 추천 주류/안주 소개 (요리/주류 정보 포함) 2. 맛과 향, 질감, 온도 설명 3. 추천 이유 (상황/분위기, 미식적 조화, 창의성, 한국인 취향 고려) 4. 추가 페어링 제안 (대체 가능한 안주/주류, 곁들임 메뉴 등) 5. 추천 점수 (10점 만점) **입력 종류:** {input_type} **입력 내용:** {input_text} **추천 페어링:** """ response = model.generate_content(SYSTEM_PROMPT, stream=True) collected_text = "" for token in response: chunk = token.text collected_text += chunk yield collected_text time.sleep(0.03) # Streamlit Interface st.set_page_config( page_title="주류 페어링 마스터", page_icon="🍇", layout="centered", initial_sidebar_state="expanded", ) colored_header( label="🍇 주류 페어링 마스터", description="🍻 안주 또는 주류를 입력하시면 최고의 페어링을 찾아드립니다. 상황과 분위기에 맞는 완벽한 조합을 경험해보세요!", color_name="red-70", ) add_vertical_space(1) # 사이드바 입력 영역 st.sidebar.markdown("## 📝 입력 정보") # 사용자 입력 영역 (사이드바 탭으로 분리) tabs = st.sidebar.tabs(["🍝 안주 입력", "🍇 주류 입력"]) with tabs[0]: st.markdown("#### 안주를 입력해 주세요:") input_text_anjoo = st.text_input("예: 한우 스테이크, 모듬 사시미, 팟타이 등", key="input_text_anjoo") with tabs[1]: st.markdown("#### 주류를 입력해 주세요:") input_text_liquor = st.text_input("예: 싱글 몰트 위스키, 드라이 로제 와인, 수제 맥주 등", key="input_text_liquor") # 상황 또는 분위기 입력 (사이드바) st.sidebar.markdown("#### 상황이나 분위기를 입력해 주세요:") situation = st.sidebar.text_area("예: 기념일 저녁 식사, 퇴근 후 혼술, 캠핑 바베큐 파티 등", height=100, key="situation") # 페어링 추천 받기 버튼 generate_button = st.sidebar.button("✨ 페어링 추천 받기") # 출력 영역 정의 output_area = st.empty() # 추천 결과 생성 및 출력 if generate_button: input_type = "안주" if st.session_state.input_text_anjoo else "주류" input_text = st.session_state.input_text_anjoo if st.session_state.input_text_anjoo else st.session_state.input_text_liquor situation = st.session_state.situation if input_text: # 입력값이 있을 때만 추천 시작 output_text = "" output_area.markdown(output_text) try: with st.spinner("페어링 정보를 생성 중입니다... 잠시만 기다려 주세요!"): for partial_output in generate_pairing_recommendation(input_text, input_type, situation): output_text = partial_output output_area.markdown(output_text) except Exception as e: st.error(f"오류가 발생했습니다: {str(e)}") else: st.warning("안주 또는 주류를 입력해주세요.") # 추가 정보 및 FAQ add_vertical_space(2) with st.expander("📜 주류 페어링 마스터 FAQ"): # FAQ 내용 접기/펼치기 기능 추가 st.markdown( """ **주류 페어링 마스터에 오신 것을 환영합니다!** 🎉 이 앱은 단순히 안주와 주류를 매칭하는 것을 넘어, **미식의 즐거움을 극대화**하는 것을 목표로 합니다. 주류 페어링 전문가와 요리 전문가의 노하우를 담아, **상황과 분위기에 맞는 완벽한 페어링**을 제안합니다. 특별한 날, 소중한 사람들과의 만남, 혹은 혼자만의 여유로운 시간을 더욱 풍요롭게 만들어보세요! --- **Q1: 어떤 상황에 페어링 추천을 받을 수 있나요?** A: **모든 상황**에 맞춰 페어링을 추천해 드립니다! 예를 들어: * **로맨틱한 데이트:** 와인, 샴페인과 어울리는 고급 안주 * **친구들과의 활기찬 모임:** 맥주, 소주와 잘 어울리는 캐주얼한 안주 * **가족과의 저녁 식사:** 전통주, 막걸리와 함께 즐기는 푸짐한 한식 요리 * **혼술:** 위스키, 사케와 함께 깊은 풍미를 즐길 수 있는 안주 * **캠핑/바비큐:** 야외에서 즐기기 좋은 간편한 안주와 주류 * **기념일/파티:** 특별한 날을 위한 화려하고 고급스러운 페어링 * **비오는 날:** 따뜻한 국물 요리와 어울리는 전통주, 막걸리 * **더운 여름날:** 시원한 맥주, 칵테일과 상큼한 안주 **Q2: 페어링 추천은 어떻게 이루어지나요?** A: 페어링 추천은 다음 요소들을 종합적으로 고려하여 이루어집니다. * **주류 및 안주 정보:** 맛, 향, 질감, 온도, 요리 방법, 재료 등 * **상황 및 분위기:** 로맨틱, 캐주얼, 격식, 파티 등 * **한국인의 취향:** 보편적인 선호도 및 개인의 취향 * **전문가의 창의성:** 독창적이고 새로운 페어링 제안 * **미식적 조화:** 서로의 풍미를 증폭시키는 최적의 조합 **Q3: 추천 점수는 어떻게 매겨지나요?** A: 추천 점수는 10점 만점으로, 다음과 같은 기준에 따라 평가됩니다. * **맛의 조화:** 주류와 안주의 맛이 얼마나 잘 어울리는지 * **향의 조화:** 주류와 안주의 향이 서로를 보완하는지 * **질감의 조화:** 주류와 안주의 질감이 얼마나 잘 어울리는지 * **상황 적합성:** 해당 상황과 분위기에 얼마나 적합한지 * **창의성:** 얼마나 독창적이고 새로운 페어링인지 * **한국인 취향 부합도:** 한국인의 일반적인 입맛에 얼마나 잘 맞는지 **Q4: 추천 결과 외에 다른 정보도 얻을 수 있나요?** A: 추천 결과와 함께 다음과 같은 추가 정보를 제공합니다. * **요리/주류 상세 정보:** 안주의 요리 방법, 주재료, 소스, 주류의 종류, 제조법, 알코올 도수 등 * **추천 이유:** 상황/분위기, 맛, 향, 질감 등을 고려한 상세한 설명 * **추가 페어링 제안:** 대체 가능한 안주/주류, 곁들임 메뉴 등 **Q5: 지속적으로 업데이트되나요?** A: 네, 주류 페어링 마스터는 사용자 피드백과 최신 트렌드를 반영하여 **지속적으로 업데이트**될 예정입니다. 새로운 안주, 주류, 페어링 조합이 계속 추가될 것이며, 더욱 정확하고 만족스러운 추천을 제공하기 위해 노력하겠습니다. --- **주류 페어링 마스터와 함께 최고의 미식 경험을 즐겨보세요!** 🥂 """, )