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

Auto-deploy from GitHub Actions - 2025-12-12 06:47:16

Browse files
Files changed (1) hide show
  1. app/gemini_client.py +84 -75
app/gemini_client.py CHANGED
@@ -371,89 +371,98 @@ class GeminiClient:
371
 
372
  print(f"[Gemini] v1 REST API ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ: {rest_response.status_code}")
373
 
374
- # v1 ์‘๋‹ต๋„ ํ™•์ธ
 
375
  if rest_response.status_code == 200:
376
  response_data_check_v1 = rest_response.json()
377
- if 'error' in response_data_check_v1:
378
- # v1์—์„œ๋„ ์—๋Ÿฌ ๋ฐœ์ƒ
379
- error_info_v1 = response_data_check_v1['error']
 
 
 
 
 
 
 
 
 
380
  error_code_v1 = error_info_v1.get('code', 404)
381
- error_message_v1 = error_info_v1.get('message', '์•Œ ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜')
 
 
 
 
 
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(
389
- list_models_url,
390
- headers={"x-goog-api-key": api_key_clean},
391
- params={"key": api_key_clean},
392
- timeout=10
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:
400
- model_name_short = model_name_full.split('/')[-1]
401
- else:
402
- model_name_short = 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
453
- print(f"[Gemini] v1์—์„œ ์ •์ƒ ์‘๋‹ต ๋ฐ›์Œ")
454
- elif rest_response.status_code != 200:
455
- error_text_v1 = rest_response.text[:1000] if rest_response.text else '์ƒ์„ธ ์ •๋ณด ์—†์Œ'
456
- raise Exception(f"REST API ์˜ค๋ฅ˜ {rest_response.status_code}: {error_text_v1}")
457
  elif error_code == 429:
458
  # 429 ์˜ค๋ฅ˜: ํ• ๋‹น๋Ÿ‰ ์ดˆ๊ณผ (์žฌ์‹œ๋„ ๋ถˆ๊ฐ€๋Šฅ)
459
  print(f"[Gemini] โŒ ํ• ๋‹น๋Ÿ‰ ์ดˆ๊ณผ ์˜ค๋ฅ˜ (429) ๊ฐ์ง€")
 
371
 
372
  print(f"[Gemini] v1 REST API ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ: {rest_response.status_code}")
373
 
374
+ # v1 ์‘๋‹ต๋„ ํ™•์ธ (์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ ๋ชจ๋‘ ์ฒ˜๋ฆฌ)
375
+ v1_success = False
376
  if rest_response.status_code == 200:
377
  response_data_check_v1 = rest_response.json()
378
+ if 'error' not in response_data_check_v1:
379
+ # v1์—์„œ ์„ฑ๊ณต
380
+ v1_success = True
381
+ response_has_error = False
382
+ print(f"[Gemini] v1์—์„œ ์ •์ƒ ์‘๋‹ต ๋ฐ›์Œ")
383
+
384
+ if not v1_success:
385
+ # v1์—์„œ๋„ ์‹คํŒจ (์—๋Ÿฌ ๋˜๋Š” 404 ๋“ฑ)
386
+ if rest_response.status_code == 200:
387
+ # 200 OK์ง€๋งŒ ์—๋Ÿฌ ํ•„๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
388
+ response_data_check_v1 = rest_response.json()
389
+ error_info_v1 = response_data_check_v1.get('error', {})
390
  error_code_v1 = error_info_v1.get('code', 404)
391
+ else:
392
+ # HTTP ์—๋Ÿฌ (404 ๋“ฑ)
393
+ error_code_v1 = rest_response.status_code
394
+ error_info_v1 = {'message': rest_response.text[:200]}
395
+
396
+ print(f"[Gemini] v1์—์„œ๋„ ์‹คํŒจ (์ฝ”๋“œ: {error_code_v1}), ๋Œ€์ฒด ๋ชจ๋ธ ๊ฒ€์ƒ‰ ์‹œ์ž‘...")
397
 
398
+ # ๋ชจ๋ธ ๋ชฉ๋ก ์กฐํšŒ ์‹œ๋„ (v1beta)
399
+ available_models_str = "ํ™•์ธ ๋ถˆ๊ฐ€"
400
+ available_models_list = []
401
+ try:
402
+ list_models_url = f"{rest_base_url}/models"
403
+ list_response = requests.get(
404
+ list_models_url,
405
+ headers={"x-goog-api-key": api_key_clean},
406
+ params={"key": api_key_clean},
407
+ timeout=10
408
+ )
409
+ if list_response.status_code == 200:
410
+ models_data = list_response.json()
411
+ available_models_list = []
412
+ for m in models_data.get('models', []):
413
+ model_name_full = m.get('name', '')
414
+ if '/' in model_name_full:
415
+ model_name_short = model_name_full.split('/')[-1]
416
+ else:
417
+ model_name_short = model_name_full
418
+ # generateContent๋ฅผ ์ง€์›ํ•˜๋Š” ๋ชจ๋ธ๋งŒ ํ•„ํ„ฐ๋ง
419
+ supported_methods = m.get('supportedGenerationMethods', [])
420
+ if 'generateContent' in supported_methods:
421
+ available_models_list.append(model_name_short)
422
+ available_models_str = ', '.join(available_models_list[:10]) if available_models_list else '์—†์Œ'
423
+ print(f"[Gemini] ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ ๋ชฉ๋ก (v1beta): {available_models_list[:10]}")
424
+ except Exception as list_error:
425
+ print(f"[Gemini] ๋ชจ๋ธ ๋ชฉ๋ก ์กฐํšŒ ์‹คํŒจ: {list_error}")
426
+
427
+ # ๋Œ€์ฒด ๋ชจ๋ธ ์ฐพ๊ธฐ ๋ฐ ์žฌ์‹œ๋„
428
+ fallback_model = None
429
+ # 1. ๋™์ผ ๊ณ„์—ด ์ตœ์‹  ๋ชจ๋ธ ์ฐพ๊ธฐ
430
+ if 'gemini-1.5-pro' in model_name_clean:
431
+ for m in available_models_list:
432
+ if 'gemini-1.5-pro' in m and m != model_name_clean:
433
+ fallback_model = m
434
+ break
435
+ # 2. Flash ๋ชจ๋ธ๋กœ ๋Œ€์ฒด
436
+ if not fallback_model and 'gemini-1.5-flash' in available_models_list:
437
+ fallback_model = 'gemini-1.5-flash'
438
+ # 3. ์•„๋ฌด ๋ชจ๋ธ์ด๋‚˜ ์„ ํƒ
439
+ if not fallback_model and available_models_list:
440
+ fallback_model = available_models_list[0]
441
 
442
+ if fallback_model:
443
+ print(f"[Gemini] ๋ชจ๋ธ {model_name_clean}์„(๋ฅผ) ์ฐพ์„ ์ˆ˜ ์—†์–ด {fallback_model}๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.")
444
+ url_fallback = f"{rest_base_url}/models/{fallback_model}:generateContent"
445
+ rest_response = requests.post(
446
+ url_fallback,
447
+ headers=headers,
448
+ json=request_body,
449
+ params=api_params,
450
+ timeout=timeout_seconds
451
+ )
452
+ # Fallback ์„ฑ๊ณต ์—ฌ๋ถ€ ํ™•์ธ
453
+ if rest_response.status_code == 200:
454
+ # ์„ฑ๊ณต์ ์œผ๋กœ ์‘๋‹ต ๋ฐ›์Œ -> ๋ฃจํ”„ ํƒˆ์ถœ์„ ์œ„ํ•ด response_has_error=False ์œ ์ง€
455
+ print(f"[Gemini] ๋Œ€์ฒด ๋ชจ๋ธ({fallback_model})๋กœ ์žฌ์‹œ๋„ ์„ฑ๊ณต")
456
+ # ๋ชจ๋ธ๋ช…์„ ๋Œ€์ฒด๋œ ๊ฒƒ์œผ๋กœ ์—…๋ฐ์ดํŠธ (ํ† ํฐ ์ €์žฅ ๋“ฑ์„ ์œ„ํ•ด)
457
+ model_name = fallback_model
458
+ response_has_error = False
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
459
  else:
460
+ # Fallback๋„ ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
461
  error_text_v1 = json.dumps(error_info_v1)
462
+ raise Exception(f"REST API ์˜ค๋ฅ˜ {error_code_v1}: {error_text_v1}\n์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ: {available_models_str}\n๋Œ€์ฒด ์‹œ๋„ ์‹คํŒจ: {fallback_model}")
463
  else:
464
+ error_text_v1 = json.dumps(error_info_v1)
465
+ raise Exception(f"REST API ์˜ค๋ฅ˜ {error_code_v1}: {error_text_v1}\n์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋ธ: {available_models_str}")
 
 
 
 
466
  elif error_code == 429:
467
  # 429 ์˜ค๋ฅ˜: ํ• ๋‹น๋Ÿ‰ ์ดˆ๊ณผ (์žฌ์‹œ๋„ ๋ถˆ๊ฐ€๋Šฅ)
468
  print(f"[Gemini] โŒ ํ• ๋‹น๋Ÿ‰ ์ดˆ๊ณผ ์˜ค๋ฅ˜ (429) ๊ฐ์ง€")