GitHub Actions
commited on
Commit
ยท
9867d88
1
Parent(s):
47d6db0
Auto-deploy from GitHub Actions - 2025-12-12 06:41:59
Browse files- app/gemini_client.py +45 -8
app/gemini_client.py
CHANGED
|
@@ -38,7 +38,7 @@ GEMINI_API_KEY = get_gemini_api_key()
|
|
| 38 |
# ์ฌ์ฉ ๊ฐ๋ฅํ Gemini ๋ชจ๋ธ ๋ชฉ๋ก (์ต์ ๋ฒ์ ์ฐ์ )
|
| 39 |
AVAILABLE_GEMINI_MODELS = [
|
| 40 |
'gemini-2.0-flash-exp',
|
| 41 |
-
'gemini-1.5-pro',
|
| 42 |
'gemini-1.5-flash',
|
| 43 |
'gemini-1.5-pro-latest',
|
| 44 |
'gemini-1.5-flash-latest',
|
|
@@ -382,6 +382,7 @@ class GeminiClient:
|
|
| 382 |
|
| 383 |
# ๋ชจ๋ธ ๋ชฉ๋ก ์กฐํ ์๋ (v1beta)
|
| 384 |
available_models_str = "ํ์ธ ๋ถ๊ฐ"
|
|
|
|
| 385 |
try:
|
| 386 |
list_models_url = f"{rest_base_url}/models"
|
| 387 |
list_response = requests.get(
|
|
@@ -392,7 +393,7 @@ class GeminiClient:
|
|
| 392 |
)
|
| 393 |
if list_response.status_code == 200:
|
| 394 |
models_data = list_response.json()
|
| 395 |
-
|
| 396 |
for m in models_data.get('models', []):
|
| 397 |
model_name_full = m.get('name', '')
|
| 398 |
if '/' in model_name_full:
|
|
@@ -402,14 +403,50 @@ class GeminiClient:
|
|
| 402 |
# generateContent๋ฅผ ์ง์ํ๋ ๋ชจ๋ธ๋ง ํํฐ๋ง
|
| 403 |
supported_methods = m.get('supportedGenerationMethods', [])
|
| 404 |
if 'generateContent' in supported_methods:
|
| 405 |
-
|
| 406 |
-
available_models_str = ', '.join(
|
| 407 |
-
print(f"[Gemini] ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ธ ๋ชฉ๋ก (v1beta): {
|
| 408 |
except Exception as list_error:
|
| 409 |
print(f"[Gemini] ๋ชจ๋ธ ๋ชฉ๋ก ์กฐํ ์คํจ: {list_error}")
|
| 410 |
|
| 411 |
-
|
| 412 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 413 |
else:
|
| 414 |
# v1์์ ์ฑ๊ณต
|
| 415 |
response_has_error = False
|
|
@@ -436,7 +473,7 @@ class GeminiClient:
|
|
| 436 |
1. ๋ด์ผ๊น์ง ๋๊ธฐ (ํ ๋น๋์ด ์๋์ผ๋ก ์ฌ์ค์ ๋ฉ๋๋ค)
|
| 437 |
2. ๋ค๋ฅธ Gemini ๋ชจ๋ธ๋ก ๋ณ๊ฒฝ:
|
| 438 |
- gemini-2.0-flash-exp (๋ ๋์ ํ ๋น๋ ์ ๊ณต)
|
| 439 |
-
- gemini-1.5-pro
|
| 440 |
- gemini-1.5-flash
|
| 441 |
3. Google AI Studio์์ ํ ๋น๋ ํ์ธ:
|
| 442 |
https://aistudio.google.com/app/apikey
|
|
|
|
| 38 |
# ์ฌ์ฉ ๊ฐ๋ฅํ Gemini ๋ชจ๋ธ ๋ชฉ๋ก (์ต์ ๋ฒ์ ์ฐ์ )
|
| 39 |
AVAILABLE_GEMINI_MODELS = [
|
| 40 |
'gemini-2.0-flash-exp',
|
| 41 |
+
'gemini-1.5-pro-002',
|
| 42 |
'gemini-1.5-flash',
|
| 43 |
'gemini-1.5-pro-latest',
|
| 44 |
'gemini-1.5-flash-latest',
|
|
|
|
| 382 |
|
| 383 |
# ๋ชจ๋ธ ๋ชฉ๋ก ์กฐํ ์๋ (v1beta)
|
| 384 |
available_models_str = "ํ์ธ ๋ถ๊ฐ"
|
| 385 |
+
available_models_list = []
|
| 386 |
try:
|
| 387 |
list_models_url = f"{rest_base_url}/models"
|
| 388 |
list_response = requests.get(
|
|
|
|
| 393 |
)
|
| 394 |
if list_response.status_code == 200:
|
| 395 |
models_data = list_response.json()
|
| 396 |
+
available_models_list = []
|
| 397 |
for m in models_data.get('models', []):
|
| 398 |
model_name_full = m.get('name', '')
|
| 399 |
if '/' in model_name_full:
|
|
|
|
| 403 |
# generateContent๋ฅผ ์ง์ํ๋ ๋ชจ๋ธ๋ง ํํฐ๋ง
|
| 404 |
supported_methods = m.get('supportedGenerationMethods', [])
|
| 405 |
if 'generateContent' in supported_methods:
|
| 406 |
+
available_models_list.append(model_name_short)
|
| 407 |
+
available_models_str = ', '.join(available_models_list[:10]) if available_models_list else '์์'
|
| 408 |
+
print(f"[Gemini] ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ธ ๋ชฉ๋ก (v1beta): {available_models_list[:10]}")
|
| 409 |
except Exception as list_error:
|
| 410 |
print(f"[Gemini] ๋ชจ๋ธ ๋ชฉ๋ก ์กฐํ ์คํจ: {list_error}")
|
| 411 |
|
| 412 |
+
# ๋์ฒด ๋ชจ๋ธ ์ฐพ๊ธฐ ๋ฐ ์ฌ์๋
|
| 413 |
+
fallback_model = None
|
| 414 |
+
# 1. ๋์ผ ๊ณ์ด ์ต์ ๋ชจ๋ธ ์ฐพ๊ธฐ
|
| 415 |
+
if 'gemini-1.5-pro' in model_name_clean:
|
| 416 |
+
for m in available_models_list:
|
| 417 |
+
if 'gemini-1.5-pro' in m and m != model_name_clean:
|
| 418 |
+
fallback_model = m
|
| 419 |
+
break
|
| 420 |
+
# 2. Flash ๋ชจ๋ธ๋ก ๋์ฒด
|
| 421 |
+
if not fallback_model and 'gemini-1.5-flash' in available_models_list:
|
| 422 |
+
fallback_model = 'gemini-1.5-flash'
|
| 423 |
+
# 3. ์๋ฌด ๋ชจ๋ธ์ด๋ ์ ํ
|
| 424 |
+
if not fallback_model and available_models_list:
|
| 425 |
+
fallback_model = available_models_list[0]
|
| 426 |
+
|
| 427 |
+
if fallback_model:
|
| 428 |
+
print(f"[Gemini] ๋ชจ๋ธ {model_name_clean}์(๋ฅผ) ์ฐพ์ ์ ์์ด {fallback_model}๋ก ๋์ฒดํ์ฌ ์ฌ์๋ํฉ๋๋ค.")
|
| 429 |
+
url_fallback = f"{rest_base_url}/models/{fallback_model}:generateContent"
|
| 430 |
+
rest_response = requests.post(
|
| 431 |
+
url_fallback,
|
| 432 |
+
headers=headers,
|
| 433 |
+
json=request_body,
|
| 434 |
+
params=api_params,
|
| 435 |
+
timeout=timeout_seconds
|
| 436 |
+
)
|
| 437 |
+
# Fallback ์ฑ๊ณต ์ฌ๋ถ ํ์ธ
|
| 438 |
+
if rest_response.status_code == 200:
|
| 439 |
+
# ์ฑ๊ณต์ ์ผ๋ก ์๋ต ๋ฐ์ -> ๋ฃจํ ํ์ถ์ ์ํด response_has_error=False ์ ์ง
|
| 440 |
+
print(f"[Gemini] ๋์ฒด ๋ชจ๋ธ({fallback_model})๋ก ์ฌ์๋ ์ฑ๊ณต")
|
| 441 |
+
# ๋ชจ๋ธ๋ช
์ ๋์ฒด๋ ๊ฒ์ผ๋ก ์
๋ฐ์ดํธ (ํ ํฐ ์ ์ฅ ๋ฑ์ ์ํด)
|
| 442 |
+
model_name = fallback_model
|
| 443 |
+
else:
|
| 444 |
+
# Fallback๋ ์คํจํ๋ฉด ์๋ฌ ๋ฐ์
|
| 445 |
+
error_text_v1 = json.dumps(error_info_v1)
|
| 446 |
+
raise Exception(f"REST API ์ค๋ฅ {error_code_v1}: {error_text_v1}\n์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ธ: {available_models_str}\n๋์ฒด ์๋ ์คํจ: {fallback_model}")
|
| 447 |
+
else:
|
| 448 |
+
error_text_v1 = json.dumps(error_info_v1)
|
| 449 |
+
raise Exception(f"REST API ์ค๋ฅ {error_code_v1}: {error_text_v1}\n์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ธ: {available_models_str}")
|
| 450 |
else:
|
| 451 |
# v1์์ ์ฑ๊ณต
|
| 452 |
response_has_error = False
|
|
|
|
| 473 |
1. ๋ด์ผ๊น์ง ๋๊ธฐ (ํ ๋น๋์ด ์๋์ผ๋ก ์ฌ์ค์ ๋ฉ๋๋ค)
|
| 474 |
2. ๋ค๋ฅธ Gemini ๋ชจ๋ธ๋ก ๋ณ๊ฒฝ:
|
| 475 |
- gemini-2.0-flash-exp (๋ ๋์ ํ ๋น๋ ์ ๊ณต)
|
| 476 |
+
- gemini-1.5-pro-002
|
| 477 |
- gemini-1.5-flash
|
| 478 |
3. Google AI Studio์์ ํ ๋น๋ ํ์ธ:
|
| 479 |
https://aistudio.google.com/app/apikey
|