# InsuRo 소식지/보험료 파일 분석을 claude CLI 기반으로 개선

## 작업 레벨: Lv.2

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

## 프로젝트
- InsuRo: `/home/jay/projects/InsuRo`
- 서버: `/home/jay/projects/InsuRo/server`

## 문제
1. PDF 텍스트 추출 실패 — 이미지 기반(스캔) PDF는 pdfplumber로 추출 불가 → "(텍스트를 추출하지 못했습니다)"
2. 보험사명 자동 감지 실패 — 단순 키워드 매칭으로는 감지 안 되는 경우 많음 → "분석중..."으로 남음
3. 제목 자동 생성 부정확

## 해결: claude CLI 기반 스마트 분석
기존 pdfplumber/python-pptx 단순 추출 → claude CLI(Max200)로 파일 직접 분석

### 구현

`server/main.py`의 `/api/insuro/upload-to-drive` 엔드포인트에서 텍스트 추출 부분을 교체:

```python
import subprocess, json, tempfile

def smart_parse_file(file_bytes: bytes, filename: str, file_type: str) -> dict:
    """claude CLI로 파일을 스마트 분석"""
    
    # 1. 임시 파일 저장
    suffix = '.pdf' if filename.lower().endswith('.pdf') else '.pptx'
    with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as f:
        f.write(file_bytes)
        tmp_path = f.name
    
    try:
        # 2. claude CLI로 분석
        prompt = f"""파일 경로: {tmp_path}
이 파일을 읽고 아래 JSON 형식으로 응답해주세요:

{{
  "company_name": "보험사명 (한화생명, DB손보, 삼성화재 등. 감지 안 되면 빈 문자열)",
  "title": "문서 제목 또는 핵심 내용 요약 (20자 이내)",
  "extracted_text": "문서의 전체 텍스트 내용 (표/숫자/보장내용 포함, 최대한 상세하게)"
}}

★ JSON만 출력하세요. 설명 없이."""

        result = subprocess.run(
            ["claude", "-p", prompt, "--model", "haiku", 
             "--output-format", "text", "--allowedTools", "Read"],
            capture_output=True, text=True, timeout=120
        )
        
        # 3. JSON 파싱
        output = result.stdout.strip()
        # JSON 블록 추출 (```json ... ``` 형태일 수 있음)
        if "```json" in output:
            output = output.split("```json")[1].split("```")[0].strip()
        elif "```" in output:
            output = output.split("```")[1].split("```")[0].strip()
        
        parsed = json.loads(output)
        return {
            "company_name": parsed.get("company_name", ""),
            "title": parsed.get("title", filename),
            "extracted_text": parsed.get("extracted_text", ""),
        }
    except Exception as e:
        # 4. fallback: 기존 pdfplumber/python-pptx 방식
        return fallback_parse(file_bytes, filename)
    finally:
        os.unlink(tmp_path)
```

### 기존 코드와의 관계
- 기존 `_detect_company()`, `_extract_title()`, pdfplumber/python-pptx 추출 → **fallback으로 유지**
- claude CLI 실패 시 기존 방식으로 자동 전환
- claude CLI 성공 시 보험사명/제목/텍스트 모두 한 번에 추출

### 장점
- 이미지 기반 PDF도 처리 가능 (Claude vision)
- 보험사명/제목 감지 정확도 대폭 향상
- PPTX 표/차트 내용도 이해 기반 추출
- Max200 플랜 내 처리 (API 키 불필요)

## affected_files
- `server/main.py` (수정 — upload-to-drive 내 텍스트 추출 로직 교체)

## 검증 시나리오
1. 소식지 PDF 업로드 → claude CLI로 텍스트 추출 + 보험사명 자동 감지 → DB 반영
2. 보험료 PPTX 업로드 → 표/숫자 포함 텍스트 추출 + 보험사명/제목 감지
3. 이미지 기반 PDF → claude vision으로 텍스트 추출 (pdfplumber 실패 시)
4. claude CLI 실패 시 → fallback으로 기존 방식 동작
5. 서버 재시작 후 정상 동작