JUNGU commited on
Commit
d034f8c
ยท
verified ยท
1 Parent(s): ad0c832

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +83 -17
app.py CHANGED
@@ -2,6 +2,20 @@
2
  import gradio as gr
3
  import google.generativeai as genai
4
  import os
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  # --- UI ๋ฐ ์ฑ—๋ด‡ ์„ค๋ช… ---
7
  # Gradio Blocks๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข€ ๋” ์œ ์—ฐํ•œ UI๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
@@ -10,11 +24,23 @@ with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
10
  """
11
  # โ™Š๏ธ Gemini API ์ฑ—๋ด‡ (Secrets ์‚ฌ์šฉ)
12
  Google Gemini API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค.
13
- Hugging Face Spaces์˜ 'Settings' ํƒญ์— ์žˆ๋Š” 'Repository secrets'์— `GEMINI_API_KEY`๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
 
 
14
  [API ํ‚ค ๋ฐœ๊ธ‰๋ฐ›๊ธฐ](https://aistudio.google.com/app/apikey)
 
 
15
  """
16
  )
17
 
 
 
 
 
 
 
 
 
18
  # Gradio ์ฑ—๋ด‡ UI ์ปดํฌ๋„ŒํŠธ
19
  chatbot = gr.Chatbot(label="Gemini ์ฑ—๋ด‡", height=600)
20
 
@@ -42,31 +68,61 @@ with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
42
  minimum=1, maximum=4096, value=1024, step=1, label="Max new tokens"
43
  )
44
 
45
- # --- Gemini API ํ˜ธ์ถœ ํ•จ์ˆ˜ ---
46
- def respond(message, chat_history, system_prompt, temp, max_output_tokens):
47
- # ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ API ํ‚ค๋ฅผ ์ง์ ‘ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
48
- # ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ฑ ์‹œ์ž‘ ์‹œ์ ์— ํ‚ค๋ฅผ ๋ชป ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
 
49
  GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
 
 
 
 
 
 
50
 
 
 
 
 
 
 
 
 
51
  # ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜จ API ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๋ฅผ ๋„์›๋‹ˆ๋‹ค.
52
- if not GEMINI_API_KEY:
53
- # UI์— ์ง์ ‘ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด gr.Warning์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ,
54
- # ์—ฌ๊ธฐ์„œ๋Š” ์ฑ„ํŒ… ์‘๋‹ต์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
55
- yield "โš ๏ธ **์˜ค๋ฅ˜**: `GEMINI_API_KEY`๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.\n\nHugging Face Spaces์˜ **Settings > Repository secrets**์— API ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
 
 
 
 
 
 
 
 
 
56
  return
57
 
58
  try:
59
  # API ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
60
- genai.configure(api_key=GEMINI_API_KEY)
 
61
  except Exception as e:
62
- yield f"API ํ‚ค ์„ค์ •์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {e}"
63
  return
64
 
65
  # ์‚ฌ์šฉํ•  ๋ชจ๋ธ๊ณผ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
66
- model = genai.GenerativeModel(
67
- model_name='gemini-2.0-flash', # ์ตœ์‹  Flash ๋ชจ๋ธ ์‚ฌ์šฉ
68
- system_instruction=system_prompt
69
- )
 
 
 
 
70
 
71
  # Gradio์˜ ๋Œ€ํ™” ๊ธฐ๋ก์„ Gemini API๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
72
  gemini_history = []
@@ -102,10 +158,19 @@ with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
102
 
103
  except Exception as e:
104
  # API ํ˜ธ์ถœ ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด UI์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
105
- yield f"์‘๋‹ต ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {e}"
 
 
 
 
 
 
106
 
107
  # --- Gradio ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ---
108
  def on_submit(message, chat_history, system_prompt, temp, max_output_tokens):
 
 
 
109
  chat_history.append((message, None))
110
  bot_response_stream = respond(message, chat_history, system_prompt, temp, max_output_tokens)
111
 
