• Pesan
  • Managed Agents
  • Admin
Search...
⌘K
Langkah pertama
Pengenalan ClaudeMulai cepat
Membangun dengan Claude
Ikhtisar fiturMenggunakan Messages APIAlasan berhenti dan fallbackPenolakan dan fallbackKredit fallback
Kemampuan model
Pemikiran diperpanjangPemikiran adaptifUpayaAnggaran tugas (beta)Mode cepat (pratinjau riset)Output terstrukturSitasiStreaming PesanPemrosesan batchHasil pencarianStreaming penolakanDukungan multibahasaEmbeddings
Alat
IkhtisarCara kerja penggunaan alatTutorial: Membangun agen yang menggunakan alatMendefinisikan alatMenangani panggilan alatPenggunaan alat paralelTool Runner (SDK)Penggunaan alat ketatPenggunaan alat dengan caching promptAlat serverPemecahan masalahAlat pencarian webAlat pengambilan webAlat eksekusi kodeAlat penasihatAlat memoriAlat BashAlat penggunaan komputerAlat editor teks
Infrastruktur alat
Referensi alatMengelola konteks alatKombinasi alatPencarian alatPemanggilan alat terprogramStreaming alat terperinci
Manajemen konteks
Jendela konteksPemadatanPengeditan konteksCaching promptPesan sistem di tengah percakapanMembangun mode orkestrasiDiagnostik cache (beta)Penghitungan token
Bekerja dengan file
Files APIDukungan PDFGambar dan visi
Skills
IkhtisarMulai cepatPraktik terbaikSkills untuk enterpriseSkills di API
MCP
Server MCP jarak jauhKonektor MCP
Claude di platform cloud
Amazon BedrockAmazon Bedrock (lama)Claude Platform di AWSMicrosoft FoundryVertex AI
Log in
Penolakan dan fallback
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...

Solutions

  • AI agents
  • Code modernization
  • Coding
  • Customer support
  • Education
  • Financial services
  • Government
  • Life sciences

Partners

  • Amazon Bedrock
  • Google Cloud's Vertex AI

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Company

  • Anthropic
  • Careers
  • Economic Futures
  • Research
  • News
  • Responsible Scaling Policy
  • Security and compliance
  • Transparency

Learn

  • Blog
  • Courses
  • Use cases
  • Connectors
  • Customer stories
  • Engineering at Anthropic
  • Events
  • Powered by Claude
  • Service partners
  • Startups program

Help and security

  • Availability
  • Status
  • Support
  • Discord

Terms and policies

  • Privacy policy
  • Responsible disclosure policy
  • Terms of service: Commercial
  • Terms of service: Consumer
  • Usage policy
Pesan/Membangun dengan Claude

Penolakan dan fallback

Bagaimana Claude Fable 5 mengembalikan penolakan dari classifier dan cara mencoba ulang permintaan yang ditolak pada model fallback.

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.

Seperti apa bentuk penolakan

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.

categoryArtinya
"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.

Memilih pendekatan fallback

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 AndaGunakanAlasan
Claude API atau Claude Platform di AWS, pengaturan paling sederhanaFallback sisi serverSatu permintaan, satu respons. API menangani percobaan ulang.
Platform apa pun, dengan SDK TypeScript, Python, Go, Java, atau C#Middleware SDKKonfigurasi sekali di klien. Percobaan ulang terjadi secara otomatis.
Ruby, PHP, HTTP mentah, atau logika percobaan ulang kustomPercobaan ulang manual dengan kredit fallbackKontrol 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

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.

Membuat permintaan

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:

  • Entri dicoba secara berurutan. Setiap entri harus berbeda dari entri lainnya dan dari model yang diminta.
  • Setiap entri harus merupakan salah satu target yang diizinkan untuk model yang diminta. Dengan beta header diatur, daftar tersebut dipublikasikan sebagai allowed_fallback_models pada entri model di Models API.
  • Setiap entri menyebutkan sebuah model dan dapat menimpa max_tokens dan thinking hanya untuk percobaan tersebut.
  • Permintaan harus valid sebagai permintaan langsung ke setiap model yang disebutkan. Jika model fallback tidak mendukung fitur yang digunakan permintaan, API menolak permintaan tersebut di awal.
  • Hanya penolakan dari safety classifier yang memicu fallback. Batas laju, overload, atau server error pada model yang diminta dikembalikan kepada Anda apa adanya.

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.

Apa yang terkandung dalam respons

