Segurança, Recusas e Fallbacks
Em produção, seu código deve lidar com o caso em que o Claude não vai (ou não pode) responder como esperado. Bem-feito, isso é invisível para os usuários; mal-feito, é uma falha ou uma resposta confusa.
Duas coisas diferentes
- Uma recusa do modelo — o Claude declina uma requisição (por exemplo, por julgá-la prejudicial). A resposta sinaliza isso (comumente via um
stop_reason/conteúdo de recusa). Trate-a como um resultado normal, não como um erro. - Um bloqueio de classificador/segurança — uma camada de segurança separada pode bloquear o conteúdo. Isso pode parecer diferente de uma recusa do modelo.
Saber qual deles você recebeu permite responder apropriadamente em vez de repetir cegamente.
Lide com isso de forma elegante
resp = client.messages.create(...)
if getattr(resp, "stop_reason", None) == "refusal":
# Don't show a raw/empty result. Offer a safe fallback or a clarifying ask.
show_user("I can't help with that as asked. Here's what I can do instead…")
else:
render(resp)
Reduza recusas indesejadas
- Adicione contexto legítimo. Uma requisição pode coincidir, por padrão, com algo sensível quando a intenção é benigna; declarar o propósito real e legítimo ajuda.
- Seja específico. Frases vagas ou provocativas convidam à cautela.
- Não brigue com isso. Se uma requisição é genuinamente proibida, a recusa está correta — projete um caminho elegante, não tente fazer jailbreak.
Padrões de fallback
- Uma pergunta de esclarecimento em vez de um beco sem saída.
- Uma alternativa segura ("Posso resumir as informações públicas, em vez disso").
- Para pipelines, encaminhe para um humano quando a confiança/elegibilidade for baixa.