저렴한 Claude Code용 리레이(API 중계)를 사용하기 전에, '정말로 Claude가 답변하고 있는지' 스스로 확인할 수 있는 절차를 정리했습니다. 전반부는 Claude Code가 읽는 환경 변수에 관한 내용이며, 후반부는 어떤 리레이에도 사용할 수 있는 검증 방법입니다. 필자는 CoreCode라는 리레이를 운영하고 있습니다(마지막에 공개).
공식 문서(환경 변수, LLM 게이트웨이 연결)에 따르면 다음과 같습니다.
ANTHROPIC_BASE_URL
: API의 엔드포인트를 프록시나 게이트웨이로 지정합니다. -
ANTHROPIC_AUTH_TOKEN
: Authorization: Bearer 헤더로 전송됩니다. -
ANTHROPIC_API_KEY
: x-api-key 헤더로 전송됩니다. 설정할 경우, 로그인된 구독보다 우선합니다(대화 모드에서는 최초 승인이 필요합니다). -
ANTHROPIC_DEFAULT_OPUS_MODEL / SONNET / HAIKU
: 각각의 별칭이 가리키는 모델 ID를 변경합니다.
리레이가 어떤 헤더를 읽는지에 따라 변수를 선택합니다. 헷갈린다면 ANTHROPIC_AUTH_TOKEN부터 시도해보고, 401 에러가 나면 다른 것으로 전환하는 것이 공식 안내입니다. ~/.claude/settings.json의 env에 작성하면 셸(shell) 시작 방식과 관계없이 반영됩니다.
{
"env": {
"ANTHROPIC_BASE_URL": "https://relay.example",
...
}
claude를 실행하여 /status를 실행하고, 'Anthropic base URL' 줄이 리레이 주소로 되어 있는지, 그리고 'Auth token' 또는 'API key' 줄이 있는지 확인합니다. 'Login method'에 claude.ai 계정이 표시된다면 인증 정보가 제대로 작동하지 않은 것입니다.
'Claude Code에서 사용 가능하다는 것'과 'Claude가 답변하는 것'은 별개입니다. 예를 들어 Z.ai의 GLM Coding Plan은 동일한 ANTHROPIC_BASE_URL / ANTHROPIC_AUTH_TOKEN 메커니즘으로 Claude Code를 연결하고, Opus / Sonnet / Haiku 변수를 GLM 모델에 대응시킵니다(Z.ai 문서). 이는 공식적으로 명시된 사용법이므로 부정하지는 않지만, 답변하는 주체는 Claude가 아닙니다. 참고로 Anthropic 측은 게이트웨이를 통해 Claude 이외의 모델에 Claude Code를 연결하는 사용법을 지원하지 않는다고 언급했습니다(LLM gateway). 문제는 비-Claude 모델을 조용히 반환하는 리레이가 존재할 수 있다는 점입니다.
모델에게 '당신은 누구입니까?'라고 물어봐도 의미가 없습니다. 시스템 프롬프트에 한 줄만 작성하면 어떤 모델이든 Claude인 척 할 수 있습니다. 봐야 할 것은 그 행동(behavior)입니다.
claude-relay-check는 표준 라이브러리만을 사용한 Python 1 파일이며, 비용은 몇 센트 수준입니다. README에 따르면 다음 세 가지를 조사합니다.
shape: 응답이 Anthropic Messages 형식인지 확인합니다 (type, msg_로 시작하는 id, usage). -
cache: 약 18,000 토큰의 cache_control이 붙은 프롬프트를 두 번 보내서, 쓰기(write)와 읽기(read)가 동일한 양인지 확인합니다. -
signature: thinking 블록의 서명(signature)을 한 글자 변경하여 다시 보내고 400 에러로 거부되는지 확인합니다. Anthropic은 변조된 서명은 반드시 400으로 처리한다고 설명했습니다(Preserved thinking).
curl -fsSLO https://raw.githubusercontent.com/CoreCodeAI/claude-relay-check/main/check-relay.py
python3 check-relay.py --base-url https://relay.example --key sk-your-key --model claude-sonnet-5-5
--base-url과 --key
생략하면 Claude Code가 사용하는 환경 변수를 읽습니다. README에 명시된 한계는 두 가지입니다. 상위 공급자가 Anthropic임을 보여줄 뿐, 선택한 등급(Opus인지 Sonnet인지)까지는 보여주지 못합니다. 또한 1회 추출이므로 시간을 두고 재실행해야 합니다. Claude Code 이외의 클라이언트를 403으로 거부하는 리레이에서는 ERROR가 되어 진위 판별을 할 수 없습니다.
ModelTrace는 모델에게 긴 정수열을 3회 생성하게 하고, 그 숫자의 분포를 알려진 모델의 지문과 비교하여 계보와 버전을 추정하는 도구입니다. README에 따르면 결과는 지문 라이브러리에 수록된 모델 범위 내에서의 확률이며, 미수록 모델은 가장 가까운 후보로 분류됩니다. 참고 값으로 사용해 주십시오.
Claude Code는 매 턴마다 동일한 서두(시스템 프롬프트나 도구 정의)를 보내기 때문에, 캐시 적중률이 요금을 좌우합니다. Anthropic은 캐시 읽기를 기본 입력 단가의 0.1배(모델에 따라 0.05배 등 예외 있음), 5분 캐시 쓰기를 1.25배로 책정하고 있습니다 (Prompt caching). 동일한 요청을 2회 보내 usage를 비교합니다.
python3 - > /tmp/body.json <<'PY'
import json
t = "Reference note: " + "the quick brown fox jumps over the lazy dog. " * 1500
...
첫 번째에 cache_creation_input_tokens가, 두 번째에 비슷한 수준의 cache_read_input_tokens가 나오면 기대한 대로입니다. 둘 다 0이라면, 캐시가 작동하지 않거나 사용량을 리레이가 자체적으로 계산하고 있는 경우일 수 있습니다. 쓰기만 하고 읽히지 않는 경우는 요청이 매번 다른 계정에 도달하고 있을 가능성이 있습니다.
- 입력, 출력, 캐시 쓰기, 캐시 읽기가 각각 Anthropic과 동일한 비율로 과금되는지.
- 요청 단위의 사용량과 금액이 로그에서 확인 가능한지.
- 하나의 세션이 같은 계정에 고정되는지 (캐시가 유지되는 조건입니다).
- "할인율"이 무엇을 기준으로 하는지.
필자는 CoreCode(corecode.live)를 운영하고 있으며, 이는 검증 절차의 한 예시로 언급합니다. CoreCode는 모든 요청을 Anthropic 공식 Claude 계정이 처리하는 리레이입니다. 결제는 Alipay와 WeChat Pay의 위안화(CNY)만 가능하며, 일본 엔이나 신용카드는 지원하지 않습니다. 자체 검증 페이지는 여기에 있으며, 위의 스크립트는 CoreCode를 포함하여 어떤 리레이에도 사용할 수 있습니다. Anthropic 공식 서비스가 아닙니다.