Spaces:
Running
Running
File size: 6,770 Bytes
2670252 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
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()
|