Spaces:
Paused
Paused
| 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", | |
| 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="green-60", | |
| ) | |
| 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_tea = st.text_input("예: 백차, 보이차, 루이보스 등", key="input_text_tea") | |
| # 상황 또는 분위기 입력 (사이드바) | |
| 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_tea | |
| 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. 네, 추천 페어링과 함께 다음과 같은 팁을 제공합니다. | |
| * **티 우리는 방법:** 티의 종류에 따라 적절한 물 온도와 우리는 시간 안내 | |
| * **다과와의 조합 팁:** 티와 다과의 맛과 향을 더욱 잘 어울리게 즐기는 방법 | |
| * **분위기 연출 팁:** 티타임에 어울리는 음악, 조명, 소품 등 추천 | |
| **Q4. 이 앱은 지속적으로 업데이트되나요?** | |
| A. 네, **최신 트렌드를 반영**하여 지속적으로 업데이트될 예정입니다. | |
| 새로운 티와 다과 정보, 다양한 페어링 조합, 전문가의 팁 등을 추가하여 더욱 풍부하고 만족스러운 티타임 경험을 제공하겠습니다. | |
| --- | |
| **티 페어링 마스터와 함께 향긋한 티타임을 즐겨보세요!** ☕ | |
| """, | |
| ) |