Spaces:
Running
Running
Fix Pydantic compatibility and improve error handling
Browse files- OpenAITools/CrinicalTrialTools.py +11 -2
- app.py +59 -7
- requirements.txt +10 -15
OpenAITools/CrinicalTrialTools.py
CHANGED
@@ -24,8 +24,8 @@ except ImportError:
|
|
24 |
from langchain_core.runnables import RunnablePassthrough
|
25 |
from langchain_core.output_parsers import StrOutputParser
|
26 |
|
27 |
-
#
|
28 |
-
gpt = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
|
29 |
|
30 |
## Database関連のインポート
|
31 |
from langchain_community.utilities import SQLDatabase
|
@@ -36,6 +36,15 @@ from langchain_core.prompts import MessagesPlaceholder
|
|
36 |
|
37 |
from OpenAITools.FetchTools import fetch_clinical_trials, fetch_clinical_trials_jp
|
38 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
39 |
# エラーハンドリング用のデコレータ
|
40 |
def retry_on_error(max_retries=3, delay=1):
|
41 |
"""エラー時のリトライデコレータ"""
|
|
|
24 |
from langchain_core.runnables import RunnablePassthrough
|
25 |
from langchain_core.output_parsers import StrOutputParser
|
26 |
|
27 |
+
# 修正: モジュールレベルでの初期化を削除
|
28 |
+
# gpt = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
|
29 |
|
30 |
## Database関連のインポート
|
31 |
from langchain_community.utilities import SQLDatabase
|
|
|
36 |
|
37 |
from OpenAITools.FetchTools import fetch_clinical_trials, fetch_clinical_trials_jp
|
38 |
|
39 |
+
# GPT初期化を関数として追加
|
40 |
+
def get_openai_client():
|
41 |
+
"""OpenAIクライアントを安全に初期化"""
|
42 |
+
try:
|
43 |
+
return ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
|
44 |
+
except Exception as e:
|
45 |
+
print(f"OpenAI初期化エラー: {e}")
|
46 |
+
return None
|
47 |
+
|
48 |
# エラーハンドリング用のデコレータ
|
49 |
def retry_on_error(max_retries=3, delay=1):
|
50 |
"""エラー時のリトライデコレータ"""
|
app.py
CHANGED
@@ -2,20 +2,54 @@ import gradio as gr
|
|
2 |
import pandas as pd
|
3 |
import time
|
4 |
import traceback
|
|
|
5 |
from OpenAITools.FetchTools import fetch_clinical_trials
|
6 |
from langchain_openai import ChatOpenAI
|
7 |
from langchain_groq import ChatGroq
|
8 |
from OpenAITools.CrinicalTrialTools import SimpleClinicalTrialAgent, GraderAgent, LLMTranslator, generate_ex_question_English
|
9 |
|
10 |
-
#
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
15 |
|
16 |
# エラーハンドリング付きでエージェント評価を実行する関数
|
17 |
def evaluate_with_retry(agent, criteria, question, max_retries=3):
|
18 |
"""エラーハンドリング付きでエージェント評価を実行"""
|
|
|
|
|
|
|
19 |
for attempt in range(max_retries):
|
20 |
try:
|
21 |
return agent.evaluate_eligibility(criteria, question)
|
@@ -32,6 +66,8 @@ def evaluate_with_retry(agent, criteria, question, max_retries=3):
|
|
32 |
continue
|
33 |
else:
|
34 |
return "評価エラー: サーバーに接続できませんでした"
|
|
|
|
|
35 |
else:
|
36 |
print(f"予期しないエラー (試行 {attempt + 1}/{max_retries}): {e}")
|
37 |
if attempt < max_retries - 1:
|
@@ -43,6 +79,9 @@ def evaluate_with_retry(agent, criteria, question, max_retries=3):
|
|
43 |
|
44 |
def evaluate_grade_with_retry(agent, judgment, max_retries=3):
|
45 |
"""エラーハンドリング付きでグレード評価を実行"""
|
|
|
|
|
|
|
46 |
for attempt in range(max_retries):
|
47 |
try:
|
48 |
return agent.evaluate_eligibility(judgment)
|
@@ -54,6 +93,8 @@ def evaluate_grade_with_retry(agent, judgment, max_retries=3):
|
|
54 |
continue
|
55 |
else:
|
56 |
return "unclear"
|
|
|
|
|
57 |
else:
|
58 |
print(f"予期しないエラー (グレード評価 - 試行 {attempt + 1}/{max_retries}): {e}")
|
59 |
if attempt < max_retries - 1:
|
@@ -72,7 +113,11 @@ def generate_dataframe(age, sex, tumor_type, GeneMutation, Meseable, Biopsiable)
|
|
72 |
|
73 |
# 日本語の腫瘍タイプを英語に翻訳
|
74 |
try:
|
75 |
-
|
|
|
|
|
|
|
|
|
76 |
except Exception as e:
|
77 |
print(f"翻訳エラー: {e}")
|
78 |
TumorName = tumor_type # 翻訳に失敗した場合は元の値を使用
|
@@ -162,7 +207,14 @@ def download_full_csv(df):
|
|
162 |
# Gradioインターフェースの作成
|
163 |
with gr.Blocks(title="臨床試験適格性評価", theme=gr.themes.Soft()) as demo:
|
164 |
gr.Markdown("## 臨床試験適格性評価インターフェース")
|
165 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
166 |
|
167 |
# 各種入力フィールド
|
168 |
with gr.Row():
|
|
|
2 |
import pandas as pd
|
3 |
import time
|
4 |
import traceback
|
5 |
+
import os
|
6 |
from OpenAITools.FetchTools import fetch_clinical_trials
|
7 |
from langchain_openai import ChatOpenAI
|
8 |
from langchain_groq import ChatGroq
|
9 |
from OpenAITools.CrinicalTrialTools import SimpleClinicalTrialAgent, GraderAgent, LLMTranslator, generate_ex_question_English
|
10 |
|
11 |
+
# 環境変数チェック
|
12 |
+
def check_environment():
|
13 |
+
"""環境変数をチェックし、不足している場合は警告"""
|
14 |
+
missing_vars = []
|
15 |
+
|
16 |
+
if not os.getenv("GROQ_API_KEY"):
|
17 |
+
missing_vars.append("GROQ_API_KEY")
|
18 |
+
|
19 |
+
if not os.getenv("OPENAI_API_KEY"):
|
20 |
+
missing_vars.append("OPENAI_API_KEY")
|
21 |
+
|
22 |
+
if missing_vars:
|
23 |
+
print(f"⚠️ 環境変数が設定されていません: {', '.join(missing_vars)}")
|
24 |
+
print("一部の機能が制限される可能性があります。")
|
25 |
+
|
26 |
+
return len(missing_vars) == 0
|
27 |
+
|
28 |
+
# 環境変数チェック実行
|
29 |
+
env_ok = check_environment()
|
30 |
+
|
31 |
+
# モデルとエージェントの安全な初期化
|
32 |
+
def safe_init_agents():
|
33 |
+
"""エージェントを安全に初期化"""
|
34 |
+
try:
|
35 |
+
groq = ChatGroq(model_name="llama3-70b-8192", temperature=0)
|
36 |
+
translator = LLMTranslator(groq)
|
37 |
+
criteria_agent = SimpleClinicalTrialAgent(groq)
|
38 |
+
grader_agent = GraderAgent(groq)
|
39 |
+
return translator, criteria_agent, grader_agent
|
40 |
+
except Exception as e:
|
41 |
+
print(f"エージェント初期化エラー: {e}")
|
42 |
+
return None, None, None
|
43 |
+
|
44 |
+
# エージェント初期化
|
45 |
+
translator, CriteriaCheckAgent, grader_agent = safe_init_agents()
|
46 |
|
47 |
# エラーハンドリング付きでエージェント評価を実行する関数
|
48 |
def evaluate_with_retry(agent, criteria, question, max_retries=3):
|
49 |
"""エラーハンドリング付きでエージェント評価を実行"""
|
50 |
+
if agent is None:
|
51 |
+
return "評価エラー: エージェントが初期化されていません。API keyを確認してください。"
|
52 |
+
|
53 |
for attempt in range(max_retries):
|
54 |
try:
|
55 |
return agent.evaluate_eligibility(criteria, question)
|
|
|
66 |
continue
|
67 |
else:
|
68 |
return "評価エラー: サーバーに接続できませんでした"
|
69 |
+
elif "API key" in str(e) or "authentication" in str(e).lower():
|
70 |
+
return "評価エラー: API keyが無効または設定されていません"
|
71 |
else:
|
72 |
print(f"予期しないエラー (試行 {attempt + 1}/{max_retries}): {e}")
|
73 |
if attempt < max_retries - 1:
|
|
|
79 |
|
80 |
def evaluate_grade_with_retry(agent, judgment, max_retries=3):
|
81 |
"""エラーハンドリング付きでグレード評価を実行"""
|
82 |
+
if agent is None:
|
83 |
+
return "unclear"
|
84 |
+
|
85 |
for attempt in range(max_retries):
|
86 |
try:
|
87 |
return agent.evaluate_eligibility(judgment)
|
|
|
93 |
continue
|
94 |
else:
|
95 |
return "unclear"
|
96 |
+
elif "API key" in str(e) or "authentication" in str(e).lower():
|
97 |
+
return "unclear"
|
98 |
else:
|
99 |
print(f"予期しないエラー (グレード評価 - 試行 {attempt + 1}/{max_retries}): {e}")
|
100 |
if attempt < max_retries - 1:
|
|
|
113 |
|
114 |
# 日本語の腫瘍タイプを英語に翻訳
|
115 |
try:
|
116 |
+
if translator is not None:
|
117 |
+
TumorName = translator.translate(tumor_type)
|
118 |
+
else:
|
119 |
+
print("翻訳エージェントが利用できません。元の値を使用します。")
|
120 |
+
TumorName = tumor_type
|
121 |
except Exception as e:
|
122 |
print(f"翻訳エラー: {e}")
|
123 |
TumorName = tumor_type # 翻訳に失敗した場合は元の値を使用
|
|
|
207 |
# Gradioインターフェースの作成
|
208 |
with gr.Blocks(title="臨床試験適格性評価", theme=gr.themes.Soft()) as demo:
|
209 |
gr.Markdown("## 臨床試験適格性評価インターフェース")
|
210 |
+
|
211 |
+
# 環境変数状態の表示
|
212 |
+
if env_ok:
|
213 |
+
gr.Markdown("✅ **ステータス**: 全ての環境変数が設定されています")
|
214 |
+
else:
|
215 |
+
gr.Markdown("⚠️ **���意**: 一部の環境変数が設定されていません。機能が制限される可能性があります。")
|
216 |
+
|
217 |
+
gr.Markdown("💡 **使用方法**: 患者情報を入力して「Generate Clinical Trials Data」をクリックしてください。")
|
218 |
|
219 |
# 各種入力フィールド
|
220 |
with gr.Row():
|
requirements.txt
CHANGED
@@ -6,23 +6,23 @@ pandas>=1.5.0
|
|
6 |
numpy>=1.21.0
|
7 |
requests>=2.25.0
|
8 |
|
9 |
-
# LangChain ecosystem (
|
10 |
-
langchain==0.
|
11 |
-
langchain-community==0.
|
12 |
-
langchain-core==0.
|
13 |
-
langchain-openai==0.
|
14 |
-
langchain-groq==0.
|
15 |
-
langchain-text-splitters==0.
|
16 |
|
17 |
# LLM providers
|
18 |
-
openai>=1.0.0
|
19 |
groq>=0.4.0
|
20 |
|
21 |
# Database utilities
|
22 |
SQLAlchemy>=2.0.0,<3.0.0
|
23 |
|
24 |
-
# Pydantic (
|
25 |
-
pydantic>=2.
|
26 |
|
27 |
# Text processing (軽量化)
|
28 |
tiktoken>=0.4.0
|
@@ -31,11 +31,6 @@ tiktoken>=0.4.0
|
|
31 |
tenacity>=8.0.0
|
32 |
packaging>=23.0.0
|
33 |
|
34 |
-
# Optional: Vector databases (必要な場合のみ)
|
35 |
-
# chromadb>=0.4.0
|
36 |
-
# sentence-transformers>=2.2.0
|
37 |
-
# transformers>=4.40.0
|
38 |
-
|
39 |
# Optional: Bio-related libraries (if needed for your specific use case)
|
40 |
# Uncomment the following lines if bio-processing is required
|
41 |
# biopython>=1.83
|
|
|
6 |
numpy>=1.21.0
|
7 |
requests>=2.25.0
|
8 |
|
9 |
+
# LangChain ecosystem (互換性のあるバージョンに調整)
|
10 |
+
langchain==0.2.16
|
11 |
+
langchain-community==0.2.16
|
12 |
+
langchain-core==0.2.38
|
13 |
+
langchain-openai==0.1.23
|
14 |
+
langchain-groq==0.1.9
|
15 |
+
langchain-text-splitters==0.2.4
|
16 |
|
17 |
# LLM providers
|
18 |
+
openai>=1.0.0,<2.0.0
|
19 |
groq>=0.4.0
|
20 |
|
21 |
# Database utilities
|
22 |
SQLAlchemy>=2.0.0,<3.0.0
|
23 |
|
24 |
+
# Pydantic (LangChain互換性のため)
|
25 |
+
pydantic>=2.5.0,<3.0.0
|
26 |
|
27 |
# Text processing (軽量化)
|
28 |
tiktoken>=0.4.0
|
|
|
31 |
tenacity>=8.0.0
|
32 |
packaging>=23.0.0
|
33 |
|
|
|
|
|
|
|
|
|
|
|
34 |
# Optional: Bio-related libraries (if needed for your specific use case)
|
35 |
# Uncomment the following lines if bio-processing is required
|
36 |
# biopython>=1.83
|