# Task: group_chat.py — Anthropic SDK → Claude CLI 방식으로 전환

## 작업 레벨: Lv.1 (파일/위치 특정, 변경 범위 명확)

## 변경 대상
- `/home/jay/workspace/group_chat.py` (기존 파일 수정)
- `/home/jay/workspace/tests/test_group_chat.py` (테스트 업데이트)

## 변경 내용

### 핵심: `anthropic` SDK 제거 → `claude` CLI subprocess 호출

**Before (현재)**:
```python
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=300,
    system=[{"type": "text", "text": system_prompt, "cache_control": {"type": "ephemeral"}}],
    messages=history
)
text = response.content[0].text
```

**After (변경)**:
```python
import subprocess
import json

def call_claude(system_prompt: str, user_message: str, max_tokens: int = 300) -> str:
    """Claude CLI를 subprocess로 호출하여 응답 생성."""
    # claude CLI는 --print 옵션으로 비대화형 실행 가능
    # --model: 모델 지정
    # --max-tokens: 최대 토큰
    # --system: 시스템 프롬프트 (stdin으로 전달하면 user message)

    cmd = [
        "/home/jay/.local/bin/claude",
        "--print",           # 비대화형, 응답만 출력
        "--model", "claude-sonnet-4-6",
        "--max-tokens", str(max_tokens),
    ]

    # 시스템 프롬프트 + 유저 메시지를 합쳐서 전달
    # claude CLI는 --system-prompt 옵션 지원
    if system_prompt:
        cmd.extend(["--system-prompt", system_prompt])

    result = subprocess.run(
        cmd,
        input=user_message,
        capture_output=True,
        text=True,
        timeout=30  # 30초 타임아웃
    )

    if result.returncode != 0:
        raise RuntimeError(f"Claude CLI 에러: {result.stderr[:200]}")

    return result.stdout.strip()
```

### 변경 포인트 상세

1. **`import anthropic` 제거** — 더 이상 SDK 불필요
2. **`anthropic.Anthropic()` 클라이언트 생성 제거**
3. **`ANTHROPIC_API_KEY` 환경변수 체크 제거** — Claude CLI는 자체 OAuth 인증 사용
4. **`load_env_keys()` 함수에서 ANTHROPIC_API_KEY 관련 로직 제거** (GROUP_CHAT_BOT_TOKEN 로직은 유지)
5. **모든 `client.messages.create()` 호출을 `call_claude()` 함수로 대체**

### 호출 위치 (모두 변경)

1. **페르소나 응답 생성** (`generate_response` 또는 유사 메서드)
   - system_prompt: 페르소나 시스템 프롬프트
   - user_message: 최근 대화 히스토리를 텍스트로 포맷
   - max_tokens: 300

2. **다음 발화자 선택** (`select_next_speaker` 또는 유사 메서드)
   - system_prompt: "다음 발화자를 선택하세요" 지시
   - user_message: 참여자 목록 + 최근 대화 + 발화 횟수
   - max_tokens: 50
   - 이 부분은 모델을 claude-haiku-4-5로 지정 (비용 절감) → call_claude에 model 파라미터 추가

3. **입장 인사 생성** (각 페르소나의 첫 인사)
   - max_tokens: 100

### call_claude 함수 시그니처

```python
def call_claude(
    system_prompt: str,
    user_message: str,
    max_tokens: int = 300,
    model: str = "claude-sonnet-4-6"
) -> str:
```

### 대화 히스토리 전달 방식

기존 SDK는 messages 배열(role/content)을 보냈지만, CLI는 단일 텍스트 입력.
히스토리를 텍스트로 포맷:

```python
def format_history_for_cli(history: list, last_n: int = 20) -> str:
    """대화 히스토리를 CLI 입력용 텍스트로 변환."""
    lines = []
    for msg in history[-last_n:]:
        role = msg.get("role", "")
        persona = msg.get("persona", "")
        content = msg.get("content", "")
        if persona:
            lines.append(f"[{persona}]: {content}")
        elif role == "user":
            lines.append(f"[제이회장님]: {content}")
        else:
            lines.append(content)
    return "\n".join(lines)
```

### 에러 핸들링 변경

```python
# Before (SDK)
except anthropic.RateLimitError: ...
except anthropic.APITimeoutError: ...

# After (CLI)
except subprocess.TimeoutExpired:
    # 30초 타임아웃 → "(잠시 생각 중...)" 전송
except RuntimeError as e:
    # CLI 에러 → 재시도 1회, 실패 시 스킵
except Exception as e:
    # 기타 에러 → 안전 종료
```

### main() 함수 변경

```python
def main():
    load_env_keys()  # GROUP_CHAT_BOT_TOKEN만 로드 (ANTHROPIC_API_KEY 불필요)

    token = os.environ.get("GROUP_CHAT_BOT_TOKEN")
    if not token:
        logger.error("GROUP_CHAT_BOT_TOKEN이 설정되지 않았습니다.")
        sys.exit(1)

    # Claude CLI 존재 확인
    claude_path = "/home/jay/.local/bin/claude"
    if not os.path.exists(claude_path):
        logger.error(f"Claude CLI를 찾을 수 없습니다: {claude_path}")
        sys.exit(1)

    # anthropic 클라이언트 생성 제거
    # engine = GroupChatEngine(token, personas, client) → client 파라미터 제거
```

## 검증 항목
1. `anthropic` import 완전 제거 확인
2. ANTHROPIC_API_KEY 관련 코드 완전 제거 확인
3. `call_claude()` 함수가 claude CLI를 정상 호출하는지 확인
4. 기존 기능 유지: 입장/퇴장, 타임아웃, MAX_AUTO_TURNS
5. 테스트 전체 PASS (anthropic mock → subprocess mock으로 변경)
6. 실제 데몬 실행 테스트: `source /home/jay/workspace/.env.keys && python3 group_chat.py` 시작 확인

## 주의사항
- claude CLI 경로: `/home/jay/.local/bin/claude`
- `--print` 플래그 필수 (비대화형 모드)
- `--system-prompt` 플래그로 시스템 프롬프트 전달
- subprocess.run의 timeout 반드시 설정 (30초)
- GroupChatEngine 클래스에서 anthropic.Anthropic 의존성 완전 제거
- 테스트에서 anthropic mock → subprocess.run mock으로 전환