Sie haben Ihre Aufrufe der Claude API auf ein neueres Modell umgestellt und bekommen jetzt den folgenden Fehler. Oder der Antworttext kommt leer zurück. Die Ursache ist meist dieselbe: Der erste Inhaltsblock (content[0]) ist kein Text mehr, sondern ein Thinking-Block.

AttributeError: 'ThinkingBlock' object has no attribute 'text'

Wenn Sie mit dem Python-SDK response.content[0].text lesen, erhalten Sie diesen Fehler. In JavaScript liefert derselbe Code undefined, sodass statt eines Fehlers ein leerer String durch Ihre Anwendung läuft. Das Tückische: Bei einfachen Eingaben ist der erste Block weiterhin Text, daher bestehen Tests mit leichten Eingaben.

Das Problem in drei Zeilen

Was passiert

Der erste Block ist kein Text mehr

Vor allem bei schweren Eingaben steht ein Thinking-Block am Anfang der Antwort (manchmal auch bei leichten Eingaben). content[0].text bricht.

Ursache

Es denkt, ohne gefragt zu werden

Modelle ab Claude 5 denken bei Bedarf, auch wenn Sie thinking nicht setzen. Claude-4-Modelle denken nicht, solange Sie es nicht setzen.

Lösung

Blöcke nach Typ suchen

Gehen Sie nicht vom ersten Block aus. Sammeln Sie die Blöcke, deren type "text" ist, und prüfen Sie auch stop_reason.

1. Wann es auftritt

Der typische Fall ist eine Migration, bei der Sie nur den Modellnamen ändern. Zum Beispiel wechseln Sie von Claude Sonnet 4.6 zu Claude Sonnet 5.5, indem Sie nur den Wert von model umschreiben. In der Annahme, dass die Form der Antwort gleich bleibt, lassen Sie den übrigen Code unverändert. Dann passiert Folgendes (der dritte Fall tritt sogar bei korrekt geschriebenem Code auf).

Art des LesensWas passiert
content[0].text im Python-SDKBricht mit AttributeError: 'ThinkingBlock' object has no attribute 'text' ab
content[0].text in JavaScriptKein Fehler; der Wert wird undefined, und leerer Text landet auf dem Bildschirm oder im Speicher
Suche nach dem TextblockWenn das Modell viel denkt und max_tokens erreicht, gibt es womöglich gar keinen Textblock

Der dritte Fall tritt sogar bei korrekt geschriebenem Code auf. Thinking-Tokens zählen zu max_tokens; ist das Limit klein, wird die Antwort abgeschnitten, bevor das Modell überhaupt Text schreibt.

2. Ursache: Ab Claude 5 denkt das Modell ungefragt

Die Dokumentation „Thinking“ von Anthropic listet für jedes Modell auf, was passiert, wenn die Anfrage kein thinking enthält. Die Trennlinie ist Claude 5.

ModellOhne thinkingInhalt des Denkens
Ab Claude 5
(Opus 5.5, Sonnet 5.5, Haiku 5.5, Fable 5.1 usw.)
Denkt (adaptives Denken)Standardmäßig leer (display: "omitted")
Opus 4.8, Opus 4.7Denkt nichtDenkt nur, wenn Sie thinking: {type: "adaptive"} setzen; Inhalt standardmäßig leer ("omitted")
Opus 4.6, Sonnet 4.6Denkt nichtDenkt nur, wenn Sie thinking: {type: "adaptive"} setzen; liefert standardmäßig eine Zusammenfassung ("summarized")

Quelle: die Tabelle pro Modell und die Beschreibung von display in Anthropics „Thinking“ (geprüft am 1. November 2026). Opus 4.5, Sonnet 4.5 und Haiku 4.5 akzeptieren {type: "adaptive"} nicht; um sie denken zu lassen, verwenden Sie {type: "enabled"} mit budget_tokens.

Das Modell entscheidet für jede Eingabe, ob es denkt. Die Dokumentation „Steering thinking“ erklärt, dass das Modell bei einfachen Faktenfragen ohne Thinking-Block antworten kann. Sie warnt dann davor, die Logik Ihrer Anwendung auf der Annahme aufzubauen, dass jede Antwort mit einem Thinking-Block beginnt. Der erste Block ist also mal Text, mal Thinking. Code, der von einem der beiden ausgeht, bricht irgendwann.

Der Inhalt der Antwort ist wie unten gezeigt geordnet. Der Inhalt des Denkens ist standardmäßig leer, der Block selbst wird aber trotzdem zurückgegeben.

