Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import pandas as pd | |
| import time | |
| import traceback | |
| import os | |
| # 軽量版のimportエラー対策 | |
| try: | |
| from OpenAITools.FetchTools import fetch_clinical_trials | |
| from langchain_openai import ChatOpenAI | |
| from langchain_groq import ChatGroq | |
| from OpenAITools.CrinicalTrialTools import SimpleClinicalTrialAgent, GraderAgent, LLMTranslator, generate_ex_question_English | |
| FULL_VERSION = True | |
| except ImportError as e: | |
| print(f"完全版モジュールのインポートに失敗: {e}") | |
| print("軽量版モードで動作します") | |
| FULL_VERSION = False | |
| # 環境変数チェック | |
| def check_environment(): | |
| """環境変数をチェックし、不足している場合は警告""" | |
| missing_vars = [] | |
| if not os.getenv("GROQ_API_KEY"): | |
| missing_vars.append("GROQ_API_KEY") | |
| if not os.getenv("OPENAI_API_KEY"): | |
| missing_vars.append("OPENAI_API_KEY") | |
| return missing_vars | |
| # 軽量版データ生成関数 | |
| def generate_sample_dataframe(age, sex, tumor_type, GeneMutation, Meseable, Biopsiable): | |
| """サンプルデータを生成(軽量版)""" | |
| try: | |
| # 入力検証 | |
| if not all([age, sex, tumor_type]): | |
| return pd.DataFrame() | |
| # サンプルデータの作成 | |
| sample_data = { | |
| 'NCTID': ['NCT12345678', 'NCT87654321', 'NCT11111111'], | |
| 'AgentGrade': ['yes', 'no', 'unclear'], | |
| 'Title': [ | |
| f'Clinical Trial for {tumor_type} in {sex} patients', | |
| f'Alternative treatment for {tumor_type}', | |
| f'Experimental therapy for {tumor_type} with {GeneMutation}' | |
| ], | |
| 'AgentJudgment': [ | |
| f'{age}歳{sex}の{tumor_type}患者は参加可能です', | |
| f'{age}歳{sex}の{tumor_type}患者は参加できません', | |
| f'{age}歳{sex}の{tumor_type}患者の参加は不明確です' | |
| ], | |
| 'Japanese_Locations': ['Tokyo', 'Osaka', 'Kyoto'], | |
| 'Cancer': [tumor_type, tumor_type, tumor_type] | |
| } | |
| df = pd.DataFrame(sample_data) | |
| return df | |
| except Exception as e: | |
| print(f"データフレーム生成エラー: {e}") | |
| return pd.DataFrame() | |
| # 完全版データ生成関数 | |
| def generate_full_dataframe(age, sex, tumor_type, GeneMutation, Meseable, Biopsiable): | |
| """完全版のデータ生成(実際のAPI使用)""" | |
| if not FULL_VERSION: | |
| return generate_sample_dataframe(age, sex, tumor_type, GeneMutation, Meseable, Biopsiable) | |
| # 完全版の実装は元のコードと同じ | |
| # ... (省略) | |
| # Gradioインターフェース | |
| def create_interface(): | |
| missing_vars = check_environment() | |
| with gr.Blocks(title="臨床試験適格性評価", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("## 🏥 臨床試験適格性評価インターフェース") | |
| # バージョン情報 | |
| if FULL_VERSION: | |
| gr.Markdown("✅ **モード**: 完全版(API連携)") | |
| else: | |
| gr.Markdown("⚠️ **モード**: 軽量版(サンプルデータ)") | |
| # 環境変数状態の表示 | |
| if not missing_vars: | |
| gr.Markdown("✅ **ステータス**: 全ての環境変数が設定されています") | |
| else: | |
| gr.Markdown(f"⚠️ **注意**: 環境変数が不足しています: {', '.join(missing_vars)}") | |
| # 入力フィールド | |
| with gr.Row(): | |
| with gr.Column(): | |
| age_input = gr.Textbox(label="Age", placeholder="例: 65", value="65") | |
| sex_input = gr.Dropdown(choices=["男性", "女性"], label="Sex", value="男性") | |
| tumor_type_input = gr.Textbox(label="Tumor Type", placeholder="例: gastric cancer", value="gastric cancer") | |
| with gr.Column(): | |
| gene_mutation_input = gr.Textbox(label="Gene Mutation", placeholder="例: HER2", value="HER2") | |
| measurable_input = gr.Dropdown(choices=["有り", "無し", "不明"], label="Measurable Tumor", value="有り") | |
| biopsiable_input = gr.Dropdown(choices=["有り", "無し", "不明"], label="Biopsiable Tumor", value="有り") | |
| # データフレーム表示 | |
| dataframe_output = gr.DataFrame(label="Clinical Trials Results", interactive=False) | |
| # ボタン群 | |
| with gr.Row(): | |
| if FULL_VERSION: | |
| generate_button = gr.Button("Generate Clinical Trials Data", variant="primary") | |
| else: | |
| generate_button = gr.Button("Generate Sample Data", variant="primary") | |
| all_button = gr.Button("Show All", variant="secondary") | |
| yes_button = gr.Button("Show Eligible", variant="secondary") | |
| no_button = gr.Button("Show Ineligible", variant="secondary") | |
| unclear_button = gr.Button("Show Unclear", variant="secondary") | |
| # 状態管理 | |
| df_state = gr.State(value=None) | |
| # イベントハンドリング | |
| def update_dataframe(age, sex, tumor_type, gene_mutation, measurable, biopsiable): | |
| if FULL_VERSION: | |
| df = generate_full_dataframe(age, sex, tumor_type, gene_mutation, measurable, biopsiable) | |
| else: | |
| df = generate_sample_dataframe(age, sex, tumor_type, gene_mutation, measurable, biopsiable) | |
| return df, df | |
| def filter_dataframe(df, grade): | |
| if df is None or len(df) == 0: | |
| return df | |
| if grade == "all": | |
| return df | |
| return df[df['AgentGrade'] == grade] | |
| # ボタンイベント | |
| generate_button.click( | |
| fn=update_dataframe, | |
| inputs=[age_input, sex_input, tumor_type_input, gene_mutation_input, measurable_input, biopsiable_input], | |
| outputs=[dataframe_output, df_state] | |
| ) | |
| all_button.click( | |
| fn=lambda df: filter_dataframe(df, "all"), | |
| inputs=[df_state], | |
| outputs=[dataframe_output] | |
| ) | |
| yes_button.click( | |
| fn=lambda df: filter_dataframe(df, "yes"), | |
| inputs=[df_state], | |
| outputs=[dataframe_output] | |
| ) | |
| no_button.click( | |
| fn=lambda df: filter_dataframe(df, "no"), | |
| inputs=[df_state], | |
| outputs=[dataframe_output] | |
| ) | |
| unclear_button.click( | |
| fn=lambda df: filter_dataframe(df, "unclear"), | |
| inputs=[df_state], | |
| outputs=[dataframe_output] | |
| ) | |
| return demo | |
| if __name__ == "__main__": | |
| demo = create_interface() | |
| demo.launch() | |