모델 및 사용량 검증
호출 로그와 다섯 가지 검사를 사용하여 각 호출의 모델, 토큰 사용량, 비용을 검증합니다.
호출 로그
제목이 “호출 로그”인 섹션모든 호출은 콘솔의 호출 로그에 기록되며, 모델, 입력, 출력, 캐시 읽기, 캐시 쓰기 토큰 사용량과 비용이 나열됩니다.
다섯 가지 검사
제목이 “다섯 가지 검사”인 섹션다음 검사는 Anthropic API의 공개 형식과 비교하여 반환된 필드와 형식의 차이를 감지합니다.
| 검사 | 예상 결과 | 주의할 점 |
|---|---|---|
1. 반환된 model 필드 | 요청한 모델 ID와 일치 | 다른 모델 이름이 반환되거나 필드가 없음 |
| 2. 캐시 읽기 | 캐시 조건을 충족하는 동일한 요청을 캐시 유효 기간 내에 두 번 전송; 두 번째 cache_read_input_tokens이 0보다 큼 | 항상 0이거나 usage에 캐시 필드가 없음 |
| 3. 도구 호출 ID | tool_use 블록의 id이 toolu_으로 시작 | 다른 형식이거나 모델이 요구대로 도구를 호출하지 않음 |
| 4. 스트리밍 이벤트 순서 | message_start, content_block_start, content_block_delta, message_delta, message_stop이 순서대로 나타남 | OpenAI 형식의 data: 블록만 있거나 이벤트가 누락되거나 순서가 다름 |
| 5. 실제 작업 비교 | 고정된 작업을 사용하여 결과를 공식 API 또는 기타 신뢰할 수 있는 출처와 비교 | 결과가 눈에 띄게 나쁘거나, 비정상적인 거부, 자주 잘림 |
이 검사들은 필드와 형식의 차이만 감지할 수 있으며, 실제 사용 중인 모델을 단독으로 확인할 수는 없습니다. model 필드는 재작성될 수 있고, 형식은 모방될 수 있습니다.
스크립트로 처음 네 가지 검사 완료하기
제목이 “스크립트로 처음 네 가지 검사 완료하기”인 섹션bash, curl, jq이 필요합니다. 스크립트는 다섯 번의 작은 호출을 수행하며, 그중 하나는 약 18,000 토큰을 캐시에 기록하고 정상 가격으로 과금됩니다.
#!/usr/bin/env bash# 用法:ONEZHE_API_KEY=sk-你的API密钥 bash verify.sh [模型ID]set -euo pipefailBASE="https://1zheai.com"MODEL="${1:-claude-sonnet-5-5}"H=(-H "x-api-key: $ONEZHE_API_KEY" -H "anthropic-version: 2023-06-01" -H "content-type: application/json")
echo "== 1. model 字段"curl -s "$BASE/v1/messages" "${H[@]}" \ -d "$(jq -n --arg m "$MODEL" '{model:$m,max_tokens:16,messages:[{role:"user",content:"ping"}]}')" \ | jq 'if .error then .error else {id, model, usage} end'
echo "== 2. 缓存:同一请求发两次,看第二次的 cache_read_input_tokens"LONG=$(printf '这是一段用来测试缓存的固定文本,内容不重要,长度够就行。%.0s' {1..600})BODY=$(jq -n --arg m "$MODEL" --arg t "$LONG" '{model:$m,max_tokens:16, system:[{type:"text",text:$t,cache_control:{type:"ephemeral"}}], messages:[{role:"user",content:"ping"}]}')for i in 1 2; do curl -s "$BASE/v1/messages" "${H[@]}" -d "$BODY" | jq -c 'if .error then .error else .usage end'done
echo "== 3. 工具调用 ID"curl -s "$BASE/v1/messages" "${H[@]}" \ -d "$(jq -n --arg m "$MODEL" '{model:$m,max_tokens:256, tools:[{name:"get_weather",description:"查询城市天气", input_schema:{type:"object",properties:{city:{type:"string"}},required:["city"]}}], tool_choice:{type:"auto"}, messages:[{role:"user",content:"北京今天天气怎么样"}]}')" \ | jq -r 'if .error then .error.message else (.content[]? | select(.type=="tool_use") | .id) end'
echo "== 4. 流式事件序列"curl -sN "$BASE/v1/messages" "${H[@]}" \ -d "$(jq -n --arg m "$MODEL" '{model:$m,max_tokens:32,stream:true,messages:[{role:"user",content:"数到三"}]}')" \ | grep '^event:' | uniq검사 3은 tool_choice: auto을 사용합니다. Sonnet 5.5와 같은 5.x 모델은 도구 사양 강제({"type":"tool"} 또는 {"type":"any"})를 지원하지 않으며 400 does not support forced tool_choice을 반환합니다.
2026-10-15에 claude-sonnet-5-5으로 테스트한 결과는 다음과 같습니다(검사 1은 핵심 필드만 유지):
== 1. model 字段{ "id": "msg_011Cg3Esh8zeEdLeXAPVALKe", "model": "claude-sonnet-5-5", "usage": { "input_tokens": 518, "cache_creation_input_tokens": 0, "cache_read_input_tokens": 0, "output_tokens": 12, ... }}== 2. 缓存:同一请求发两次,看第二次的 cache_read_input_tokens{"input_tokens":23,"cache_creation_input_tokens":17920,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":17920,"ephemeral_1h_input_tokens":0},"output_tokens":4,"output_tokens_details":{"thinking_tokens":0},"service_tier":"standard","inference_geo":"global"}{"input_tokens":23,"cache_creation_input_tokens":0,"cache_read_input_tokens":17920,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":0},"output_tokens":4,"output_tokens_details":{"thinking_tokens":0},"service_tier":"standard","inference_geo":"global"}== 3. 工具调用 IDtoolu_01UPsdyKX8M9fJTTkDoSKHXA== 4. 流式事件序列event: message_startevent: content_block_startevent: pingevent: content_block_deltaevent: content_block_stopevent: message_deltaevent: message_stopping 이벤트가 나타나는지, 어디에 나타나는지는 고정되어 있지 않으며 판단에 영향을 주지 않습니다.
thinking 블록
제목이 “thinking 블록”인 섹션thinking이 활성화되면 반환되는 thinking 블록에는 signature 필드가 포함되며, 이는 형식 검사로도 사용할 수 있습니다. 5.x 모델의 구문은 4.x와 다르며, 2026-10-15에 테스트했습니다:
| 모델 | thinking 매개변수 | 결과 |
|---|---|---|
claude-sonnet-4-6 | {"type":"enabled","budget_tokens":1024} | thinking 텍스트와 signature이 포함된 thinking 블록 반환 |
claude-sonnet-5 | {"type":"enabled","budget_tokens":1024} 또는 {"type":"adaptive"} | 둘 다 작동 |
claude-sonnet-5-5 | {"type":"adaptive"} | 작동; enabled을 전달하면 400 반환, adaptive만 지원함을 의미 |
5.x 모델의 thinking 블록은 기본적으로 signature만 포함하며 thinking 텍스트는 빈 문자열입니다. thinking 요약을 보려면 "display": "summarized"을 추가하세요:
"thinking": {"type": "adaptive", "display": "summarized"}제3자 감지 웹사이트를 사용할 때는 전용 API 키를 생성하고 테스트 후 삭제하는 것이 좋습니다.
불일치가 발견될 때
제목이 “불일치가 발견될 때”인 섹션[email protected]으로 요청 시각, 모델 ID, 전체 응답 내용(API 키 제거), 해당 검사 항목을 포함하여 이메일을 보내세요. 응답 내용이나 오류 메시지의 request id는 이 호출을 찾는 데 도움이 됩니다.
자주 묻는 질문
제목이 “자주 묻는 질문”인 섹션Is asking the model "Who are you?" reliable?
신뢰할 수 없습니다. 모델의 자기소개는 시스템 프롬프트의 영향을 받으며, 특정 프롬프트에서는 자신의 버전을 잘못 답할 수 있습니다. 반환된 필드와 이벤트 형식을 확인하는 것이 더 유용합니다.
Opus를 선택했는데 호출 로그에 왜 Haiku가 나타나나요?
Claude Code는 일부 백그라운드 작업에 Haiku 모델을 사용하며, 해당 기록이 호출 로그에 나타납니다. 이러한 작업에 사용할 모델을 지정하려면 ANTHROPIC_DEFAULT_HAIKU_MODEL 환경 변수를 사용할 수 있습니다. Claude Code 연동을 참조하세요. Claude Code를 사용하지 않을 때 이러한 현상이 발생하면 요청 시각을 [email protected]으로 보내주세요.
