# InsuWiki 백엔드: txt 업로드 + LLM 정제 + Firestore Sync API

## 작업 개요
대시보드에서 카카오톡 txt 파일을 업로드하면 파싱→LLM 정제→위키 항목 생성하고,
승인된 항목만 InsuWiki Firestore에 sync하는 백엔드 API를 구현한다.

## 산출물 위치
`/home/jay/workspace/dashboard/server.py`에 엔드포인트 추가

## 참조 파일
- 카톡 파서: `/home/jay/projects/insuwiki/scripts/kakao_knowledge/kakao_parser.py`
- 지식 추출기: `/home/jay/projects/insuwiki/scripts/kakao_knowledge/knowledge_extractor.py`
- 현재 wiki API: server.py 내 `/api/wiki/*` 엔드포인트들
- wiki_entries.json: `/home/jay/projects/insuwiki/scripts/kakao_knowledge/wiki_entries.json`
- InsuWiki Firestore 설정: `/home/jay/projects/insuwiki/firebase.json`

## 구현 요구사항

### 1. POST /api/wiki/upload — txt 파일 업로드 + 파싱 + 정제
- multipart/form-data로 txt 파일 수신
- kakao_parser.py로 파싱
- knowledge_extractor.py로 스레드 분리 + 규칙 기반 추출
- **LLM 정제** (핵심):
  - 기존 항목과 비교하여 **신규 항목만** 추출 (중복 방지)
  - 각 항목의 제목/질문/답변을 깔끔하게 정제
  - 정제 시 **Anthropic Claude Haiku** 사용 (외부 API 금지)
  - API 키: `/home/jay/workspace/.env.keys`의 `ANTHROPIC_API_KEY`
  - 정제 프롬프트 예시:
    ```
    아래 보험 Q&A 대화 스레드를 분석하여 정제해주세요:
    - title: 핵심 주제를 한 문장으로 (예: "안저 광응고술의 수술 해당 여부")
    - question: 질문자의 핵심 궁금증 1~2문장으로 요약
    - answer: 전문가 답변의 핵심 결론 2~3문장으로 요약
    - keywords: 관련 키워드 5~10개
    - category: 보상/고지의무/약관/상품/기타 중 택1
    
    원본 대화:
    {raw_thread}
    ```
  - 비용 최적화: 배치 처리 (한번에 5~10개 스레드씩)
  - 노이즈 필터링: 오픈채팅봇 메시지, 입퇴장, 사진/이모티콘만 있는 스레드는 자동 제거
- 정제된 항목을 wiki_entries.json에 추가 (기존 항목 보존)
- 응답: `{"status": "ok", "new_entries": 23, "duplicates_skipped": 5, "noise_filtered": 12}`

### 2. POST /api/wiki/refine — 기존 미정제 항목 일괄 정제
- 현재 wiki_entries.json의 draft 상태 항목 중 제목이 `#궁금증`으로 시작하는 등 미정제 항목을 LLM으로 정제
- 한번에 최대 50건씩 처리 (비용 관리)
- 응답: `{"status": "ok", "refined": 50, "remaining": 95}`

### 3. POST /api/wiki/sync-firestore — 승인된 항목 Firestore sync
- status가 "approved"인 항목만 대상
- InsuWiki Firestore의 `wiki` 컬렉션에 upsert
- Firestore 문서 구조:
  ```json
  {
    "title": "안저 광응고술의 수술 해당 여부",
    "category": "보상",
    "subcategory": "수술 판정",
    "question": "...",
    "answer": "...",
    "expert": "이해철/프라임/부산",
    "keywords": ["광응고술", "수술", "고지의무"],
    "source": "kakao-앞서가는설계사",
    "sourceDate": "2025-12-03",
    "createdAt": serverTimestamp,
    "updatedAt": serverTimestamp
  }
  ```
- 이미 sync된 항목은 skip (id 기반)
- sync 완료 후 해당 항목에 `synced: true` 마킹
- 응답: `{"status": "ok", "synced": 15, "already_synced": 3}`

### 4. Firestore 연결
- Firebase Admin SDK 사용
- 서비스 계정 키: `/home/jay/projects/insuwiki/` 하위에 있는 json 키 파일 확인
  - 없으면 `firebase-adminsdk` 키 파일 경로를 `.env.keys`에서 읽도록 구현
- 프로젝트 ID: `firebase.json`에서 확인

### 5. LLM 호출 방법 (Haiku)
```python
import anthropic
client = anthropic.Anthropic()  # ANTHROPIC_API_KEY 환경변수 자동 사용
response = client.messages.create(
    model="claude-haiku-4-5-20251001",
    max_tokens=1024,
    messages=[{"role": "user", "content": prompt}]
)
```

## 주의사항
- 외부 LLM (Gemini, GPT 등) 사용 금지. Anthropic Haiku만 사용
- txt 파일 업로드 시 파일 크기 제한: 10MB
- LLM 호출 비용: 배치 처리로 최적화 (한번에 5~10개 스레드)
- 기존 wiki API 엔드포인트 깨지지 않도록 주의
- pyright 에러 0건

## 완료 기준
1. /api/wiki/upload로 txt 업로드 → 파싱 → 정제 → 저장 동작
2. /api/wiki/refine로 기존 미정제 항목 정제 동작
3. /api/wiki/sync-firestore로 승인 항목 Firestore sync 동작
4. LLM 정제 결과 제목이 깔끔 (예: "안저 광응고술의 수술 해당 여부")
5. 테스트 PASS