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"]) # 모델 설정 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-exp", generation_config=generation_config, ) def generate_pairing_recommendation(input_text, input_type, situation): """ 입력받은 커피 또는 다과에 어울리는 페어링 정보를 생성합니다. """ SYSTEM_PROMPT = f""" **커피 페어링 마스터입니다!** 🎉 상황/분위기를 고려하여 한국인의 취향에 맞는 커피와 다과를 추천합니다. 커피 전문가와 다과 전문가의 관점을 통합하여 추천합니다. 입력하신 {input_type} '{input_text}'에 어울리는 최고의 페어링을 찾아드리겠습니다. '{situation}' 상황에 딱 맞는, 더욱 풍요로운 커피타임을 위한 맞춤 추천을 제공합니다. 다음과 같은 요소들을 종합적으로 고려하여 최적의 페어링을 제안합니다. * **상황 및 분위기:** '{situation}'에 맞춰 여유로운 분위기, 활기찬 분위기, 차분한 분위기 등을 고려합니다. * **맛과 향의 조화:** 커피와 다과의 맛과 향이 서로 보완하고 풍미를 높이는 조합을 찾습니다. * **질감의 조화:** 부드러운 커피와 바삭한 다과, 묵직한 커피와 촉촉한 다과 등 다양한 질감의 조합을 고려합니다. * **온도의 조화:** 따뜻한 커피와 차가운 다과, 차가운 커피와 따뜻한 다과 등 온도의 조합을 고려합니다. * **한국인의 취향:** 한국인의 입맛과 선호도를 고려한 맞춤 추천을 제공합니다. * **전문가의 팁:** 커피 추출 방법, 다과와 함께 즐기기 좋은 음악이나 책 추천 등 전문가의 팁을 제공합니다. * **다양한 선택지:** 최소 4가지 이상의 다양한 페어링을 추천합니다. * **상세한 설명:** 각 페어링에 대한 추천 이유와 함께 커피와 다과에 대한 자세한 정보 (종류, 맛, 향, 질감, 온도, 원산지, 제조법, 추천 점수 등) 를 제공합니다. * **커피 센서리 정보:** 커피의 경우 향, 아로마, 산미, 바디감, 밸런스, 후미 등의 센서리 정보를 포함합니다. **페어링 구성 요소:** 1. 추천 커피/다과 소개 (커피/다과 정보 포함) 2. 맛, 향, 질감, 온도 설명 (커피의 경우 테이스팅 노트, 센서리 정보를 구체적으로 작성) 3. 추천 이유 (상황/분위기, 미식적 조화, 창의성, 한국인 취향 고려) 4. 추가 페어링 제안 (대체 가능한 커피/다과, 곁들임 메뉴 등) 5. 추천 점수 (10점 만점) 6. 추가 정보 (페어링을 더욱 풍부하게 즐길 수 있는 방법) **입력 종류:** {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_snack = st.text_input("예: 수제 양갱, 마들렌, 과일 타르트 등", key="input_text_snack") with tabs[1]: st.markdown("#### 커피를 입력해 주세요:") input_text_coffee = st.text_input("예: 에티오피아 예가체프, 케냐 AA, 과테말라 안티구아 등", key="input_text_coffee") # 상황 또는 분위기 입력 (사이드바) 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_snack else "커피" input_text = st.session_state.input_text_snack if st.session_state.input_text_snack else st.session_state.input_text_coffee 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"): st.markdown( """ **커피 페어링 마스터에 오신 것을 환영합니다!** 🎉 이 앱은 단순히 커피와 다과를 매칭하는 것을 넘어, **최상의 미식 경험을 선사**하는 것을 목표로 합니다. 커피 페어링 전문가의 섬세한 감각과 지식을 바탕으로, **상황과 분위기에 맞는 완벽한 페어링**을 제안합니다. 소중한 사람들과의 커피타임, 혼자만의 여유로운 시간, 특별한 날을 더욱 풍요롭게 만들어보세요! --- **Q1. 어떤 상황에 페어링 추천을 받을 수 있나요?** A. **어떤 상황이든** 완벽한 커피타임을 위한 페어링을 추천해 드립니다! 예를 들어: * **여유로운 오후:** 부드러운 라떼와 달콤한 스콘 * **친구들과의 커피타임:** 상큼한 에이드와 다채로운 다과 * **비 오는 날:** 따뜻한 아메리카노와 촉촉한 케이크 * **집중이 필요한 시간:** 깔끔한 드립 커피와 담백한 쿠키 * **기념일/생일:** 고급스러운 핸드드립 커피와 특별한 디저트 * **계절별 추천:** 여름에는 시원한 콜드브루, 겨울에는 깊은 풍미의 에스프레소 **Q2. 페어링 추천은 어떻게 이루어지나요?** A. 다음 요소들을 종합적으로 고려하여 **최적의 페어링**을 추천합니다. * **커피 종류:** 아메리카노, 라떼, 카푸치노, 에스프레소, 콜드브루 등 * **다과 종류:** 케이크, 쿠키, 마카롱, 초콜릿, 빵, 과일, 떡 등 * **맛과 향의 조화:** 커피와 다과의 맛과 향이 서로 보완하고 풍미를 높이는 조합 * **질감의 조합:** 부드러운 커피와 바삭한 다과, 묵직한 커피와 촉촉한 다과 등 다양한 질감의 조합 * **온도의 조합:** 따뜻한 커피와 차가운 다과, 차가운 커피와 따뜻한 다과 등 온도의 조합 * **상황 및 분위기:** 여유로운 분위기, 활기찬 분위기, 차분한 분위기 등 * **한국인의 취향:** 한국인의 입맛과 선호도를 고려한 맞춤 추천 * **전문가의 팁:** 커피 추출 방법, 다과와 함께 즐기기 좋은 음악이나 책 추천 등 **Q3. 더욱 풍부한 커피타임을 즐기기 위한 팁이 있나요?** A. 네, 추천 페어링과 함께 다음과 같은 팁을 제공합니다. * **커피 추출 방법:** 커피의 종류에 따라 적절한 물 온도와 추출 시간 안내 * **다과와의 조합 팁:** 커피와 다과의 맛과 향을 더욱 잘 어울리게 즐기는 방법 * **분위기 연출 팁:** 커피타임에 어울리는 음악, 조명, 소품 등 추천 **Q4. 이 앱은 지속적으로 업데이트되나요?** A. 네, **최신 트렌드를 반영**하여 지속적으로 업데이트될 예정입니다. 새로운 커피와 다과 정보, 다양한 페어링 조합, 전문가의 팁 등을 추가하여 더욱 풍부하고 만족스러운 커피타임 경험을 제공하겠습니다. --- **커피 페어링 마스터와 함께 향긋한 커피타임을 즐겨보세요!** ☕ """, )