Claude Fable 5 e Claude Opus 5 incluem classificadores de segurança que podem recusar uma solicitação. Quando isso acontece, você recebe uma resposta normal, não um erro, com stop_reason: "refusal". Normalmente você ainda pode obter uma resposta enviando a mesma solicitação para outro modelo Claude. Esta página mostra como reconhecer uma recusa e como configurar essa nova tentativa.
Leia esta página quando você construir sobre Claude Fable 5 ou Claude Opus 5 e quiser que solicitações recusadas sejam encaminhadas automaticamente para outro modelo. Ela também se aplica quando você acabou de ver "refusal" em uma resposta e quer saber o que fazer em seguida.
Páginas relacionadas:
stop_reason.A configuração mais simples, em beta na Claude API: defina fallbacks como "default", e a API repete uma solicitação recusada no modelo de fallback que a Anthropic recomenda para sua categoria de recusa. Para categorias sem fallback recomendado, a recusa é mantida.
client = Anthropic()
response = client.beta.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
fallbacks="default",
betas=["server-side-fallback-2026-07-01"],
)
print(response.model)As seções a seguir cobrem o que uma resposta de recusa contém, quando usar fallback do lado do servidor ou do lado do cliente, e como cada um é cobrado.
Uma recusa é uma resposta HTTP 200 bem-sucedida com stop_reason: "refusal":
{
"id": "msg_01XFUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"model": "claude-fable-5",
"content": [],
"stop_reason": "refusal",
"stop_details": {
"type": "refusal",
"category": "cyber",
"explanation": "This request was declined because it could enable cyber harm."
},
"usage": {
"input_tokens": 412,
"output_tokens": 0
}
}O objeto stop_details explica a recusa:
category: nomeia a área de política que acionou o classificador.explanation: uma descrição legível por humanos. O texto não é estável, então exiba-o em vez de analisá-lo.null quando a recusa não corresponde a uma categoria nomeada. Esse null é um valor normal e permanente, não um placeholder.stop_details é null para todos os stop reasons que não sejam refusal.category | O que significa |
|---|---|
"cyber" | A solicitação poderia possibilitar danos cibernéticos, como desenvolvimento de malware ou exploits. Trabalho benigno de cibersegurança também pode acionar esta categoria. |
"bio" | A solicitação poderia possibilitar danos biológicos, como métodos de laboratório perigosos. Trabalho benéfico em ciências da vida também pode acionar esta categoria. |
"frontier_llm" | A solicitação poderia auxiliar o desenvolvimento de modelos de IA concorrentes, o que é restrito pelos termos comerciais da Anthropic. Trabalho benigno de aprendizado de máquina também pode acionar esta categoria. |
"reasoning_extraction" | A solicitação pede que o modelo reproduza seu raciocínio interno no texto da resposta. Para obter o raciocínio em uma forma estruturada, use o pensamento adaptativo. |
"general_harms" | A solicitação pode estar relacionada a uma área que foi determinada como prejudicial. Trabalho benigno pode às vezes acionar esta categoria. |
Uma recusa pode chegar antes de qualquer saída, ou no meio do stream após uma saída parcial. Em ambos os casos, trate qualquer saída parcial como incompleta e descarte-a.
Como as recusas são cobradas: você não é cobrado por uma recusa que chega antes de qualquer saída. content fica vazio, e as contagens de tokens aparecem em usage, mas não são cobradas. A solicitação ainda conta para seus limites de taxa. Uma recusa no meio do stream cobra os input_tokens e a saída já transmitida nas taxas normais.
Há três maneiras de repetir uma solicitação recusada em outro modelo. A correta depende de onde você está executando e de quanto controle você precisa.
| Sua situação | Use | Por quê |
|---|---|---|
| Claude API, configuração mais simples | Fallback do lado do servidor | Uma solicitação, uma resposta. A API cuida da nova tentativa. |
| Qualquer plataforma, usando um SDK da Anthropic | O middleware do SDK | Configure uma vez no cliente. As novas tentativas acontecem automaticamente. |
| HTTP bruto ou lógica de nova tentativa personalizada | Nova tentativa manual com crédito de fallback | Controle total. O crédito de fallback mantém o custo baixo. |
O fallback do lado do servidor e o middleware do SDK aplicam o crédito de fallback para você. Você só precisa da página Crédito de fallback quando você mesmo constrói a nova tentativa.
O fallback do lado do servidor repete uma solicitação recusada dentro de uma única chamada de API. No modo padrão, quando o modelo primário recusa e a categoria de recusa tem um fallback recomendado, a API executa a mesma solicitação no modelo que a Anthropic recomenda para essa categoria. Você pode, em vez disso, nomear até três modelos de fallback próprios (abaixo). De qualquer forma, você recebe de volta uma resposta que nomeia o modelo que respondeu, de modo que seu usuário obtém uma resposta em uma única ida e volta.
O fallback do lado do servidor está em beta na Claude API. O parâmetro fallbacks não é suportado na Message Batches API (um item de lote que o inclui retorna como um resultado com erro) e não está disponível no Amazon Bedrock, Google Cloud ou Microsoft Foundry. Nessas plataformas, use o fallback do lado do cliente com o middleware do SDK em vez disso.
Defina o parâmetro fallbacks como a string "default" e envie o cabeçalho beta server-side-fallback-2026-07-01. A API então aplica o roteamento padrão definido pelo servidor para o modelo solicitado, que seleciona um modelo de fallback recomendado com base na categoria de recusa que o classificador reporta, de modo que solicitações recusadas sejam atendidas sem que você mantenha uma lista de modelos conforme as recomendações mudam.
client = Anthropic()
response = client.beta.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
fallbacks="default",
betas=["server-side-fallback-2026-07-01"],
)
# Uma entrada fallback_message em usage.iterations significa que um modelo de fallback foi executado;
# combine-a com stop_reason para confirmar que o fallback atendeu à resposta.
fallback_ran = any(
iteration.type == "fallback_message"
for iteration in response.usage.iterations or []
)
served_by_fallback = fallback_ran and response.stop_reason != "refusal"
print(
json.dumps(
{
"stop_reason": response.stop_reason,
"model": response.model,
"served_by_fallback": served_by_fallback,
}
)
)A Anthropic define salvaguardas para cada modelo individualmente e para cada categoria de política, de acordo com a capacidade do modelo: dependendo da categoria, uma solicitação sinalizada pode recorrer a um modelo menos capaz ou ser recusada. O modo "default" codifica essas recomendações por modelo e por categoria para você, de modo que uma solicitação recusada seja repetida no modelo que a Anthropic recomenda para essa categoria. Os fallbacks são visíveis de qualquer forma: a resposta nomeia o modelo que a atendeu, e o bloco de conteúdo fallback marca a transferência.
O roteamento é aplicado do lado do servidor e não é publicado por modelo na Models API. Para ver qual modelo atendeu uma solicitação recusada, verifique o campo model de nível superior da resposta e procure uma entrada fallback_message em usage.iterations, como fazem os exemplos desta página.
Apenas uma recusa do classificador de segurança aciona o fallback. Um limite de taxa, sobrecarga ou erro de servidor no modelo solicitado é retornado para você como está.
O cabeçalho beta deve conter exatamente a data 2026-07-01, que suporta tanto "default" quanto a forma de lista explícita abaixo, ou 2026-06-01, que aceita apenas a forma de lista explícita. Sob qualquer outro valor server-side-fallback-*, o parâmetro fallbacks é rejeitado com um erro 400. Se você construiu com base em uma prévia anterior deste recurso, atualize o cabeçalho beta e os formatos de solicitação e resposta juntos para os desta página.
Em vez do roteamento padrão, você pode definir fallbacks como uma lista de até três modelos. Quando o modelo solicitado recusa, a API executa o próximo modelo da cadeia na mesma solicitação. Use esta forma quando quiser controlar exatamente quais modelos atendem solicitações recusadas, como fixar um modelo que sua aplicação qualificou.
client = Anthropic()
response = client.beta.messages.create(
model="claude-fable-5",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello, Claude"}],
fallbacks=[{"model": "claude-opus-4-8"}],
betas=["server-side-fallback-2026-07-01"],
)
print(response.model)Algumas regras se aplicam à lista fallbacks:
allowed_fallback_models na entrada do modelo na Models API.model e pode sobrescrever max_tokens, thinking, output_config e speed apenas para essa tentativa.A forma de lista explícita também funciona sob o cabeçalho beta server-side-fallback-2026-06-01; o modo "default" não.
A resposta tem o mesmo formato em ambos os modos: o modelo que atendeu o turno aparece no campo model de nível superior, um bloco de conteúdo fallback marca a transferência, e usage.iterations registra cada tentativa.
A resposta se parece com qualquer outra mensagem, com duas adições:
model de nível superior reporta o modelo que produziu a mensagem retornada, seja ele o modelo solicitado ou um fallback.fallback marca cada ponto em content onde a saída de um modelo dá lugar ao próximo: {"type": "fallback", "from": {"model": ...}, "to": {"model": ...}}.
from.model ecoa a string de modelo que você enviou quando o salto que recusou é o modelo solicitado.to.model é sempre o ID resolvido do modelo que continua.Em uma recusa antes de qualquer saída, o bloco fallback é o primeiro bloco de conteúdo. Por exemplo, quando o roteamento padrão seleciona Claude Opus 4.8 para a categoria da recusa:
{
"id": "msg_01XFUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"model": "claude-opus-4-8",
"content": [
{
"type": "fallback",
"from": { "model": "claude-fable-5" },
"to": { "model": "claude-opus-4-8" }
},
{ "type": "text", "text": "Hi! How can I help you today?" }
],
"stop_reason": "end_turn",
"stop_details": null,
"usage": {
"input_tokens": 412,
"output_tokens": 264,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0,
"iterations": [
{
"type": "message",
"model": "claude-fable-5",
"input_tokens": 535,
"output_tokens": 0,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
},
{
"type": "fallback_message",
"model": "claude-opus-4-8",
"input_tokens": 412,
"output_tokens": 264,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
}
]
}
}O array usage.iterations registra cada tentativa. Um modelo que recusou aparece como uma entrada message comum, e o modelo que atendeu o turno aparece como uma entrada fallback_message. Se todos os modelos da cadeia recusarem, a resposta é a recusa do último modelo, com uma entrada message para cada salto anterior e uma entrada fallback_message para o último.
No próximo turno, envie o conteúdo do assistente de volta como você o recebeu. Após um fallback no meio da saída, content pode incluir tipos de bloco que o modelo que recusou produziu antes da transferência; a tabela a seguir cobre quais manter e quais descartar quando você ecoa o turno.
| Tipo de bloco | No próximo turno |
|---|---|
fallback | Mantenha-o exatamente onde apareceu. A API usa sua posição para validar os blocos de thinking ao seu redor, então uma solicitação que ecoa blocos de thinking de ambos os lados da fronteira é rejeitada se o bloco for omitido ou movido. |
text | Mantenha. |
Qualquer bloco após o bloco fallback final | Mantenha. |
thinking, redacted_thinking ou connector_text antes do bloco fallback final | Descarte. |
tool_use do lado do cliente antes do bloco fallback final | Descarte. |
server_tool_use antes do bloco fallback final | Mantenha quando pareado com seu resultado. Descarte quando não tiver resultado correspondente. |
Um bloco connector_text carrega texto de narração que algumas respostas com uso de ferramentas incluem entre chamadas de ferramentas.
Em uma solicitação de streaming, a nova tentativa acontece no mesmo stream, e nada do que você já recebeu é invalidado. O que você vê depende de quando a recusa acontece.
Quando a recusa acontece antes de qualquer saída:
message_start nomeia o modelo de fallback, e o bloco fallback é o primeiro bloco de conteúdo.message_start espera o início da tentativa de fallback, o tempo até o primeiro byte inclui a tentativa recusada.Quando a recusa acontece no meio da saída:
fallback (um par comum de content_block_start e content_block_stop sem deltas) marca a fronteira.text da saída parcial são passados ao modelo de fallback como contexto; outros tipos de bloco permanecem em content.message_start já nomeou o modelo solicitado, então leia o modelo que está atendendo a partir do to.model do bloco fallback e da entrada fallback_message em usage.iterations do message_delta final.Em uma solicitação sem streaming, uma recusa no meio da saída se comporta de forma diferente: a resposta omite a saída parcial do modelo que recusou, e o modelo de fallback responde do zero. O resultado se parece com uma recusa antes de qualquer saída, com o bloco fallback primeiro. A tentativa recusada e seus output_tokens ainda aparecem em usage.iterations.
Recusas durante o uso de ferramentas: trabalho de ferramenta concluído não bloqueia o fallback. Quando uma recusa ocorre depois que ferramentas de servidor (por exemplo, busca na web ou execução de código) terminaram de executar dentro de uma solicitação, a tentativa de fallback prossegue: os resultados de ferramenta concluídos são transferidos, e o modelo de fallback pode continuar invocando ferramentas de servidor. O único caso que não é repetido é uma recusa em streaming que ocorre enquanto um bloco de tool_use de qualquer tipo (uma ferramenta do cliente, uma ferramenta do servidor ou uma chamada de ferramenta MCP) ainda está aberto no stream: essa recusa é retornada diretamente e, se o cabeçalho fallback-credit-2026-07-01 estiver definido, ela ainda carrega um token de crédito resgatável ao continuar a resposta parcial. Solicitações sem streaming não são afetadas; a API limpa o trabalho parcial e tenta novamente antes de responder.
Todo SDK da Anthropic inclui um middleware de fallback de recusa. Você o configura uma vez no cliente com sua lista de modelos de fallback. Chamadas através de client.beta.messages então repetem solicitações recusadas automaticamente, em qualquer plataforma. O middleware também envia o cabeçalho beta fallback-credit-2026-07-01 em cada solicitação que ele trata, de modo que as novas tentativas são reprecificadas sem configuração por solicitação.
Passe o middleware para o construtor do cliente e compartilhe uma instância de BetaFallbackState entre as solicitações de uma conversa.
from anthropic import Anthropic, BetaFallbackState, BetaRefusalFallbackMiddleware
# Em caso de recusa, o middleware tenta novamente no modelo de fallback listado e
# envia automaticamente o header beta de crédito de fallback em cada requisição que ele trata.
client = Anthropic(
middleware=[BetaRefusalFallbackMiddleware([{"model": "claude-opus-4-8"}])],
)
state = BetaFallbackState() # pins follow-ups to the model that accepted
# Streaming: em caso de recusa, o middleware tenta novamente no modelo de fallback e
# insere os eventos dele no stream aberto.
with (
state,
client.beta.messages.stream(
max_tokens=1024,
model="claude-fable-5",
messages=[{"role": "user", "content": "Hello, Claude"}],
) as stream,
):
for text in stream.text_stream:
print(text, end="", flush=True)
final_message = stream.get_final_message()
print(f"\nserved by: {final_message.model}")
# Sem streaming: reutilizar o estado mantém a conversa fixada.
with state:
message = client.beta.messages.create(
max_tokens=1024,
model="claude-fable-5",
messages=[{"role": "user", "content": "Hello, Claude"}],
)
print(f"served by: {message.model}")fallback que ele mesmo adicionou.fallback em cada fronteira de modelo, da mesma forma que as respostas de fallback do lado do servidor. O middleware gerencia esses blocos para você em solicitações posteriores.BetaFallbackState, então solicitações subsequentes que compartilham o estado permanecem fixadas nele em vez de perguntar novamente a um modelo que recusou.O middleware e o parâmetro fallbacks do lado do servidor fazem o mesmo trabalho. Configure um ou outro, nunca ambos na mesma solicitação. Para enviar uma solicitação fallbacks do lado do servidor a partir de uma aplicação que instala o middleware, use uma instância de cliente separada sem ele.
Uma solicitação recusada em um Message Batch retorna como result.type: "succeeded" com stop_reason: "refusal". Os resultados de lote carregam o mesmo objeto stop_details que as respostas síncronas, então você pode detectar recusas através de stop_reason ou de stop_details.type. Uma diferença: recusas em lote não geram créditos de fallback, então stop_details em um resultado de lote nunca inclui um fallback_credit_token.
O fallback do lado do servidor não está disponível para lotes (uma solicitação de lote que inclui fallbacks produz um resultado com erro por item). Para repetir itens de lote recusados:
fallbacks não se propaga para chamadas de modelo feitas de dentro da execução de ferramentas.fallback_message em usage.iterations marca esta última), depois alerte sobre a diferença entre as duas contagens.stop_reason ou stop_details.type, não em content ou nos campos internos de stop_details. O objeto stop_details está sempre presente em uma recusa, mas seus campos category e explanation podem ser null. Verifique diretamente se stop_reason é igual a "refusal".Evite pagar o custo do cache de prompt duas vezes quando você mesmo constrói a nova tentativa.
Todos os valores de stop_reason e como lidar com cada um.
Como o middleware do SDK funciona, incluindo o auxiliar de fallback de recusa.
Migre uma aplicação existente para Claude Fable 5.
Was this page helpful?