# app.py - Entry point (theme fixed and color-scheme locked to dark) import gradio as gr from core.logic_handlers import make_on_show_total, make_on_submit from core.models import load_models, vectorize_jobs from data.data_jobs import jobs_df from data.data_personas import personas from docs.docs_build import build_docs_tabs from practice.practice_ui import build_practice_tabs from styles.css import CUSTOM_CSS model_ruri, model_bert = load_models() jobs_vec = vectorize_jobs(jobs_df.copy(), model_ruri, model_bert) def build_app(): with gr.Blocks(theme=gr.themes.Soft(), css=CUSTOM_CSS) as demo: gr.HTML("") gr.HTML( "", ) gr.Markdown("# 【NLPハンズオン】モデルの思考を探る!求人マッチング改善体験", elem_id="main-title") # State は Blocks 直下で1回だけ生成(Tabs の外) scores_state = gr.State({}) all_history_state = gr.State([]) with gr.Tabs(): with gr.TabItem("📘 説明パート", elem_id="top-docs-tab"): build_docs_tabs(jobs_vec, personas) with gr.TabItem("🧪 実践パート", elem_id="top-practice-tab"): on_submit = make_on_submit(jobs_vec, personas, model_bert, model_ruri) on_show_total = make_on_show_total() build_practice_tabs( jobs_vec, personas, on_submit, on_show_total, scores_state, all_history_state, # 追加:ここで渡す model_bert, model_ruri, ) return demo demo = build_app() if __name__ == "__main__": demo.launch(server_name="0.0.0.0", server_port=7860)