CCR-Rust
CCR-Rust는 사용자의 AI 코딩 도구(Claude Code, Codex, OpenCode 또는 모든 OpenAI 호환 클라이언트)와 모델 제공자 사이에 위치하는 경량의 자체 호스팅 LLM 라우터입니다. 사용자의 클라이언트는 하나의 로컬 URL과 통신하며, CCR-Rust가 어떤 제공자와 모델이 실제로 각 요청을 처리할지 결정하고, 필요에 따라 API 형식을 변환하며, 제공자에 문제가 생기면 자동으로 장애 조치(fail over)를 수행합니다. 이 도구는 개발자 및 팀이 선호하는 코딩 CLI를 계속 사용하면서도 제공자를 전환하거나, 여러 모델에 부하를 분산시키거나, 사용량 제한이 소진된 후에도 작업을 지속하고 싶은 사람들을 목표로 합니다.
사람들이 가장 흔하게 설치하는 이유는 다음과 같습니다: Claude 플랜을 다 써버렸을 때, 도구를 변경하는 대신 GLM, MiniMax, DeepSeek 또는 다른 제공자를 사용하여 Claude Code를 계속 사용하는 것.
라우팅이 필요한 이유
코딩 에이전트와 그 모델 제공자는 두 개의 독립적인 계층이며, 실제로 긴 에이전트 세션을 중단시키는 실패는 제공자 계층에서 발생합니다: 할당량 창(5시간, 주간, 월간)이 소진되거나, 피크 시간대에 제공자들이 429 폭풍을 내보내거나, 엔드포인트에 지역적 장애가 발생하거나, 모델이 사용 중단되거나 조용히 라우팅되거나, 가격이나 약관이 예고 없이 변경됩니다. 아무리 좋은 에이전트라도 자신에게 속도 제한(rate-limiting)을 거는 제공자를 고칠 수는 없습니다. 라우터는 에이전트와 이 전체 실패 표면 사이에 로컬이며 제공자 독립적인 엔드포인트를 배치합니다:
- 실패 대신 장애 조치(Failover instead of failure). 제공업체들은 계층(tier)별로 구성되어 있으며, 5xx 에러와 타임아웃은 다음 계층으로 자동으로 전파됩니다.
- 폐기된 작업 대신 보류 재시도(Held retries instead of dropped work). retry sweeps가 활성화되면, 모든 계층을 소진한 요청은 인플라이트(in flight) 상태로 유지되었다가 일정 시간 후 재전파됩니다. 따라서 에이전트는 429 대신 지연 시간(latency)을 관찰하게 됩니다. 결정론적 거부(Deterministic rejections, 401/402/403/404)는 한 번 시도되고 그 이후에는 건너뜁니다.
- 클라이언트 선택과 제공업체 선택의 분리. 라우터는 Anthropic과 OpenAI 양쪽의 와이어 포맷(wire formats)을 모두 이해하고 필요에 따라 변환하므로, 제공업체를 추가하거나 교체해도 도구 변경이나 각 도구별 자격 증명 수정이 필요한 일이 없습니다.
- 할당량 격리(Quota isolation). 작업 부하 클래스(interactive sessions, bulk sub-agents, automated review)별로 별도의 라우터 인스턴스를 실행하여, 한 작업 부하가 다른 작업 부하의 할당량 창을 소모하지 못하도록 합니다.
- 단일 자격 증명 경로(One credential path). 키는 하나의 설정 파일에서 환경 변수로부터 확장됩니다. 따라서 도구별 설정이나 로그에 붙여넣기 하는 일이 절대 없습니다.
- 측정(Measurement). 계층별 토큰, 지연 시간 및 속도 제한(rate-limit) 메트릭을 통해 어떤 제공업체가 실제로 각 요청을 처리했는지, 그리고 각 할당량 창이 얼마의 비용을 발생시켰는지를 보여줍니다. 라우터가 없으면 이는 눈에 보이지 않습니다.
라우터는 용량을 생성하지 않습니다. 라우터는 사용자가 이미 보유하고 있는 모든 용량을, 연결하는 모든 제공업체에 걸쳐 최대화합니다.
기능
- 자동 장애 복구(Automatic failover) — 제공업체들이 계층별로 구성되어 있으며, 5xx 오류 및 시간 초과는 다음 계층으로 자동으로 전파됩니다. 속도 제한(429)은 추적되고 투명하게 보고됩니다.
- 다중 프로토콜(Multi-protocol) — 하나의 로컬 엔드포인트가 Anthropic API(
/v1/messages)와 OpenAI API(/v1/chat/completions, /v1/responses)를 모두 지원하며, 요청 및 응답 변환을 처리해 드립니다.
- 비용 및 클래스 인식 라우팅(Cost- and class-aware routing) — 다른 트래픽 클래스(기본값 / 생각 / 백그라운드 / 웹 검색)를 다른 모델로 전송하고, 선택적으로 GP 기반의 요청 인식 재순위화(request-aware reranking)를 수행할 수 있습니다.
- 비피크 시간대 플레이북(Off-peak lane playbooks) — 어느 제공업체가 가장 저렴한지 추측하는 대신, 시간대에 안전한 일/야간 가이드를 가진 Qwen 토큰 플랜과 같은 크레딧 플랜 경로를 고정할 수 있습니다.
- 관찰 가능성(Observability) — Prometheus 메트릭, 실시간 터미널 대시보드, 제공업체 계층별 토큰/지연 시간/비용 추적 기능을 제공합니다.
- MCP 집계(MCP aggregation) — 선택적 모델 컨텍스트 프로토콜(Model Context Protocol) 서버 및 도구 프록시를 위한 공유 데몬을 제공합니다.
- 압축(Compression) — 장시간 실행되는 에이전트 세션을 위한 응답 및 도구 출력 압축 트랜스포머를 제공합니다.
작은 크기: 약 15MB의 바이너리로, P99 라우팅 오버헤드가 50ms 미만이며, 사용자의 흐름을 방해하지 않도록 설계되었습니다.
작동 방식
┌──────────────┐ ┌────────────┐ ┌─────────────────────┐
│ Claude Code │ ─────▶ │ │ ─────▶ │ Z.AI (GLM-5.2) │ tier 0
│ Codex │ ─────▶ │ CCR-Rust │ ─────▶ │ MiniMax (M3) │ tier 1
...
- 사용자의 클라이언트가 CCR-Rust로 요청을 전송합니다 (Anthropic 스타일 또는 OpenAI 스타일).
- CCR-Rust는 라우팅 규칙을 사용하여 구성된 제공업체/모델을 선택합니다.
- 업스트림 제공업체가 다른 API 형식을 사용하는 경우, CCR-Rust가 요청을 변환합니다.
- 요청을 업스트림으로 전송하고 응답을 수집하거나(또는 스트리밍) 필요에 따라 다시 변환합니다.
- 사용자의 클라이언트는 예상하는 형식의 결과를 받게 되며, 그 아래 엔진은 워크플로우를 변경하지 않고도 변경될 수 있습니다.
설치
소스에서 (권장)
Rust 툴체인(rustup을 사용하는 것이 가장 쉽습니다)이 필요합니다.
git clone https://github.com/RESMP-DEV/ccr-rust.git
cd ccr-rust
cargo build --release
...
이렇게 하면 ccr-rust 바이너리가 ~/.cargo/bin에 설치됩니다 (해당 디렉터리가 PATH에 포함되어 있는지 확인하세요).
Docker
Dockerfile과 docker-compose.yml이 포함되어 있습니다. compose 파일은 리포지토리 루트의 ./config.json을 마운트합니다:
cp config.example.json config.json
docker compose up --build
또는 이미지를 직접 빌드하고 실행할 수 있습니다:
docker build -t ccr-rust .
docker run --rm -p 3456:3456 \
-v ./config.json:/etc/ccr/config.json:ro \
...
사전 빌드 바이너리(Prebuilt binaries)
사전 빌드된 릴리스 바이너리는 아직 게시되지 않았습니다. 소스에서 빌드하거나 Docker를 사용하세요. 향후 바이너리 릴리스는 리포지토리의 Releases 페이지를 확인해 주세요.
빠른 시작(Quickstart)
이미 로컬에 설정하셨나요? claude-ccr, codex-ccr, 서비스 제어 및 검증에 대해서는 로컬 작업 및 에이전트 사용을 참조하세요. 개인 플랜과 기업 플랜을 분리하려면 인증 스위트(Authentication suites)를 따르세요.
Claude Code가 CCR을 통해 라우팅되는 것은 기기별 옵트인 방식이며, 유지 관리자 Mac의 경우 Claude Code는 네이티브 Anthropic 구독 로그인을 사용하고 claude-ccr은 폐지되었습니다.
전체 문서 색인(documentation index)에서 설정 및 작동 방식을 확인할 수 있습니다.
코딩 플랜 전환을 사용하여 세션별로 Kimi 또는 Z.AI GLM을 선택하거나, Codex 프로필을 저장하거나, 의도적인 폴백(fallback)을 구성할 수 있습니다. 테스트된 두 공급자 시작점은 examples/coding-plans.json입니다.
Qwen Token Plan을 크레딧 레인으로 추가하려면 Qwen Token Plan 통합을 참조하세요.
권장되는 다중 공급자(multi-provider) 시작 지점은 examples/config.followers.json입니다. 이 파일은 1차 계층으로 GLM 코딩 플랜, 2차 계층으로 MiniMax 토큰 플랜, 오버플로우를 위한 무료 NVIDIA NIM 체험 계층을 포함하며, 경계가 있는 홀드(bounded hold)로 재시도 스윕(retry sweeps)이 활성화되어 있습니다. 이 구성의 근거는 Why route at all를 참조하십시오. OpenRouter 전용 무료 티어 설정의 경우, examples/openrouter-free.json 및 OpenRouter 설정을 참조하십시오.
최소한의 단일 공급자(single-provider) 구성은 약 2분 만에 로컬에서 라우터(router)를 실행할 수 있습니다. 이 팔로워 템플릿은 세 개의 API 키와 세 계층 전체를 커버하는 유효성 검사(validate run)가 필요합니다.
1. 설치 (Install)
위의 설치를 따르고, 다음을 확인하십시오:
2. 구성 파일 생성 (Create a config)
mkdir -p ~/.claude-code-router
cp config.example.json ~/.claude-code-router/config.json
~/.claude-code-router/config.json을 열고 API 키를 가진 공급자만 남겨두십시오. 최소한의 단일 공급자 구성은 다음과 같습니다 (복사 붙여넣기 버전은 examples/config.minimal.json을 참조하십시오):
${DEEPSEEK_API_KEY}는 환경 변수에서 확장되므로, 먼저 키를 내보내십시오:
export DEEPSEEK_API_KEY="sk-..."
3. 유효성 검사 및 시작 (Validate and start)
ccr-rust validate
ccr-rust start
두 번째 터미널에서:
4. 첫 요청 보내기 (Send your first request)
curl -s http://127.0.0.1:3456/v1/messages \
-H "content-type: application/json" \
-d '{
...
ANTHROPIC_BASE_URL=http://127.0.0.1:3456 \
ANTHROPIC_AUTH_TOKEN=ccr-local ANTHROPIC_API_KEY=ccr-local claude
...
위에 언급된 로컬 클라이언트 토큰은 플레이스홀더입니다. CCR는 자체 설정에서 업스트림 제공업체 키를 사용하며, HTTP 리스너가 클라이언트를 인증하지 않습니다. 루프백(loopback) 상태로 유지하세요. 일반적인 `claude` 및 `codex` 실행은 기존 설정을 유지합니다. 모델 오버라이드와 프로필 형식에 대한 내용은 클라이언트 가이드를 참조하세요.
더 많은 예시(다단계 장애 조치, 프리셋, 스모크 테스트 스크립트)는 [`examples/`](examples/)에서 확인할 수 있습니다.
전체 참고 자료를 보려면 `ccr-rust --help`를 실행하세요. 가장 일반적인 명령어들은 다음과 같습니다:
| 명령어 | 목적 |
| :--- | :--- |
| `ccr-rust start` | 라우터 시작 (기본 명령어 — 단순히 `ccr-rust`를 실행하는 것도 동일합니다) |
| ... |
```bash
ccr-rust start --host 0.0.0.0 --port 8080
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
API 엔드포인트 (API surface)
| 엔드포인트 | 메서드 | 목적 |
|---|
/v1/messages | POST | Anthropic 메시지 API |
| ... | | |
설정 (Configuration)
CCR-Rust는 기본적으로 ~/.claude-code-router/config.json 파일을 읽습니다( --config 또는 CCR_CONFIG로 재정의 가능). "${MY_API_KEY}"와 같은 값은 환경 변수에서 확장되므로, 비밀 정보가 파일에 저장될 필요가 없습니다. 리버스 프록시 노출을 위해 별도의 키 보호 리스너를 추가하려면 AUTH_PORT와 함께 CLIENT_API_KEY를 설정하세요. 일반적인 HOST/PORT 리스너는 기존의 인증되지 않은 로컬 계약(local contract) 상태로 유지됩니다. 원격 API (Remote API)를 참조하세요.
가장 많이 다루게 될 세 가지 섹션은 다음과 같습니다:
Providers — 업스트림 엔드포인트: 이름, 기본 URL, API 키, 모델, 선택적 트랜스포머(transformers).
Router — 라우팅 규칙: default 경로, 선택적 background / think / webSearch 경로, tiers 장애 조치 계층 구조(failover cascade), 재시도(retries), 그리고 GP 라우팅.
Presets — 매개변수 오버라이드가 적용된 이름 지정 경로: /preset/{name}/v1/messages에서 접근 가능.
전체 스키마, 트랜스포머 참조 및 제공업체별 설정: docs/configuration.md. 일반적인 시나리오를 위한 준비된 설정: docs/presets.md 및 examples/.
속도 제한 및 실패 처리 방식
- 429 응답은 정규화된 오류 본문(
type: "rate_limit_error", code: "rate_limited")과 어느 제공업체가 속도 제한에 걸렸는지 식별하는 x-ccr-tier 헤더와 함께 클라이언트로 전달됩니다. 속도 제한은 내부적으로 추적되므로, 향후 요청 시 해당 티어는 백오프(backoff)되는 동안 건너뛰게 됩니다.
- 5xx / 타임아웃 오류는 다음 티어로 자동으로 전파됩니다. 모든 티어가 소진되었을 때만 클라이언트가 오류를 보게 됩니다.
- 정보성 헤더 (200 응답 시
X-RateLimit-Remaining: 0)는 기본적으로 선제적인 티어 건너뛰기를 유발합니다. 이러한 정보성 경고를 실제 강제 적용 없이 보내는 제공업체(예: Z.AI)의 경우, 각 제공업체별로 `
status가 'Not running'이라고 나오지만 방금 시작했습니다
기본적으로 status는 127.0.0.1:3456을 확인합니다. 만약 다른 호스트/포트로 시작했다면, 동일한 값을 전달하세요: ccr-rust status --host 0.0.0.0 --port 8080.
Claude Code는 ANTHROPIC_API_KEY를 요청합니다
클라이언트의 환경 변수에 비어있지 않은 값으로 설정해 주세요. CCR-Rust는 자체 설정 파일에 있는 키를 사용하여 상위 시스템(upstream) 인증을 수행합니다.