Кэши подсказок привязаны к конкретной модели. Когда Claude Fable 5 отклоняет запрос и вы повторяете его на другой модели, префикс разговора, который уже был закэширован для Claude Fable 5, должен быть записан в кэш новой модели с нуля, а запись в кэш стоит дороже, чем чтение из кэша. «Fallback credit» (кредит на резервный запрос) устраняет эту дополнительную стоимость: отказ содержит токен кредита, вы передаёте этот токен при повторной попытке, и повторный запрос тарифицируется так, как если бы разговор с самого начала вёлся на новой модели.
Эта страница нужна вам только в том случае, если вы реализуете повторную попытку самостоятельно: на Ruby или PHP SDK, через необработанный HTTP или с помощью собственной логики повторных попыток. Резервный запрос на стороне сервера и промежуточное ПО SDK применяют кредит на резервный запрос автоматически. Если вы используете один из этих вариантов, пропустите эту страницу.
Страница Отказы и резервные запросы описывает обнаружение отказов и выбор подхода к резервному запросу. Страница Кэширование подсказок объясняет чтение из кэша и запись в кэш, если эти термины вам незнакомы.
Включите функцию с помощью бета-заголовка
Отправьте запрос, который может быть отклонён, с заголовком anthropic-beta: fallback-credit-2026-06-01. Заголовок server-side-fallback-2026-06-01 также предоставляет те же поля.
Прочитайте два поля из отказа
При отказе stop_details включает fallback_credit_token — непрозрачную строку, представляющую кредит, и fallback_has_prefill_claim — булево значение, указывающее, какую форму тела повторного запроса использовать. Оба поля равны null, если для данного отказа кредит недоступен.
Сформируйте повторный запрос
Начните с тела отклонённого запроса. Установите model на резервную модель и добавьте токен как параметр верхнего уровня fallback_credit_token. Выберите форму тела из таблицы ниже.
Отправьте повторный запрос с тем же заголовком
Отправьте повторный запрос с тем же бета-заголовком fallback-credit-2026-06-01. Повторному запросу нужен этот заголовок для погашения токена.
Поле fallback_has_prefill_claim указывает, может ли повторный запрос продолжить частичный вывод отклонённой модели вместо того, чтобы начинать заново:
fallback_has_prefill_claim | Тело повторного запроса |
|---|---|
true | Тело отклонённого запроса без изменений плюс одно добавленное сообщение ассистента, чьё поле content повторяет content отклонённого ответа. Модель повторного запроса продолжает ответ с того места, где остановилась отклонённая модель, а завершённые вызовы серверных инструментов не выполняются повторно. |
false | Тело отклонённого запроса без изменений. |
Приведённый ниже пример выполняет запрос, который может быть отклонён, погашает токен кредита при повторной попытке на Claude Opus 4.8 и последовательно деградирует по лестнице отклонений, описанной в разделе Когда повторный запрос отклонён.
Кредит на резервный запрос находится в бета-версии на Claude API, Claude Platform на AWS, Amazon Bedrock, Vertex AI и Microsoft Foundry. Токены кредита, возвращённые в результатах Message Batches, не могут быть погашены; погашение применяется только к прямым запросам Messages API.
Модель повторного запроса должна быть одной из разрешённых резервных целей отклонённой модели. На момент запуска разрешённой целью для Claude Fable 5 является Claude Opus 4.8 (claude-opus-4-8).
Возврат виден в поле usage повторного запроса: значение cache_creation_input_tokens ниже, а cache_read_input_tokens выше на ту же величину, чем тот же запрос показал бы без токена. Сдвиг, равный нулю, означает, что токен был принят, но переоценивать было нечего — например, потому что кэш модели повторного запроса уже был прогрет.
Большинство повторных запросов погашаются с первой попытки. Если этого не происходит, API возвращает ошибку 400, которая указывает, что попробовать дальше.
Продолжение отклонено: отправьте тело без изменений
Если повторный запрос с добавленным сообщением ассистента отклонён с ошибкой 400, повторно отправьте тело отклонённого запроса без изменений, по-прежнему с токеном.
Токен отклонён: уберите токен
Если тело без изменений также отклонено с ошибкой 400, в сообщении которой упоминается fallback_credit_token, повторите запрос без токена. Кредит теряется, но сам повторный запрос проходит.
Если отклонённый запрос выполнял серверные инструменты, повторный запрос без токена повторно запускает и повторно тарифицирует эти инструменты. В таком случае передайте ошибку 400 вызывающей стороне вместо того, чтобы переходить к повторному запросу без токена.
Разделы ниже охватывают пограничные случаи и полные правила погашения. Большинству интеграций они не нужны.
Обнаруживайте отказы и выбирайте между резервным запросом на стороне сервера, промежуточным ПО SDK и ручной повторной попыткой.
Как тарифицируются чтение из кэша и запись в кэш.
Was this page helpful?
client = Anthropic()
request = {
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hello, Claude"}],
}
def send(model, body):
return client.beta.messages.create(
model=model, betas=["fallback-credit-2026-06-01"], **body
)
response = send("claude-fable-5", request)
if (
response.stop_reason == "refusal"
and (details := response.stop_details)
and (token := details.fallback_credit_token)
):
exact_body = request | {"fallback_credit_token": token}
# Предпочитать форму продолжения, если только утверждение не False
if details.fallback_has_prefill_claim is not False:
# Повторить содержимое отказа, удалив конечные пробелы из
# последнего текстового блока (валидатор префилла отклоняет их; серверное
# сопоставление допускает правку). Запросы с инструментами также опускают непарные
# блоки tool_use, затем снова удаляют пробелы после всех пропусков.
echoed = [block.model_dump() for block in response.content]
match echoed:
case [*_, {"type": "text"} as final_block]:
final_block["text"] = final_block["text"].rstrip()
attempt = exact_body | {
"messages": [
*request["messages"],
{"role": "assistant", "content": echoed},
]
}
else:
attempt = exact_body
try:
response = send("claude-opus-4-8", attempt)
except BadRequestError as error:
if "redemption temporarily unavailable" in str(error):
raise # Transient: retry with the token within its five-minute window
try:
# Откатиться к неизменённому телу, всё ещё с токеном
response = send("claude-opus-4-8", exact_body)
except BadRequestError as error:
if "redemption temporarily unavailable" in str(error):
raise # Transient: retry with the token within its five-minute window
# Сам токен был отклонён: отбросить его и повторить без него.
response = send("claude-opus-4-8", request)
print(json.dumps({"stop_reason": response.stop_reason, "model": response.model}))Каждое значение stop_reason и как его обрабатывать.