Kılavuzlara dön
Sorun giderme·23 Eylül 2026·6 dk okuma

Claude API 400 “Invalid `signature` in `thinking` block” — imzayı ne bozdu ve nasıl kurtarılır

API, geri gönderdiğiniz thinking bloğundaki imzayı denetledi ve doğrulayamadı: imza kısaltılmış, değiştirilmiş veya boş olarak geri gönderilmiş olabilir; blok hiçbir zaman Claude tarafından imzalanmamış olabilir — ya da Claude Fable 5.1 ve Claude Opus 5.5 modellerinde konuşmanın daha önceki bir bölümü değişmiş olabilir. Aynı geçmişi yeniden göndermek her seferinde aynı şekilde başarısız olur. Neyin bozduğunu bulun, ardından o konuşmadaki thinking bloklarını bir kez kaldırıp devam edin — modelin önceki reasoning'ini kaybedersiniz, konuşmayı değil.

Son inceleme tarihi: .

API, geri gönderdiğiniz thinking bloğundaki imzayı denetledi ve doğrulayamadı: imza kısaltılmış, değiştirilmiş veya boş olarak geri gönderilmiş olabilir; blok hiçbir zaman Claude tarafından imzalanmamış olabilir — ya da Claude Fable 5.1 ve Claude Opus 5.5 modellerinde konuşmanın daha önceki bir bölümü değişmiş olabilir. Aynı geçmişi yeniden göndermek her seferinde aynı şekilde başarısız olur. Neyin bozduğunu bulun, ardından o konuşmadaki thinking bloklarını bir kez kaldırıp devam edin — modelin önceki reasoning'ini kaybedersiniz, konuşmayı değil.

Hata

