From daf1a70b8b68fbfc07f04daf070613f0c7d02e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=9E=AC=EC=A4=91?= <126754298+m-a-king@users.noreply.github.com> Date: Sat, 15 Aug 2026 18:21:55 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=96=B4=EB=8A=90=20Gemini=20=ED=8B=B0?= =?UTF-8?q?=EC=96=B4=EA=B0=80=20=EC=9D=91=EB=8B=B5=ED=96=88=EB=8A=94?= =?UTF-8?q?=EC=A7=80=20=EC=84=B1=EA=B3=B5=20=EA=B2=BD=EB=A1=9C=EC=97=90?= =?UTF-8?q?=EB=8F=84=20=EB=82=A8=EA=B8=B4=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 앞선 무료 티어 폴백(#34)은 에스컬레이션(실패)에만 로그를 남겼다. 그 결과 "무료가 성공해서 유료를 안 불렀다" 와 "무료가 아예 안 쓰이고 유료가 성공했다" 가 로그상 완전히 같아, 기능이 실제로 도는지 우리 쪽에서 확인할 방법이 없었다 - 배포 후 검증을 시도하다 이 사각을 발견했다. 키가 컨테이너 env 에 실린 것은 배포 로그의 SSM env 줄 수(7 -> 8)로 확인했지만, 그 다음 질문인 "그래서 무료가 서빙 중인가" 에 답할 신호가 없었다 - 메트릭이 아니라 info 로그를 고른 이유는 두 가지다. Grafana Cloud metrics 무료 한도가 이미 도달 상태라 새 시계열을 늘리지 않기로 한 앞선 결정을 유지하고, 호출량이 월 1,000건 미만이라 로그 볼륨이 하루 30줄 수준으로 무시할 만하다 - 프로브 경로(generateContentExactly)에는 넣지 않았다. 프로브는 항상 유료 고정이라 티어 비율에 노이즈만 더한다 --- .../piki/extractor/extraction/gemini/GeminiHttpClient.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/depromeet/piki/extractor/extraction/gemini/GeminiHttpClient.java b/src/main/java/com/depromeet/piki/extractor/extraction/gemini/GeminiHttpClient.java index 8a3cf96..608d6c6 100644 --- a/src/main/java/com/depromeet/piki/extractor/extraction/gemini/GeminiHttpClient.java +++ b/src/main/java/com/depromeet/piki/extractor/extraction/gemini/GeminiHttpClient.java @@ -145,7 +145,11 @@ public Res generateContent(Req request, Class resultType, String Tier tier = tiers.get(i); boolean hasNext = i < tiers.size() - 1; try { - return withModelCandidates(request, resultType, requestedModel, tier); + Res result = withModelCandidates(request, resultType, requestedModel, tier); + // 어느 티어가 응답했는지를 성공 경로에서도 남긴다. 실패(에스컬레이션)만 찍으면 "무료가 성공했다" 와 + // "무료가 아예 안 쓰였다" 가 로그상 똑같아, 무료 티어 도입 여부를 우리 쪽에서 확인할 수 없다. + log.info("Gemini 호출 성공 - tier={}", tier.label()); + return result; } catch (GeminiApiException e) { if (!hasNext || !escalates(e)) { throw e;