3. Was ich im Test festgestellt habe

Ich habe das am 1. November 2026 in meiner eigenen Umgebung mit dem Python-SDK (anthropic 1.14.0) getestet. Ich habe vier Modellen je einmal eine leichte und eine schwere Eingabe geschickt, jeweils ohne thinking und mit {type: "adaptive"}. max_tokens habe ich auf 8000 gesetzt. Die leichte Eingabe war eine einfache Faktenfrage nach der Hauptstadt Japans in einem Wort (auf Japanisch gestellt); die schwere Eingabe war eine Aufgabe, alle vierstelligen ganzen Zahlen zu finden, die fünf Bedingungen erfüllen.

Modellthinking-Einstellungcontent (leichte Eingabe)content (schwere Eingabe)
Sonnet 4.6Nicht gesetzttexttext
Sonnet 4.6adaptivetextnur thinking (Limit erreicht)
Haiku 5.5Nicht gesetzttextnur thinking (Limit erreicht)
Haiku 5.5adaptivetextnur thinking (Limit erreicht)
Sonnet 5.5Nicht gesetzttextthinking → text
Sonnet 5.5adaptivetextthinking → text
Opus 5.5Nicht gesetzttextthinking → text
Opus 5.5adaptivethinking → textthinking → text

Rot markiert die Kombinationen, bei denen content[0].text AttributeError: 'ThinkingBlock' object has no attribute 'text' auslöste. Jede Zeile ist das Ergebnis eines einzigen Durchlaufs; ob das Modell denkt, kann von Durchlauf zu Durchlauf schwanken, selbst bei gleicher Eingabe.

Drei Erkenntnisse.

Erstens dachten die Modelle ab Claude 5 bei der schweren Eingabe auch ohne thinking. Bei Sonnet 4.6 blieb Text der erste Block, wenn man es wegließ. Das bestätigt, was die Dokumentation sagt: Nur den Modellnamen zu ändern, ändert die Form der Antwort.

Zweitens war bei der leichten Eingabe der erste Block in fast allen Kombinationen Text. Wenn Ihre Tests nur leichte Eingaben verwenden, finden Sie dieses Problem nicht. Andererseits dachte Opus 5.5 mit adaptive sogar bei der leichten Eingabe. Ab Claude 5 sind das Weglassen von thinking und das Setzen von adaptive dieselbe Konfiguration, daher ist dieser Unterschied höchstwahrscheinlich eine Schwankung zwischen Durchläufen. Man kann nicht sagen: „Leichte Eingaben lösen kein Denken aus.“

Drittens kam beim Erreichen des Limits überhaupt kein Text zurück. Bei der schweren Eingabe verbrauchte Haiku 5.5 alle 8000 Tokens für das Denken, sowohl ohne thinking als auch mit adaptive, und lieferte keinen Textblock. Auch Sonnet 4.6 mit adaptive erreichte das Limit. Ab Claude 5 ist zudem der Inhalt des Denkens standardmäßig leer, daher sehen Nutzer nichts, Sie bezahlen aber trotzdem die Ausgabe-Tokens.

4. So beheben Sie es

Die Lösung: Gehen Sie nicht mehr davon aus, welcher Block zuerst kommt, und sammeln Sie die Blöcke vom Typ Text (type ist "text"). Prüfen Sie außerdem stop_reason, damit Sie eine am Limit abgeschnittene Antwort nicht als normale Antwort behandeln.

Python

import anthropic

client = anthropic.Anthropic()
response = client.messages.create(
    model="claude-sonnet-5-5",
    max_tokens=16000,
    messages=[{"role": "user", "content": prompt}],
)

# Nicht vom ersten Block ausgehen: nur die Textblöcke sammeln
text = "".join(b.text for b in response.content if b.type == "text")

if response.stop_reason == "max_tokens":
    # Am Limit abgeschnitten. text kann leer sein
    raise RuntimeError("max_tokens erreicht. Limit erhöhen oder Denken reduzieren")
if response.stop_reason == "end_turn" and not text:
    # Bei Tool-Nutzung ist stop_reason "tool_use" und leerer Text normal
    raise RuntimeError("Kein Textblock")

TypeScript

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();
const response = await client.messages.create({
  model: "claude-sonnet-5-5",
  max_tokens: 16000,
  messages: [{ role: "user", content: prompt }],
});

// Vor dem Lesen von text nach Typ eingrenzen
const text = response.content
  .filter((b): b is Anthropic.TextBlock => b.type === "text")
  .map((b) => b.text)
  .join("");

