같은 버그 수정 태스크를 Claude, ZAI(GLM), OpenAI Codex, Google Gemini에게 동시에 던지면 어떤 일이 벌어질까?
이 질문에서 AgentForge 프로젝트가 시작됐다. 여러 LLM CLI를 NATS JetStream 메시지 큐로 묶어서 같은 태스크를 병렬로 처리하는 시스템을 만들었고, 그 과정에서 예상치 못한 발견들이 있었다. 이번 글은 “설정하면서 뭘 발견했나"에 집중한 비교 실험 기록이다.
시스템의 설계·구현 이야기는 2편에서 다룬다.
테스트한 AI 목록
최종적으로 운영 중인 워커 18개의 구성은 다음과 같다.
| 계열 | 모델 | 비고 |
|---|---|---|
| Claude Code | claude-sonnet-4-6 | 메인 개발 워커 |
| Claude Code | claude-sonnet-4-5 | 이전 세대 비교용 |
| Claude Code | claude-haiku-4-5 | 경량·고속 |
| Claude Code | claude-opus-4-6 | 최고 사양 |
| Claude Code | claude-opus-4-5 | 이전 세대 비교용 |
| ZAI (GLM) | glm-5.1 | 고사양 티어 |
| ZAI (GLM) | glm-4.7 | 중간 티어 |
| ZAI (GLM) | glm-4.5-air | 경량 티어 |
| OpenAI Codex | gpt-5.5 | |
| Codex | gpt-5.4 | 1M 컨텍스트 |
| Codex | gpt-5.4-mini | 400K 컨텍스트 |
| Codex | gpt-5.3-codex | 272K 컨텍스트 |
| Google Gemini | gemini-2.5-flash | |
| Gemini | gemini-2.5-pro | 고사양 |
| Gemini | gemini-2.5-flash-lite | 경량 |
처음 시작할 때 목록은 훨씬 짧았다. 어떤 모델을 쓸 수 있는지 직접 실험해보면서 늘어났다.
발견 1: Claude 3.x 시리즈는 이미 접근 불가
Claude Code를 오래 써온 사람이라면 Claude 3.7 Sonnet, 3.5 Sonnet, 3.5 Haiku를 떠올릴 수 있다. 그래서 이 모델들도 워커로 추가하려 했다.
claude --model claude-3-7-sonnet-20250219 --print "hello"
# → "may not exist or no access"
세 모델 모두 동일한 오류. Claude 3 시리즈는 2026년 초에 EOL을 맞이했고, Claude Code CLI를 통한 접근이 차단됐다. 현재 Claude Code 구독으로 쓸 수 있는 것은 4.x 계열뿐이다.
결론: Claude 워커는 4.5/4.6 계열로만 구성했다.
발견 2: ChatGPT 계정 Codex는 모델 선택이 제한적이다
OpenAI Codex CLI는 ChatGPT Plus/Pro 계정이나 별도 API 키로 인증한다. ChatGPT 계정 기반일 경우 접근 가능한 모델이 제한된다.
codex --model gpt-5.5-pro "fix the bug"
# → "Model gpt-5.5-pro is not supported with ChatGPT account"
codex --model gpt-5.5 "fix the bug"
# → 정상 작동
ChatGPT 계정으로 사용할 수 있는 모델:
| 모델 | 컨텍스트 | 추론 수준 |
|---|---|---|
| gpt-5.5 | 1M / 1M | High |
| gpt-5.4 | 1M / 1M | Medium |
| gpt-5.4-mini | 400K / 400K | Medium |
| gpt-5.3-codex | 272K / 400K | Medium |
gpt-5.5-pro를 포함한 다른 모델은 모두 “not supported with ChatGPT account” 오류를 반환한다. API 키 방식이라면 더 많은 모델을 쓸 수 있지만, 그건 다른 접근 방식이다.
발견 3: Gemini CLI는 2.5 시리즈만 된다
Gemini CLI(gemini 바이너리)로 여러 모델을 테스트했다.
gemini -p "hello" -m gemini-2.0-flash
# → ModelNotFoundError: models/gemini-2.0-flash is not found
gemini -p "hello" -m gemini-1.5-pro
# → ModelNotFoundError
gemini -p "hello" -m gemini-2.5-flash
# → 정상 작동
현재 계정으로 접근 가능한 Gemini 모델:
gemini-2.5-flash— 기본 추천 모델gemini-2.5-pro— 고사양gemini-2.5-flash-lite— 경량
Gemini 2.0 이하 버전은 ModelNotFoundError를 반환한다. 계정 플랜이나 API 키 종류에 따라 다를 수 있지만, Gemini CLI 기준으로는 2.5 시리즈만 안정적으로 동작했다.
발견 4: ZAI는 Claude SDK로 우회할 수 있다
ZAI는 Anthropic API와 호환되는 엔드포인트를 제공하는 서비스다. 덕분에 Claude Code CLI에서 환경변수 두 개만 바꿔서 GLM 모델을 쓸 수 있다.
ANTHROPIC_BASE_URL=https://<ZAI endpoint> \
ANTHROPIC_AUTH_TOKEN=<ZAI_KEY> \
claude --model glm-5.1 --print "fix the bug"
Claude Code가 내부적으로 Anthropic Python SDK를 쓰기 때문에, ANTHROPIC_BASE_URL만 오버라이드하면 동일한 포맷으로 ZAI의 GLM 모델을 호출한다. 별도의 어댑터 코드 없이 기존 claude 백엔드를 그대로 재사용할 수 있다는 점이 흥미로웠다.
사용한 GLM 모델 3종:
glm-5.1— 고사양 티어glm-4.7— 비용·성능 균형점glm-4.5-air— 경량·고속
4-way Fan-out 비교 테스트
18개 워커 중 대표 4개(Claude Sonnet, GLM-5.1, Codex gpt-5.5, Gemini 2.5 Flash)에 동일한 Go 버그 수정 태스크를 동시에 발행했다.
태스크: "fix the off-by-one error in the binary search function"
응답 시간 (wall clock):
| 워커 | 모델 | 응답 시간 |
|---|---|---|
| cc-go-dev-01 | claude-sonnet-4-6 | ~8초 |
| cc-zai-high-dev-01 | glm-5.1 | ~12초 |
| codex-py-dev-01 | gpt-5.5 | ~15초 |
| gemini-py-dev-01 | gemini-2.5-flash | ~10초 |
응답 시간보다 흥미로운 건 접근 방식의 차이다. Claude는 함수 전체를 리팩토링하는 경향이 있었고, Gemini는 최소한의 수정을 선호했다. Codex는 테스트 코드까지 함께 추가하는 경우가 많았다.
물론 이건 단일 태스크 결과라 통계적 의미는 없다. 벤치마크가 아니라 “실제로 동작하는지 확인"하는 수준의 검증이었다.
분산 워커: 두 번째 호스트 추가
워커들이 모두 한 서버에 있으면 비교 실험의 의미가 약해진다. 그래서 두 번째 호스트에 Claude 워커를 추가했다.
두 번째 호스트에서 NATS 브로커(첫 번째 호스트)에 접근하는 방법은 autossh 터널이다.
[Service]
ExecStart=autossh -N -L 4222:127.0.0.1:4222 broker-host
로컬의 4222 포트를 브로커로 포워딩하면 워커 코드 변경 없이 어느 호스트에서나 nats://127.0.0.1:4222로 접속할 수 있다.
이 방식의 장점: 워커는 브로커가 어디 있는지 알 필요가 없다. 항상 localhost:4222로 연결하면 된다.
운영하면서 가장 당황했던 순간
가장 곤혹스러운 상황은 NATS operator signing key를 분실한 것이었다. NATS JetStream은 NKey 기반 인증을 쓰는데, 신규 워커의 credentials를 발급하려면 operator/account의 signing key(nsc seed)가 필요하다.
nsc add user --account Services --name new-worker
# → "signing key not found"
백업이 없었다. 결국 NATS operator를 통째로 재생성하고, 모든 워커의 credentials를 새 권한 트리로 교체하는 대규모 컷오버를 진행했다. 서비스 다운타임은 약 60초였다.
교훈: NATS operator seed는 생성 즉시 오프라인 백업을 만들어라. 분실하면 재생성 외에 방법이 없다.
정리
이번 실험에서 얻은 실용적인 결론:
- Claude 3.x는 EOL - 2026년 기준 Claude Code CLI에서 접근 불가. 4.x만 쓸 것.
- Codex ChatGPT 계정은 모델 4종만 - gpt-5.5, 5.4, 5.4-mini, 5.3-codex. Pro 모델은 별도 API 키 필요.
- Gemini는 2.5 시리즈만 - CLI 기준 이전 버전 접근 불가.
- ZAI는 Claude SDK 환경변수 오버라이드로 통합 가능 - 별도 어댑터 불필요.
- NATS NKey는 반드시 백업 - signing key 분실 = 전체 재발급.
다음 편에서는 이 워커들이 어떻게 연결되는지, 시스템 설계와 구현을 다룬다.