import gradio as gr import google.generativeai as genai import os class KyungAhNeChatbot: def __init__(self): # 허깅페이스 스페이스에서는 secrets에서 API 키 가져오기 api_key = os.getenv("GEMINI_API_KEY") if not api_key: raise ValueError("GEMINI_API_KEY 환경변수가 설정되지 않았습니다!") # 제미나이 클라이언트 설정 genai.configure(api_key=api_key) self.model = genai.GenerativeModel('gemini-2.0-flash-exp') # 경아네 반찬가게 FAQ 데이터 self.faq_data = """ 경아네 반찬가게 고객센터 FAQ: == 기본 정보 == • 고객센터: 010-8082-0047 • 입금계좌: 하나은행 12345-00-1234304 주)경아네 • 최소 주문금액: 26,000원 == 주문 관련 == 1. Q: 주문은 어떻게 하나요? A: ① 로그인 → ② 주문하기 클릭 → ③ 전체주문 또는 일별주문 클릭 → ④ 드시고 싶은 반찬 클릭(최소 26,000원) → ⑤ 구매버튼 및 장바구니 버튼 클릭 → ⑥ 결제창에서 신용카드/제로페이/무통장 중 선택하여 결제 2. Q: 첫주문 방법이 궁금해요 A: 첫방문 감사합니다. 이용방법과 배송지역을 확인 → 회원가입 후 로그인 → 주문창에서 원하는 반찬 선택 → 장바구니 담기 → 구매버튼으로 결제 3. Q: 반찬 추가는 어떻게 하나요? A: 첫 페이지에서 구매하고 싶은 반찬 선택 → 장바구니 담기 → 장바구니에서 수량 추가 가능 == 결제 관련 == 4. Q: 카드결제는 어떻게 하나요? A: 결제창에서 신용카드/제로페이/무통장 중 선택해서 결제하면 됩니다 5. Q: 포인트 사용은 어떻게 하나요? A: 결제시 첫 페이지에서 포인트 금액을 입력하고 무통장입금으로 결제 6. Q: 선결제는 어떻게 하나요? A: 선결제는 3가지로 나뉩니다 - 카드선결제, 제로페이, 현금결제. 선결제 후 홈페이지 게시글에 남기거나 고객센터로 문자 주시면 됩니다 7. Q: 계좌번호 확인은 어디서 하나요? A: 무통장 거래시 입금계좌가 나옵니다. 하나은행 12345-00-1234304 주)경아네 8. Q: 결제가 안돼요 A: 신용카드 결제 안될 시 고객센터(010-8082-0047)로 연락주세요 == 배송 관련 == 9. Q: 배송비는 얼마인가요? A: 새벽배송 3,500원, 택배배송 4,000원 10. Q: 새벽배송인지 택배인지 어떻게 구분하나요? A: 이용방법에서 배송지를 입력하시면 확인 가능합니다 11. Q: 배송은 어떻게 이루어지나요? A: 전날 포장 → 배송업체 냉장센터 8시 입고 → 분류 작업 → 새벽배송(2-7시)/택배배송(다음날 하루 중) 12. Q: 반찬이 아직 안왔어요 A: 죄송합니다. 배송업체에 확인 후 연락드리겠습니다 == 취소/환불 관련 == 13. Q: 취소는 어떻게 하나요? A: 취소는 2일 전에만 가능합니다. 하루 전에는 반찬이 이미 제작되어 취소가 안됩니다 14. Q: 환불은 어떻게 이루어지나요? A: 카드는 취소 후 환불까지 2-3일 소요. 카드취소는 문의 남기시면 적립금 포인트가 카드취소로 처리됩니다 15. Q: 반찬이 상한 것 같아요 A: 죄송합니다. 배송과정에서 상한 것 같습니다. 계좌환불/카드취소/적립금 중 편하신 방법으로 환불해드리겠습니다 == 메뉴/상품 관련 == 16. Q: 정기식 구성은 어떻게 되나요? A: 고객님이 선택하기 어려운 분을 위해 마련되었습니다. 국1개 + 반찬4개 (메인1개, 서브1개, 나물 및 반찬2개) 17. Q: 반찬 미리보기는 어떻게 되나요? A: 반찬명을 말씀해주시면 알려드리겠습니다 18. Q: 영양성분을 알 수 있나요? A: 가능합니다. 반찬명을 말씀해주시면 영양성분 알려드립니다 19. Q: 원산지를 알고 싶어요 A: 원산지표를 링크로 제공해드립니다 == 이벤트/혜택 관련 == 20. Q: 이벤트는 어디서 보나요? A: 이벤트 주문창이 별도로 있습니다 21. Q: 소개하면 혜택이 있나요? A: 소개해주시면 감사합니다. 소개하신 분과 소개받은 분 모두에게 서비스찬 또는 포인트 적립금으로 혜택을 드립니다 22. Q: 후기 남기면 어떤 혜택이 있나요? A: 후기를 남겨주시면 500포인트를 적립해드립니다 == 기타 == 23. Q: 주문 누락인 것 같아요 A: 죄송합니다. 확인해보겠습니다. 아이디를 입력해주세요 모든 문의사항은 고객센터 010-8082-0047로 연락주세요. """ def chat_stream(self, message, history): system_prompt = f""" 당신은 경아네 반찬가게의 친절한 상담원입니다. {self.faq_data} 위 FAQ 정보를 참고하여 고객의 질문에 정확하고 친절하게 답변해주세요. - FAQ에 있는 정보는 정확히 제공해주세요 - FAQ에 없는 내용은 "자세한 사항은 고객센터(010-8082-0047)로 문의해주세요"라고 안내해주세요 - 반말보다는 존댓말을 사용해주세요 - 간결하고 이해하기 쉽게 답변해주세요 - "안녕하세요 경아네입니다"로 시작하고 "감사합니다"로 마무리해주세요 """ print(f"사용자 질문: {message}") print(f"API 키 상태: {'설정됨' if os.getenv('GEMINI_API_KEY') else '없음'}") try: response = self.model.generate_content( contents=f"{system_prompt}\n\n사용자 질문: {message}" ) print(f"응답 받음: {response.text[:100]}...") yield response.text except Exception as e: error_msg = str(e) print(f"에러 발생: {error_msg}") yield f"""죄송합니다. 기술적 문제가 발생했습니다. 에러 정보: {error_msg} 고객센터(010-8082-0047)로 연락해주세요.""" # 챗봇 인스턴스 생성 try: chatbot = KyungAhNeChatbot() # 심플하고 깔끔한 그라디오 인터페이스 demo = gr.ChatInterface( fn=chatbot.chat_stream, title="🥢 경아네 AI 상담봇", description="경아네 반찬가게 고객상담 챗봇입니다.", examples=[ "주문은 어떻게 하나요?", "포인트는 어떻게 사용하나요?", "배송비가 얼마인가요?", "환불 방법을 알려주세요" ], theme=gr.themes.Default(), css=""" /* 전체 배경 흰색 */ .gradio-container { background-color: #ffffff !important; max-width: 800px !important; margin: 0 auto !important; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif !important; } /* 모든 테두리 제거 */ .chatbot, .chatbot > div, .contain, .block { border: none !important; box-shadow: none !important; background-color: #ffffff !important; } /* Chatbot 탭 완전히 숨기기 */ .tab-nav, div[role="tablist"], .tabs > div:first-child { display: none !important; } /* 채팅 메시지 스타일링 */ .message { border: none !important; margin: 10px 0 !important; } /* 입력창을 타원형으로 */ .input-container, textarea { border-radius: 25px !important; border: 1px solid #e0e0e0 !important; background-color: #f8f9fa !important; padding: 12px 20px !important; } /* 전송 버튼 둥글게 */ button { border-radius: 20px !important; border: none !important; background-color: #007bff !important; color: white !important; font-weight: 500 !important; padding: 8px 16px !important; } button:hover { background-color: #0056b3 !important; } /* 예시 버튼들 타원형으로 */ .examples button { border-radius: 20px !important; background-color: #f8f9fa !important; border: 1px solid #e9ecef !important; color: #333 !important; margin: 5px !important; padding: 8px 16px !important; } .examples button:hover { background-color: #007bff !important; color: white !important; border-color: #007bff !important; } /* 타이틀 스타일 */ h1 { color: #333 !important; font-size: 28px !important; text-align: center !important; margin-bottom: 10px !important; } /* 설명 텍스트 */ .description { color: #666 !important; text-align: center !important; font-size: 14px !important; margin-bottom: 20px !important; } /* 여백 조정 */ .block { padding: 10px !important; } /* 스크롤바 깔끔하게 */ ::-webkit-scrollbar { width: 6px; } ::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 10px; } ::-webkit-scrollbar-thumb { background: #c1c1c1; border-radius: 10px; } ::-webkit-scrollbar-thumb:hover { background: #a8a8a8; } """ ) except Exception as e: def error_message(message, history): yield "❌ GEMINI_API_KEY가 설정되지 않았습니다. 관리자에게 문의하세요." demo = gr.ChatInterface( fn=error_message, title="🥢 설정 오류", description="API 키 설정이 필요합니다." ) if __name__ == "__main__": demo.launch()