# InsuRo AI 콘텐츠 생성을 서버 사이드로 전환

## 작업 레벨: Lv.2

## 프로젝트 시스템 3문서
- DevSystem: `/home/jay/workspace/memory/plans/anu-guide-system/plan.md`

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`
- 서버: `/home/jay/projects/InsuRo/server` (FastAPI, port 8001)

## 배경
블로그 콘텐츠 생성(AI 콘텐츠 작성) 기능이 Supabase Edge Function(`generate-content`)에서 외부 AI API(Gemini/Claude)를 호출하는 구조. `GOOGLE_AI_API_KEY`와 `ANTHROPIC_API_KEY`가 Edge Function Secrets에 미설정 → "AI API key is not configured" 에러.

**제이회장님 지시**: 외부 API 대신 아누 서버(InsuRo 서버)에서 anthropic SDK로 직접 처리 (Max200 플랜 활용).

## 현재 구조 (Edge Function — 743줄)
```
프론트(Generate.tsx) → generate-content Edge Function
  → 플랜별 모델 티어 결정 (haiku/sonnet/opus)
  → 티어별 모델 선택 (gemini-flash/gemini-pro/claude-sonnet)
  → 외부 AI API 호출 (GOOGLE_AI_API_KEY 또는 ANTHROPIC_API_KEY)
  → 토큰 차감 + 사용 기록
  → SSE 스트리밍 응답
```

## 변경 후 구조 (서버 사이드)
```
프론트(Generate.tsx) → InsuRo 서버 /api/insuro/generate-content
  → JWT 인증 + 플랜 확인
  → 플랜별 모델 티어 결정
  → anthropic SDK로 Claude 호출 (서버 환경변수 ANTHROPIC_API_KEY)
  → 토큰 차감 + 사용 기록  
  → SSE 스트리밍 응답
```

## ★ 핵심 로직 (Edge Function에서 이전해야 할 것)

### 1. 플랜별 모델 티어
```python
PLAN_MODEL_TIER = {
    0: "haiku",    # 무료 → Claude Haiku
    1: "haiku",    # 베이직 → Claude Haiku
    2: "sonnet",   # 프로 → Claude Sonnet
    3: "opus",     # 맥스 → Claude Opus
    4: "opus",     # 히든 → Claude Opus
}
```

### 2. AI 모델 선택 기능 연동
- 어드민 > AI 엔진 설정 (`/admin/ai-config`)에서 모델 선택 가능
- DB `plan_ai_models` 테이블에서 플랜별 기본 모델 조회
- 사용자가 Generate 페이지에서 모델 선택 시 프론트에서 `settings.model` 전달
- **서버에서 처리**: 사용자의 플랜 티어에 맞는 모델만 허용, 초과 시 403 에러

### 3. 모델 매핑 (Gemini → Claude로 전환)
기존 Gemini 모델을 Claude로 대체:
```python
MODEL_MAP = {
    "gemini-2.5-flash": "claude-haiku-4-5-20251001",      # 기본 (무료/베이직)
    "gemini-2.5-pro": "claude-sonnet-4-5-20250514",       # 프로
    "claude-sonnet": "claude-sonnet-4-5-20250514",         # 맥스/히든
}
```

### 4. 토큰 차감
- `checkTokenBalance()` 로직 이전
- `recordTokenUsage()` 로직 이전
- Supabase service_role key로 DB 직접 접근

### 5. 채널별 프롬프트
- 네이버 블로그, 티스토리, 인스타그램, Threads, 유튜브 채널별 시스템 프롬프트
- `channelPrompt` 파라미터로 프론트에서 전달됨

### 6. 금소법 규정 + 개인화 설정
- `gaRegulations`, `personalRegulations` — 금소법 필터
- `settings.insuranceCategory`, `settings.lifeStage` 등 타겟팅 설정
- `settings.cpaLink` — CPA 링크 삽입
- `settings.extraPrompt` — 추가 지시사항

### 7. SSE 스트리밍 형식
기존 Edge Function과 동일한 SSE 형식 유지:
```
data: {"choices":[{"delta":{"content":"텍스트..."}}]}
```

## 참고: 기존 Edge Function 코드
- 경로: `supabase/functions/generate-content/index.ts` (743줄)
- 이 파일의 핵심 로직을 서버로 이전하되, Gemini 호출 → anthropic SDK로 변환
- 플랜 계층, 채널 허용, 토큰 체크 로직은 그대로 유지

## affected_files
- `server/main.py` (수정 — /api/insuro/generate-content 엔드포인트 추가)
- `src/pages/Generate.tsx` (수정 — SUPABASE_FUNCTION_BASE → INSURO_API_BASE)

## 환경변수
- `ANTHROPIC_API_KEY` — InsuRo 서버 .env에 설정 필요 (확인: `grep ANTHROPIC /home/jay/projects/InsuRo/.env`)

## 검증 시나리오
1. AI 콘텐츠 작성 → "30대 직장인 암보험 비교" 주제 → 네이버 블로그 채널 → 콘텐츠 스트리밍 생성 성공
2. 토큰 차감 확인 (히든 플랜은 무제한이지만 사용 기록은 남아야 함)
3. 채널 변경 (티스토리, 인스타그램) → 채널별 프롬프트 적용 확인
4. "AI API key is not configured" 에러 해소
5. npm run build 성공
6. 서버 재시작 후 엔드포인트 정상 응답

## goal_assertions (auto-generated)
- `grep ANTHROPIC /home/jay/projects/InsuRo/.env`