yanıt (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"."

Nedenler ve çözümler özeti

NedenÇözüm
İmza geri gönderilmeden önce kesilmiş, boşaltılmış veya düzenlenmişHer bloğu döndürüldüğü şekliyle tam olarak saklayın ve yeniden oynatın. signature_delta'nın kaybolmaması için akış hâlindeki dönüşleri SDK'nın birleştirmesine izin verin.
Blok hiçbir zaman Claude tarafından imzalanmadıAnthropic uyumlu bir URL'nin arkasındaki Claude dışı bir model veya kendi imzalarını yazan bir proxy. Bu dönüşleri yalnızca metin ve tool_use olarak geri gönderin.
Konuşma sırasında temel URL'yi, hesabı veya oturumu değiştirdinizClaude Code 2.1.152+, model veya oturum değişikliğinden sonra eski imzaları kaldırır. Kendi kodunuzda, değişiklikten sonraki ilk istek başarısız olursa thinking'i bir kez kaldırın.
“Blok farklı bir konuşmaya bağlı” (Fable 5.1, Opus 5.5)Sistem istemi, araçlar veya önceki bir ileti değişti. Geçmişi yalnızca ekleme yapılabilir tutun ya da drop_block seçeneğini etkinleştirin (beta üstbilgisi gerekir).
Bir proxy veya ağ geçidi, geçmişi iletim sırasında yeniden yazıyorYaptığı yeniden yazımlar sizin düzenlemeleriniz olarak sayılır. Bunu doğrulamak veya elemek için doğrudan API'ye karşı yeniden üretin.

Hangi denetimin başarısız olduğunu okuyun

İfadeler size bunu söyler. “Invalid `signature` in `thinking` block” ile duran bir ileti, imzanın kendisinin doğrulanmadığı anlamına gelir: Anthropic, nedenler olarak kesilmiş, değiştirilmiş veya boş geri gönderilmiş imzaları listeler (https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting, Eylül 2026 itibarıyla); korunan thinking sayfası da bunu her zaman 400 döndüren, kurcalanmış veya çözülemeyen bir imza olarak açıklar. ***.***.content.0 olarak maskelenmiş bir yol veya ağ geçidi tarafından eklenen bir istek kimliği bunu değiştirmez; önemli olan, konuşma hakkında bir cümlenin devam edip etmediğidir. Claude Fable 5.1 ve Claude Opus 5.5'te aynı sözcükler “The block is bound to a different conversation” ile devam edebilir — bu, son adımda ele alınan farklı bir denetimdir. “blocks in the latest assistant message cannot be modified” şeklindeki üçüncü ileti, en yeni assistant dönüşünün düzenlendiği, filtrelendiği, yeniden sıralandığı veya yeniden oluşturulduğu anlamına gelir; düzenlenmiş thinking metni bu hatayı üretir, imza hatasını değil. Aynı gövdeyi yeniden denemek bunların hiçbirini temizlemez.

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

assistant dönüşlerini tam olarak döndürüldükleri şekliyle geri gönderin

Her thinking bloğu, tam akıl yürütmenin şifrelenmiş kopyası olan bir imza taşır ve API bu imzayı bloğun Claude tarafından oluşturulduğunu doğrulamak için kullanır (https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-encryption). Yanıtın içerik listesini değiştirmeden ekleyin: thinking, redacted_thinking ve tool_use blokları; buna metni boş olan ve yeni modellerde varsayılan görüntüleme davranışı olan thinking blokları da dahildir. Akış sırasında imza, blok kapanmadan hemen önce tek bir signature_delta içinde gelir; bu nedenle bunu kaçıran elle yazılmış bir birleştirici boş imza saklar ve boş imzayla geri gönderilen blok başarısız olur. Anthropic'in önerisi, iletinin birleştirilmesini SDK'ya bırakmaktır. JSON anahtar sırası ve boşluklar önemli değildir — değerler önemlidir.

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.

Diğer arka uçların thinking içeriğini Claude geçmişinden uzak tutun

Anthropic belgelerine göre kendi API'sinde Claude modelleri arasında geçiş yapmak tek başına bunu tetiklememelidir: geçiş yaptığınızda blokları göndermeye devam etmenizi, yeni modelin okuyamadıklarını hata vermeden atmasını ister ve imzaların Claude API, Amazon Bedrock ve Google Cloud arasında taşınabilir olduğunu belirtir (https://platform.claude.com/docs/en/build-with-claude/thinking, Eylül 2026 itibarıyla). Doğrulayamayacağı şey, Claude'un hiç imzalamadığı bir bloktur. Kamuya açık raporlar, başka bir arka uçtan geçen geçmişleri içerir: GLM arka ucunda çalışıp sonra Anthropic'e dönen bir Claude Code oturumu (github.com/anthropics/claude-code/issues/21726), Claude thinking blokları gibi görünen ve kendi imzalarını oluşturan bir proxy üzerinden Gemini dönüşleri (github.com/router-for-me/CLIProxyAPI/issues/1584), oturum ortasında başka bir anahtara geçip geri dönen bir Claude Code oturumu (github.com/lbjlaq/Antigravity-Manager/issues/388). Claude dışı bir modelin ürettiği dönüşlerde Anthropic'in önerisi, o modelin çıktısını yalnızca metin ve tool_use içeriği olarak geri göndermektir.

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

Zaten başarısız olan bir konuşmayı kurtarın

Saklanan geçmişten thinking ve redacted_thinking bloklarını bir kez kaldırın — hepsini kaldırmak en basitidir; “farklı bir konuşmaya bağlı” varyantında Anthropic'in belirttiği minimum, adı geçen blok ve ondan sonraki her bloktur — diğer tüm blokları yerlerinde tutun, bu geçmişi kaydedin ve devam edin. Anthropic bunu artık yeniden oynatılamayan kaydedilmiş bir oturum için kurtarma yöntemi olarak verir (https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#faq); bir imza doğrulanmadığında diğer tek çıkış, hâlâ elinizdeyse bloğu döndürüldüğü şekliyle yeniden oynatmaktır. Claude Code, API bir imzayı reddettiğinde önceki thinking içeriğini kendisi kaldırır. Blokları kaldırıp devam ettikten sonra onları geri koymayın: Fable 5.1'de kaldırılıp geri konan bir blok, yokluğu sırasında üretilen thinking'i geçersiz kılar. Model önceki akıl yürütmesi olmadan yanıt verir ve yeni thinking bundan sonra geçerli olur. Claude Code 2.1.152 (27 Mayıs 2026, https://code.claude.com/docs/en/changelog), model veya oturum değişikliğinden sonra eski imzaları kaldırır; ağ geçidi kılavuzu da imza reddini önceki thinking blokları olmadan yeniden denediğini söyler — ancak bu yeniden deneme upstream'in hata metniyle eşleşir ve hataları kendi sarmalayıcısıyla saran bir ağ geçidi bunu bozabilir (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

Fable 5.1'de öneki sabit tutun — veya drop_block seçeneğini etkinleştirin

“Farklı bir konuşmaya bağlı” korunan-thinking denetimidir: Claude Fable 5.1 ve Claude Opus 5.5'te yeniden oynatılan bir blok yalnızca sistem istemi, araçlar ve önceki her ileti değişmeden kaldığında geçerlidir. Anthropic bunu 31 Ağustos 2026 veya sonrasında oluşturulan hesaplarda varsayılan olarak uygular (https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#enforcement); bir ağ geçidinin arkasında bu hesap size ait değildir, bu nedenle açık olduğunu varsayın. Oturum boyunca sistemi ve araçları sabit tutun ve düzenlemek yerine ekleme yapın. Düzenlemeyi bulana kadar isteklerin başarılı olmasını sağlamak için prefix_mismatch_behavior değeri drop_block olacak şekilde thinking-binding-controls-2026-08-01 beta üstbilgisini gönderin; bu üstbilgi olmadan alanın kendisi “block_binding: Extra inputs are not permitted” ile reddedilir (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": "..."}]
  }'

Kunavo üzerinden çağrı yapıyorsanız

Kunavo, thinking ve redacted_thinking bloklarını imza ve data dahil olmak üzere gönderildikleri hâliyle /v1/messages üzerinden iletir — tek istek değişiklikleri model kimliği ve bunları reddeden modellerde temperature, top_p ve top_k'nin kaldırılmasıdır — ve akışlı olsun veya olmasın yanıt gövdesini upstream'in gönderdiği şekilde döndürür. Eylül 2026 itibarıyla her Claude modeli geri dönüş olmadan tek bir upstream kanalı üzerinden sunulur; dolayısıyla Kunavo'nun yönlendirmesi bir konuşmayı sağlayıcılar arasında taşımaz ve 400 başka yerde yeniden denenmez. Anthropic direct ile Kunavo arasında konuşma taşımayı test etmedik; bu nedenle böyle bir geçişten sonraki ilk isteğin thinking içeriğinin kaldırılmasını gerektirmesini bekleyin. Kunavo, 24 Eylül 2026'dan beri thinking-binding-controls-2026-08-01 beta'sını iletir; o gün yapılan bir testte Claude'u sunan kanal, Claude Fable 5.1'de block_binding'i üstbilgiyle veya üstbilgisiz kabul etti ve bir bloğu kaldırdığını görmedik. Ret, request_id alanı olmadan, upstream'in ileti metnini taşıyan HTTP 400 türündeki invalid_request_error olarak gelir — bu metin messages.N yolunu maskeleyebilir ve upstream'in kendi request id'siyle bitebilir — bu nedenle durumla ve “Invalid `signature` in `thinking` block” sözcükleriyle eşleşin. Claude Code'un otomatik kaldırma ve yeniden denemesi bu ifadeye göre çalışır: Claude Code 2.1.280, bu zarfla yanıt veren bir test sunucusuna yönlendirildiğinde thinking bloklarını kaldırıp yeniden denedi. Hatayı Kunavo'nun kendisi üzerinden tetiklemedik; bu nedenle bir oturum her dönüşte hâlâ başarısız oluyorsa yeni bir oturum başlatın. Başarısız istekler ücretlendirilmez. Anthropic'e özgü uç noktanın değiştirmeden ilettiği şeyler şurada listelenmiştir: Messages API başvurusu.

Sık sorulan sorular

“Invalid `signature` in `thinking` block” ne anlama gelir?

API, geri gönderdiğiniz bir thinking bloğunu doğrulayamadı. Her thinking bloğu, Claude'un akıl yürütmesinin şifrelenmiş kopyası olan bir imza taşır; bu imza kesildiğinde, değiştirildiğinde veya boş geri gönderildiğinde ya da blok hiçbir zaman Claude tarafından imzalanmadığında denetim başarısız olur. Bu geçici bir hata değil, 400 hatasıdır: aynı istek her seferinde başarısız olur.

Thinking bloğu imzalarının süresi dolar mı?

Anthropic'in belgelerinde bir süre sonundan bahsedilmiyor. anthropic-sdk-python takipçisinde (issue #1598, Ağustos 2026), GitHub'ın katkıda bulunan olarak işaretlediği bir hesaptan gelen yanıta göre imzaların süresi dolmuyor ve denetim, API'ye ulaşan blok döndürülen bloktan farklı olduğunda başarısız oluyor — bu bir belge değil, issue yorumudur. Daha önce çalışan kaydedilmiş bir oturum şimdi başarısız oluyorsa, saklanan blokları veya izledikleri rotayı değiştirmiş olabilecek şeylere bakın: depolama katmanınız, bir proxy veya arka uç değişikliği.

Thinking bloklarını silip devam edebilir miyim?

Evet. Anthropic bunu yeniden oynatılamayan kaydedilmiş bir oturum için kurtarma yöntemi olarak verir ve Claude Code, imza reddedildiğinde önceki thinking içeriğini kendisi kaldırır. Thinking ve redacted_thinking bloklarını kaldırın — hepsini kaldırmak en basitidir — diğer blokları koruyun ve bir kez yeniden deneyin. Model önceki akıl yürütmesini kaybeder, konuşmayı değil; araç kullanımı dışında Anthropic belgeleri önceki dönüşlerin thinking içeriğinin dışarıda bırakılmasına zaten izin verir.

Modelleri veya sağlayıcıları değiştirdikten sonra neden olur?

Anthropic belgeleri, kendi API'sindeki Claude modelleri arasında geçişte yeni modelin okuyamadığı blokların hata vermeden atıldığını ve imzaların Claude API, Amazon Bedrock ve Google Cloud arasında çalıştığını söyler. Claude Code yine de model veya oturum değişikliğinden sonra eski imzalara takılan oturumları düzeltmek zorunda kaldı (2.1.152); kamuya açık raporlar da Claude'un doğrulayamayacağı bir şeyden geçen geçmişleri içeriyor — aynı temel URL'nin arkasındaki Claude dışı bir model, kendi imzalarını yazan bir proxy veya imzaları kaybeden bir istemci. Değişiklikten sonra thinking bloklarını bir kez kaldırın.

Claude Code bunu otomatik olarak düzeltir mi?

Güncel sürümler deniyor. 2.1.152'den beri model veya oturum değişikliğinden sonra eski imzaları kaldırıyor ve imza reddini önceki thinking blokları olmadan yeniden deniyor. Bu yeniden deneme upstream'in hata metniyle eşleşir; Anthropic'in ağ geçidi kılavuzuna göre hataları kendi zarfıyla saran bir ağ geçidi bunu bozabilir. Önce claude update çalıştırın; bir oturum her dönüşte hâlâ başarısız oluyorsa yeni bir oturum başlatın.

İlgili kılavuzlar

Hata anlamlarına ilişkin daha fazla bilgi hata referansı bölümünde; anahtar almak kayıt ve kimlik doğrulama kılavuzu üzerinden bir dakika sürer.