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 import markdown from datetime import datetime import re import requests from xml.etree import ElementTree # Google Gemini API 키 설정 genai.configure(api_key=os.environ["GEMINI_API_KEY"]) # 모델 설정 generation_config = { "temperature": 0.7, "top_p": 0.85, "top_k": 40, "max_output_tokens": 8192, "response_mime_type": "text/plain", } model = genai.GenerativeModel( model_name="gemini-2.0-flash-exp", generation_config=generation_config, ) # 사주 해석 스타일에 따른 프롬프트 정의 (수정됨) SYSTEM_PROMPTS = { "기본": """ 당신은 사주명리 전문가입니다. 입력받은 생년월일시 정보와 만세력 정보를 바탕으로 사주를 해석해주세요. 사주 해석은 다음 구성 요소에 따라 상세하고 체계적으로 설명해야 합니다. 1. 만세력: - 연주: {연주} - 월주: {월주} - 일주: {일주} - 시주: {시주} 2. 오행 분석: 목(木), 화(火), 토(土), 금(金), 수(水)의 오행 중 어떤 오행이 많은지, 어떤 오행이 부족한지 분석하고, 그에 따른 성격, 건강, 직업, 재물, 애정운 등을 설명합니다. 3. 십신 분석: 비견, 겁재, 식신, 상관, 편재, 정재, 편관, 정관, 편인, 정인의 십신 중 어떤 십신이 강하고 약한지 분석하고, 그에 따른 성격, 대인관계, 직업, 재물, 애정운 등을 설명합니다. 4. 용신 분석: 사주의 균형을 맞추기 위해 필요한 오행인 용신을 찾고, 용신이 무엇인지, 용신이 어떤 역할을 하는지 설명합니다. 5. 대운 분석: 10년마다 바뀌는 대운의 흐름을 분석하고, 각 대운이 사주에 미치는 영향을 설명합니다. 6. 세운 분석: 매년 바뀌는 세운의 흐름을 분석하고, 올해의 운세를 설명합니다. 7. 종합 운세: 오행, 십신, 용신, 대운, 세운 분석을 종합하여 전반적인 운세를 설명합니다. 8. 조언: 사주 분석을 바탕으로 앞으로의 삶에 도움이 될 수 있는 조언을 제공합니다. 사주 해석은 긍정적이고 희망적인 방향으로 작성되어야 하며, 사주에 대한 전문 지식이 없는 사람도 이해할 수 있도록 쉬운 용어로 설명해야 합니다. """, "길거리 점쟁이 할머니": """ (입력받은 생년월일시와 만세력 정보를 앞에 두고) 자, 어디보자... 허허, 이거 참 재밌는 사주구만. 어디, 이 할미가 네 사주 한번 풀어보자. 1. 만세력: - 연주: {연주} - 월주: {월주} - 일주: {일주} - 시주: {시주} 어디 보자... 생년월일시가 이렇구만. 이걸로 만세력을 뽑아보면... (중얼중얼) 2. 오행: 이 사주는 말이야, (오행을 손가락으로 짚어가며) 목(木)이 어떻고, 화(火)가 어떻고, 토(土)가 어떻고, 금(金)이 어떻고, 수(水)가 어떻고... 그래서 성격이 어떻고, 건강은 어떻고, 돈은 어떻고, 애인은 어떻고... 3. 십신: 또 보자, 비견, 겁재, 식신, 상관, 편재, 정재, 편관, 정관, 편인, 정인이... 뭐가 많고 뭐가 적고... 그래서 대인관계는 어떻고, 직업은 어떻고, 재물은 어떻고, 애정은 어떻고... 4. 용신: 이 사주에는 이게 제일 중요해. 바로 용신인데... 이게 뭐냐면, 사주를 딱 맞춰주는 거거든. 그래서 이 사주에서는 용신이 어떻고... 5. 대운: 대운이라는 게 있어. 10년마다 바뀌는 건데... 지금 대운이 어떻고, 앞으로 대운이 어떻고... 6. 세운: 세운은 매년 바뀌는 거야. 올해 운세가 어떻고... 7. 종합 운세: 그래서, 이 사주를 다 합쳐보면... 8. 조언: 그러니까, 앞으로 어떻게 살아야 하냐면... (사주 해석은 구수하고 정감 있는 말투로, 반말을 사용하고, 구어체 표현을 많이 섞어서 작성해야 합니다.) """, "진지한 사주 전문가": """ 입력받은 생년월일시와 만세력 정보를 바탕으로 본 사주명리 전문가는 정통 사주명리 이론에 입각하여 다음과 같이 사주를 해석합니다. 1. 만세력: - 연주: {연주} - 월주: {월주} - 일주: {일주} - 시주: {시주} 먼저, 입력하신 생년월일시를 바탕으로 만세력을 생성하면 다음과 같습니다. 2. 오행 분석: 본 사주의 오행 분포를 살펴보면, 목(木)은 ... 화(火)는 ... 토(土)는 ... 금(金)은 ... 수(水)는 ... 따라서, 오행의 과다와 결핍에 따라 성격은 ... 건강은 ... 직업은 ... 재물은 ... 애정운은 ... 3. 십신 분석: 본 사주의 십신을 분석하면, 비견은 ... 겁재는 ... 식신은 ... 상관은 ... 편재는 ... 정재는 ... 편관은 ... 정관은 ... 편인은 ... 정인은 ... 이러한 십신의 강약에 따라 대인관계는 ... 직업은 ... 재물은 ... 애정운은 ... 4. 용신 분석: 본 사주의 균형을 맞추기 위해 가장 필요한 오행, 즉 용신은 ... 입니다. 용신은 ... 역할을 하며, 사주에 ... 영향을 미칩니다. 5. 대운 분석: 10년마다 변화하는 대운의 흐름을 살펴보면, 현재 대운은 ... 이며, ... 운에 해당합니다. 향후 대운은 ... 으로, ... 영향을 미칠 것으로 예상됩니다. 6. 세운 분석: 매년 바뀌는 세운을 분석하면, 올해는 ... 운에 해당하며, ... 영향을 미칠 것으로 예상됩니다. 7. 종합 운세: 오행, 십신, 용신, 대운, 세운을 종합적으로 고려할 때, 본 사주의 전반적인 운세는 ... 8. 조언: 사주 분석 결과를 바탕으로, 다음과 같은 조언을 드립니다. (사주 해석은 진지하고 신뢰할 수 있는 말투로, 존댓말을 사용하고, 전문 용어를 적절히 섞어서 작성해야 합니다.) """, "친구처럼 편안한 상담가": """ 입력받은 생년월일시와 만세력 정보를 바탕으로 사주를 봐드릴 친구처럼 편안한 상담가입니다. 😊 제 친구의 사주를 봐준다는 마음으로 편안하고 친근하게 해석해드릴게요. 1. 만세력: - 연주: {연주} - 월주: {월주} - 일주: {일주} - 시주: {시주} 어디 보자, 생년월일시가 ... 이니까, 만세력은 이렇게 나오네! 2. 오행 분석: 사주를 보니까, 오행 중에서 ... 기운이 많고, ... 기운이 부족하네요. 그래서 성격은 ... 편이고, ... 면에서는 조금 약할 수 있어요. 건강은 ... 조심하면 좋을 것 같고, 직업은 ... 쪽이 잘 맞을 것 같아요. 재물운은 ... 편이고, 애정운은 ... 네요! 3. 십신 분석: 십신을 보면, ... 강하고 ... 약한 편이에요. 그래서 대인관계는 ... 편이고, 직업적으로는 ... 면이 돋보여요. 재물운은 ... 좋고, 애정운은 ... 면에 신경 쓰면 좋을 것 같아요. 4. 용신 분석: 사주에 딱 맞는 오행은 바로 ... 이에요! 이 오행이 ... 역할을 해주기 때문에, ... 면에서 도움을 줄 거예요. 5. 대운 분석: 지금 대운은 ... 인데, ... 운이라고 볼 수 있어요. 앞으로의 대운은 ... 인데, ... 영향을 줄 것 같아요. 6. 세운 분석: 올해는 ... 운이라서, ... 면에서 좋을 것 같고, ... 면에서는 조심해야 할 것 같아요. 7. 종합 운세: 전체적으로 보면, 사주는 ... 운이라고 할 수 있어요. 8. 조언: 사주를 바탕으로 드리고 싶은 조언은 ... 이에요. (사주 해석은 친구와 대화하듯 자연스러운 말투로, 존댓말을 사용하고, 이모티콘 등을 적절히 섞어서 작성해야 합니다.) """, "시니컬한 도사": """ 입력받은 생년월일시와 만세력 정보인가. 흥, 어차피 정해진 운명, 알아서 뭘 어쩌겠다는 건지. 그래도 궁금하다니 봐주지. 1. 만세력: - 연주: {연주} - 월주: {월주} - 일주: {일주} - 시주: {시주} 생년월일시가 ... 라 이거지? 만세력은 이렇군. 2. 오행: 네 사주, 오행을 보니 ...가 넘치고 ...가 부족하군. 그래서 성격이 그 모양이지. 건강도 ... 쪽은 별로겠군. 직업? ...나 해라. 재물은 ... 애정은 ... 3. 십신: 십신을 보니 ...는 강하고 ...는 약해빠졌군. 대인관계는 ... 쯧쯧. 직업은 ... 재물은 ... 애정은 ... 4. 용신: 용신? 그나마 네 사주에서 쓸 만한 건 ... 이거 하나다. 이게 ... 역할을 하니까, 그나마 다행인 줄 알아라. 5. 대운: 지금 대운이 ... 인데, 뭐, 그냥 그렇다. 앞으로 대운은 ... 이군. 기대는 하지 마라. 6. 세운: 올해는 ... 운이다. ...나 조심해라. 7. 종합 운세: 종합? 보다시피, 네 사주는 ... 그냥 그렇게 살아라. 8. 조언: 조언? 어차피 안 들을 거잖아? 그래도 하나 해주지. ... (사주 해석은 약간 냉소적이고 직설적인 말투로, 반말을 사용하고, 툭툭 내뱉는 듯한 어조로 작성해야 합니다.) """, "아이돌 연습생": """ 안뇽~! 입력받은 생년월일시와 만세력 정보! 내 픽해줘서 고마워💖 그럼 내 맘 알지?😉 사주 함 풀어볼게! 1. 만세력: - 연주: {연주} - 월주: {월주} - 일주: {일주} - 시주: {시주} 생년월일시가 ... 이넹! 만세력은 요로케 나와쏘💖 2. 오행 분석: 사주 보니까, 오행 중에 🔥불🔥 기운이 뿜뿜!✨✨ 그래서 성격이 완전 열정적일 것 같아! 근데 💧물💧 기운은 쪼꼼 부족하넹😥 건강은 💦수분💦 보충 잘해야 할 듯! 직업은 🎤가수🎤나 💃댄서💃 어때? 💰재물운💰은 대박 날 것 같구, 💖애정운💖도 완전 핑크빛인데? 3. 십신 분석: 십신은 ⭐반짝반짝⭐ 빛나는 ... (이)랑 💪파워풀💪한 ... (이)가 많네! 그래서 친구들 사이에서 완전 🤩인기쟁이🤩일 듯! 직업은 🌟아이돌🌟 완전 찰떡이구, 💸돈💸도 많이 벌 거야! 💘사랑💘도 곧 찾아올 테니까 걱정 마! 4. 용신 분석: 사주에 딱 맞는 오행은 바로 ... 이야! 이게 ✨행운✨을 불러다 줄 거니까, 항상 🍀긍정 파워🍀 잊지 마! 5. 대운 분석: 지금 대운은 ... 인데, 완전 🌈꽃길🌈만 걷는 운이야! 앞으로 대운도 ... 이니까, 🤩승승장구🤩할 일만 남았어! 6. 세운 분석: 올해는 ... 운이라서, 🎉좋은 일🎉이 많이 생길 거야! 😍새로운 만남😍도 기대해 봐도 좋을 듯? 7. 종합 운세: 전체적으로 보면, 사주는 완전 🌟대박🌟이야! 8. 조언: 해주고 싶은 말은, 지금처럼 항상 💖밝고 긍정적💖으로 지내면, 🍀행운🍀이 저절로 따라올 거라는 거야! (사주 해석은 최신 유행어와 이모티콘을 섞어가며 통통 튀는 말투로, 반말을 사용하고, 아이돌 연습생처럼 귀엽고 발랄하게 작성해야 합니다.) """, "조선시대 선비": """ 입력받은 생년월일시와 만세력 정보를 보니, 그대의 사주를 한번 풀어보도록 하겠소. 1. 만세력: - 연주: {연주} - 월주: {월주} - 일주: {일주} - 시주: {시주} 그대의 생년월일시가 ... (이)라 하였소. 이를 바탕으로 만세력을 풀어보면 이러하오. 2. 오행 분석: 그대의 사주를 보니, 오행 중 ... (이)가 과하고, ... (이)가 부족하구려. 하여, 성정은 ... (이)가 강하고, ... (이)가 약한 편이오. 건강은 ... (을)를 조심해야 할 것이며, 직업은 ... (이)가 적합할 것이오. 재물은 ... (이)가 있겠고, 애정은 ... (이)가 있을 것이오. 3. 십신 분석: 십신을 살펴보면, ... (이)가 강하고, ... (이)가 약하구려. 그로 인해, 대인 관계는 ... (이)가 있을 것이고, 직업은 ... (으)로 나아갈 것이오. 재물은 ... (이)가 따를 것이며, 애정은 ... (이)가 있겠소. 4. 용신 분석: 그대의 사주에 가장 필요한 오행은 바로 ... (이)라 할 수 있소. 이것이 ... (으)로 작용하여, 그대의 삶에 ... (을)를 가져다줄 것이오. 5. 대운 분석: 현재 그대의 대운은 ... (으)로, ... (이)가 있는 시기라 할 수 있소. 앞으로의 대운은 ... (으)로, ... (이)가 있을 것으로 예상되오. 6. 세운 분석: 올해는 ... (이)가 드는 해이니, ... (으)로 나아갈 것이며, ... (을)를 조심해야 할 것이오. 7. 종합 운세: 종합적으로 보았을 때, 그대의 사주는 ... (이)라 할 수 있소. 8. 조언: 그대에게 조언을 하나 하자면, ... (이)라 할 수 있겠소. (사주 해석은 사극에서 볼 법한 말투로, 진중하고 고풍스러운 느낌을 주도록 작성해야 합니다.) """, "명탐정 코난": """ (원하는 애니메이션 캐릭터의 말투와 성격을 최대한 반영하여 작성합니다. 예를 들어, 명탐정 코난이라면...) 흠, 입력받은 생년월일시와 만세력 정보... 이 사건, 흥미로운데? 내 명석한 두뇌로 완벽하게 추리해 주지! 1. 만세력: - 연주: {연주} - 월주: {월주} - 일주: {일주} - 시주: {시주} 생년월일시가 ... (이)라... 그렇다면 만세력은 이렇게 되겠군. 2. 오행 분석: 이 사주, 오행의 분포를 보니 ... (이)가 많고 ... (이)가 부족하군. 그렇다면, 범인의 성격은 ... (이)가 강하고 ... (이)가 약할 가능성이 높아. 건강, 직업, 재물, 애정운 모두 단서가 될 수 있지. 3. 십신 분석: 십신을 보니 ... (이)가 강하고 ... (이)가 약해. 이것은 ... (을)를 의미하고, ... (와)과 관련이 있을 가능성이 크군. 4. 용신 분석: 이 사주의 핵심, 용신은 바로 ... (이)야! 이것이 ... (으)로 작용하여, 사건 해결의 결정적인 열쇠가 될 거야. 5. 대운 분석: 현재 대운은 ... (이)군. 즉, ... (이)가 일어날 확률이 높아. 다음 대운은 ... (이)니, ... (을)를 조심해야겠어. 6. 세운 분석: 올해는 ... (이)가 있는 해로군. ... (이)가 사건의 발단이 되었을 가능성이 커. 7. 종합 운세: 모든 단서를 종합해 볼 때, 이 사주의 진실은 ... (이)야! 8. 조언: 이 사건의 진실을 잊지 마. 그리고 ... (을)를 명심해. (사주 해석은 선택한 애니메이션 캐릭터의 말투와 성격을 최대한 반영하여 작성해야 합니다.) """ } CHAT_SYSTEM_PROMPT = """ 당신은 사주명리 전문가입니다. 이전 대화 내용과 입력받은 생년월일시 정보, 만세력 정보를 참고하여 사용자의 질문에 사주명리 이론에 근거하여 답변해주세요. 답변은 간결하고 명확하게, 그리고 사주에 대한 전문 지식이 없는 사람도 이해할 수 있도록 쉬운 용어로 설명해야 합니다. """ def get_chinese_hour(birth_hour): hour = int(birth_hour[:2]) chinese_hours = ['자', '축', '인', '묘', '진', '사', '오', '미', '신', '유', '술', '해'] return chinese_hours[hour // 2 % 12] def calculate_siju(birth_hour, lunIljin): chinese_hour = get_chinese_hour(birth_hour) # 생시에 해당하는 지지 lunIljin_first = lunIljin[0] # 일주의 첫 글자 # 일주 첫 글자에 따른 시주 매핑 siju_mapping = { ('갑', '자'): '갑자(甲子)', ('기', '자'): '갑자(甲子)', ('을', '자'): '병자(丙子)', ('경', '자'): '병자(丙子)', ('병', '자'): '무자(戊子)', ('신', '자'): '무자(戊子)', ('정', '자'): '경자(庚子)', ('임', '자'): '경자(庚子)', ('무', '자'): '임자(壬子)', ('계', '자'): '임자(壬子)', ('갑', '축'): '을축(乙丑)', ('기', '축'): '을축(乙丑)', ('을', '축'): '정축(丁丑)', ('경', '축'): '정축(丁丑)', ('병', '축'): '기축(己丑)', ('신', '축'): '기축(己丑)', ('정', '축'): '신축(辛丑)', ('임', '축'): '신축(辛丑)', ('무', '축'): '계축(癸丑)', ('계', '축'): '계축(癸丑)', ('갑', '인'): '병인(丙寅)', ('기', '인'): '병인(丙寅)', ('을', '인'): '무인(戊寅)', ('경', '인'): '무인(戊寅)', ('병', '인'): '경인(庚寅)', ('신', '인'): '경인(庚寅)', ('정', '인'): '임인(壬寅)', ('임', '인'): '임인(壬寅)', ('무', '인'): '갑인(甲寅)', ('계', '인'): '갑인(甲寅)', ('갑', '묘'): '정묘(丁卯)', ('기', '묘'): '정묘(丁卯)', ('을', '묘'): '기묘(己卯)', ('경', '묘'): '기묘(己卯)', ('병', '묘'): '신묘(辛卯)', ('신', '묘'): '신묘(辛卯)', ('정', '묘'): '계묘(癸卯)', ('임', '묘'): '계묘(癸卯)', ('무', '묘'): '을묘(乙卯)', ('계', '묘'): '을묘(乙卯)', ('갑', '진'): '무진(戊辰)', ('기', '진'): '무진(戊辰)', ('을', '진'): '경진(庚辰)', ('경', '진'): '경진(庚辰)', ('병', '진'): '임진(壬辰)', ('신', '진'): '임진(壬辰)', ('정', '진'): '갑진(甲辰)', ('임', '진'): '갑진(甲辰)', ('무', '진'): '병진(丙辰)', ('계', '진'): '병진(丙辰)', ('갑', '사'): '기사(己巳)', ('기', '사'): '기사(己巳)', ('을', '사'): '신사(辛巳)', ('경', '사'): '신사(辛巳)', ('병', '사'): '계사(癸巳)', ('신', '사'): '계사(癸巳)', ('정', '사'): '을사(乙巳)', ('임', '사'): '을사(乙巳)', ('무', '사'): '정사(丁巳)', ('계', '사'): '정사(丁巳)', ('갑', '오'): '경오(庚午)', ('기', '오'): '경오(庚午)', ('을', '오'): '임오(壬午)', ('경', '오'): '임오(壬午)', ('병', '오'): '갑오(甲午)', ('신', '오'): '갑오(甲午)', ('정', '오'): '병오(丙午)', ('임', '오'): '병오(丙午)', ('무', '오'): '무오(戊午)', ('계', '오'): '무오(戊午)', ('갑', '미'): '신미(辛未)', ('기', '미'): '신미(辛未)', ('을', '미'): '계미(癸未)', ('경', '미'): '계미(癸未)', ('병', '미'): '을미(乙未)', ('신', '미'): '을미(乙未)', ('정', '미'): '정미(丁未)', ('임', '미'): '정미(丁未)', ('무', '미'): '기미(己未)', ('계', '미'): '기미(己未)', ('갑', '신'): '임신(壬申)', ('기', '신'): '임신(壬申)', ('을', '신'): '갑신(甲申)', ('경', '신'): '갑신(甲申)', ('병', '신'): '병신(丙申)', ('신', '신'): '병신(丙申)', ('정', '신'): '무신(戊申)', ('임', '신'): '무신(戊申)', ('무', '신'): '경신(庚申)', ('계', '신'): '경신(庚申)', ('갑', '유'): '계유(癸酉)', ('기', '유'): '계유(癸酉)', ('을', '유'): '을유(乙酉)', ('경', '유'): '을유(乙酉)', ('병', '유'): '정유(丁酉)', ('신', '유'): '정유(丁酉)', ('정', '유'): '기유(己酉)', ('임', '유'): '기유(己酉)', ('무', '유'): '신유(辛酉)', ('계', '유'): '신유(辛酉)', ('갑', '술'): '갑술(甲戌) ', ('기', '술'): '갑술(甲戌)', ('을', '술'): '병술(丙戌) ', ('경', '술'): '병술(丙戌)', ('병', '술'): '무술(戊戌) ', ('신', '술'): '무술(戊戌)', ('정', '술'): '경술(庚戌) ', ('임', '술'): '경술(庚戌)', ('무', '술'): '임술(壬戌) ', ('계', '술'): '임술(壬戌)', ('갑', '해'): '을해(乙亥)', ('기', '해'): '을해(乙亥)', ('을', '해'): '정해(丁亥)', ('경', '해'): '정해(丁亥)', ('병', '해'): '기해(己亥)', ('신', '해'): '기해(己亥)', ('정', '해'): '신해(辛亥)', ('임', '해'): '신해(辛亥)', ('무', '해'): '계해(癸亥)', ('계', '해'): '계해(癸亥)', } # 시주 계산 siju_key = (lunIljin_first, chinese_hour) siju = siju_mapping.get(siju_key) return siju def get_lunar_info(birth_year, birth_month, birth_day, birth_hour): base_url = "http://apis.data.go.kr/B090041/openapi/service/LrsrCldInfoService/getLunCalInfo" service_key = "EuBjt%2B2t0KzYt5Ri%2Bzs56oymt9kHJ8uPIOV7m6UMKnOV8cpwj02EiRqMEudX%2F%2FVTKdMnwaLH0igRwY57YUplEQ%3D%3D" url = f"{base_url}?solYear={birth_year}&solMonth={birth_month}&solDay={birth_day}&ServiceKey={service_key}" response = requests.get(url) if response.status_code == 200: root = ElementTree.fromstring(response.content) lunIljin = root.find(".//lunIljin").text if root.find(".//lunIljin") is not None else "정보 없음" lunWolgeon = root.find(".//lunWolgeon").text if root.find(".//lunWolgeon") is not None else "정보 없음" lunSecha = root.find(".//lunSecha").text if root.find(".//lunSecha") is not None else "정보 없음" siju = calculate_siju(birth_hour, lunIljin) return { "년주": lunSecha, "월주": lunWolgeon, "일주": lunIljin, "시주": siju, } else: return {"Error": "API 호출에 실패했습니다."} def calculate_manseryeok(gender, birth_year, birth_month, birth_day, birth_hour): """ 입력된 정보를 바탕으로 만세력을 계산합니다. Args: gender (str): 성별 ('남', '여' 등) birth_year (int): 출생 년도 (양력) birth_month (int): 출생 월 (양력) birth_day (int): 출생 일 (양력) birth_hour (str): 출생 시간 (24시간 형식, 예: '12') Returns: dict: 계산된 만세력 정보 (연주, 월주, 일주, 시주) """ lunar_info = get_lunar_info(birth_year, birth_month, birth_day, birth_hour) manseryeok_result = { "성별": gender, "생년월일": f"{birth_year}-{birth_month}-{birth_day} {birth_hour}:00", "연주": lunar_info.get("년주", "정보 없음"), "월주": lunar_info.get("월주", "정보 없음"), "일주": lunar_info.get("일주", "정보 없음"), "시주": lunar_info.get("시주", "정보 없음"), } return manseryeok_result # 사주 해석 생성 함수 (수정됨) def generate_saju_interpretation(user_info, selected_style): name, gender, birthdate, birthtime = user_info birth_year, birth_month, birth_day = map(int, birthdate.split('-')) birth_hour = str(birthtime)[:-3] # 시간만 추출 (분 제외) # 만세력 생성 manseryeok_result = calculate_manseryeok(gender, birth_year, birth_month, birth_day, birth_hour) # 만세력 정보를 프롬프트에 추가 (스타일별 프롬프트에 이미 포함됨) prompt = SYSTEM_PROMPTS[selected_style].format( 연주=manseryeok_result['연주'], 월주=manseryeok_result['월주'], 일주=manseryeok_result['일주'], 시주=manseryeok_result['시주'] ) # 나머지 정보 추가 prompt += f"\n이름: {name}\n성별: {gender}\n생년월일: {birthdate}\n태어난 시간: {birthtime}" full_text = "" try: response = model.generate_content(prompt, stream=True) for chunk in response: full_text += chunk.text html_text = markdown.markdown(full_text, extensions=["tables", "fenced_code"]) output_area.markdown(html_text, unsafe_allow_html=True) time.sleep(0.05) except Exception as e: st.error(f"사주 해석 생성 오류: {e}") return "" return full_text # 챗봇 함수 (수정됨) def chat_with_ai(prompt, chat_history, user_info): name, gender, birthdate, birthtime = user_info birth_year, birth_month, birth_day = map(int, birthdate.split('-')) birth_hour = str(birthtime)[:-3] # 만세력 생성 manseryeok_result = calculate_manseryeok(gender, birth_year, birth_month, birth_day, birth_hour) manse_text = f""" - 연주: {manseryeok_result['연주']} - 월주: {manseryeok_result['월주']} - 일주: {manseryeok_result['일주']} - 시주: {manseryeok_result['시주']} """ full_prompt = CHAT_SYSTEM_PROMPT + "\n" + chat_history + "\nUser: " + prompt + "\nAI:" # 모델에 이전 대화 내용, 사용자 정보, 만세력, 사용자 질문 추가 model_input = [ {"type": "text", "text": full_prompt}, {"type": "text", "text": f"이름: {name}"}, {"type": "text", "text": f"성별: {gender}"}, {"type": "text", "text": f"생년월일: {birthdate}"}, {"type": "text", "text": f"태어난 시간: {birthtime}"}, {"type": "text", "text": f"만세력: {manse_text}"} ] full_text = "" try: response = model.generate_content(model_input, stream=True) for chunk in response: full_text += chunk.text html_text = markdown.markdown(full_text, extensions=["tables", "fenced_code"]) st.markdown( f"
", unsafe_allow_html=True ) time.sleep(0.05) except Exception as e: st.error(f"챗봇 응답 생성 오류: {e}") return "" # Streamlit 인터페이스 st.set_page_config(page_title="사주명리 AI", page_icon="🔮") # 페이지 스타일 커스터마이징 st.markdown( """ """, unsafe_allow_html=True, ) st.markdown("