# Task: 멀티모델 봇 토론 기능 + Gemini SDK 전환

## 개요
`/home/jay/workspace/services/multimodel-bot/` 의 3개 봇(잼민이/코덱스/클로디)에
봇 간 토론 기능을 추가하고, Gemini CLI를 Python SDK로 전환한다.

## 현재 파일 구조
```
services/multimodel-bot/
├── config.py        # 토큰, 상수
├── engine.py        # call_gemini(), call_codex(), call_claude()
├── bot_utils.py     # should_respond(), send_response(), split_message()
├── gemini_bot.py    # Gemini 텔레그램 봇
├── codex_bot.py     # Codex 텔레그램 봇
└── claude_bot.py    # Claude 텔레그램 봇
```

## 수정 사항

### 1. engine.py — call_gemini() SDK 전환

**현재**: `gemini -p "prompt" --approval-mode yolo` CLI 호출 (매번 Node.js 런타임 + 스킬 로드 → 13초)
**변경**: `google-generativeai` Python SDK 직접 호출 (2-3초 목표)

- 패키지: `google-generativeai` v0.8.6 (이미 설치됨)
- OAuth 인증 정보: `~/.gemini/oauth_creds.json`
  ```json
  {
    "access_token": "...",
    "scope": "...",
    "token_type": "Bearer",
    "id_token": "...",
    "expiry_date": 1234567890,
    "refresh_token": "..."
  }
  ```
- `google.oauth2.credentials.Credentials`로 변환하여 `genai.Client(credentials=...)` 사용
- 모델: `gemini-2.5-flash` 또는 적절한 모델 사용
- call_gemini() 시그니처는 유지: `async def call_gemini(prompt: str, timeout: int = 120) -> str`
- **주의**: `google-auth`, `google-auth-oauthlib` 패키지가 없으면 `pip install` 필요

### 2. bot_utils.py — should_respond() 수정

**현재**: `sender.is_bot == True`면 무조건 무시 (봇 메시지 차단)
**변경**: 자기 자신(같은 bot username)만 무시, 다른 봇 메시지에는 응답 가능

```python
# 기존
if sender.is_bot:
    return False

# 변경: 자기 자신만 무시, 다른 봇은 허용
if sender.is_bot and sender.username and sender.username.lower() == bot_username.lower():
    return False
```

단, 토론 매니저의 제어를 받아야 함 (아래 참조).

### 3. 토론 매니저 (discussion_manager.py 신규)

#### 핵심 규칙
1. **기본 동작**: 유저 메시지 → 3봇 모두 응답. 봇 메시지 → 토론 모드일 때만 다른 봇이 응답.
2. **5분 idle 정지**: 봇끼리 대화 중 유저가 5분간 무응답이면 자동 중단.
3. **시간 한정 모드**: 유저가 시간을 지정하면 ("30분간 토론해", "1시간동안 얘기해") 해당 시간까지 5분 규칙 무시, 봇끼리 계속 대화.
4. **유저 끼어들기**: 유저가 중간에 메시지 보내면 → idle 타이머 리셋 + 유저 의견 반영하며 대화 계속.

#### 시간 파싱
유저 메시지에서 시간 키워드 감지:
- "N분간", "N분동안", "N시간동안", "N시간", "Nmin", "Nhour" 등
- 정규식으로 파싱 → 분 단위 변환
- 최대 제한: 3시간 (무한 방지)

#### 턴 관리 (무한루프 방지)
- 봇 A가 응답 → 다른 봇 중 하나만 응답 (전부 응답하면 기하급수 증가)
- 방법: 라운드 로빈 (잼민이 → 코덱스 → 클로디 → 잼민이 → ...) 또는 랜덤 선택
- 턴 간 딜레이: 3-5초 (rate limit 방지 + 자연스러운 대화 흐름)
- 한 라운드 = 3봇 각 1회 발언

#### 상태 관리
```python
class DiscussionState:
    active: bool = False           # 토론 모드 ON/OFF
    start_time: float              # 토론 시작 시간
    duration_minutes: int | None   # 시간 한정 모드 시 분 단위 (None = 5분 idle 규칙 적용)
    last_user_message_time: float  # 유저 마지막 메시지 시간
    current_turn: str              # 현재 턴인 봇 username
    chat_id: int                   # 그룹 chat ID
```

#### 토론 흐름
1. 유저가 그룹에 메시지 → 3봇 모두 응답 (기존 A모드)
2. 봇 응답 후 → 토론 모드 진입 (active=True)
3. 다음 턴 봇이 이전 봇 메시지에 응답 (라운드 로빈)
4. 체크: 시간 초과? 유저 idle 5분? → True면 중단, "토론을 마치겠습니다" 메시지
5. 유저 메시지 오면 → last_user_message_time 갱신, 3봇 모두 응답, 턴 리셋

#### 통합 방법
- 각 봇(gemini_bot.py, codex_bot.py, claude_bot.py)에서 `discussion_manager` import
- `handle_message`에서 `discussion_manager`의 상태를 체크하여 응답 여부 결정
- 공유 상태: 3봇이 같은 프로세스가 아니므로, **파일 기반 상태 공유** 또는 **하나의 통합 봇 프로세스**로 변경 필요

**권장: 통합 프로세스**
- `main_bot.py` 하나로 3봇을 통합 실행 (3개의 Application을 asyncio로 동시 실행)
- 메모리 내 상태 공유 가능 → 파일 I/O 불필요
- 또는 Redis/SQLite 같은 공유 저장소 사용 (오버킬일 수 있음)

## 봇 정보
- 잼민이: @gemini_view_bot (Gemini)
- 코덱스: @codex_view_bot (Codex, gpt-5.2-codex)
- 클로디: @claude_view_bot (Claude, sonnet)

## 환경
- Python 3.x, python-telegram-bot v22.6
- google-generativeai v0.8.6
- OAuth creds: ~/.gemini/oauth_creds.json (Gemini Pro, jonghyuk.jeon@gmail.com)
- 토큰: source /home/jay/workspace/.env.keys (GEMINI_BOT_TOKEN, CODEX_BOT_TOKEN, CLAUDE_BOT_TOKEN)
- OWNER_USER_ID: 6937032012

## 테스트
- 각 엔진 함수 단독 테스트 (call_gemini SDK 전환 후)
- 봇 간 토론 루프 테스트 (3턴 이상)
- 5분 idle 정지 테스트
- 시간 한정 모드 테스트
- 유저 끼어들기 테스트

## 실행
- 현재: 3개 프로세스 각각 nohup 실행
- 변경 후: 통합 프로세스 1개 또는 기존 방식 유지 (팀 판단)
- 로그: /tmp/gemini-bot.log, /tmp/codex-bot.log, /tmp/claude-bot.log
