# Task-507.1: InsuRo AI 서버 프록시 API + Google Drive + FCPA PDF 파싱

## 목표
InsuRo의 AI 기능을 우리 서버(100.76.130.39)에서 처리하는 프록시 API 구축.
첫 타겟: FCPA(금소법) PDF 업로드 → Google Drive 저장 → Claude Sonnet 분석 → Supabase DB 저장.

## 배경
- InsuRo는 Supabase Edge Function에서 AI 호출하는 구조였으나, API 키 미설정 상태
- Lovable 자체 AI gateway 의존에서 벗어나 우리 서버로 전환
- 스토리지도 Supabase Storage → Google Drive(5TB)로 전환
- InsuWiki에서 이미 Google Drive 연동 패턴이 있음 (참고용)

## 구현 범위

### 1. 서버 프록시 API 엔드포인트 (FastAPI or Flask)

**위치**: `/home/jay/projects/InsuRo/server/` (새 디렉토리)

**엔드포인트 1: PDF 업로드 + AI 분석**
```
POST /api/insuro/fcpa/upload
Content-Type: multipart/form-data
Authorization: Bearer <supabase_jwt>

Request: { file: PDF }
Response: {
  "status": "ok",
  "pdf_url": "https://drive.google.com/...",
  "summary": "...",
  "checklist": [{"id":"...","category":"...","text":"...","required":true}, ...]
}
```

**엔드포인트 2: AI 콘텐츠 생성 프록시** (향후 확장용, 이번엔 스텁만)
```
POST /api/insuro/ai/generate
Authorization: Bearer <supabase_jwt>
Body: { topic, contentType, settings, ... }
Response: { content: "..." }
```

### 2. Google Drive 연동

**InsuWiki 참고 파일**: `/home/jay/projects/insuwiki/nextapp/src/lib/googleDrive.ts`

**인증 방식**: OAuth2 (refresh token) — InsuWiki와 동일 패턴
- 환경변수: `DRIVE_CLIENT_ID`, `DRIVE_CLIENT_SECRET`, `DRIVE_REFRESH_TOKEN`
- `.env.keys`에서 로드 (InsuWiki 것과 동일 credentials 재사용 가능)

**폴더 구조**:
```
Google Drive Root/
  InsuRo/
    fcpa/
      fcpa-{timestamp}.pdf
    uploads/
      ... (향후 다른 파일용)
```

**구현 사항**:
- PDF 업로드 → Google Drive InsuRo/fcpa/ 폴더에 저장
- 공유 링크 생성 (anyoneWithLink 읽기)
- 링크 URL 반환

### 3. Claude Sonnet PDF 분석

**API**: Anthropic API (환경변수 `ANTHROPIC_API_KEY` from `.env.keys`)
**모델**: `claude-sonnet-4-6`

**프로세스**:
1. PDF 파일 바이너리 수신
2. PDF 텍스트 추출 (PyPDF2 또는 pdfplumber)
3. Claude Sonnet에 프롬프트 전송:

```
당신은 금융소비자보호법(금소법) 전문가입니다.
첨부된 PDF 내용에서 보험 SNS/블로그 콘텐츠 작성 시 반드시 알아야 할 핵심사항을 추출하세요.

다음 JSON 형식으로 응답하세요:
{
  "summary": "마크다운 형식의 금소법 핵심 요약 (## 제목, ### 소제목, - 항목 형식)",
  "checklist": [
    {
      "id": "고유ID",
      "category": "필수 포함" | "금지 표현" | "주의 사항",
      "text": "체크리스트 항목 내용",
      "required": true/false
    }
  ]
}

카테고리 분류 기준:
- "필수 포함": 콘텐츠에 반드시 포함해야 할 안내문구, 고지사항
- "금지 표현": 절대 사용하면 안 되는 표현 (확정적 판단, 과장, 허위 등)
- "주의 사항": 상황에 따라 주의가 필요한 표현이나 규정
```

4. 응답 파싱 → JSON 추출
5. Supabase DB `fcpa_config` 테이블에 upsert

### 4. Supabase DB 연동

**환경변수**:
- `INSURO_SUPABASE_URL` (from .env.keys)
- `SUPABASE_SERVICE_ROLE_KEY` (Supabase 대시보드에서 확인 필요 — 없으면 anon key + JWT 검증)

**로직**:
```python
# fcpa_config 테이블에 upsert
payload = {
    "summary": extracted_summary,
    "checklist": extracted_checklist,
    "pdf_url": gdrive_public_url,
    "updated_at": datetime.utcnow().isoformat()
}
# 기존 row 있으면 update, 없으면 insert
```

### 5. 인증 (CORS + JWT 검증)

- InsuRo 프론트엔드(aidevserver.tail2cdab6.ts.net:8443)에서 호출
- CORS 허용: `aidevserver.tail2cdab6.ts.net`, `localhost:5173`, `localhost:3004`
- Authorization 헤더의 Supabase JWT를 검증하여 인증된 사용자만 접근

## 기술 스택
- **Python 3** + **FastAPI** (경량, 비동기)
- **google-api-python-client** (Google Drive)
- **anthropic** (Claude API)
- **pdfplumber** (PDF 텍스트 추출)
- **supabase-py** (Supabase 클라이언트)

## 서버 실행
- 포트: 8001 (대시보드 8000과 분리)
- systemd 또는 nohup으로 상시 실행
- Tailscale Funnel 연동은 Phase 2에서 처리

## 테스트 계획
1. PDF 업로드 → Google Drive 저장 확인
2. Claude Sonnet 응답 파싱 확인
3. Supabase fcpa_config 데이터 upsert 확인
4. 인증 없이 호출 시 401 반환 확인

## 산출물
- `/home/jay/projects/InsuRo/server/main.py` — FastAPI 서버
- `/home/jay/projects/InsuRo/server/gdrive.py` — Google Drive 연동
- `/home/jay/projects/InsuRo/server/ai_parser.py` — Claude Sonnet PDF 파싱
- `/home/jay/projects/InsuRo/server/requirements.txt`
- `/home/jay/projects/InsuRo/server/.env.example`

## 참고
- InsuWiki GDrive 코드: `/home/jay/projects/insuwiki/nextapp/src/lib/googleDrive.ts`
- InsuWiki GDrive 설정 가이드: `/home/jay/projects/insuwiki/docs/guides/google-drive-integration-setup.md`
- InsuRo Supabase 프로젝트: `zayhfjuwviporbzokudr`
- 환경변수: `/home/jay/workspace/.env.keys`에서 DRIVE_*, ANTHROPIC_API_KEY 로드
