# Task: 멀티모델 텔레그램 봇 서버 구축

## 목표
Gemini CLI와 Codex CLI를 백엔드로 사용하는 텔레그램 봇 서버 2개 구축.
기존 Claude 봇(cokacdir)과 함께 그룹챗에서 멀티모델 논의가 가능하도록 한다.

## 봇 정보
- **잼민이 (Gemini)**: `gemini_view_bot` — 토큰: `$GEMINI_BOT_TOKEN` (env)
- **코덱스 (Codex)**: `codex_view_bot` — 토큰: `$CODEX_BOT_TOKEN` (env)
- 토큰은 반드시 `/home/jay/workspace/.env.keys`에서 로드. 코드에 하드코딩 금지.

## 기술 스택
- Python 3 + `python-telegram-bot` (pip install 필요)
- Gemini CLI: `gemini -p "prompt" --yolo` (비대화식 모드, OAuth 인증 완료)
- Codex CLI: `codex exec "prompt"` (비대화식 모드, OAuth 로그인 아직 안됨 → 에러 핸들링 필수)

## CLI 인증 현황
- **Gemini CLI v0.31.0**: OAuth 완료 (`~/.gemini/oauth_creds.json`, 계정: jonghyuk.jeon@gmail.com)
- **Codex CLI v0.106.0**: 미로그인. `codex login` 필요. 봇 시작 시 로그인 안 되어있으면 안내 메시지 반환.

## 디렉토리 구조
```
/home/jay/workspace/services/multimodel-bot/
├── gemini_bot.py          # Gemini 텔레그램 봇
├── codex_bot.py           # Codex 텔레그램 봇
├── engine.py              # CLI 호출 공통 모듈 (subprocess 래핑)
├── config.py              # 설정 (토큰 로드, 타임아웃 등)
├── requirements.txt       # python-telegram-bot 등
├── start.sh               # 두 봇 동시 시작 스크립트
└── README.md              # 사용법
```

## 핵심 기능

### 1. engine.py — CLI 래핑
```python
# Gemini 호출
async def call_gemini(prompt: str, timeout: int = 120) -> str:
    # subprocess: gemini -p "{prompt}" --yolo --approval-mode yolo
    # stdout 캡처, stderr 무시
    # 타임아웃 처리

# Codex 호출
async def call_codex(prompt: str, timeout: int = 120) -> str:
    # subprocess: codex exec "{prompt}"
    # stdout 캡처
    # 로그인 안 되어있으면 "Codex 로그인 필요" 반환
```

### 2. 그룹챗 동작 규칙 (중요!)
- **응답 트리거**: @멘션 또는 봇 메시지에 직접 리플라이할 때만 응답
- **루프 방지**: 다른 봇의 메시지에는 자동 응답하지 않음 (bot.is_bot 체크)
- **1:1 DM**: owner_user_id(6937032012)의 DM에는 항상 응답
- **타임아웃**: CLI 응답 120초 제한. 초과 시 "응답 시간 초과" 메시지

### 3. 메시지 처리 흐름
1. 텔레그램 메시지 수신
2. 트리거 조건 확인 (@멘션 or 리플라이 or DM)
3. "생각 중..." 임시 메시지 전송 (typing action)
4. CLI 호출 (gemini -p / codex exec)
5. 결과 텔레그램 전송 (4096자 초과 시 분할)
6. CLI 에러 시 에러 메시지 전송

### 4. config.py
```python
import os

# .env.keys에서 로드됨 (source /home/jay/workspace/.env.keys)
GEMINI_BOT_TOKEN = os.environ["GEMINI_BOT_TOKEN"]
CODEX_BOT_TOKEN = os.environ["CODEX_BOT_TOKEN"]
OWNER_USER_ID = 6937032012
CLI_TIMEOUT = 120  # seconds
MAX_MESSAGE_LENGTH = 4096
```

### 5. start.sh
```bash
#!/bin/bash
source /home/jay/workspace/.env.keys
cd /home/jay/workspace/services/multimodel-bot/
python3 gemini_bot.py &
python3 codex_bot.py &
wait
```

## 시스템 서비스
- systemd 서비스 파일 2개 생성 (gemini-bot.service, codex-bot.service)
- `/etc/systemd/system/` 에 배치
- `ExecStart`에 `source .env.keys` 포함
- 자동 재시작 설정

## 테스트 계획
1. 각 봇 단독 실행 → DM 테스트 (echo "hello" 수준)
2. Gemini 봇 → `gemini -p` 호출 → 응답 확인
3. Codex 봇 → 로그인 안 된 상태 에러 핸들링 확인
4. 4096자 초과 메시지 분할 테스트
5. 타임아웃 처리 테스트

## 주의사항
- 토큰/키를 코드에 하드코딩하지 말 것. 반드시 환경변수.
- gemini CLI 호출 시 `--yolo --approval-mode yolo` 필수 (도구 승인 프롬프트 방지)
- subprocess 호출 시 shell=True 금지. 리스트로 전달 (인젝션 방지)
- Codex 미로그인 시 graceful 처리 (크래시 X, 안내 메시지 O)