if (response.stop_reason === "max_tokens") {
  throw new Error("max_tokens erreicht. Limit erhöhen oder Denken reduzieren");
}
// Bei Tool-Nutzung ist stop_reason "tool_use" und leerer Text normal
if (response.stop_reason === "end_turn" && text === "") {
  throw new Error("Kein Textblock");
}

Im TypeScript-SDK sind die Elemente von content eine Union aus Typen wie Text, Thinking und Tool-Nutzung. Direkt content[0].text zu schreiben, sollte normalerweise bei der Typprüfung scheitern. Erzwingen Sie den Typ aber mit as, rutscht der Fehler durch.

max_tokens inklusive Denken festlegen

Die Dokumentation „Steering thinking“ erklärt, dass max_tokens ein gemeinsames Limit für das Denken und den Antworttext ist. Sie weist auch darauf hin, dass ein Limit, das unter der Annahme gewählt wurde, das Modell denke nicht, für schwierige Eingaben oft zu klein ist. Wenn Sie stop_reason: "max_tokens" erhalten, gibt es zwei Lösungen.

Die 16000 in den Beispielen oben sind ein grober Richtwert. In meinen Tests wurden selbst 8000 manchmal vollständig vom Denken aufgebraucht. Für die Produktion lassen Sie schwere Eingaben laufen und legen den Wert anhand von usage.output_tokens_details.thinking_tokens (der Anzahl der für das Denken verbrauchten Tokens) in der Antwort fest.

  • Das Limit erhöhen: wenn das Denken die Antwortqualität bei den abgeschnittenen Eingaben verbessert
  • Den Aufwand senken: wenn das Modell einfach zu viel denkt und sich die Antwortqualität nicht ändert (den Aufwand mit output_config.effort setzen)

Beim Fortsetzen eines Gesprächs auch die Thinking-Blöcke zurückgeben

Wenn Sie eine Antwort an den Gesprächsverlauf anhängen, extrahieren Sie nicht nur den Text, sondern geben Sie content unverändert zurück. Gerade bei Tool-Nutzung enthält der Thinking-Block die Überlegung hinter dem Tool-Aufruf. Die Dokumentation verlangt, die erhaltenen Blöcke unverändert zurückzugeben, und veränderte Blöcke werden mit einem 400-Fehler abgelehnt. Am sichersten ist es, den angezeigten Text vom content zu trennen, den Sie im Verlauf zurückgeben.

5. Kann man das Denken einfach abschalten?

Man ist versucht zu denken: „Wenn das Denken stört, schalte ich es eben ab.“ Ob das geht, hängt aber vom Modell ab. So wird thinking: {type: "disabled"} behandelt.

Modell{type: "disabled"}
Opus 5.5, Fable 5.1, Fable 5400-Fehler (lässt sich nicht abschalten)
Sonnet 5.5400-Fehler (stattdessen überspringt {type: "between_tools"} das anfängliche Denken, wenn der Aufwand high oder niedriger ist)
Haiku 5.5, Opus 5Abschaltbar (nur wenn der Aufwand high oder niedriger ist; 400-Fehler bei xhigh und max)
Sonnet 5Abschaltbar

Quelle: Anthropics „Thinking“ (geprüft am 1. November 2026). Ob ein Modell es akzeptiert, können Sie auch mit capabilities.thinking.types.disabled.supported in der Models API prüfen. Der Standardaufwand ist medium bei Opus 5.5 und Haiku 5.5 und high bei den meisten anderen Modellen, sodass die Standardwerte die Bedingung „high oder niedriger“ erfüllen.

Selbst bei Modellen, bei denen es geht, kann das Abschalten die Antwortqualität bei schwierigen Eingaben senken. Und dasselbe Problem kehrt bei jedem Modellwechsel zurück. Die eigentliche Lösung ist Code, der eine Antwort in jeder Reihenfolge lesen kann. Wenn Sie das Denken reduzieren wollen, senken Sie zuerst den Aufwand. Laut Anthropics Dokumentation reduziert die Bitte im Systemprompt, Sonnet 5.5 möge weniger denken, das Denken nicht zuverlässig, und Haiku 5.5 dachte weiter, selbst als es angewiesen wurde, direkt zu antworten (in Anthropics Tests). Steuern Sie bei beiden über den Aufwand.

6. So übersehen Sie es im Test nicht

