Die API hat die Signatur eines von Ihnen zurückgesendeten Thinking-Blocks geprüft, konnte sie aber nicht verifizieren: Die Signatur war abgeschnitten, verändert oder leer zurückgesendet worden, oder der Block wurde nie von Claude signiert — oder bei Claude Fable 5.1 und Claude Opus 5.5 wurde etwas Früheres in der Unterhaltung geändert. Das erneute Senden desselben Verlaufs schlägt jedes Mal auf dieselbe Weise fehl. Finden Sie heraus, was ihn beschädigt hat, und entfernen Sie dann die Thinking-Blöcke einmal aus dieser Unterhaltung und fahren Sie fort — Sie verlieren die frühere Schlussfolgerung des Modells, nicht die Unterhaltung.
Der Fehler
// 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"."Ursachen und Lösungen im Überblick
| Ursache | Lösung |
|---|---|
| Die Signatur wurde abgeschnitten, geleert oder vor dem Zurücksenden bearbeitet | Speichern und wiedergeben Sie jeden Block exakt so, wie er zurückgegeben wurde. Lassen Sie das SDK gestreamte Turns zusammensetzen, damit die signature_delta nicht verloren geht. |
| Der Block wurde nie von Claude signiert | Ein Nicht-Claude-Modell hinter einer Anthropic-kompatiblen URL oder ein Proxy, der eigene Signaturen schreibt. Senden Sie diese Turns nur als Text und tool_use zurück. |
| Sie haben während der Unterhaltung die Basis-URL, das Konto oder die Anmeldung gewechselt | Claude Code 2.1.152+ entfernt veraltete Signaturen nach einem Modell- oder Anmeldungswechsel. Entfernen Sie in Ihrem eigenen Code die Thinking-Blöcke einmal, wenn die erste Anfrage nach einem Wechsel fehlschlägt. |
| „Der Block ist an eine andere Unterhaltung gebunden“ (Fable 5.1, Opus 5.5) | Der System-Prompt, Tools oder eine frühere Nachricht wurden geändert. Halten Sie den Verlauf nur zum Anhängen, oder aktivieren Sie drop_block (erfordert einen Beta-Header). |
| Ein Proxy oder Gateway schreibt den Verlauf unterwegs um | Diese Umschreibungen zählen als Ihre Bearbeitungen. Wiederholen Sie den Vorgang direkt gegen die API, um dies ein- oder auszuschließen. |
Lesen Sie, welche Prüfung fehlgeschlagen ist
Die Formulierung gibt den Hinweis. Eine Meldung, die bei „Invalid `signature` in `thinking` block“ endet, bedeutet, dass die Signatur selbst nicht verifiziert werden konnte: Anthropic nennt als Ursachen eine abgeschnittene, veränderte oder leer zurückgesendete Signatur (https://platform.claude.com/docs/en/build-with-claude/thinking-troubleshooting, Stand September 2026), und die Seite zum Bewahren von Thinking beschreibt sie als manipulierte oder nicht entschlüsselbare Signatur, die immer einen 400-Fehler zurückgibt. Ein als ***.***.content.0 maskierter Pfad oder eine von einem Gateway angehängte Anfrage-ID ändert daran nichts; entscheidend ist, ob anschließend ein Satz über die Unterhaltung folgt. Bei Claude Fable 5.1 und Claude Opus 5.5 können dieselben Worte mit „The block is bound to a different conversation“ fortgesetzt werden — eine andere Prüfung, die im letzten Schritt behandelt wird. Eine dritte Meldung, „blocks in the latest assistant message cannot be modified“, bedeutet, dass der neueste Assistant-Turn bearbeitet, gefiltert, neu geordnet oder rekonstruiert wurde; bearbeiteter Thinking-Text erzeugt diesen Fehler, keinen Signaturfehler. Ein erneuter Versuch mit demselben Body behebt keinen dieser Fehler.
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 backAssistant-Turns exakt so zurücksenden, wie sie zurückgegeben wurden
Jeder Thinking-Block enthält eine Signatur — eine verschlüsselte Kopie der vollständigen Schlussfolgerung — und die API verwendet sie, um zu prüfen, ob der Block von Claude erzeugt wurde (https://platform.claude.com/docs/en/build-with-claude/thinking#thinking-encryption). Hängen Sie die Inhaltsliste der Antwort unverändert an: Thinking-, redacted_thinking- und tool_use-Blöcke, einschließlich Thinking-Blöcken mit leerem Text, was bei neueren Modellen standardmäßig angezeigt wird. Beim Streaming kommt die Signatur in einem einzigen signature_delta unmittelbar vor dem Schließen des Blocks an. Ein selbst geschriebener Akkumulator, der sie verpasst, speichert eine leere Signatur, und ein mit leerer Signatur zurückgesendeter Block schlägt fehl; Anthropic empfiehlt, das SDK die Nachricht zusammensetzen zu lassen. Reihenfolge und Leerzeichen der JSON-Schlüssel spielen keine Rolle — die Werte schon.
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.Thinking anderer Backends aus dem Claude-Verlauf heraushalten
Laut Anthropics Dokumentation sollte der Wechsel zwischen Claude-Modellen in der eigenen API dies nicht auslösen: Sie fordert dazu auf, die Blöcke beim Wechsel weiterzusenden, verwirft diejenigen, die das neue Modell nicht lesen kann, ohne einen Fehler auszulösen, und dokumentiert Signaturen als portabel zwischen der Claude API, Amazon Bedrock und Google Cloud (https://platform.claude.com/docs/en/build-with-claude/thinking, Stand September 2026). Was sie nicht verifizieren kann, ist ein Block, den Claude nie signiert hat. Die öffentlichen Berichte betreffen Verläufe, die ein anderes Backend durchlaufen haben: eine Claude-Code-Sitzung, die auf einem GLM-Backend lief und anschließend zu Anthropic zurückkehrte (github.com/anthropics/claude-code/issues/21726), Gemini-Turns in einem als Claude ausgegebenen Proxy, der eigene Signaturen für Thinking-Blöcke erzeugt (github.com/router-for-me/CLIProxyAPI/issues/1584), sowie eine Claude-Code-Sitzung, die mitten in der Sitzung zu einem anderen Schlüssel und zurück wechselte (github.com/lbjlaq/Antigravity-Manager/issues/388). Bei Turns, die ein Nicht-Claude-Modell erzeugt hat, empfiehlt Anthropic, die Ausgabe dieses Modells nur als Text- und tool_use-Inhalt zurückzusenden.
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")]Eine bereits fehlschlagende Unterhaltung wiederherstellen
Entfernen Sie die Thinking- und redacted_thinking-Blöcke einmal aus dem gespeicherten Verlauf — alle zu entfernen ist am einfachsten; bei der Variante „an eine andere Unterhaltung gebunden“ ist laut Anthropic mindestens der genannte Block und jeder darauffolgende erforderlich — lassen Sie alle übrigen Blöcke an ihrer Position, speichern Sie den Verlauf und fahren Sie fort. Anthropic nennt dies als Wiederherstellung für eine gespeicherte Sitzung, die nicht mehr wiedergegeben werden kann (https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#faq); wenn eine Signatur nicht verifiziert werden kann, bleibt nur, den Block exakt so wiederzugeben, wie er zurückgegeben wurde, sofern Sie ihn noch besitzen. Claude Code entfernt frühere Thinking-Blöcke selbst, wenn die API eine Signatur zurückweist. Sobald Sie die Blöcke entfernt haben und fortfahren, fügen Sie sie nicht wieder ein: Bei Fable 5.1 macht ein entfernter und wieder eingefügter Block das während seiner Entfernung erzeugte Thinking ungültig. Das Modell antwortet ohne seine frühere Schlussfolgerung, und neues Thinking ist ab diesem Punkt gültig. In Claude Code entfernt 2.1.152 (27. Mai 2026, https://code.claude.com/docs/en/changelog) veraltete Signaturen nach einem Modell- oder Anmeldungswechsel, und der Gateway-Leitfaden besagt, dass eine Signaturzurückweisung ohne die früheren Thinking-Blöcke erneut versucht wird — dieser Versuch erkennt jedoch die Fehlerformulierung des Upstreams, und ein Gateway, das Fehler in eine eigene Hülle einbettet, kann dies verhindern (https://code.claude.com/docs/en/llm-gateway-protocol#automatic-retry-and-error-forwarding).
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 blocksBei Fable 5.1 das Präfix unverändert lassen — oder drop_block aktivieren
„An eine andere Unterhaltung gebunden“ ist die Prüfung für bewahrtes Thinking: Bei Claude Fable 5.1 und Claude Opus 5.5 ist ein wiedergegebener Block nur gültig, solange System-Prompt, Tools und jede frühere Nachricht unverändert sind. Anthropic setzt dies standardmäßig für Konten durch, die am oder nach dem 31. August 2026 erstellt wurden (https://platform.claude.com/docs/en/build-with-claude/preserved-thinking#enforcement); hinter einem Gateway gehört dieses Konto nicht Ihnen, gehen Sie daher davon aus, dass die Prüfung aktiv ist. Halten Sie System und Tools während der Sitzung unverändert und hängen Sie Nachrichten an, statt sie zu bearbeiten. Damit Anfragen weiter funktionieren, während Sie die Änderung suchen, senden Sie den Beta-Header thinking-binding-controls-2026-08-01 mit prefix_mismatch_behavior auf drop_block gesetzt; ohne diesen Header wird das Feld selbst mit „block_binding: Extra inputs are not permitted“ zurückgewiesen (https://platform.claude.com/docs/en/api/errors).
# 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": "..."}]
}'Wenn Sie Kunavo verwenden
Kunavo leitet Thinking- und redacted_thinking-Blöcke über /v1/messages so weiter, wie sie gesendet wurden, einschließlich Signatur und Daten — die einzigen Änderungen an der Anfrage sind die Modell-ID und bei Modellen, die diese Parameter ablehnen, das Entfernen von temperature, top_p und top_k — und gibt den Antwort-Body gestreamt oder nicht gestreamt so zurück, wie der Upstream ihn gesendet hat. Seit September 2026 wird jedes Claude-Modell über genau einen Upstream-Kanal ohne Fallback bereitgestellt, sodass Kunavos Routing eine Unterhaltung nicht zwischen Anbietern verschiebt und ein 400-Fehler niemals an anderer Stelle erneut versucht wird. Wir haben das Verschieben einer Unterhaltung zwischen Anthropic direkt und Kunavo nicht getestet; gehen Sie daher davon aus, dass die erste Anfrage nach einem solchen Wechsel das Entfernen des Thinking erfordert. Seit dem 24. September 2026 leitet Kunavo den Beta-Header thinking-binding-controls-2026-08-01 weiter; bei einem Test an diesem Tag akzeptierte der Claude bereitstellende Kanal block_binding bei Claude Fable 5.1 mit oder ohne Header, und wir haben nicht beobachtet, dass ein Block entfernt wurde. Die Zurückweisung kommt als HTTP 400 vom Typ invalid_request_error ohne request_id-Feld und enthält den Nachrichtentext des Upstreams — dieser kann den messages.N-Pfad maskieren und mit der eigenen Request-ID des Upstreams enden — prüfen Sie daher Status und die Worte „Invalid `signature` in `thinking` block“. Der automatische Entfernen-und-Erneut-Versuchen-Mechanismus von Claude Code verwendet diese Formulierung: Claude Code 2.1.280 entfernte bei einer Testserverantwort in dieser Hülle die Thinking-Blöcke und wiederholte die Anfrage. Wir haben den Fehler über Kunavo selbst nicht ausgelöst; wenn eine Sitzung weiterhin bei jedem Turn fehlschlägt, starten Sie eine neue. Fehlgeschlagene Anfragen werden nicht berechnet. Was der native Endpunkt unverändert weitergibt, ist aufgeführt in der Referenz zur Messages API.
Häufig gestellte Fragen
Was bedeutet „Invalid `signature` in `thinking` block“?
Die API konnte einen von Ihnen zurückgesendeten Thinking-Block nicht verifizieren. Jeder Thinking-Block enthält eine Signatur — eine verschlüsselte Kopie der Schlussfolgerung von Claude — und die Prüfung schlägt fehl, wenn diese Signatur abgeschnitten, verändert oder leer zurückgesendet wurde oder wenn der Block nie von Claude signiert wurde. Es handelt sich um einen 400-Fehler, nicht um einen vorübergehenden Fehler: Dieselbe Anfrage schlägt jedes Mal fehl.
Laufen Signaturen von Thinking-Blöcken ab?
Anthropics Dokumentation erwähnt keinen Ablauf. Im Tracker von anthropic-sdk-python (Issue #1598, August 2026) sagt eine Antwort von einem Konto, das GitHub als Mitwirkenden markiert, dass sie nicht ablaufen und die Prüfung fehlschlägt, wenn der bei der API ankommende Block von dem zurückgegebenen abweicht — ein Issue-Kommentar, keine Dokumentation. Wenn eine gespeicherte Sitzung, die zuvor funktionierte, nun fehlschlägt, prüfen Sie, was die gespeicherten Blöcke oder ihre Route verändert haben könnte: Ihre Speicherschicht, ein Proxy oder ein Backend-Wechsel.
Kann ich die Thinking-Blöcke einfach löschen und fortfahren?
Ja. Anthropic nennt dies als Wiederherstellung für eine gespeicherte Sitzung, die nicht wiedergegeben werden kann, und Claude Code entfernt frühere Thinking-Blöcke selbst, wenn eine Signatur zurückgewiesen wird. Entfernen Sie die Thinking- und redacted_thinking-Blöcke — alle zu entfernen ist am einfachsten — behalten Sie die übrigen Blöcke und versuchen Sie es einmal erneut. Das Modell verliert seine frühere Schlussfolgerung, nicht die Unterhaltung; abgesehen von Tool-Nutzung erlauben Anthropics Dokumente ohnehin, das Thinking früherer Turns wegzulassen.
Warum passiert dies nach dem Wechsel von Modellen oder Anbietern?
Anthropics Dokumentation besagt, dass ein Wechsel zwischen Claude-Modellen in der eigenen API die Blöcke verwirft, die das neue Modell nicht lesen kann, ohne einen Fehler auszulösen, und dass Signaturen über die Claude API, Amazon Bedrock und Google Cloud hinweg funktionieren. Claude Code musste dennoch Sitzungen mit veralteten Signaturen nach einem Modell- oder Anmeldungswechsel reparieren (2.1.152), und die öffentlichen Berichte betreffen Verläufe, die durch etwas liefen, das Claude nicht verifizieren kann — ein Nicht-Claude-Modell hinter derselben Basis-URL, ein Proxy, der eigene Signaturen schreibt, oder ein Client, der sie verloren hat. Entfernen Sie die Thinking-Blöcke nach dem Wechsel einmal.
Behebt Claude Code dies automatisch?
Aktuelle Versionen versuchen es. Seit 2.1.152 entfernt Claude Code veraltete Signaturen nach einem Modell- oder Anmeldungswechsel und wiederholt eine Signaturzurückweisung ohne die früheren Thinking-Blöcke. Dieser Versuch erkennt die Fehlerformulierung des Upstreams, und Anthropics Gateway-Leitfaden weist darauf hin, dass ein Gateway, das Fehler in eine eigene Hülle einbettet, dies verhindern kann. Führen Sie zuerst claude update aus; wenn eine Sitzung weiterhin bei jedem Turn fehlschlägt, starten Sie eine neue Sitzung.
Verwandte Anleitungen
- Claude API 400 „tool_use ids were found without tool_result blocks“ — die Reihenfolgeregel
- Claude Code Router – Claude Code zu jedem Modell routen oder den Router vollständig überspringen
- LLM-Streaming-Fehler — SSE-Abbrüche, hängende Streams und fehlende Nutzungsdaten
- Claude Code „context_management: Extra inputs are not permitted“ – der Beta-Header, der nicht ankam
Weitere Informationen zur Fehlersemantik finden Sie unter Fehlerreferenz; einen Schlüssel erhalten Sie in einer Minute über Registrierung und die Authentifizierungsanleitung.