LearningnRunning commited on
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
Files changed (4) hide show
  1. .hf_ignore +15 -0
  2. Dockerfile +6 -7
  3. app.py +33 -16
  4. 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 pyproject.toml ./
23
- RUN uv pip install --system -e .
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
- # ํฌํŠธ ๋…ธ์ถœ (Gradio ๊ธฐ๋ณธ ํฌํŠธ)
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 ["sh", "-c", "uv run python init_db.py && uv run python app.py"]
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("๐Ÿ”— Supabase ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค...")
16
 
17
  # Supabase ์„œ๋น„์Šค ์ดˆ๊ธฐํ™”
18
  if supabase_client:
19
- supabase_service = SupabaseService()
20
- print("โœ… Supabase ํด๋ผ์ด์–ธํŠธ ์ดˆ๊ธฐํ™” ์™„๋ฃŒ")
21
-
22
- # ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ์ดํ„ฐ ๋กœ๋“œ (ํ…Œ์ด๋ธ”์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ฌด์‹œ)
23
  try:
24
- print("๐Ÿ“ฅ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์ค‘...")
25
- supabase_service.load_scenarios_from_json("data/scenarios.json")
26
- print("โœ… ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์™„๋ฃŒ")
27
- except Exception as load_error:
28
- print(f"โš ๏ธ ์‹œ๋‚˜๋ฆฌ์˜ค ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์‹คํŒจ: {load_error}")
29
- print(" Supabase Dashboard์—์„œ ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”:")
30
- print(" 1. supabase_schema.sql ์‹คํ–‰")
31
- print(" 2. supabase_rls_fix_complete.sql ์‹คํ–‰")
 
 
 
 
 
 
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
- print("โ„น๏ธ Supabase ์‚ฌ์šฉ ์‹œ: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”")
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
- supabase_service = SupabaseService()
 
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
- app.launch(server_name="0.0.0.0", server_port=7860, share=False)
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+