GgaammGo commited on
Commit
fafebf2
Β·
verified Β·
1 Parent(s): 3d785ae

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +25 -25
app.py CHANGED
@@ -1,17 +1,18 @@
1
  import os
2
  import gradio as gr
3
- from huggingface_hub import InferenceClient
4
- from huggingface_hub.errors import HfHubHTTPError
5
 
6
- MODEL_ID = "google/gemma-3-27b-it"
7
- HF_TOKEN = os.environ.get("HF_TOKEN", None)
8
 
9
- # ── InferenceClient μ΄ˆκΈ°ν™” ───────────────────────────────────────────────
10
- # huggingface_hub >= 1.2.0 의 InferenceClientλŠ” λ‚΄λΆ€μ μœΌλ‘œ
11
- # μƒˆ μ—”λ“œν¬μΈνŠΈμΈ https://router.huggingface.co λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
12
- # (ꡬ μ—”λ“œν¬μΈνŠΈ api-inference.huggingface.co λŠ” 2025λ…„ ν•˜λ°˜κΈ°λΆ€λ‘œ
13
- # μ™„μ „νžˆ μ„œλΉ„μŠ€ μ’…λ£Œλ˜μ–΄ DNS μ‘°μ°¨ μ‘λ‹΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.)
14
- client = InferenceClient(token=HF_TOKEN)
 
 
15
 
16
 
17
  # ── Gradio 버전에 따라 history ν˜•μ‹μ΄ λ‹€λ₯΄λ―€λ‘œ 두 ν˜•μ‹ λͺ¨λ‘ 지원 ────────────
@@ -43,7 +44,6 @@ def _normalize_history(history: list) -> list:
43
  role = getattr(turn, "role", "user")
44
  content = getattr(turn, "content", "")
45
 
46
- # Gemma 4λŠ” OpenAI ν‘œμ€€μΈ "assistant"둜 ν†΅μΌν•΄μ„œ 보내야 ν•©λ‹ˆλ‹€.
47
  if role == "model":
48
  role = "assistant"
49
  messages.append({"role": role, "content": content})
@@ -51,40 +51,40 @@ def _normalize_history(history: list) -> list:
51
  return messages
52
 
53
 
54
- # ── λŒ€ν™” ν…μŠ€νŠΈ 생성 ν•¨μˆ˜ (OpenAI ν˜Έν™˜ chat.completions 방식) ───────────────
55
  def predict_chat(message: str, history: list):
56
  messages = _normalize_history(history)
57
  messages.append({"role": "user", "content": message})
58
 
59
  try:
60
- # 2. chat.completions.create λ₯Ό μ‚¬μš©ν•˜λ©΄ Gemma 4 μ „μš© ν”„λ‘¬ν”„νŠΈ
61
- # ν…œν”Œλ¦Ώ(<|turn>system ... <turn|> λ“±)을 λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μžλ™μœΌλ‘œ
62
- # ꡬ성해 μ£Όλ―€λ‘œ, 직접 ν”„λ‘¬ν”„νŠΈ λ¬Έμžμ—΄μ„ 쑰립할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.
63
  completion = client.chat.completions.create(
64
  model=MODEL_ID,
65
  messages=messages,
66
- max_tokens=8192,
67
  temperature=0.7,
68
  top_p=0.95,
 
 
 
 
 
 
69
  )
70
  output = completion.choices[0].message.content
71
  return output.strip() if output else ""
72
 
73
- except HfHubHTTPError as e:
74
- # λͺ¨λΈμ΄ μ„œλ²„λ¦¬μŠ€ Inference Providers에 아직 λ°°ν¬λ˜μ§€ μ•Šμ•˜κ±°λ‚˜
75
- # (예: "Model not found" / 404), 게이트(gated) λͺ¨λΈ λΌμ΄μ„ μŠ€
76
- # λ―Έλ™μ˜ λ“± HF μͺ½ μ‚¬μœ λ‘œ 였λ₯˜κ°€ λ‚˜λŠ” 경우
77
- return f"❌ Hugging Face API 였λ₯˜: {str(e)}"
78
  except Exception as e:
79
  return f"❌ λ„€νŠΈμ›Œν¬ 톡신 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
80
 
81
 
82
  # ── UI λΉŒλ“œ 및 API κ°œμ„€ ──────────────────────────────────────────────────────
83
  with gr.Blocks() as demo:
84
- gr.Markdown(f"# πŸ€– GS-AI API Server (Gemma 4 Mode)\nModel: `{MODEL_ID}`")
85
 
86
- # type 인자λ₯Ό μ§€μ •ν•˜μ§€ μ•Šμ•„, μ„€μΉ˜λœ Gradio 버전이 무엇이든
87
- # (κ΅¬ν˜• tuples 기본값이든 μ‹ ν˜• messages 기본값이든) 였λ₯˜ 없이 λ™μž‘ν•©λ‹ˆλ‹€.
88
  chatbot_ui = gr.Chatbot(height=480)
