Claude Fable 5 menyertakan "safety classifiers" (pengklasifikasi keamanan) yang dapat menolak sebuah permintaan. Ketika itu terjadi, Anda menerima respons normal, bukan error, dengan stop_reason: "refusal". Anda biasanya masih bisa mendapatkan jawaban dengan mengirim permintaan yang sama ke model Claude lain. Halaman ini menunjukkan cara mengenali penolakan dan cara menyiapkan percobaan ulang tersebut.
Baca halaman ini ketika Anda membangun dengan Claude Fable 5 dan ingin permintaan yang ditolak diteruskan ke model lain secara otomatis. Halaman ini juga berlaku ketika Anda baru saja melihat "refusal" dalam respons dan ingin tahu apa yang harus dilakukan selanjutnya.
Halaman terkait:
stop_reason.Pengaturan paling sederhana: sebutkan model fallback pada permintaan, dan API akan menangani percobaan ulangnya.
client = Anthropic()
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-06-01"],
)Bagian-bagian di bawah ini membahas apa yang terkandung dalam respons penolakan, kapan menggunakan fallback sisi server atau sisi klien, dan bagaimana masing-masing ditagih.
Penolakan adalah respons HTTP 200 yang berhasil dengan 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
}
}Objek stop_details menjelaskan penolakan tersebut:
category: menyebutkan area kebijakan yang memicu classifier.explanation: deskripsi yang dapat dibaca manusia. Teksnya tidak stabil, jadi tampilkan saja daripada mem-parse-nya.null ketika penolakan tidak dipetakan ke kategori bernama. Nilai null tersebut adalah nilai normal dan permanen, bukan placeholder.stop_details itu sendiri bernilai null untuk setiap stop reason selain refusal.category | Artinya |
|---|---|
"cyber" | Permintaan dapat memungkinkan bahaya siber, seperti pengembangan malware atau exploit. Pekerjaan keamanan siber yang tidak berbahaya juga dapat memicu kategori ini. |
"bio" | Permintaan dapat memungkinkan bahaya biologis, seperti metode laboratorium berbahaya. Pekerjaan ilmu hayati yang bermanfaat juga dapat memicu kategori ini. |
"frontier_llm" | Permintaan dapat membantu pengembangan model AI pesaing, yang dibatasi berdasarkan ketentuan komersial Anthropic. Pekerjaan machine learning yang tidak berbahaya juga dapat memicu kategori ini. |
"reasoning_extraction" | Permintaan meminta model untuk mereproduksi penalaran internalnya dalam teks respons. Untuk mendapatkan penalaran dalam bentuk terstruktur, gunakan adaptive thinking. |
Penolakan dapat tiba sebelum output apa pun, atau di tengah stream setelah output parsial. Dalam kedua kasus, perlakukan output parsial apa pun sebagai tidak lengkap dan buang.
Bagaimana penolakan ditagih: Anda tidak ditagih untuk penolakan yang tiba sebelum output apa pun. content kosong, jumlah token muncul di usage tetapi tidak dikenakan biaya, dan permintaan tidak dihitung terhadap batas laju. Penolakan di tengah stream menagih token input dan output yang sudah di-stream dengan tarif normal.
Ada tiga cara untuk mencoba ulang permintaan yang ditolak pada model lain. Pilihan yang tepat bergantung pada di mana Anda menjalankannya dan seberapa banyak kontrol yang Anda butuhkan.
| Situasi Anda | Gunakan | Alasan |
|---|---|---|
| Claude API atau Claude Platform di AWS, pengaturan paling sederhana | Fallback sisi server | Satu permintaan, satu respons. API menangani percobaan ulang. |
| Platform apa pun, dengan SDK TypeScript, Python, Go, Java, atau C# | SDK middleware | Konfigurasi sekali pada klien. Percobaan ulang terjadi secara otomatis. |
| Ruby, PHP, HTTP mentah, atau logika percobaan ulang kustom | Percobaan ulang manual dengan fallback credit | Kontrol penuh. Fallback credit menjaga biaya tetap rendah. |
Fallback sisi server dan SDK middleware menerapkan fallback credit untuk Anda. Anda hanya memerlukan halaman Fallback credit ketika Anda membangun percobaan ulang sendiri.
Fallback sisi server mencoba ulang permintaan yang ditolak di dalam satu panggilan API. Anda menyebutkan hingga tiga model fallback, dan ketika Claude Fable 5 menolak, API menjalankan model berikutnya dalam rantai pada permintaan yang sama. Anda mendapatkan kembali satu respons yang menyebutkan model yang menjawab, sehingga pengguna Anda mendapatkan jawaban dalam satu round trip.
Fallback sisi server dalam status beta pada Claude API dan Claude Platform di AWS. Parameter fallbacks ditolak pada Message Batches API dan tidak tersedia di Amazon Bedrock, Google Cloud, atau Microsoft Foundry. Pada platform tersebut, gunakan SDK middleware sebagai gantinya.
Sebutkan model fallback dalam parameter fallbacks dan kirim header beta server-side-fallback-2026-06-01.
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-06-01"],
)
# Entri fallback_message di usage.iterations berarti model fallback dijalankan;
# padukan dengan stop_reason untuk memastikan fallback yang memberikan respons.
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,
}
)
)Beberapa aturan berlaku untuk daftar fallbacks:
allowed_fallback_models pada entri model di Models API.model dan dapat meng-override max_tokens dan thinking hanya untuk percobaan tersebut.Header beta harus membawa tanggal persis 2026-06-01. Di bawah nilai server-side-fallback-* lainnya, parameter fallbacks ditolak dengan error 400. Jika Anda membangun berdasarkan preview fitur ini yang lebih awal, perbarui header beta serta bentuk permintaan dan respons secara bersamaan ke yang ada di halaman ini.
Respons terlihat seperti pesan lainnya, dengan dua tambahan:
model tingkat atas melaporkan model yang menghasilkan pesan yang dikembalikan, baik itu model yang diminta atau fallback.fallback menandai setiap titik dalam content di mana output satu model beralih ke model berikutnya: {"type": "fallback", "from": {"model": ...}, "to": {"model": ...}}.
from.model menggemakan string model yang Anda kirim ketika hop yang menolak adalah model yang diminta.to.model selalu merupakan ID yang di-resolve dari model yang melanjutkan.Pada penolakan sebelum output apa pun, blok fallback adalah blok konten pertama:
{
"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
}
]
}
}Array usage.iterations mencatat setiap percobaan. Model yang menolak muncul sebagai entri message biasa, dan model yang melayani giliran muncul sebagai entri fallback_message. Jika setiap model dalam rantai menolak, respons adalah penolakan dari model terakhir, dengan entri message untuk setiap hop sebelumnya dan entri fallback_message untuk yang terakhir.
Pada giliran berikutnya, kirim kembali konten asisten seperti yang Anda terima. Setelah fallback di tengah output, content dapat menyertakan tipe blok yang dihasilkan model yang menolak sebelum handoff; tabel di bawah ini mencakup mana yang harus dipertahankan dan mana yang harus dibuang ketika Anda menggemakan giliran tersebut.
| Tipe blok | Pada giliran berikutnya |
|---|---|
fallback | Pertahankan persis di tempat ia muncul. API menggunakan posisinya untuk memvalidasi blok thinking di sekitarnya, sehingga permintaan yang menggemakan blok thinking dari kedua sisi batas akan ditolak jika blok tersebut dihilangkan atau dipindahkan. |
text | Pertahankan. |
Blok apa pun setelah blok fallback terakhir | Pertahankan. |
thinking, redacted_thinking, atau connector_text sebelum blok fallback terakhir | Buang. |
tool_use sisi klien sebelum blok fallback terakhir | Buang. |
server_tool_use sebelum blok fallback terakhir | Pertahankan jika dipasangkan dengan hasilnya. Buang jika tidak memiliki hasil yang cocok. |
Blok connector_text membawa teks narasi yang disertakan oleh beberapa respons yang menggunakan alat di antara panggilan alat.
Pada permintaan streaming, percobaan ulang terjadi pada stream yang sama, dan tidak ada yang sudah Anda terima yang dibatalkan. Apa yang Anda lihat bergantung pada kapan penolakan terjadi.
Ketika penolakan terjadi sebelum output apa pun:
message_start menyebutkan model fallback, dan blok fallback adalah blok konten pertama.message_start menunggu percobaan fallback dimulai, waktu ke byte pertama mencakup percobaan yang ditolak.Ketika penolakan terjadi di tengah output:
fallback (pasangan content_block_start dan content_block_stop biasa tanpa delta) menandai batasnya.text dari output parsial yang diteruskan ke model fallback sebagai konteks; tipe blok lainnya tetap berada di content.message_start sudah menyebutkan model yang diminta, jadi baca model yang melayani dari to.model pada blok fallback dan dari entri fallback_message di usage.iterations pada message_delta terakhir.Pada permintaan non-streaming, penolakan di tengah output berperilaku berbeda: respons menghilangkan output parsial dari model yang ditolak, dan model fallback menjawab dari awal. Hasilnya terlihat seperti penolakan sebelum output apa pun, dengan blok fallback di awal. Percobaan yang ditolak dan token outputnya tetap muncul di usage.iterations.
Penolakan setelah server tools berjalan: ketika penolakan terjadi setelah server tools (misalnya, pencarian web atau eksekusi kode) sudah dieksekusi dalam sebuah permintaan, API mengembalikan penolakan alih-alih melanjutkan ke model fallback. Jika header fallback-credit-2026-06-01 juga diatur, penolakan tersebut membawa token kredit yang dapat ditukarkan dengan melanjutkan respons parsial, sehingga pekerjaan alat yang sudah selesai tidak hilang. Ini hanya berlaku untuk server tools yang beriterasi dalam satu permintaan. Percakapan yang menggunakan alat sisi klien melakukan fallback secara normal.
SDK TypeScript, Python, Go, Java, dan C# menyertakan middleware refusal-fallback. Anda mengonfigurasinya sekali pada klien dengan daftar model fallback Anda. Panggilan melalui client.beta.messages kemudian mencoba ulang permintaan yang ditolak secara otomatis, pada platform apa pun. Middleware juga mengirim header beta fallback-credit-2026-06-01 pada setiap permintaan yang ditanganinya, sehingga percobaan ulang dihargai ulang tanpa pengaturan per-permintaan.
Helper middleware refusal-fallback belum tersedia di SDK Ruby dan PHP. Pada SDK tersebut, implementasikan pola deteksi-dan-coba-ulang secara langsung.
Teruskan middleware ke konstruktor klien, dan bagikan satu instance BetaFallbackState di seluruh permintaan dalam sebuah percakapan.
# Saat terjadi penolakan, middleware mencoba ulang pada model fallback yang terdaftar dan
# secara otomatis mengirim header beta fallback-credit pada setiap permintaan yang ditanganinya.
client = Anthropic(
middleware=[BetaRefusalFallbackMiddleware([{"model": "claude-opus-4-8"}])],
)
state = BetaFallbackState() # pins follow-ups to the model that accepted
# Streaming: saat terjadi penolakan, middleware mencoba ulang pada model fallback dan
# menyambungkan event-nya ke stream yang sedang terbuka.
with (
state,
client.beta.messages.stream(
max_tokens=1024,
model="claude-fable-5",
messages=[{"role": "user", "content": "Hello, Claude"}],
) as stream,
):
for event in stream:
if event.type == "text":
print(event.text, end="", flush=True)
final_message = stream.get_final_message()
print(f"\nserved by: {final_message.model}")
# Non-streaming: menggunakan kembali state membuat percakapan tetap terikat.
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 di setiap batas model, sama seperti respons fallback sisi server. Middleware mengelola blok tersebut untuk Anda pada permintaan selanjutnya.BetaFallbackState, sehingga permintaan lanjutan yang berbagi state tersebut tetap dipatok padanya daripada bertanya ulang ke model yang menolak.Middleware dan parameter fallbacks sisi server melakukan pekerjaan yang sama. Konfigurasikan salah satunya, jangan pernah keduanya pada permintaan yang sama. Untuk mengirim permintaan fallbacks sisi server dari aplikasi yang menginstal middleware, gunakan instance klien terpisah tanpa middleware.
Permintaan yang ditolak dalam Message Batch kembali sebagai result.type: "succeeded" dengan stop_reason: "refusal". Field stop_details mungkin bernilai null pada hasil batch, jadi deteksi penolakan dengan memeriksa stop_reason secara langsung.
Fallback sisi server tidak tersedia untuk batch (permintaan batch yang menyertakan fallbacks menghasilkan hasil error per-item). Untuk mencoba ulang item batch yang ditolak:
fallbacks tidak menyebar ke panggilan model yang dibuat dari dalam eksekusi alat.fallback_message di usage.iterations menandai yang terakhir), lalu buat alert pada selisih antara kedua hitungan tersebut.stop_reason, bukan stop_details atau content. stop_details bersifat informasional dan dapat bernilai null pada penolakan. Periksa stop_reason sama dengan "refusal" secara langsung.Hindari membayar biaya cache prompt dua kali ketika Anda membangun percobaan ulang sendiri.
Setiap nilai stop_reason dan cara menanganinya.
Cara kerja SDK middleware, termasuk helper refusal-fallback.
Pindahkan aplikasi yang sudah ada ke Claude Fable 5.
Was this page helpful?