GitHub Actions commited on
Commit
9867d88
ยท
1 Parent(s): 47d6db0

Auto-deploy from GitHub Actions - 2025-12-12 06:41:59

Browse files
Files changed (1) hide show
  1. 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
- available_models = []
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
- available_models.append(model_name_short)
406
- available_models_str = ', '.join(available_models[:10]) if available_models else '์—†์Œ'
407
- print(f"[Gemini] ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ ๋ชฉ๋ก (v1beta): {available_models[:10]}")
408
  except Exception as list_error:
409
  print(f"[Gemini] ๋ชจ๋ธ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ: {list_error}")
410
 
411
- error_text_v1 = json.dumps(error_info_v1)
412
- raise Exception(f"REST API ์˜ค๋ฅ˜ {error_code_v1}: {error_text_v1}\n์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ: {available_models_str}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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