Skip to content

fix(anthropic): map refusal and context-window stop reasons#316

Open
sven2718 wants to merge 1 commit into
charmbracelet:mainfrom
sven2718:fix/anthropic-finish-reasons
Open

fix(anthropic): map refusal and context-window stop reasons#316
sven2718 wants to merge 1 commit into
charmbracelet:mainfrom
sven2718:fix/anthropic-finish-reasons

Conversation

@sven2718

@sven2718 sven2718 commented Jul 19, 2026

Copy link
Copy Markdown

One thing that's been annoying me about working with fable-5 in crush is that if you trip over anthropic's content classifier (so fable is refusing to process the API calls), crush will just end the turn with no indication of what's gone wrong.

This is easy to fix, because FinishReasonContentFilter is a thing that fantasy already supports -- it just doesn't understand Anthropic's flavor of the error.

The core fix is a 2-line diff. While we're here it's probably also worth writing a unit test and extending the coverage of FinishReasonLength.

The Anthropic API can end a response with stop_reason "refusal"
(safety classifier intervention) or "model_context_window_exceeded",
but both fell through to FinishReasonUnknown, leaving clients unable
to distinguish them from a missing stop reason.

Map "refusal" to FinishReasonContentFilter, matching how the OpenAI
and Google providers already surface their native content-filter
stops, and map "model_context_window_exceeded" to
FinishReasonLength alongside "max_tokens".

💘 Generated with Crush

Assisted-by: Kimi K3 (max thinking) via Crush <crush@charm.land>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant