Commit
ยท
a4126ee
1
Parent(s):
3a338e5
feat: Add .hf_ignore file to exclude unnecessary files during Hugging Face Space deployment. Update app.py for improved error handling and environment detection, and modify Dockerfile to use requirements.txt for dependency management.
Browse files- .hf_ignore +15 -0
- Dockerfile +6 -7
- app.py +33 -16
- requirements.txt +8 -0
.hf_ignore
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Hugging Face Space ๋ฐฐํฌ ์ ๋ฌด์ํ ํ์ผ๋ค
|
| 2 |
+
*.md
|
| 3 |
+
!README.md
|
| 4 |
+
ENV_EXAMPLE
|
| 5 |
+
*.sql
|
| 6 |
+
.git/
|
| 7 |
+
__pycache__/
|
| 8 |
+
*.pyc
|
| 9 |
+
*.log
|
| 10 |
+
.venv/
|
| 11 |
+
venv/
|
| 12 |
+
.DS_Store
|
| 13 |
+
.vscode/
|
| 14 |
+
.idea/
|
| 15 |
+
|
Dockerfile
CHANGED
|
@@ -18,9 +18,9 @@ ENV PYTHONUNBUFFERED=1 \
|
|
| 18 |
# uv ์ค์น (๋น ๋ฅธ Python ํจํค์ง ๊ด๋ฆฌ์)
|
| 19 |
RUN pip install --no-cache-dir uv
|
| 20 |
|
| 21 |
-
#
|
| 22 |
-
COPY
|
| 23 |
-
RUN uv pip install --system -
|
| 24 |
|
| 25 |
# ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ณต์ฌ
|
| 26 |
COPY config/ ./config/
|
|
@@ -29,13 +29,12 @@ COPY services/ ./services/
|
|
| 29 |
COPY data/ ./data/
|
| 30 |
COPY app.py init_db.py ./
|
| 31 |
|
| 32 |
-
# ํฌํธ ๋
ธ์ถ (
|
| 33 |
EXPOSE 7860
|
| 34 |
|
| 35 |
# ํฌ์ค์ฒดํฌ ์ถ๊ฐ
|
| 36 |
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
| 37 |
CMD curl -f http://localhost:7860/ || exit 1
|
| 38 |
|
| 39 |
-
# ์์ ์คํฌ๋ฆฝํธ
|
| 40 |
-
CMD ["
|
| 41 |
-
|
|
|
|
| 18 |
# uv ์ค์น (๋น ๋ฅธ Python ํจํค์ง ๊ด๋ฆฌ์)
|
| 19 |
RUN pip install --no-cache-dir uv
|
| 20 |
|
| 21 |
+
# requirements.txt ๋ณต์ฌ ๋ฐ ์ค์น
|
| 22 |
+
COPY requirements.txt ./
|
| 23 |
+
RUN uv pip install --system -r requirements.txt
|
| 24 |
|
| 25 |
# ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ณต์ฌ
|
| 26 |
COPY config/ ./config/
|
|
|
|
| 29 |
COPY data/ ./data/
|
| 30 |
COPY app.py init_db.py ./
|
| 31 |
|
| 32 |
+
# ํฌํธ ๋
ธ์ถ (Hugging Face Space๋ 7860 ํฌํธ ์ฌ์ฉ)
|
| 33 |
EXPOSE 7860
|
| 34 |
|
| 35 |
# ํฌ์ค์ฒดํฌ ์ถ๊ฐ
|
| 36 |
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
|
| 37 |
CMD curl -f http://localhost:7860/ || exit 1
|
| 38 |
|
| 39 |
+
# ์์ ์คํฌ๋ฆฝํธ (Hugging Face Space๋ ์๋์ผ๋ก ํ๊ฒฝ ๋ณ์๋ฅผ ์ฃผ์
ํจ)
|
| 40 |
+
CMD ["python", "app.py"]
|
|
|
app.py
CHANGED
|
@@ -12,31 +12,34 @@ from config.database import supabase_client
|
|
| 12 |
|
| 13 |
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐํ
|
| 14 |
try:
|
| 15 |
-
print("๐
|
| 16 |
|
| 17 |
# Supabase ์๋น์ค ์ด๊ธฐํ
|
| 18 |
if supabase_client:
|
| 19 |
-
supabase_service = SupabaseService()
|
| 20 |
-
print("โ
Supabase ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์๋ฃ")
|
| 21 |
-
|
| 22 |
-
# ์๋๋ฆฌ์ค ๋ฐ์ดํฐ ๋ก๋ (ํ
์ด๋ธ์ด ์๋ ๊ฒฝ์ฐ ๋ฌด์)
|
| 23 |
try:
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
else:
|
| 33 |
print("โ ๏ธ Supabase ํด๋ผ์ด์ธํธ๊ฐ ์ด๊ธฐํ๋์ง ์์์ต๋๋ค.")
|
| 34 |
print(" ํ๊ฒฝ ๋ณ์ SUPABASE_URL๊ณผ SUPABASE_ANON_KEY๋ฅผ ํ์ธํ์ธ์.")
|
|
|
|
| 35 |
except Exception as e:
|
| 36 |
print(f"โ ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐํ ์ค ์ค๋ฅ: {e}")
|
| 37 |
import traceback
|
| 38 |
traceback.print_exc()
|
| 39 |
-
|
| 40 |
|
| 41 |
# Gemini ํ๊ฐ๊ธฐ ์ด๊ธฐํ
|
| 42 |
evaluator = GeminiEvaluator()
|
|
@@ -338,7 +341,8 @@ def load_scenario_data(scenario_id: str):
|
|
| 338 |
if not scenario_id:
|
| 339 |
return None, None, ""
|
| 340 |
|
| 341 |
-
|
|
|
|
| 342 |
|
| 343 |
scenario = supabase_service.get_scenario(scenario_id)
|
| 344 |
patient = supabase_service.get_patient(scenario['patient_id']) if scenario else None
|
|
@@ -857,5 +861,18 @@ with gr.Blocks(title="๊ฐํธ ์ธ์์ธ๊ณ ๊ต์ก ํ๋ซํผ", theme=gr.themes.Sof
|
|
| 857 |
|
| 858 |
|
| 859 |
if __name__ == "__main__":
|
| 860 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 861 |
|
|
|
|
| 12 |
|
| 13 |
# ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐํ
|
| 14 |
try:
|
| 15 |
+
print("๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์๋ ์ค...")
|
| 16 |
|
| 17 |
# Supabase ์๋น์ค ์ด๊ธฐํ
|
| 18 |
if supabase_client:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
try:
|
| 20 |
+
supabase_service = SupabaseService()
|
| 21 |
+
print("โ
Supabase ํด๋ผ์ด์ธํธ ์ด๊ธฐํ ์๋ฃ")
|
| 22 |
+
|
| 23 |
+
# ์๋๋ฆฌ์ค ๋ฐ์ดํฐ ๋ก๋ (ํ
์ด๋ธ์ด ์๋ ๊ฒฝ์ฐ ๋ฌด์)
|
| 24 |
+
try:
|
| 25 |
+
print("๐ฅ ์๋๋ฆฌ์ค ๋ฐ์ดํฐ ๋ก๋ ์ค...")
|
| 26 |
+
supabase_service.load_scenarios_from_json("data/scenarios.json")
|
| 27 |
+
print("โ
์๋๋ฆฌ์ค ๋ฐ์ดํฐ ๋ก๋ ์๋ฃ")
|
| 28 |
+
except Exception as load_error:
|
| 29 |
+
print(f"โ ๏ธ ์๋๋ฆฌ์ค ๋ฐ์ดํฐ ๋ก๋ ์คํจ: {load_error}")
|
| 30 |
+
print(" (์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์๊ฑฐ๋ ํ
์ด๋ธ์ด ์์ ์ ์์ต๋๋ค)")
|
| 31 |
+
except Exception as service_error:
|
| 32 |
+
print(f"โ ๏ธ Supabase ์๋น์ค ์ด๊ธฐํ ์คํจ: {service_error}")
|
| 33 |
+
supabase_service = None
|
| 34 |
else:
|
| 35 |
print("โ ๏ธ Supabase ํด๋ผ์ด์ธํธ๊ฐ ์ด๊ธฐํ๋์ง ์์์ต๋๋ค.")
|
| 36 |
print(" ํ๊ฒฝ ๋ณ์ SUPABASE_URL๊ณผ SUPABASE_ANON_KEY๋ฅผ ํ์ธํ์ธ์.")
|
| 37 |
+
supabase_service = None
|
| 38 |
except Exception as e:
|
| 39 |
print(f"โ ๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๊ธฐํ ์ค ์ค๋ฅ: {e}")
|
| 40 |
import traceback
|
| 41 |
traceback.print_exc()
|
| 42 |
+
supabase_service = None
|
| 43 |
|
| 44 |
# Gemini ํ๊ฐ๊ธฐ ์ด๊ธฐํ
|
| 45 |
evaluator = GeminiEvaluator()
|
|
|
|
| 341 |
if not scenario_id:
|
| 342 |
return None, None, ""
|
| 343 |
|
| 344 |
+
if not supabase_service:
|
| 345 |
+
return None, None, "Supabase ์๋น์ค๊ฐ ์ด๊ธฐํ๋์ง ์์์ต๋๋ค."
|
| 346 |
|
| 347 |
scenario = supabase_service.get_scenario(scenario_id)
|
| 348 |
patient = supabase_service.get_patient(scenario['patient_id']) if scenario else None
|
|
|
|
| 861 |
|
| 862 |
|
| 863 |
if __name__ == "__main__":
|
| 864 |
+
# Hugging Face Space ํ๊ฒฝ ํ์ธ
|
| 865 |
+
is_hf_space = bool(os.getenv("SPACE_ID") or os.getenv("HF_SPACE_ID"))
|
| 866 |
+
|
| 867 |
+
if is_hf_space:
|
| 868 |
+
# Hugging Face Space์์ ์คํ
|
| 869 |
+
print("๐ Hugging Face Space์์ ์คํ ์ค...")
|
| 870 |
+
# Queue ์ค์ ์ผ๋ก API ํธ์ถ ์์ ์ฑ ํฅ์
|
| 871 |
+
app.queue()
|
| 872 |
+
# Space๋ ์๋์ผ๋ก ํธ์คํ
ํ๋ฏ๋ก ์ต์ ์ค์
|
| 873 |
+
app.launch(server_name="0.0.0.0", server_port=7860)
|
| 874 |
+
else:
|
| 875 |
+
# ๋ก์ปฌ/์ง์ ์คํ
|
| 876 |
+
print("๐ ๋ก์ปฌ ํ๊ฒฝ์์ ์คํ ์ค...")
|
| 877 |
+
app.launch(server_name="0.0.0.0", server_port=7860, share=False)
|
| 878 |
|
requirements.txt
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
google-generativeai>=0.8.5
|
| 2 |
+
gradio>=5.49.1
|
| 3 |
+
python-dotenv>=1.1.1
|
| 4 |
+
requests>=2.31.0
|
| 5 |
+
supabase>=2.0.0
|
| 6 |
+
tsidpy>=1.1.5
|
| 7 |
+
psycopg2-binary>=2.9.9
|
| 8 |
+
|