Kembali ke panduan
Pemecahan masalah·23 September 2026·Baca 6 menit

Claude API 400 “Invalid `signature` in `thinking` block” — apa yang merusak signature dan cara memulihkannya

API memeriksa signature pada blok thinking yang Anda kirim kembali dan verifikasi gagal: signature terpotong, berubah atau dikirim kembali dalam keadaan kosong, atau blok tersebut tidak pernah ditandatangani oleh Claude — atau, pada Claude Fable 5.1 dan Claude Opus 5.5, sesuatu yang lebih awal dalam percakapan berubah. Mengirim ulang riwayat yang sama selalu gagal dengan cara yang sama. Temukan penyebabnya, lalu hapus blok thinking dari percakapan itu sekali dan lanjutkan — Anda kehilangan penalaran model sebelumnya, bukan percakapannya.

Terakhir ditinjau pada .

API memeriksa signature pada blok thinking yang Anda kirim kembali dan verifikasi gagal: signature terpotong, berubah atau dikirim kembali dalam keadaan kosong, atau blok tersebut tidak pernah ditandatangani oleh Claude — atau, pada Claude Fable 5.1 dan Claude Opus 5.5, sesuatu yang lebih awal dalam percakapan berubah. Mengirim ulang riwayat yang sama selalu gagal dengan cara yang sama. Temukan penyebabnya, lalu hapus blok thinking dari percakapan itu sekali dan lanjutkan — Anda kehilangan penalaran model sebelumnya, bukan percakapannya.

Error

respons (HTTP 400)
// Through Kunavo: the upstream message as it reaches you, typed as Anthropic
// types a 400; no request_id field, the upstream's own id is appended instead:
{"type":"error","error":{"type":"invalid_request_error","message":"messages.1.content.0: Invalid `signature` in `thinking` block (request id: …)"}}
// (the message path, any masking of it and the appended request id vary by upstream)

// From Anthropic's API directly:
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "messages.1.content.0: Invalid `signature` in `thinking` block"
  },
  "request_id": "req_011C..."
}

// messages.{i}.content.{j}: i = position in messages[], j = block index. Both vary.
// An upstream can mask that path (***.***) and append its own request id, as above.
// Claude Code prints the body after "API Error: 400".
// On Claude Fable 5.1 and Claude Opus 5.5 the message can continue:
//   "... The block is bound to a different conversation. Remove the block, or set
//    `thinking.block_binding.prefix_mismatch_behavior` to "drop_block"."

Ringkasan penyebab dan perbaikan

PenyebabPerbaikan
Signature terpotong, dikosongkan, atau diedit sebelum dikirim kembaliSimpan dan putar ulang setiap blok persis seperti yang dikembalikan. Biarkan SDK menyusun giliran yang dialirkan agar signature_delta tidak hilang.
Blok tersebut tidak pernah ditandatangani oleh ClaudeModel non-Claude di balik URL yang kompatibel dengan Anthropic, atau proxy yang menulis signature-nya sendiri. Kirim kembali giliran tersebut hanya sebagai teks dan tool_use.
Anda mengganti base URL, akun, atau login di tengah percakapanClaude Code 2.1.152+ menghapus signature kedaluwarsa setelah pergantian model atau login. Dalam kode Anda sendiri, hapus thinking sekali jika permintaan pertama setelah pergantian gagal.
“Blok terikat ke percakapan yang berbeda” (Fable 5.1, Opus 5.5)System prompt, alat, atau pesan sebelumnya berubah. Pertahankan riwayat hanya dengan penambahan, atau pilih drop_block (memerlukan header beta).
Proxy atau gateway menulis ulang riwayat saat meneruskannyaPenulisan ulangnya dihitung sebagai pengeditan Anda. Uji langsung ke API untuk memastikan apakah ini penyebabnya.

Baca pemeriksaan mana yang gagal

Pilihan katanya memberi petunjuk. Pesan yang berhenti pada “Invalid `signature` in `thinking` block” berarti signature itu sendiri gagal diverifikasi: Anthropic mencantumkan penyebabnya sebagai terpotong, berubah, atau dikirim kembali dalam keadaan kosong (https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting, per September 2026), dan halaman preserved-thinking menyebutnya sebagai signature yang dirusak atau tidak dapat didekripsi, yang selalu menghasilkan 400. Jalur yang disamarkan sebagai ***.***.content.0 atau request id yang ditambahkan gateway tidak mengubah hal itu; yang penting adalah apakah ada kalimat tentang percakapan setelahnya. Pada Claude Fable 5.1 dan Claude Opus 5.5, kata-kata yang sama dapat dilanjutkan dengan “The block is bound to a different conversation” — pemeriksaan berbeda yang dibahas pada langkah terakhir. Pesan ketiga, “blocks in the latest assistant message cannot be modified”, berarti giliran assistant terbaru diedit, difilter, diurutkan ulang, atau dibuat ulang; teks thinking yang diedit menghasilkan kesalahan itu, bukan kesalahan signature. Mencoba ulang isi yang sama tidak menghapus satu pun penyebab tersebut.