Respons terlihat seperti pesan lainnya, dengan dua tambahan:

  • Field model tingkat atas melaporkan model yang menghasilkan pesan yang dikembalikan, baik itu model yang diminta maupun fallback.
  • Blok konten 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.

Melanjutkan percakapan

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 blokPada giliran berikutnya
fallbackPertahankan 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.
textPertahankan.
Blok apa pun setelah blok fallback terakhirPertahankan.
thinking, redacted_thinking, atau connector_text sebelum blok fallback terakhirBuang.
tool_use sisi klien sebelum blok fallback terakhirBuang.
server_tool_use sebelum blok fallback terakhirPertahankan 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.

Streaming

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.

Fallback sisi klien dengan middleware SDK

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.

Menyiapkannya

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}")

Bagaimana perilakunya

  • Percobaan ulang menelusuri daftar fallback Anda secara berurutan. Model fallback yang juga menolak meneruskan permintaan ke entri berikutnya.
  • Respons penolakan asli dikembalikan hanya ketika setiap model dalam daftar telah menolak. Middleware tidak memunculkan error untuk itu.
  • Blok thinking dari Claude Fable 5 ditangani untuk Anda: middleware menghapusnya dari percobaan ulang dan mengelolanya dalam riwayat percakapan pada permintaan selanjutnya.
  • Respons yang dilayani melalui middleware menyertakan blok konten fallback di setiap batas model, sama seperti respons fallback sisi server. Middleware mengelola blok-blok tersebut untuk Anda pada permintaan selanjutnya.
  • Model yang menerima dicatat dalam 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.

Penolakan dalam Message Batches

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:

  1. Kumpulkan item yang ditolak dari hasil.
  2. Hapus blok thinking Claude Fable 5 dari riwayat multi-giliran mana pun.
  3. Kirim ulang pada model fallback sebagai batch baru atau sebagai permintaan langsung.

Kesalahan umum

  • Coba ulang pada model yang berbeda. Mengirim ulang permintaan yang ditolak ke model yang sama biasanya menghasilkan penolakan lagi. Arahkan percobaan ulang ke model fallback.
  • Anggarkan percobaan ulang per permintaan, bukan per giliran atau per sesi. Satu giliran dapat menghasilkan beberapa penolakan, misalnya sebuah agen ditambah sub-agennya.
  • Konfigurasikan fallback pada setiap jalur permintaan. Handler percobaan ulang, cabang pemulihan error, dan worker latar belakang semuanya membutuhkannya. Handler yang mengirim ulang permintaan tanpa fallback kehilangan perlindungan justru pada permintaan yang paling mungkin membutuhkannya.
  • Berikan panggilan sub-agen fallback-nya sendiri. Parameter fallbacks tidak dipropagasi ke panggilan model yang dibuat dari dalam eksekusi alat.
  • Jadikan fallback sebagai properti dari permintaan, bukan dari state ambien. Flag bersama, nilai konfigurasi yang di-cache, atau toggle global dapat menjadi tidak sinkron dan secara diam-diam membiarkan permintaan tidak terlindungi. Ketika Anda tidak dapat memastikan fallback aktif, konfigurasikan alih-alih mengasumsikan sudah aktif.
  • Instrumentasikan penolakan sebagai sinyal tersendiri. Penolakan adalah HTTP 200, jadi pemantauan yang dibangun berdasarkan tingkat error atau respons 5xx tidak pernah melihatnya. Pancarkan satu event per penolakan dan satu per respons yang dilayani fallback (entri fallback_message di usage.iterations menandai yang terakhir), lalu buat alert pada selisih antara kedua hitungan tersebut.
  • Bercabang berdasarkan 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.

Langkah selanjutnya

Kredit fallback

Hindari membayar biaya cache prompt dua kali ketika Anda membangun percobaan ulang sendiri.

Stop reason dan fallback

Setiap nilai stop_reason dan cara menanganinya.

Middleware SDK

Cara kerja middleware SDK, termasuk helper refusal-fallback.

Panduan migrasi

Pindahkan aplikasi yang sudah ada ke Claude Fable 5.

Was this page helpful?

  • Seperti apa bentuk penolakan
  • Memilih pendekatan fallback
  • Fallback sisi server
  • Membuat permintaan
  • Apa yang terkandung dalam respons
  • Melanjutkan percakapan
  • Streaming
  • Fallback sisi klien dengan middleware SDK
  • Menyiapkannya
  • Bagaimana perilakunya
  • Penolakan dalam Message Batches
  • Kesalahan umum
  • Langkah selanjutnya