---
task_id: task-2100
type: context
scope: task
created: 2026-04-22
updated: 2026-04-22
status: completed
---

# 맥락 노트: task-2100

**task**: task-2100

---

## 결정 근거

### 근본 원인: callGemini의 엔드포인트 불일치
- `callGemini`가 `stream: false`일 때도 `streamGenerateContent` 엔드포인트를 사용
- Gemini `streamGenerateContent`의 응답은 JSON 배열(`[{candidates:...}, ...]`)
- 비스트리밍 파싱 로직은 `data.candidates?.[0]`으로 단일 객체를 기대 → content가 빈 문자열
- suggest-topics Edge Function이 `result.content`를 받아 파싱 시도 → 빈 문자열이므로 "AI 응답 파싱 실패" throw

### 3 Step Why
1st: callGemini가 비스트리밍 호출에서도 streamGenerateContent 사용하여 응답 구조 불일치
2nd: Gemini API의 두 엔드포인트는 응답 구조가 근본적으로 다름 → stream 옵션 분기가 API 사양에 정확
3rd: streamGenerateContent 응답 합치기는 불필요한 오버헤드 → 올바른 엔드포인트 사용이 깔끔함

### Codex 리뷰 지적사항 대응
- critical: 엔드포인트 분기 수정 (이번 작업에서 해결)
- high: JWT/플랜 검증 서버측 강제 (범위 외 — 별도 보안 태스크로 분리 권장)
- medium: 프롬프트에서 "suggest_topics 함수 사용" 제거 (이번 작업에서 해결)
- medium: 빈 결과 UI 처리 (이번 작업에서 해결)

## 참조 자료

- Gemini API: `generateContent` vs `streamGenerateContent` 엔드포인트
- Edge Function 코드: `/home/jay/projects/InsuRo/supabase/functions/suggest-topics/index.ts`
- 공유 AI 모듈: `/home/jay/projects/InsuRo/supabase/functions/_shared/ai-provider.ts`
- 프론트: `/home/jay/projects/InsuRo/src/pages/Generate.tsx`

## 주의사항

- Edge Function은 Deno 런타임 (Supabase Edge Functions)
- GOOGLE_AI_API_KEY 환경변수가 Supabase 프로젝트에 설정되어 있어야 함
- 이 수정은 suggest-topics뿐 아니라 callGemini를 stream:false로 호출하는 모든 Edge Function에 영향