three thinking-block 400s
Invalid `signature` in `thinking` block
  -> the signature did not verify: truncated, altered, empty, or not Claude's

Invalid `signature` in `thinking` block. The block is bound to a different conversation. ...
  -> Fable 5.1 / Opus 5.5: system, tools or an earlier message changed after the block was made

`thinking` or `redacted_thinking` blocks in the latest assistant message cannot be modified
  -> the newest assistant turn was edited, filtered, reordered or rebuilt before it was sent back

Kirim kembali giliran assistant persis seperti yang dikembalikan

Setiap blok thinking membawa signature — salinan terenkripsi dari seluruh penalaran — dan API menggunakannya untuk memverifikasi bahwa blok tersebut dibuat oleh Claude (https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-encryption). Tambahkan daftar content respons tanpa perubahan: blok thinking, redacted_thinking, dan tool_use, termasuk blok thinking yang teksnya kosong, yang merupakan tampilan default pada model-model baru. Saat melakukan streaming, signature tiba dalam satu signature_delta tepat sebelum blok ditutup, sehingga akumulator buatan tangan yang melewatkannya menyimpan signature kosong, dan blok yang dikirim kembali dengan signature kosong akan gagal; saran Anthropic adalah membiarkan SDK menyusun pesan. Urutan kunci JSON dan spasi tidak penting — nilainya yang penting.

replay_verbatim.py
import anthropic

client = anthropic.Anthropic(base_url="https://api.kunavo.com", api_key="sk-kn-...")

tools = [{
    "name": "get_weather",
    "description": "Current weather for a city.",
    "input_schema": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"],
    },
}]
messages = [{"role": "user", "content": "What's the weather in Paris?"}]

with client.messages.stream(
    model="claude-sonnet-4-6",
    max_tokens=16000,
    thinking={"type": "adaptive"},
    tools=tools,
    messages=messages,
) as stream:
    final = stream.get_final_message()   # signature_delta already applied

# Append the content list untouched: thinking, redacted_thinking, tool_use.
messages.append({"role": "assistant", "content": final.content})

# Not this: a store that keeps the text but not the signature replays
# {"type": "thinking", "thinking": "...", "signature": ""}  -> this 400.

Jauhkan thinking dari backend lain dari riwayat Claude

