import gradio as gr
from llm_functions import generate_context_report
# 예제 데이터
example_companies = ["토스", "삼성전자", "CJ제일제당", "하이브", "현대건설", "신한은행", "카카오", "네이버", "LG전자", "SK하이닉스"]
example_jobs = ["백엔드 개발", "경영기획", "식품마케팅", "A&R", "HRM(인사운영)", "해외영업", "데이터 분석", "온라인마케팅", "기획", "개발"]
experience_levels = ["신입", "경력", "인턴", "기타"]
def create_info_cards(report_data):
"""
리포트 데이터를 카드 형태로 표시하는 HTML 생성
"""
if not report_data or 'company_profile' not in report_data:
return "
리포트를 생성해주세요
"
# 기업 프로필 카드
company_card = f"""
🏢 기업 프로필
🎯 비전/미션:
{report_data['company_profile']['vision_mission']}
💎 핵심 가치:
{' • '.join(report_data['company_profile']['core_values'])}
👥 인재상:
{report_data['company_profile']['talent_philosophy']}
"""
# 직무 분석 카드
position_card = f"""
💼 직무 분석
📋 역할:
{report_data['position_analysis']['role_summary']}
🔧 하드 스킬:
{' • '.join(report_data['position_analysis']['required_skills']['hard'])}
💡 소프트 스킬:
{' • '.join(report_data['position_analysis']['required_skills']['soft'])}
"""
# 산업 맥락 카드
industry_card = f"""
🌐 산업 맥락
📈 주요 트렌드:
{' • '.join(report_data['industry_context']['trends'])}
🏆 주요 경쟁사:
{' • '.join(report_data['industry_context']['competitors'])}
"""
# 키워드 카드
keywords_html = ""
if 'keywords' in report_data['position_analysis']:
keywords_html = "🏷️ 핵심 키워드:
"
for keyword in report_data['position_analysis']['keywords']:
keywords_html += f"{keyword}"
keywords_html += "
"
return f"""
{company_card}
{position_card}
{industry_card}
🏷️ 핵심 키워드
{''.join([f'{keyword}' for keyword in report_data['position_analysis']['keywords']])}
"""
def process_report_generation(job_title, company_name, experience_level):
"""
리포트 생성 결과를 처리하고 UI에 표시할 형태로 변환하는 함수
"""
try:
content, report_data = generate_context_report(job_title, company_name, experience_level)
info_cards = create_info_cards(report_data)
return content, info_cards
except Exception as e:
error_content = f"""## ❌ 오류 발생
컨텍스트 리포트 생성 중 오류가 발생했습니다.
**오류 내용:** {str(e)}
다시 시도해주세요.
"""
error_cards = create_info_cards({})
return error_content, error_cards
def create_interface():
"""
Gradio 인터페이스 생성
"""
with gr.Blocks(
title="📊 자소서 컨텍스트 리포트",
theme=gr.themes.Soft(),
css="""
.main-header {
text-align: center;
padding: 20px;
background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
color: white;
border-radius: 10px;
margin-bottom: 20px;
}
.input-section {
background-color: #f8f9fa;
padding: 20px;
border-radius: 8px;
margin: 10px 0;
}
.example-section {
background-color: #f0f9ff;
padding: 15px;
border-radius: 8px;
margin: 10px 0;
}
"""
) as demo:
# 헤더
gr.HTML("""
📊 자소서 컨텍스트 리포트
기업과 직무에 대한 종합적인 분석으로 완벽한 자기소개서를 준비하세요
""")
# 설명
gr.Markdown("""
### 🚀 **사용 방법**
1. **직무**: 지원하고자 하는 직무를 입력하세요
2. **회사명**: 지원 회사명을 입력하세요
3. **경력 수준**: 신입/경력/인턴/기타 중 선택하세요
4. **생성**: '리포트 생성' 버튼을 클릭하여 결과를 확인하세요
✨ **특징**: 기업 프로필, 직무 분석, 산업 맥락을 종합적으로 분석하여 자소서 작성에 필요한 핵심 정보를 제공합니다.
""")
with gr.Row():
with gr.Column(scale=2):
# 입력 섹션
gr.HTML('')
gr.Markdown("### 📝 **기본 정보 입력**")
with gr.Row():
job_input = gr.Textbox(
label="💼 직무",
placeholder="예: 백엔드 개발, 경영기획, 마케팅 등",
value="",
scale=1
)
company_input = gr.Textbox(
label="🏢 회사명",
placeholder="예: 토스, 삼성전자, 카카오 등",
value="",
scale=1
)
experience_input = gr.Dropdown(
label="📈 경력 수준",
choices=experience_levels,
value="신입",
interactive=True
)
generate_btn = gr.Button(
"📊 리포트 생성",
variant="primary",
size="lg"
)
gr.HTML('
')
with gr.Column(scale=1):
# 예제 및 가이드
gr.HTML('')
gr.Markdown("### 💡 **예제 회사**")
company_rows = [example_companies[i:i+2] for i in range(0, len(example_companies), 2)]
for row in company_rows:
with gr.Row():
for company in row:
example_btn = gr.Button(
company,
size="sm",
variant="secondary",
scale=1
)
example_btn.click(
fn=lambda x=company: x,
outputs=company_input
)
gr.Markdown("### 💼 **예제 직무**")
job_rows = [example_jobs[i:i+2] for i in range(0, len(example_jobs), 2)]
for row in job_rows:
with gr.Row():
for job in row:
job_btn = gr.Button(
job,
size="sm",
variant="secondary",
scale=1
)
job_btn.click(
fn=lambda x=job: x,
outputs=job_input
)
gr.Markdown("### 📈 **경력 수준**")
with gr.Row():
for level in experience_levels:
level_btn = gr.Button(
level,
size="sm",
variant="secondary",
scale=1
)
level_btn.click(
fn=lambda x=level: x,
outputs=experience_input
)
gr.HTML('
')
# 결과 출력 섹션
with gr.Row():
with gr.Column(scale=2):
gr.Markdown("### 📋 **상세 리포트**")
result_output = gr.Markdown(
value="직무, 회사명, 경력 수준을 입력하고 '리포트 생성' 버튼을 클릭하세요.",
elem_classes=["result-output"]
)
with gr.Column(scale=1):
gr.Markdown("### 📊 **핵심 정보**")
info_cards = gr.HTML(
value="리포트를 생성해주세요
",
elem_classes=["info-cards"]
)
# 생성 버튼 클릭 이벤트
generate_btn.click(
fn=process_report_generation,
inputs=[job_input, company_input, experience_input],
outputs=[result_output, info_cards],
api_name="generate_context_report"
)
# 푸터
gr.Markdown("""
---
**📊 리포트 구성**:
- **🏢 기업 프로필**: 비전/미션, 핵심가치, 인재상, 최근동향, 주요제품/서비스
- **💼 직무 분석**: 역할요약, 필요스킬(하드/소프트), 핵심키워드
- **🌐 산업 맥락**: 주요트렌드, 경쟁사 정보
💡 **활용 팁**: 생성된 키워드와 정보를 자소서 작성 시 적극 활용하여 맞춤형 자기소개서를 작성하세요.
🤖 **Powered by**: OpenAI GPT-4o
""")
return demo
if __name__ == "__main__":
# Gradio 앱 실행
demo = create_interface()
demo.launch(
server_name="0.0.0.0",
# server_port=7862,
share=True,
show_error=True
)