Claude Fable 5 menyertakan "safety classifier" (pengklasifikasi keamanan) yang dapat menolak sebuah permintaan. Ketika hal itu terjadi, Anda menerima respons normal, bukan error, dengan stop_reason: "refusal". Anda biasanya masih bisa mendapatkan jawaban dengan mengirimkan 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 sebuah respons dan ingin tahu apa yang harus dilakukan selanjutnya.
Daftar lengkap nilai stop_reason ada di Stop reason dan fallback. Detail tentang bagaimana permintaan yang ditolak ditagih, dan cara menghindari membayar dua kali untuk caching prompt pada percobaan ulang, ada di Kredit fallback. Helper SDK yang membungkus semua ini ada di Middleware SDK. Untuk contoh lengkap dari awal hingga akhir, lihat Cookbook fallback dan penagihan.
Pengaturan paling sederhana: sebutkan model fallback pada permintaan, dan API akan menangani percobaan ulangnya.
await client.beta.messages.create({
model: "claude-fable-5",
max_tokens: 1024,
messages,
betas: ["server-side-fallback-2026-06-01"],
fallbacks: [{ model: "claude-opus-4-8" }]
});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. Field category-nya menyebutkan area kebijakan yang memicu classifier. Field explanation-nya adalah deskripsi yang dapat dibaca manusia; teksnya tidak stabil, jadi tampilkan saja alih-alih mem-parsing-nya. Kedua field bernilai null ketika penolakan tidak dipetakan ke kategori bernama, dan null 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 eksploit. 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. |
"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: Penolakan sebelum output apa pun membuat content kosong, dan Anda tidak ditagih (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. Cara 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# | Middleware SDK | Konfigurasi sekali di klien. Percobaan ulang terjadi secara otomatis. |
| Ruby, PHP, HTTP mentah, atau logika percobaan ulang kustom | Percobaan ulang manual dengan kredit fallback | Kontrol penuh. Kredit fallback menekan biaya. |
Fallback sisi server dan middleware SDK menerapkan kredit fallback untuk Anda, jadi Anda hanya memerlukan halaman tersebut ketika 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 kali bolak-balik.
Fallback sisi server masih dalam tahap beta di Claude API dan Claude Platform di AWS. Parameter fallbacks ditolak pada Message Batches API dan tidak tersedia di Amazon Bedrock, Vertex AI, atau Microsoft Foundry. Pada platform-platform tersebut, gunakan middleware SDK sebagai gantinya.
Sebutkan model fallback dalam parameter fallbacks dan kirim beta header 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 dalam usage.iterations berarti model fallback dijalankan;
# pasangkan 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 menimpa max_tokens dan thinking hanya untuk percobaan tersebut.Beta header harus membawa tanggal persis 2026-06-01. Di bawah nilai server-side-fallback-* lainnya, parameter fallbacks ditolak dengan error 400. Jika Anda membangun berdasarkan pratinjau fitur ini yang lebih awal, perbarui beta header 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 maupun 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 telah 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 tersebut 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 serah terima; 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. Ketika penolakan terjadi sebelum output apa pun, message_start menyebutkan model fallback dan blok fallback adalah blok konten pertama; karena message_start menunggu percobaan fallback dimulai, waktu ke byte pertama mencakup percobaan yang ditolak. Ketika penolakan terjadi di tengah output, blok konten yang terbuka ditutup, blok fallback (pasangan content_block_start dan content_block_stop biasa tanpa delta) menandai batasnya, dan model fallback melanjutkan dari output parsial. Hanya blok text dari output parsial yang diteruskan ke model fallback sebagai konteks; tipe blok lainnya tetap berada di content. Dalam kasus di tengah output, message_start sudah menyebutkan model yang diminta, jadi baca model yang melayani dari to.model pada blok fallback dan dari entri fallback_message dalam 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 urutan pertama. Percobaan yang ditolak dan token output-nya tetap muncul di usage.iterations.
Ketika penolakan terpicu setelah server tool (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 tool 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, di platform apa pun. Middleware juga mengirimkan beta header 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-blok tersebut untuk Anda pada permintaan selanjutnya.BetaFallbackState, sehingga permintaan lanjutan yang berbagi state tersebut tetap terpaku padanya alih-alih bertanya ulang ke model yang menolak.Middleware dan parameter fallbacks sisi server melakukan pekerjaan yang sama. Konfigurasikan salah satu saja, jangan pernah keduanya pada permintaan yang sama. Untuk mengirim permintaan fallbacks sisi server dari aplikasi yang memasang middleware, gunakan instance klien terpisah tanpa middleware tersebut.
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 dipropagasi 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 middleware SDK, termasuk helper refusal-fallback.
Pindahkan aplikasi yang sudah ada ke Claude Fable 5.
Was this page helpful?