Menurut dokumentasi Anthropic, berpindah antar-model Claude di API mereka sendiri seharusnya tidak memicu hal ini: dokumentasi meminta Anda terus mengirimkan blok saat berganti model, menghapus blok yang tidak dapat dibaca model baru tanpa kesalahan, dan menyatakan bahwa signature dapat dipindahkan antara Claude API, Amazon Bedrock, dan Google Cloud (https://platform.claude.com/docs/en/build-with-claude/thinking, per September 2026). Yang tidak dapat diverifikasi adalah blok yang tidak pernah ditandatangani Claude. Laporan publik melibatkan riwayat yang melewati backend lain: sesi Claude Code yang berjalan pada backend GLM lalu kembali ke Anthropic (github.com/anthropics/claude-code/issues/21726), giliran Gemini melalui proxy yang menyamarkan blok thinking sebagai Claude dengan signature buatan sendiri (github.com/router-for-me/CLIProxyAPI/issues/1584), serta sesi Claude Code yang berganti kunci di tengah sesi lalu kembali (github.com/lbjlaq/Antigravity-Manager/issues/388). Untuk giliran yang dihasilkan model non-Claude, saran Anthropic adalah mengirim kembali output model tersebut hanya sebagai konten teks dan tool_use.

foreign_turn.py
def as_foreign_turn(content: list[dict]) -> list[dict]:
    """A turn a non-Claude model produced: keep what it said and did,
    never its thinking blocks, which Claude cannot verify."""
    return [b for b in content if b["type"] in ("text", "tool_use")]

Pulihkan percakapan yang sudah gagal

Hapus blok thinking dan redacted_thinking dari riwayat tersimpan satu kali — menghapus semuanya adalah cara paling sederhana; untuk varian “terikat ke percakapan yang berbeda”, minimum yang disebutkan Anthropic adalah blok yang disebutkan dan setiap blok setelahnya — pertahankan semua blok lain di tempatnya, simpan riwayat tersebut, lalu lanjutkan. Anthropic memberikan langkah ini sebagai pemulihan untuk sesi tersimpan yang tidak lagi dapat diputar ulang (https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#faq); ketika signature gagal diverifikasi, satu-satunya jalan lain adalah memutar ulang blok persis seperti saat dikembalikan, jika Anda masih memilikinya. Claude Code menghapus thinking sebelumnya sendiri ketika API menolak signature. Setelah blok dihapus dan Anda melanjutkan, jangan masukkan kembali blok tersebut: pada Fable 5.1, blok yang dihapus lalu dikembalikan akan membatalkan thinking yang dihasilkan selama blok itu tidak ada. Model menjawab tanpa penalaran sebelumnya, dan thinking baru valid sejak saat itu. Di Claude Code, 2.1.152 (27 Mei 2026, https://code.claude.com/docs/en/changelog) menghapus signature kedaluwarsa setelah pergantian model atau login, dan panduan gateway-nya menyatakan bahwa sistem mencoba ulang penolakan signature tanpa blok thinking sebelumnya — tetapi percobaan ulang itu mencocokkan kata-kata kesalahan dari upstream, dan gateway yang membungkus kesalahan dalam envelope sendiri dapat merusaknya (https://code.claude.com/docs/en/llm-gateway-protocol#automatic-retry-and-error-forwarding).

strip_thinking.py
THINKING = {"thinking", "redacted_thinking"}

def block_type(b) -> str:
    return b["type"] if isinstance(b, dict) else b.type   # dicts or SDK objects

def strip_thinking(messages: list[dict]) -> list[dict]:
    """One-time recovery: drop every thinking block, keep everything else."""
    out = []
    for m in messages:
        content = m["content"]
        if m["role"] == "assistant" and isinstance(content, list):
            kept = [b for b in content if block_type(b) not in THINKING]
            content = kept or [{"type": "text", "text": "(no visible reply)"}]  # keep the turn non-empty
        out.append({**m, "content": content})
    return out

messages = strip_thinking(messages)   # save this version; never re-add the blocks

Pada Fable 5.1, pertahankan prefix tetap — atau pilih drop_block

“Bound to a different conversation” adalah pemeriksaan preserved-thinking: pada Claude Fable 5.1 dan Claude Opus 5.5, blok yang diputar ulang hanya valid selama system prompt, alat, dan setiap pesan sebelumnya tidak berubah. Anthropic memberlakukannya secara default untuk akun yang dibuat pada atau setelah 31 Agustus 2026 (https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#enforcement); di balik gateway, akun itu bukan milik Anda, jadi anggap pemeriksaan tersebut aktif. Pertahankan system dan alat tetap untuk sesi itu, lalu tambahkan pesan alih-alih mengeditnya. Agar permintaan tetap berhasil saat Anda mencari perubahan tersebut, kirim header beta thinking-binding-controls-2026-08-01 dengan prefix_mismatch_behavior diatur ke drop_block; tanpa header itu, kolom tersebut sendiri ditolak dengan “block_binding: Extra inputs are not permitted” (https://platform.claude.com/docs/en/api/errors).

drop_block.sh
# Anthropic's API directly. The field needs the beta header; Kunavo forwards it (see below).
curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "anthropic-beta: thinking-binding-controls-2026-08-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-fable-5-1",
    "max_tokens": 16000,
    "thinking": {
      "type": "adaptive",
      "block_binding": {"prefix_mismatch_behavior": "drop_block"}
    },
    "messages": [{"role": "user", "content": "..."}]
  }'

Jika Anda melakukan panggilan melalui Kunavo

Kunavo meneruskan blok thinking dan redacted_thinking melalui /v1/messages seperti yang dikirim, termasuk signature dan data — satu-satunya perubahan permintaan adalah model id dan, pada model yang menolaknya, penghapusan temperature, top_p, dan top_k — lalu mengembalikan body respons, baik melalui streaming maupun tidak, seperti yang dikirim upstream. Per September 2026 setiap model Claude disajikan melalui satu saluran upstream tanpa fallback, sehingga routing Kunavo tidak memindahkan percakapan antar-penyedia, dan 400 tidak pernah dicoba ulang di tempat lain. Kami belum menguji pemindahan percakapan antara Anthropic langsung dan Kunavo, jadi perkirakan permintaan pertama setelah pergantian tersebut perlu menghapus thinking. Sejak 24 September 2026 Kunavo meneruskan beta thinking-binding-controls-2026-08-01; dalam pengujian pada hari itu, saluran yang melayani Claude menerima block_binding pada Claude Fable 5.1 dengan atau tanpa header, dan kami belum melihatnya menghapus blok. Penolakan dikirim sebagai HTTP 400 bertipe invalid_request_error, tanpa kolom request_id, dengan teks pesan upstream — yang dapat menyamarkan jalur messages.N dan diakhiri request id upstream sendiri — jadi cocokkan status serta kata-kata “Invalid `signature` in `thinking` block”. Penghapusan dan percobaan ulang otomatis Claude Code bergantung pada kata-kata tersebut: Claude Code 2.1.280, yang diarahkan ke server pengujian yang menjawab dalam envelope ini, menghapus blok thinking lalu mencoba ulang. Kami belum memicu kesalahan melalui Kunavo sendiri, jadi jika sesi tetap gagal pada setiap giliran, mulai sesi baru. Permintaan yang gagal tidak ditagihkan. Yang diteruskan tanpa perubahan oleh endpoint native tercantum di referensi Messages API.

Pertanyaan umum

Apa arti “Invalid `signature` in `thinking` block”?

API tidak dapat memverifikasi blok thinking yang Anda kirim kembali. Setiap blok thinking membawa signature — salinan terenkripsi dari penalaran Claude — dan pemeriksaan gagal ketika signature tersebut terpotong, diubah, dikirim kembali dalam keadaan kosong, atau ketika blok itu tidak pernah ditandatangani oleh Claude. Ini adalah error 400, bukan error sementara: permintaan yang sama akan selalu gagal.

Apakah signature blok thinking kedaluwarsa?

Dokumentasi Anthropic tidak menyebutkan masa kedaluwarsa. Di pelacak anthropic-sdk-python (issue #1598, Agustus 2026), balasan dari akun yang ditandai GitHub sebagai kontributor menyatakan bahwa signature tersebut tidak kedaluwarsa, dan pemeriksaan gagal ketika blok yang sampai ke API berbeda dari blok yang dikembalikan — ini adalah komentar issue, bukan dokumentasi. Jika sesi tersimpan yang sebelumnya berfungsi kini gagal, periksa apa yang mungkin telah mengubah blok tersimpan atau rute yang dilaluinya: lapisan penyimpanan Anda, proxy, atau pergantian backend.

Bisakah saya menghapus blok thinking dan melanjutkan?

Ya. Anthropic menyarankan hal itu sebagai pemulihan untuk sesi tersimpan yang tidak dapat diputar ulang, dan Claude Code sendiri menghapus thinking sebelumnya ketika signature ditolak. Hapus blok thinking dan redacted_thinking — menghapus semuanya adalah cara paling sederhana — pertahankan blok lainnya, lalu coba sekali lagi. Model kehilangan penalaran sebelumnya, bukan percakapannya; di luar penggunaan tool, dokumentasi Anthropic mengizinkan Anda tidak menyertakan thinking dari giliran sebelumnya.

Mengapa ini terjadi setelah berganti model atau provider?

Dokumentasi Anthropic menyatakan bahwa pergantian antara model Claude di API-nya menghapus blok yang tidak dapat dibaca oleh model baru, tanpa error, dan bahwa signature berfungsi di Claude API, Amazon Bedrock, serta Google Cloud. Claude Code tetap harus memperbaiki sesi yang tersangkut pada signature usang setelah pergantian model atau login (2.1.152), dan laporan publik melibatkan riwayat yang melewati sesuatu yang tidak dapat diverifikasi Claude — model non-Claude di balik base URL yang sama, proxy yang menulis signature-nya sendiri, atau client yang kehilangan signature tersebut. Hapus blok thinking sekali setelah pergantian.

Apakah Claude Code memperbaikinya secara otomatis?

Versi terbaru berusaha melakukannya. Sejak 2.1.152, Claude Code menghapus signature usang setelah pergantian model atau login, lalu mencoba kembali penolakan signature tanpa blok thinking sebelumnya. Percobaan ulang itu mencocokkan teks error dari upstream, dan panduan gateway Anthropic menyatakan bahwa gateway yang membungkus error dalam envelope-nya sendiri dapat membuatnya gagal. Jalankan claude update terlebih dahulu; jika satu sesi masih gagal pada setiap giliran, mulai sesi baru.

Panduan terkait

Detail semantik error lainnya tersedia di referensi error; mendapatkan kunci hanya perlu satu menit melalui pendaftaran dan panduan autentikasi.