# task-1068.1: Eval Runner OAuth 전환 (API Key → Claude CLI)

## 배경
`/home/jay/workspace/tools/eval-runner/run_evals.py`의 `call_llm()` 함수(line 407-441)가 `anthropic` SDK + `ANTHROPIC_API_KEY` 환경변수를 사용하고 있다. 우리 시스템은 API 키가 아닌 OAuth 인증을 사용하므로, `claude` CLI를 통해 호출하도록 변경해야 한다.

## 작업 내용

### 1. `call_llm()` 함수 수정 (run_evals.py:407-441)

**변경 전:**
```python
def call_llm(prompt: str) -> str:
    api_key = os.environ.get("ANTHROPIC_API_KEY")
    if not api_key:
        raise ValueError(...)
    import anthropic
    client = anthropic.Anthropic(api_key=api_key)
    time.sleep(1)
    message = client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=2048,
        messages=[{"role": "user", "content": prompt}],
    )
    content = message.content[0]
    if hasattr(content, "text"):
        return content.text
    return str(content)
```

**변경 후 (claude CLI subprocess):**
```python
def call_llm(prompt: str) -> str:
    """
    Claude CLI를 통해 LLM을 호출합니다. (OAuth 인증 사용)
    """
    import subprocess

    result = subprocess.run(
        ["claude", "-p", prompt, "--model", "claude-haiku-4-5-20251001"],
        capture_output=True,
        text=True,
        timeout=120,
    )

    if result.returncode != 0:
        raise RuntimeError(f"claude CLI 호출 실패: {result.stderr[:500]}")

    return result.stdout.strip()
```

### 2. import 정리
- `import anthropic` 제거 (더 이상 사용 안 함)
- `import subprocess` 추가 (파일 상단, 기존 import들 사이에)
- `os.environ.get("ANTHROPIC_API_KEY")` 관련 코드 제거

### 3. 테스트 수정 (test_run_evals.py)
- `ANTHROPIC_API_KEY` 관련 테스트가 있으면 OAuth/CLI 기반으로 수정
- `call_llm` mock 테스트가 있으면 subprocess.run mock으로 변경
- 기존 dry-run 테스트는 영향 없어야 함

### 4. 검증
```bash
# dry-run은 LLM 미호출이므로 변경 없이 통과해야 함
cd /home/jay/workspace/tools/eval-runner
python3 -m pytest test_run_evals.py -v

# claude CLI 설치 확인
which claude  # /home/jay/.local/bin/claude

# 실제 단일 스킬 테스트 (1개만)
python3 run_evals.py --skill ad-creative --dry-run
```

## 주의사항
- `anthropic` SDK import를 완전히 제거할 것 (미사용 의존성)
- subprocess 호출 시 timeout=120 필수 (API 응답 대기)
- rate limit: `time.sleep(1)` 유지 (CLI 호출 간 간격)
- 에러 메시지에 stderr 포함 (디버깅용)
- 기존 evaluate_response(), keyword_match() 등 평가 로직은 변경 금지

## 산출물
- 수정된 run_evals.py
- 수정된 test_run_evals.py
- 보고서: `memory/reports/task-1068.1.md`
