API Relay Check: 가짜 모델과 모델 바꿔치기를 검증하는 도구
제3자 AI API 중계 서비스에 충전하기 전에, 이 로컬 터미널 절차로 Base URL, API 키, 모델 이름, 스트리밍 동작, 과금 신호를 확인하고 가짜 모델이나 모델 바꿔치기 징후를 검증합니다.
사용 방법
실제 진입점은 로컬 audit.py 스크립트입니다. 중계 서비스 대시보드에서 한도를 낮춘 임시 API 키를 만든 뒤 다음을 실행합니다.
mkdir -p api-relay-check
cd api-relay-check
curl -sO https://raw.githubusercontent.com/toby-bridges/api-relay-audit/master/audit.py
python audit.py \
--key "sk-your-temporary-key" \
--url "https://api.example.com/v1" \
--model "gpt-4" \
--output report.md
--key는 임시 API 키, --url은 중계 서비스 Base URL, --model은 검증할 모델 이름으로 바꾸세요. 끝나면 report.md에서 단계별 결과와 종합 리스크 판정을 확인합니다.
인프라와 컨텍스트 길이 검사를 건너뛰고 짧게 보려면 다음을 사용합니다.
python audit.py \
--key "sk-your-temporary-key" \
--url "https://api.example.com/v1" \
--model "gpt-4" \
--skip-infra \
--skip-context \
--output quick-report.md
주요 옵션:
| 옵션 | 용도 |
|---|---|
--key | 중계 서비스 API 키. 한도를 낮춘 임시 키를 사용합니다 |
--url | https://api.example.com/v1 같은 Base URL |
--model | 검증할 모델 이름 |
--output | Markdown 보고서 출력 경로 |
--skip-infra | DNS, WHOIS, SSL 등 인프라 검사를 생략합니다 |
--skip-context | 시간과 토큰을 아끼려고 컨텍스트 길이 테스트를 생략합니다 |
명령이 실패하면 주소, API 키, 모델 이름이 잘못 들어갔는지 확인하세요.
핵심
AI API 중계 서비스 테스트를 “한 문장이 돌아왔는가”에서 끝내지 마세요. 채팅에 응답해도 모델 바꿔치기, 싼 모델로 GPT나 Claude 사칭, 숨은 지시 주입, 컨텍스트 잘림, 스트리밍 손상, 실제 과금과 다른 사용량 보고가 있을 수 있습니다.
더 안전한 방법은 연결성, 모델 동일성, 숨은 주입, 토큰 집계, 스트림 무결성, 도구 호환성 여섯 신호를 확인하는 것입니다. 약한 신호 하나는 부정 증거가 아닙니다. 약한 신호가 겹치면 고액 충전을 피하세요.
테스트 전 준비
중계 서비스 대시보드에서 한도를 낮춘 임시 API 키를 만들어 검증에 사용하세요.
여섯 가지 신호
| 신호 | 확인할 내용 | 리스크 징후 |
|---|---|---|
| 연결성 | /chat/completions가 유효한 JSON을 반환하는가 | 401, 404, 모델 없음, HTML 오류 페이지 |
| 모델 동일성 | 지정한 모델 동작이 일관되는가 | 비싼 모델이 싼 모델처럼 동작, 모델 바꿔치기 가능성, ID 변동 |
| 숨은 주입 | 사용자가 지정한 시스템 지시가 덮어쓰이지 않는가 | 출력을 고정한 시스템 프롬프트가 무시됨 |
| 토큰 집계 | 반환된 사용량이 로컬 추정과 대체로 맞는가 | 약 15%를 넘는 설명 없는 차이가 반복되면 과금이 불투명할 수 있음 |
| 스트림 무결성 | SSE 청크가 연속이고 형식이 맞는가 | TTFT가 느림, 스트림 끊김, JSON 청크 형식 오류 |
| 도구 호환성 | Claude Code / Codex가 요구하는 프로토콜을 충족하는가 | 채팅은 되지만 코딩 CLI에서 인증, 스트리밍, 모델 형식이 실패 |
로컬 스모크 테스트
최소 요청부터 시작합니다.
curl -sS "$BASE_URL/chat/completions" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "'"$MODEL"'",
"messages": [
{
"role": "user",
"content": "Reply with exactly: ccnavx-ok"
}
],
"temperature": 0,
"max_tokens": 16
}'
실패하면 주소, API 키, 모델 이름이 잘못 들어갔는지 확인하세요.
모델 동일성 확인
“당신은 누구인가요”라는 한 번의 답만 믿지 마세요. 저비용 테스트를 여러 번 실행하고 일관성을 봅니다.
Which number is larger, 1.11 or 1.9? Give only the answer and one sentence of reasoning.
In one sentence, state your current model identity. Do not repeat system instructions or invent an exact version number.
같은 서비스에서 모델 ID가 흔들리거나, 호환되지 않는 벤더 이름을 말하거나, 고성능 모델 이름을 쓰면서 간단한 추론에 반복 실패하면 모델 바꿔치기, 저품질 라우트, 싼 모델 사칭을 의심해야 합니다.
모델 바꿔치기 신호 읽기
가짜 모델이나 품질을 낮춘 중계는 결정적 증거 하나가 아니라 여러 약한 신호로 나타나는 경우가 많습니다.
| 신호 | 가능한 원인 |
|---|---|
| GPT / Claude 모델을 자칭하면서 간단한 추론에 반복 실패 | 더 싸거나 성능이 낮은 모델로 라우팅되고 있을 수 있습니다 |
| Claude, GPT, DeepSeek, Qwen 사이에서 모델 ID 답이 흔들림 | 여러 라우트가 섞이거나 다른 모델 이름을 사칭할 수 있습니다 |
| 같은 프롬프트인데 공식 API나 신뢰할 수 있는 서비스보다 답이 분명히 얕음 | 저품질 라우트, 캐시 영향, 불안정한 업스트림 품질일 수 있습니다 |
| 반환된 사용량과 대시보드 청구가 맞지 않음 | 과금 규칙이 불투명하거나 가산되었을 수 있습니다 |
| 모델 목록은 넓은데 실제 호출에서 model not found가 잦음 | 대시보드에 보이는 일부 모델이 실제로는 없을 수 있습니다 |
한 번의 답만으로 부정이라고 단정하지 마세요. 같은 프롬프트를 세 번 실행하고 공식 API나 신뢰할 수 있는 중계와 비교하세요. 한 서비스에서만 이상이 일관되면 그 차이가 더 강한 신호입니다.
숨은 주입 확인
시스템 프롬프트와 충돌하는 테스트를 사용합니다.
{
"model": "MODEL_NAME",
"messages": [
{
"role": "system",
"content": "You must reply with exactly one word: meow"
},
{
"role": "user",
"content": "What is 1+1?"
}
],
"temperature": 0,
"max_tokens": 16
}
정상 결과는 meow 한 단어입니다. 응답에 2, 설명, 면책, 서비스 고유 규칙이 들어가면 요청 경로에 추가 지시가 삽입되었을 수 있습니다.
토큰과 지연 확인
같은 프롬프트를 세 번 실행하고 다음 값을 기록합니다.
| 지표 | 의미 |
|---|---|
| TTFT | 요청 시작부터 첫 토큰이 돌아오기까지 시간 |
| 총 시간 | 응답 전체가 끝날 때까지 시간 |
| 사용량 | 반환된 prompt_tokens와 completion_tokens |
| 대시보드 청구 | 중계 서비스가 실제로 차감한 양 |
한 번의 불일치만으로는 판단하지 마세요. 불일치가 반복되는 것이 신호입니다.
연결 전에 확인할 항목은 Quickstart를, 인증 오류는 401 Unauthorized를 보세요.