@@ -125,4 +190,5 @@ with gr.Blocks(theme=gr.themes.Default(primary_hue="blue")) as demo:
125
  )
126
 
127
  if __name__ == "__main__":
128
- demo.launch(debug=True)
 
 
2
  import gradio as gr
3
  import google.generativeai as genai
4
  import os
5
+ import logging
6
+
7
+ # ๋กœ๊น… ์„ค์ •
8
+ logging.basicConfig(level=logging.INFO)
9
+ logger = logging.getLogger(__name__)
10
+
11
+ # ์‹œ์ž‘ ์‹œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํ™•์ธ
12
+ GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
13
+ if GEMINI_API_KEY:
14
+ logger.info("API ํ‚ค๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ๊ฐ์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
15
+ # ํ‚ค์˜ ์ผ๋ถ€๋งŒ ํ‘œ์‹œ (๋ณด์•ˆ์„ ์œ„ํ•ด)
16
+ logger.info(f"API ํ‚ค ๋ฏธ๋ฆฌ๋ณด๊ธฐ: {GEMINI_API_KEY[:8]}...")
17
+ else:
18
+ logger.warning("GEMINI_API_KEY๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ๊ฐ์ง€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.")
19
 
20
  # --- UI ๋ฐ ์ฑ—๋ด‡ ์„ค๋ช… ---
21
  # Gradio Blocks๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข€ ๋” ์œ ์—ฐํ•œ UI๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
 
24
  """
25
  # โ™Š๏ธ Gemini API ์ฑ—๋ด‡ (Secrets ์‚ฌ์šฉ)
26
  Google Gemini API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฑ—๋ด‡์ž…๋‹ˆ๋‹ค.
27
+
28
+ **์ค‘์š”**: Hugging Face Spaces์˜ **Settings โ†’ Repository secrets**์— `GEMINI_API_KEY`๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
29
+
30
  [API ํ‚ค ๋ฐœ๊ธ‰๋ฐ›๊ธฐ](https://aistudio.google.com/app/apikey)
31
+
32
+ **๋””๋ฒ„๊น… ์ •๋ณด**:
33
  """
34
  )
35
 
36
+ # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ƒํƒœ ํ‘œ์‹œ
37
+ with gr.Row():
38
+ env_status = gr.Textbox(
39
+ label="ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ƒํƒœ",
40
+ value=f"GEMINI_API_KEY: {'โœ… ์„ค์ •๋จ' if GEMINI_API_KEY else 'โŒ ์„ค์ •๋˜์ง€ ์•Š์Œ'}",
41
+ interactive=False
42
+ )
43
+
44
  # Gradio ์ฑ—๋ด‡ UI ์ปดํฌ๋„ŒํŠธ
45
  chatbot = gr.Chatbot(label="Gemini ์ฑ—๋ด‡", height=600)
46
 
 
68
  minimum=1, maximum=4096, value=1024, step=1, label="Max new tokens"
69
  )
70
 
71
+ # ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ƒˆ๋กœ๊ณ ์นจ ๋ฒ„ํŠผ
72
+ refresh_button = gr.Button("๐Ÿ”„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ƒˆ๋กœ๊ณ ์นจ", size="sm")
73
+
74
+ def refresh_env_status():
75
+ """ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ƒํƒœ๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•ฉ๋‹ˆ๋‹ค."""
76
+ global GEMINI_API_KEY
77
  GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY")
78
+ status = f"GEMINI_API_KEY: {'โœ… ์„ค์ •๋จ' if GEMINI_API_KEY else 'โŒ ์„ค์ •๋˜์ง€ ์•Š์Œ'}"
79
+ if GEMINI_API_KEY:
80
+ status += f" (๋ฏธ๋ฆฌ๋ณด๊ธฐ: {GEMINI_API_KEY[:8]}...)"
81
+ return status
82
+
83
+ refresh_button.click(refresh_env_status, outputs=[env_status])
84
 