Dieses Problem rutscht durch Tests mit leichten Eingaben. Beim Modellwechsel ist es schwerer zu übersehen, wenn Sie in der folgenden Reihenfolge prüfen.

  1. content[0] im Code finden: Listen Sie alle Stellen auf, die nach Position lesen, etwa content[0], content[-1] und .content[0].text, nicht nur im Produktivcode, sondern auch in Tests und im Logging
  2. Schwere Eingaben in die Tests aufnehmen: Nehmen Sie Ihre längsten Produktiveingaben und schwierigsten Aufgaben als Testeingaben auf (mit nur leichten Eingaben bleibt der erste Block Text und der Fehler verborgen)
  3. Gefälschte Antworten einspeisen, die mit einem Thinking-Block beginnen: Bereiten Sie in Unit-Tests ohne API-Aufruf eine Antwort [thinking, text] und eine Antwort nur aus thinking mit stop_reason "max_tokens" vor, damit Sie unabhängig davon testen können, ob das Modell denkt
  4. Schrittweise ausrollen: Stellen Sie nicht alles auf einmal um; verlagern Sie zuerst einen Teil der Workloads auf das neue Modell, beobachten Sie die Zahl leerer Texte und Ausnahmen und weiten Sie dann aus

⚠️ Wenn mehrere Dienste oder Teams gemeinsam das Modell wechseln, fügen Sie der Migrationsanfrage eine Zeile hinzu: „Der erste Block der Antwort ist nicht immer Text. Suchen Sie ihn nach Typ.“ Die Änderung sieht nach einer bloßen Umbenennung aus, und wenn Sie warten, bis jedes Team es selbst bemerkt, bricht Code, der Tests mit leichten Eingaben bestanden hat, in der Produktion.

Das ist nicht das Einzige, was beim Modellwechsel zu prüfen ist. Was sich bei der Migration von früheren Generationen geändert hat, finden Sie in „Claude Opus 4.7 Migrationsleitfaden“ und „Die 3 Breaking Changes von Claude Fable 5.1“. Den Aufwand in der API beschreibt Anthropics Dokumentation „Effort“, die Wahl des Aufwands in Claude Code „Claude Code: die Aufwandseinstellung erklärt“.

Zusammenfassung

  • AttributeError: 'ThinkingBlock' object has no attribute 'text' tritt auf, wenn der erste Block der Antwort ein Thinking-Block ist und Sie den Text mit content[0].text lesen wollen
  • Modelle ab Claude 5 denken bei Bedarf auch ohne thinking, daher ändert schon der bloße Wechsel des Modellnamens von einem Claude-4-Modell die Form der Antwort
  • Bei leichten Eingaben ist der erste Block meist weiterhin Text, daher bestehen leichte Tests
  • Die Lösung: die Blöcke sammeln, deren type "text" ist, und prüfen, ob stop_reason "max_tokens" ist
  • Bei manchen Modellen lässt sich das Denken nicht abschalten, daher ist die eigentliche Lösung nicht das Abschalten, sondern Code, der eine Antwort in jeder Reihenfolge liest

FAQ

F. Ich habe thinking nie gesetzt. Warum bekomme ich einen Thinking-Block?

A. Bei Modellen ab Claude 5 ist adaptives Denken auch ohne thinking aktiv, und das Modell denkt bei Eingaben, bei denen es das für nötig hält. Der Inhalt des Denkens ist standardmäßig leer, der Block selbst ist aber in der Antwort enthalten. Claude-4-Modelle wie Claude Opus 4.8 und Sonnet 4.6 denken nicht, solange Sie es nicht setzen.

F. Warum bekomme ich eine Antwort ganz ohne Textblock?

A. Thinking-Tokens zählen zu max_tokens, und das Limit wurde erreicht, bevor das Modell überhaupt Text schrieb. stop_reason sollte "max_tokens" sein. Erhöhen Sie das Limit oder senken Sie den Aufwand, um das Denken zu reduzieren.

F. Was, wenn ich den Inhalt des Denkens lesen möchte?

A. Setzen Sie thinking: {type: "adaptive", display: "summarized"}, um eine Zusammenfassung des Denkens zu erhalten. Der Standard ab Claude 5 ist "omitted" (der Inhalt ist leer, nur die Signatur ist enthalten). In beiden Fällen werden Ihnen alle Thinking-Tokens berechnet.

Änderungsverlauf

  • 1. November 2026Erste Fassung. Geschrieben nach Durchsicht von Anthropics Dokumentationen „Thinking“ und „Steering thinking“ und einem Test der Antwortreihenfolge von vier Modellen in meiner eigenen Umgebung.

Quellen