Проверка модели и использования
Что можно проверить в ответах, инструментах и журнале и чего эти проверки не доказывают.
Сверьте запрошенный model ID, возвращённые поля, поддерживаемые функции, использование и запись в журнале. Ответ на вопрос «какая ты модель?» не является надёжным доказательством происхождения.
Минимальные проверки
Раздел «Минимальные проверки»Используйте короткий запрос, поток и необходимый инструментальный сценарий из примеров ниже. Проверьте завершение, usage и результат обработки инструмента. Для Sonnet 5.5 и других 5.x в указанном инструментальном примере применяется tool_choice: auto: принудительный выбор вроде tool или any может давать 400.
Отдельный успешный ответ не подтверждает все функции, весь диапазон контекста или постоянную доступность. Скорость, стиль текста, поля имени модели и биллинг по отдельности также не доказывают источник.
При расхождении
Раздел «При расхождении»Сохраните время, модель, протокол, идентификатор запроса и обезличенный ответ. Сопоставьте с журналом и правилами оплаты. Удалите ключ и приватные данные перед отправкой в поддержку.
Примеры запросов и конфигурации
Раздел «Примеры запросов и конфигурации»Используйте пример для выбранного протокола и версии клиента. Замените учебные ключи и идентификаторы моделей своими. Команды выполняются на вашем компьютере или сервере.
#!/usr/bin/env bash# Использование:ONEZHE_API_KEY=sk-YOUR_API_KEY bash verify.sh [MODEL_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== 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_startevent: content_block_startevent: pingevent: content_block_deltaevent: content_block_stopevent: message_deltaevent: message_stop"thinking": {"type": "adaptive", "display": "summarized"}