0. 한 줄 결론
플랫폼은 OpenAI Responses API 엔드포인트 POST /v1/responses를 구현했으며, 구현 시 명확히 Codex 요구에 맞게 설계되었습니다(스트리밍 SSE 이벤트 시퀀스, function 도구 호출, store:false 무상태 호환).
따라서 Codex CLI에는 두 가지 연결 방법이 있습니다:
- 직접 연결(권장):
~/.codex/config.toml에wire_api = "responses"를 설정하고, 직접/v1/responses를 사용합니다; - cc-switch: 그래픽 도구로 한 번의 클릭으로 Codex / Claude Code 등의 provider를 전환합니다.
두 방식의 과금은 완전히 동일합니다(동일한 사전 차감 → 라우팅 → 정산 → 원장 파이프라인).
1. 사전 조건
| 항목 | 요구사항 |
|---|---|
| Codex CLI | 설치 완료(v0.142.4+ 권장, codex --version 확인 가능) |
| RouteAll 계정 | 가입 완료, Console → API Keys에서 API Key 생성 |
| API Key | 접두사 sk-ra-, 한 번만 표시되며, 복사 시 완전해야 함; 하나의 키로 모든 모델과 엔드포인트 사용 가능 |
| 잔액 | 충전 완료(토큰 단위 과금; 잔액 부족 시 402 반환) |
| 모델명 | 플랫폼의 정식 모델명(§5.1 조회 참고, /v1/models 실제 반환값 기준) |
2. 플랫폼 측 기능 및 한계(/v1/responses)
- 엔드포인트:
POST https://routeall.ai/v1/responses - 인증:
Authorization: Bearer sk-ra-...
2.1 지원 기능(Codex 호환)
| 기능 | 설명 |
|---|---|
| 텍스트 입력 / 출력 | 비스트리밍 JSON + 스트리밍 SSE 모두 지원 |
| function 도구 호출 | Codex 에이전트 루프: tools 업스트림 전달 + function_call 스트리밍 이벤트 + function_call_output 입력 재주입 |
| 스트리밍 | 완전한 Responses SSE 이벤트 시퀀스 생성: response.created → output_item.added → output_text.delta → output_item.done → response.completed(Codex에 필요한 세 가지 불변 조건 충족) |
reasoning.effort |
reasoning_effort로 전달 |
| 알 수 없는 필드 관대성 | store / include / text / metadata 등 모두 무시, 400 오류 발생 안 함(Codex 호환) |
2.2 한계(무상태 텍스트 서브셋)
| 필드 | 동작 |
|---|---|
previous_response_id |
무시 —— 무상태; Codex는 store:false로 매 턴 전체 input을 전송하므로 자연스럽게 호환 |
input_image |
건너뜀(이미지 part는 요청을 중단하지 않고 텍스트만 추출) |
내장 도구(web_search 등) |
무시 —— type: "function" 도구만 전달 |
stream: true + 비정상 input |
400(Responses 오류 봉투) |
2.3 과금 및 오류
- 과금:
/v1/chat/completions와 완전히 동일한 파이프라인, 실제 charge는 동등; 응답 헤더X-RouteAll-Charge-Credit는 소매 과금액(원가 아님). - 오류 봉투:
{ "error": { "message", "type", "code", "param" } }; HTTP 상태: 401(키 없음/잘못됨), 402(잔액 부족), 429(속도 제한), 400(매개변수 오류), 503(업스트림 전체 불가).
3. 방법 1: Codex CLI 직접 연결(Responses API, 권장)
3.1 ~/.codex/config.toml 설정
model = "deepseek-v4-pro" # 기본 모델, 스토어의 정식 명칭으로 변경
model_provider = "routeall"
[model_providers.routeall]
name = "RouteAll"
base_url = "https://routeall.ai/v1" # 플랫폼 OpenAI 호환 base URL(/responses 제외)
env_key = "ROUTEALL_API_KEY"
wire_api = "responses" # responses = /v1/responses 사용(권장)
3.2 환경 변수 설정
# Linux / macOS
export ROUTEALL_API_KEY="sk-ra-당신의KEY"
# Windows PowerShell
# $env:ROUTEALL_API_KEY = "sk-ra-당신의KEY"
3.3 실행
codex
3.4 임시 모델 전환
codex --model Codex-haiku-4-5 "이 모듈을 리팩토링해줘"
codex --model deepseek-v4-flash "이 정규식을 설명해줘"
3.5 wire_api 정보
| wire_api | 실제 엔드포인트 | 설명 |
|---|---|---|
responses |
POST /v1/responses |
네이티브 Responses 프로토콜(Codex 기본 프로토콜), 스트리밍/도구 호출 모두 지원, 권장 |
chat |
POST /v1/chat/completions |
OpenAI 호환 형태; 플랫폼은 DTO(B15)를 완화하여 content:null 도구형 다중 턴 호출 지원 |
참고: 게이트웨이
api.서브도메인은 현재 외부에 공개되지 않았습니다(서버PUBLIC_API_DOMAIN=api.localhost내부용);/v1/*은 메인 사이트routeall.ai에서 직접 제공되므로 base_url은https://routeall.ai/v1을 사용합니다.
4. 방법 2: cc-switch(그래픽 원클릭 전환)
cc-switch는 오픈소스 공급자 전환 도구(farion1231/cc-switch)로, Codex / Claude Code / OpenCode / Gemini 등의 provider 설정을 관리하고 클릭 한 번으로 전환할 수 있습니다.
4.1 설치
GitHub farion1231/cc-switch → Releases에서 해당 시스템 설치 패키지 다운로드(Windows / macOS / Linux).
4.2 새 공급자 추가
- cc-switch를 열고 Codex 탭으로 이동 → 「새 공급자 추가」;
- 입력:
- 공급자 이름:
RouteAll(임의) - API Host / Base URL:
https://routeall.ai/v1 - API Key:
sk-ra-당신의KEY - 모델 목록: 플랫폼 정식 모델명(예:
deepseek-v4-pro,Codex-haiku-4-5, 여러 줄 가능)
- 공급자 이름:
- 저장.
4.3 적용 및 전환
RouteAll 선택 → 「전환 / 활성화」. cc-switch가 provider 설정을 ~/.codex/config.toml에 기록합니다(방법 1의 설정과 동일). 이후 정상적으로 codex를 실행하면 됩니다.
참고: cc-switch 일부 버전은 Codex의 프로토콜을
/v1/chat/completions(즉wire_api = "chat")로 변경할 수 있습니다. 플랫폼은 두 경로 모두 지원합니다(B15에서 도구형 클라이언트의 chat 400 문제 수정). 만약 프로토콜 선택이 가능한 버전이라면, Responses를 선택하는 것이 네이티브에 더 적합합니다.
5. 검증
5.1 사용 가능한 모델 목록 가져오기(목록 기준, 모델명 추측 금지)
curl https://routeall.ai/v1/models \
-H "Authorization: Bearer sk-ra-당신의KEY"
# 또는 공개 디렉터리(인증 불필요, 채널이 있는 모델만 나열)
curl https://routeall.ai/v1/public/models
5.2 비스트리밍(연결 확인)
curl https://routeall.ai/v1/responses \
-H "Authorization: Bearer sk-ra-당신의KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-pro",
"input": "안녕, 한 문장으로 너를 소개해줘",
"max_output_tokens": 200
}'
성공 시 Responses 형식(output[].content[].output_text + output_text + usage)이 반환됩니다.
5.3 스트리밍(Codex 실제 형태)
curl -N https://routeall.ai/v1/responses \
-H "Authorization: Bearer sk-ra-당신의KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-pro",
"input": "짧은 농담 하나 해줘",
"stream": true
}'
이벤트 순서: response.created → output_item.added → output_text.delta ×N → output_item.done → response.completed.
5.4 도구 호출(에이전트 루프 형태)
curl https://routeall.ai/v1/responses \
-H "Authorization: Bearer sk-ra-당신의KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-pro",
"input": [{"role": "user", "content": "17*23을 계산해줘"}],
"tools": [{
"type": "function",
"function": {
"name": "calculator",
"description": "사칙연산 수행",
"parameters": {
"type": "object",
"properties": { "expr": { "type": "string" } }
}
}
}],
"tool_choice": "auto"
}'
output에 type: "function_call" 항목(call_id / name / arguments)이 포함되며, 이후 function_call_output 항목을 다시 보내 결과를 주입하고 멀티 턴을 계속할 수 있습니다.
6. 문제 해결
| 증상 | 원인 및 조치 |
|---|---|
401 Unauthorized |
키가 잘못되었거나 복사 누락/비활성화. 키는 sha256만 저장되며 백오피스에서 평문 확인 불가, 생성 시 반드시 완전히 복사하세요 |
402 Insufficient balance |
잔액 부족, Console에서 충전(CNY / USD / USDT) |
429 Rate limited |
키당 분당 요청 제한(기본 60 RPM, 조정 가능); 동시성 낮추거나 지수 백오프 후 재시도 |
400 매개변수 오류 |
응답 본문 error.message 확인(예: Responses input 형식 오류, 모델명 부재) |
503 업스트림 오류 |
해당 모델의 모든 채널을 사용할 수 없음, 모델 변경 또는 나중에 재시도 |
| 모델 '존재하지 않음/호출 불가' | 모델명은 /v1/models 반환값의 정식 명칭이어야 하며, active + 채널이 존재해야 함; 추측하지 마세요 |
Codex에서 stream closed before response.completed 오류 |
일반적으로 네트워크 중단; 게이트웨이에서 정상 종료 처리(completed 여전히 전송), 재시도 |
| Codex에서 413 Payload Too Large | 플랫폼 요청 본문 상한 확대(Codex 긴 컨텍스트 문제 수정됨); 계속 발생하면 컨텍스트 축소 |
7. 과금 및 보안 안내
- 과금 기준: 모델 공식 가격 × 사용자 그룹 배율; 스트리밍은 실제 usage 기준 정산; 캐시 적중 시 전액 청구(B12 전략, 캐시 차익은 플랫폼 귀속, 고객 charge는 변함 없음).
- 과금 가시성: 응답 헤더
X-RouteAll-Charge-Credit(소매 금액);cost/margin은 사용자 응답에 절대 포함되지 않음(INV-8). - 키 보안:
sk-ra-는 sha256만 저장, 백오피스에서 확인 불가; 절대 클라이언트나 저장소에 포함하지 마세요. - 작은 모델(curl 검증)로 먼저 연결을 확인한 후, Codex / 긴 작업으로 전환하는 것을 권장합니다.