# Task-507.3: ai_parser.py — Anthropic SDK → Claude Code CLI 전환 + 환경변수 정비 + 서버 실행

## 목표
1. ai_parser.py에서 `anthropic` SDK 대신 `claude` CLI(subprocess) 사용으로 전환 → API 키 불필요
2. gdrive.py 환경변수명을 .env.keys의 기존 변수명과 일치시키기
3. Supabase DB upsert 로직 추가
4. 서버 실행 스크립트 작성

## 1. ai_parser.py 수정 — Claude CLI 사용

### 변경 전 (현재)
```python
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=4096,
    messages=[{"role": "user", "content": prompt}],
)
raw_response = response.content[0].text
```

### 변경 후
```python
import subprocess

result = subprocess.run(
    ['claude', '-p', prompt, '--model', 'sonnet'],
    capture_output=True, text=True, timeout=120,
    env={**os.environ}  # 현재 환경변수 그대로 전달
)
if result.returncode != 0:
    raise RuntimeError(f"Claude CLI 실행 실패: {result.stderr}")
raw_response = result.stdout
```

### 주의사항
- `anthropic` import 제거, requirements.txt에서도 제거
- `subprocess` import 추가
- `extract_text_from_pdf()`, `parse_ai_response()`는 변경 없음
- `analyze_fcpa_pdf()` 함수 시그니처 유지 (pdf_text → dict)
- 테스트도 mock 대상 변경: `anthropic.Anthropic` → `subprocess.run`
- timeout 120초 (금소법 PDF 분석은 길 수 있음)

## 2. gdrive.py 환경변수 매핑

현재 .env.keys에 있는 변수:
- `INSURO_GOOGLE_CLIENT_ID` → gdrive.py의 `GOOGLE_CLIENT_ID`
- `INSURO_GOOGLE_CLIENT_SECRET` → gdrive.py의 `GOOGLE_CLIENT_SECRET`

gdrive.py에서 환경변수 읽을 때 `INSURO_GOOGLE_CLIENT_ID`를 먼저 체크하고 fallback으로 `GOOGLE_CLIENT_ID` 체크:
```python
client_id = os.environ.get("INSURO_GOOGLE_CLIENT_ID") or os.environ.get("GOOGLE_CLIENT_ID")
client_secret = os.environ.get("INSURO_GOOGLE_CLIENT_SECRET") or os.environ.get("GOOGLE_CLIENT_SECRET")
```

**GOOGLE_REFRESH_TOKEN**은 아직 발급 안 됨. 다음 내용을 참고하여 `scripts/get_refresh_token.py` 헬퍼 스크립트 생성:
```python
"""
Google OAuth2 Refresh Token 발급 헬퍼

사용법:
1. python3 scripts/get_refresh_token.py
2. 브라우저에서 URL 열고 권한 부여
3. 리다이렉트된 URL의 code 파라미터를 입력
4. Refresh Token 출력 → .env.keys에 INSURO_GOOGLE_REFRESH_TOKEN= 으로 추가

필요 환경변수: INSURO_GOOGLE_CLIENT_ID, INSURO_GOOGLE_CLIENT_SECRET
"""
# scope: https://www.googleapis.com/auth/drive.file
```

## 3. Supabase DB upsert 추가

main.py의 `/api/insuro/fcpa/upload` 엔드포인트에서, AI 분석 결과를 Supabase `fcpa_config`에 자동 저장.

환경변수:
- `INSURO_SUPABASE_URL` = 이미 .env.keys에 있음
- `INSURO_SUPABASE_ANON_KEY` = InsuRo의 .env 파일에서 확인 가능

```python
from supabase import create_client

supabase_url = os.environ["INSURO_SUPABASE_URL"]
supabase_key = os.environ.get("INSURO_SUPABASE_SERVICE_KEY") or os.environ.get("INSURO_SUPABASE_ANON_KEY")
sb = create_client(supabase_url, supabase_key)

# upsert: 기존 row 있으면 update, 없으면 insert
existing = sb.table("fcpa_config").select("id").limit(1).execute()
payload = {
    "summary": result["summary"],
    "checklist": result["checklist"],
    "pdf_url": drive_url,
    "updated_at": datetime.utcnow().isoformat(),
}
if existing.data:
    sb.table("fcpa_config").update(payload).eq("id", existing.data[0]["id"]).execute()
else:
    sb.table("fcpa_config").insert(payload).execute()
```

Note: RLS 정책상 service_role_key가 필요할 수 있음. anon_key로 안 되면 service_role_key 필요하다고 보고서에 기록.

InsuRo Supabase anon key (공개 값, 코드에 이미 있음):
`eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InpheWhmanV3dmlwb3Jiem9rdWRyIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzMwNDY1MTksImV4cCI6MjA4ODYyMjUxOX0.aRQpYgl5ZeHxh4PTnVm_1Hwky2h83-Cb_8RGlv-xP9s`
InsuRo Supabase URL: `https://zayhfjuwviporbzokudr.supabase.co`

## 4. 서버 실행 스크립트

`/home/jay/projects/InsuRo/server/run.sh` 작성:
```bash
#!/bin/bash
# InsuRo AI Proxy Server
source /home/jay/workspace/.env.keys
cd /home/jay/projects/InsuRo/server
exec uvicorn main:app --host 0.0.0.0 --port 8001
```

## 5. requirements.txt 업데이트

제거:
- `anthropic` (더 이상 사용 안 함)

추가:
- `supabase` (DB upsert용)

## 테스트
- 기존 37개 테스트 중 anthropic mock 부분만 subprocess mock으로 교체
- Supabase upsert 테스트 추가 (mock)
- 전체 테스트 PASS 유지

## 산출물
- `/home/jay/projects/InsuRo/server/ai_parser.py` (수정)
- `/home/jay/projects/InsuRo/server/main.py` (수정 - Supabase upsert)
- `/home/jay/projects/InsuRo/server/gdrive.py` (수정 - 환경변수명)
- `/home/jay/projects/InsuRo/server/requirements.txt` (수정)
- `/home/jay/projects/InsuRo/server/run.sh` (신규)
- `/home/jay/projects/InsuRo/server/scripts/get_refresh_token.py` (신규)
- `/home/jay/projects/InsuRo/server/tests/` (수정)