89
  textbox_ui = gr.Textbox(placeholder="λ©”μ‹œμ§€λ₯Ό μž…λ ₯ν•˜μ„Έμš”...")
90
 
@@ -100,4 +100,4 @@ if __name__ == "__main__":
100
  server_name="0.0.0.0",
101
  server_port=7860,
102
  theme=gr.themes.Soft(),
103
- )
 
1
  import os
2
  import gradio as gr
3
+ from openai import OpenAI, APIError
 
4
 
5
+ MODEL_ID = "google/gemma-3-27b-it:free"
6
+ OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", None)
7
 
8
+ # ── OpenRouter ν΄λΌμ΄μ–ΈνŠΈ μ΄ˆκΈ°ν™” ─────────────────────────────────────────
9
+ # Hugging Faceλ₯Ό μ „ν˜€ κ±°μΉ˜μ§€ μ•Šκ³ , OpenRouter 자체 μ„œλ²„(openrouter.ai)둜
10
+ # 직접 μš”μ²­μ„ λ³΄λƒ…λ‹ˆλ‹€. OpenAI SDK의 base_url만 OpenRouter μ£Όμ†Œλ‘œ
11
+ # λ°”κΎΈλŠ”, OpenRouter 곡식 λ¬Έμ„œκ°€ μ•ˆλ‚΄ν•˜λŠ” ν‘œμ€€ μ‚¬μš© λ°©μ‹μž…λ‹ˆλ‹€.
12
+ client = OpenAI(
13
+ base_url="https://openrouter.ai/api/v1",
14
+ api_key=OPENROUTER_API_KEY,
15
+ )
16
 
17
 
18
  # ── Gradio 버전에 따라 history ν˜•μ‹μ΄ λ‹€λ₯΄λ―€λ‘œ 두 ν˜•μ‹ λͺ¨λ‘ 지원 ────────────
 
44
  role = getattr(turn, "role", "user")
45
  content = getattr(turn, "content", "")
46
 
 
47
  if role == "model":
48
  role = "assistant"
49
  messages.append({"role": role, "content": content})
 
51
  return messages
52
 
53
 
54
+ # ── λŒ€ν™” ν…μŠ€νŠΈ 생성 ν•¨μˆ˜ (OpenRouter chat.completions 방식) ────────────────
55
  def predict_chat(message: str, history: list):
56
  messages = _normalize_history(history)
57
  messages.append({"role": "user", "content": message})
58
 
59
  try:
 
 
 
60
  completion = client.chat.completions.create(
61
  model=MODEL_ID,
62
  messages=messages,
63
+ max_tokens=512,
64
  temperature=0.7,
65
  top_p=0.95,
66
+ extra_headers={
67
+ # OpenRouter λ¦¬λ”λ³΄λ“œμ— 앱을 ν‘œμ‹œν•˜κ³  싢을 λ•Œ μ‚¬μš©ν•˜λŠ”
68
+ # 선택 ν•­λͺ©μž…λ‹ˆλ‹€. ν•„μˆ˜λŠ” μ•„λ‹ˆλ―€λ‘œ λΉ„μ›Œλ‘μ…”λ„ λ©λ‹ˆλ‹€.
69
+ "HTTP-Referer": "https://huggingface.co/spaces",
70
+ "X-Title": "GS AI",
71
+ },
72
  )
73
  output = completion.choices[0].message.content
74
  return output.strip() if output else ""
75
 
76
+ except APIError as e:
77
+ # 무료 λͺ¨λΈμ˜ λΆ„λ‹Ή/일일 μš”μ²­ ν•œλ„ 초과, λͺ¨λΈ μΌμ‹œ 쀑단 λ“±
78
+ # OpenRouter μͺ½ μ‚¬μœ λ‘œ 였λ₯˜κ°€ λ‚˜λŠ” κ²½μš°μž…λ‹ˆλ‹€.
79
+ return f"❌ OpenRouter API 였λ₯˜: {str(e)}"
 
80
  except Exception as e:
81
  return f"❌ λ„€νŠΈμ›Œν¬ 톡신 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
82
 
83
 
84
  # ── UI λΉŒλ“œ 및 API κ°œμ„€ ──────────────────────────────────────────────────────
85
  with gr.Blocks() as demo:
86
+ gr.Markdown(f"# πŸ€– GS-AI API Server (OpenRouter Mode)\nModel: `{MODEL_ID}`")
87
 
 
 
88
  chatbot_ui = gr.Chatbot(height=480)
89
  textbox_ui = gr.Textbox(placeholder="λ©”μ‹œμ§€λ₯Ό μž…λ ₯ν•˜μ„Έμš”...")
90
 
 
100
  server_name="0.0.0.0",
101
  server_port=7860,
102
  theme=gr.themes.Soft(),
103
+ )