85
+ # --- Gemini API ํ˜ธ์ถœ ํ•จ์ˆ˜ ---
86
+ def respond(message, chat_history, system_prompt, temp, max_output_tokens):
87
+ # ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ API ํ‚ค๋ฅผ ๋‹ค์‹œ ํ™•์ธ
88
+ api_key = os.environ.get("GEMINI_API_KEY")
89
+
90
+ # ๋””๋ฒ„๊น…์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์ •๋ณด
91
+ logger.info(f"API ํ‚ค ํ™•์ธ: {'์žˆ์Œ' if api_key else '์—†์Œ'}")
92
+
93
  # ํ™˜๊ฒฝ๋ณ€์ˆ˜์—์„œ ๊ฐ€์ ธ์˜จ API ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€๋ฅผ ๋„์›๋‹ˆ๋‹ค.
94
+ if not api_key:
95
+ error_msg = """โš ๏ธ **์˜ค๋ฅ˜**: `GEMINI_API_KEY`๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
96
+
97
+ **ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•**:
98
+ 1. Hugging Face Spaces์˜ **Settings** ํƒญ์œผ๋กœ ์ด๋™
99
+ 2. **Repository secrets** ์„น์…˜ ์ฐพ๊ธฐ
100
+ 3. **New secret** ๋ฒ„ํŠผ ํด๋ฆญ
101
+ 4. Name: `GEMINI_API_KEY`, Value: ์‹ค์ œ API ํ‚ค ์ž…๋ ฅ
102
+ 5. **Save** ํด๋ฆญ
103
+ 6. Space๋ฅผ **์žฌ์‹œ์ž‘** (Settings โ†’ Factory reboot)
104
+
105
+ **์ฐธ๊ณ **: Private space๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋„ secrets๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋ณดํ˜ธ๋ฉ๋‹ˆ๋‹ค."""
106
+ yield error_msg
107
  return
108
 
109
  try:
110
  # API ํ‚ค๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
111
+ genai.configure(api_key=api_key)
112
+ logger.info("API ํ‚ค ์„ค์ • ์„ฑ๊ณต")
113
  except Exception as e:
114
+ yield f"API ํ‚ค ์„ค์ •์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"
115
  return
116
 
117
  # ์‚ฌ์šฉํ•  ๋ชจ๋ธ๊ณผ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
118
+ try:
119
+ model = genai.GenerativeModel(
120
+ model_name='gemini-2.0-flash-exp', # ๋˜๋Š” 'gemini-1.5-flash'
121
+ system_instruction=system_prompt
122
+ )
123
+ except Exception as e:
124
+ yield f"๋ชจ๋ธ ์ดˆ๊ธฐํ™” ์˜ค๋ฅ˜: {str(e)}\n์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ: gemini-1.5-flash, gemini-1.5-pro"
125
+ return
126
 
127
  # Gradio์˜ ๋Œ€ํ™” ๊ธฐ๋ก์„ Gemini API๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
128
  gemini_history = []
 
158
 
159
  except Exception as e:
160
  # API ํ˜ธ์ถœ ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด UI์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
161
+ error_detail = str(e)
162
+ if "API_KEY_INVALID" in error_detail:
163
+ yield "โŒ API ํ‚ค๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ API ํ‚ค์ธ์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
164
+ elif "QUOTA_EXCEEDED" in error_detail:
165
+ yield "โŒ API ์‚ฌ์šฉ๋Ÿ‰ ํ•œ๋„๋ฅผ ์ดˆ๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค."
166
+ else:
167
+ yield f"์‘๋‹ต ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {error_detail}"
168
 
169
  # --- Gradio ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ---
170
  def on_submit(message, chat_history, system_prompt, temp, max_output_tokens):
171
+ if not message.strip():
172
+ return "", chat_history
173
+
174
  chat_history.append((message, None))
175
  bot_response_stream = respond(message, chat_history, system_prompt, temp, max_output_tokens)
176
 
 
190
  )
191
 
192
  if __name__ == "__main__":
193
+ # ๋””๋ฒ„๊น… ๋ชจ๋“œ๋กœ ์‹คํ–‰
194
+ demo.launch(debug=True)