---
title: "모델 및 사용량 검증"
description: "호출 로그와 다섯 가지 검사를 사용하여 각 호출의 모델, 토큰 사용량, 비용을 검증합니다."
headingIds: {"호출 로그":"section-1","다섯 가지 검사":"section-2","스크립트로 처음 네 가지 검사 완료하기":"section-3","thinking 블록":"section-4","불일치가 발견될 때":"section-5","자주 묻는 질문":"section-6"}
---

<aside className="docs-publication" data-pagefind-ignore>

[1ZheAI](https://1zheai.com/en/editorial/#publisher)가 관리하는 문서입니다. [출처 및 수정 사항](https://1zheai.com/en/editorial/).

오류를 발견하셨나요? 페이지 주소와 설명을 첨부하여 [고객 지원](mailto:support@1zheai.com)으로 문의해 주세요. API 키나 계정 정보는 보내지 마세요.

</aside>
## 호출 로그

모든 호출은 콘솔의 [호출 로그](/ko/docs/usage-logs/)에 기록되며, 모델, 입력, 출력, 캐시 읽기, 캐시 쓰기 토큰 사용량과 비용이 나열됩니다.

## 다섯 가지 검사

다음 검사는 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 또는 기타 신뢰할 수 있는 출처와 비교 | 결과가 눈에 띄게 나쁘거나, 비정상적인 거부, 자주 잘림 |

<Warning>

이 검사들은 필드와 형식의 차이만 감지할 수 있으며, 실제 사용 중인 모델을 단독으로 확인할 수는 없습니다. `model` 필드는 재작성될 수 있고, 형식은 모방될 수 있습니다.

</Warning>

## 스크립트로 처음 네 가지 검사 완료하기

`bash`, `curl`, `jq`이 필요합니다. 스크립트는 다섯 번의 작은 호출을 수행하며, 그중 하나는 약 18,000 토큰을 캐시에 기록하고 정상 가격으로 과금됩니다.

```bash title="verify.sh"
#!/usr/bin/env bash
# 用法：ONEZHE_API_KEY=sk-你的API密钥 bash verify.sh [模型ID]
set -euo pipefail
BASE="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은 핵심 필드만 유지):

```text
== 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. 工具调用 ID
toolu_01UPsdyKX8M9fJTTkDoSKHXA
== 4. 流式事件序列
event: message_start
event: content_block_start
event: ping
event: content_block_delta
event: content_block_stop
event: message_delta
event: message_stop
```

`ping` 이벤트가 나타나는지, 어디에 나타나는지는 고정되어 있지 않으며 판단에 영향을 주지 않습니다.

## 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"`을 추가하세요:

```json
"thinking": {"type": "adaptive", "display": "summarized"}
```


제3자 감지 웹사이트를 사용할 때는 전용 API 키를 생성하고 테스트 후 삭제하는 것이 좋습니다.

## 불일치가 발견될 때

support@1zheai.com으로 요청 시각, 모델 ID, 전체 응답 내용(API 키 제거), 해당 검사 항목을 포함하여 이메일을 보내세요. 응답 내용이나 오류 메시지의 request id는 이 호출을 찾는 데 도움이 됩니다.

## 자주 묻는 질문

<AccordionGroup>
<Accordion title="Is asking the model &quot;Who are you?&quot; reliable?">

신뢰할 수 없습니다. 모델의 자기소개는 시스템 프롬프트의 영향을 받으며, 특정 프롬프트에서는 자신의 버전을 잘못 답할 수 있습니다. 반환된 필드와 이벤트 형식을 확인하는 것이 더 유용합니다.

</Accordion>
<Accordion title="Opus를 선택했는데 호출 로그에 왜 Haiku가 나타나나요?">

Claude Code는 일부 백그라운드 작업에 Haiku 모델을 사용하며, 해당 기록이 호출 로그에 나타납니다. 이러한 작업에 사용할 모델을 지정하려면 `ANTHROPIC_DEFAULT_HAIKU_MODEL` 환경 변수를 사용할 수 있습니다. [Claude Code 연동](/ko/docs/quickstart-claude-code/)을 참조하세요. Claude Code를 사용하지 않을 때 이러한 현상이 발생하면 요청 시각을 support@1zheai.com으로 보내주세요.

</Accordion>
</AccordionGroup>
