# app.py import gradio as gr from emotion_predictor import analyze_dialogue INTRO = """\ 감정 흐름 예측 + 급변 탐지 + 갈등 유발자 추정 데모 입력 형식: 줄마다 "화자:문장" 예) A: 너 왜 또 늦었어? B: 미안해, 차가 막혔어. A: 변명하지 마. B: 너 진짜 왜 이래? """ def run_pipeline(text, alpha, z, steps): report, img_b64, struct = analyze_dialogue( text, smooth_alpha=alpha, z_thresh=z, forecast_steps=steps ) img_md = f"![plot](data:image/png;base64,{img_b64})" if img_b64 else "" return report, img_md, str(struct) with gr.Blocks() as demo: gr.Markdown("# 대화 감정 분석·예측·갈등 판단") gr.Markdown(INTRO) with gr.Row(): text = gr.Textbox( label="대화 입력", lines=12, value="A: 너 왜 또 늦었어?\nB: 미안해, 차가 막혔어.\nA: 변명하지 마.\nB: 너 진짜 왜 이래?" ) with gr.Column(): alpha = gr.Slider(0.1, 0.9, value=0.4, step=0.05, label="EMA α(스무딩 강도)") z = gr.Slider(1.0, 3.0, value=1.8, step=0.1, label="급변 Z 임계값") steps = gr.Slider(1, 6, value=3, step=1, label="예측 턴 수") btn = gr.Button("분석 실행") report = gr.Textbox(label="리포트", lines=18) img = gr.Markdown() struct = gr.Textbox(label="디버그/구조 데이터", lines=10) # REST 노출을 위해 api_name 유지 btn.click( run_pipeline, inputs=[text, alpha, z, steps], outputs=[report, img, struct], api_name="predict" ) if __name__ == "__main__": # Gradio 버전 차이를 흡수하는 queue() 호출 try: # gradio>=4 계열 demo.queue(default_concurrency_limit=1, max_size=128) except TypeError: try: # 일부 3.x 계열 demo.queue(concurrency_count=1, max_size=128) except TypeError: # 더 구버전: 인자 없이 demo.queue() demo.launch(server_name="0.0.0.0", server_port=7860, show_error=True)