Ihr messages-Array endet mit einer Assistant-Nachricht, und Claude-Modelle ab Claude 4.6 interpretieren dies als Prefill und lehnen es ab. Beenden Sie die Unterhaltung mit einer User-Nachricht und verlagern Sie die Funktion des Prefills – JSON zu erzwingen, eine Präambel zu überspringen, eine Persona beizubehalten oder eine abgebrochene Antwort fortzusetzen – auf den von Anthropic dafür dokumentierten Ersatz.
Der Fehler
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "This model does not support assistant message prefill. The conversation must end with a user message."
},
"request_id": "req_..."
}Ursachen und Lösungen im Überblick
| Ursache | Lösung |
|---|---|
| Der letzte Eintrag in messages hat die Rolle: "assistant" | Das ist ein Prefill, und Claude-Modelle ab Claude 4.6 lehnen ihn ab. Beenden Sie die Unterhaltung mit einer User-Nachricht. |
| Ein Framework hat zuletzt eine leere Assistant-Nachricht hinterlassen | Entfernen Sie vor dem Senden eine nachgestellte Assistant-Nachricht ohne Inhalt. |
| Sie haben „{“ vorbefüllt, um JSON zu erzwingen | Verwenden Sie stattdessen strukturierte Ausgaben (output_config.format). |
| Sie haben vorbefüllt, um eine Präambel zu überspringen, eine Persona beizubehalten oder eine abgebrochene Antwort fortzusetzen | Eine Anweisung im System-Prompt, eine Rolle im System-Prompt oder eine Fortsetzung in einem User-Turn. |
| Ein Speicherverwalter, eine Agentenschleife oder eine Übergabe hat zuletzt einen Assistant-Turn hinterlassen | Normalisieren Sie das Ende einmal direkt vor der Anfrage statt in jedem Codepfad. |
Welche Claude-Modelle Prefill ablehnen (Stand September 2026)
Anthropics Fehlerreferenz ist eindeutig: Claude 4.6 und spätere Modelle unterstützen kein Prefill der letzten Assistant-Nachricht, und eine solche Anfrage erzeugt genau diesen 400-Fehler (https://platform.claude.com/docs/en/api/errors#prefill-not-supported). Namentlich sind das Claude Opus 4.6 und jedes spätere Opus, einschließlich Claude Opus 5.5 (https://platform.claude.com/docs/en/models/opus-5-5/migration-guide); Claude Sonnet 4.6 und Claude Sonnet 5 (https://platform.claude.com/docs/en/models/sonnet-5/migration-guide); sowie Claude Fable 5 und Fable 5.1 (https://platform.claude.com/docs/en/models/fable-5-1/migration-guide). Claude Haiku 4.5 akzeptiert weiterhin ein Prefill, ebenso Claude Sonnet 4.5 und Claude Opus 4.5 – deshalb tritt dieser Fehler häufig nach einer Änderung der Modell-ID statt nach einer Codeänderung auf. Frühere Assistant-Nachrichten in der Unterhaltung, einschließlich Few-Shot-Beispielen, sind nicht betroffen.
Mit einem User-Turn enden – einschließlich der einzeiligen Korrektur
Oft hat niemand absichtlich ein Prefill geschrieben: Etwas im Stack hat zuletzt eine Assistant-Nachricht eingefügt. Öffentliche Berichte führen dies auf einen Speicherverwalter zurück, der eine solche Nachricht anhängt (Strands Issue #1694), eine Agentenschleife, die nach einem Turn erneut anfragt, den sie fälschlich für unvollständig hält (opencode Issue #46415), aufeinanderfolgende Antworten und Agentenübergaben (LiveKit Issue #4907) sowie eine am Ende verbliebene leere Assistant-Nachricht (AutoGen PR #7931). Wenn die nachgestellte Nachricht leer ist, entfernen Sie sie – das ist die eine Zeile. Enthält sie Text, den Sie fortsetzen möchten, folgen Sie Anthropics Migrationsanleitung für Fortsetzungen: Legen Sie die Fortsetzung in eine User-Nachricht, die die Stelle zitiert, an der die Antwort abgebrochen wurde. Eine dokumentierte Ausnahme, die unverändert bleiben soll: Ein pause_turn aus Server-Tools wie der Websuche wird fortgesetzt, indem der pausierte Assistant-Inhalt unverändert zurückgesendet wird (https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools).
from openai import OpenAI
client = OpenAI(base_url="https://api.kunavo.com/v1", api_key="sk-kn-...")
def end_on_user(messages: list[dict]) -> list[dict]:
"""Claude 4.6 and later reject a conversation whose last turn is the assistant's."""
last = messages[-1] if messages else None
if not last or last["role"] != "assistant" or last.get("tool_calls"):
return messages # tool_calls are owed tool results instead
content = last.get("content")
if not content or (isinstance(content, str) and not content.strip()):
return messages[:-1] # the one line: drop an empty tail
tail = content[-200:] if isinstance(content, str) else "..."
return messages + [{
"role": "user",
"content": f"Your previous response was interrupted and ended with {tail!r}. "
"Continue from where you left off.",
}]
messages = [
{"role": "user", "content": "Explain HTTP caching in three bullets."},
{"role": "assistant", "content": ""}, # the empty tail a framework left behind
]
resp = client.chat.completions.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=end_on_user(messages),
)
print(resp.choices[0].message.content)Ersetzen Sie die Funktion des Prefills
Anthropics Prompting-Leitfaden ordnet jeder früheren Verwendung von Prefill einen Ersatz zu (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#migrating-away-from-prefilled-responses). JSON erzwingen: strukturierte Ausgaben, die die Antwort auf Ihr Schema beschränken und für Claude Haiku 4.5, Sonnet 4.5, Opus 4.5 und jedes spätere Modell verfügbar sind (https://platform.claude.com/docs/en/build-with-claude/structured-outputs); für YAML oder ein anderes Format empfiehlt der Leitfaden, die Struktur anzufordern und bei Abweichung erneut zu versuchen. Klassifizierung: ein Tool mit einem Enum Ihrer gültigen Bezeichnungen oder strukturierte Ausgaben. Eine Präambel überspringen: eine System-Prompt-Anweisung wie „Direkt und ohne Präambel antworten.“ Eine Persona beibehalten: Legen Sie die Rolle im System-Prompt fest (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#give-claude-a-role) und platzieren Sie regelmäßige Erinnerungen im User-Turn statt in einem vorbefüllten Assistant-Turn. Abgebrochene Antwort: die obige Fortsetzung im User-Turn. Das Erzwingen eines Tool-Aufrufs ist nicht überall ein direkter Ersatz – Claude Fable 5.1 und Claude Opus 5.5 lehnen tool_choice any und tool jeweils mit einem eigenen 400-Fehler ab (https://platform.claude.com/docs/en/api/errors#forced-tool-use-not-supported).
# Before: messages ended with {"role": "assistant", "content": "{"}
# Kunavo forwards output_config as sent; the reply is constrained to the schema.
curl https://api.kunavo.com/v1/messages \
-H "x-api-key: sk-kn-..." \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Extract the name and email: John Smith <john@example.com>"}
],
"output_config": {
"format": {
"type": "json_schema",
"schema": {
"type": "object",
"properties": {
"name": {"type": "string"},
"email": {"type": "string"}
},
"required": ["name", "email"],
"additionalProperties": false
}
}
}
}'Wenn Sie Kunavo verwenden
Kunavo leitet einen nachgestellten Assistant-Turn weiter; es repariert ihn nicht. /v1/messages übergibt Ihr messages-Array unverändert an den Upstream, und bei /v1/chat/completions überträgt der Übersetzer eine abschließende Nachricht mit role: "assistant" als abschließenden Assistant-Turn in die Claude-Anfrage – einschließlich einer leeren Nachricht; leere Nachrichten müssen Sie daher selbst entfernen. Anthropic lehnt einen vorbefüllten abschließenden Turn bei jedem von uns bereitgestellten claude-* Modell außer claude-haiku-4-5 ab, und dieser 400-Fehler erreicht Sie mit unverändertem Meldungstext sowie der Request-ID des Upstreams: im Anthropic-Format bei /v1/messages, mit dem Typ invalid_request_error wie bei Anthropics API (bis zum 24. September 2026 lautete er api_error), und im OpenAI-Format bei /v1/chat/completions (Typ upstream_error, Code upstream_400). Ein 400-Fehler wird niemals über einen anderen Kanal wiederholt, und der fehlgeschlagene Aufruf wird mit Kosten von null erfasst. Für JSON senden Sie statt eines Prefills ein Schema: /v1/messages leitet output_config so weiter, wie Sie es gesendet haben, und bei /v1/chat/completions wird ein response_format vom Typ json_schema in output_config.format übersetzt. Am 24.09.2026 beschränkte dieses Feld die Antwort bei jedem von uns bereitgestellten claude-* Modell auf das Schema. Ein response_format vom Typ json_object hat kein Claude-Gegenstück und wird nicht erzwungen, und ein gemeinsam mit einem vorbefüllten abschließenden Turn gesendetes Schema erzeugt auch bei claude-haiku-4-5 einen eigenen 400-Fehler: „When using output format, pre-filling the `assistant` response is not supported.“ Der native Endpunkt und die Anforderungsstruktur, die ihn durchläuft, sind dokumentiert in der Messages-API-Dokumentation.
Häufig gestellte Fragen
Welche Claude-Modelle unterstützen kein Prefill von Assistant-Nachrichten?
Laut der Anthropic-Dokumentation vom September 2026 gilt dies für jedes Claude-Modell ab 4.6: Claude Opus 4.6 und alle späteren Opus-Modelle, Claude Sonnet 4.6 und Sonnet 5, Claude Fable 5 und 5.1 sowie die Mythos-Modelle. Claude Haiku 4.5, Sonnet 4.5 und Opus 4.5 akzeptieren weiterhin eines.
Wie erzwinge ich JSON-Ausgabe von Claude ohne Prefill?
Verwende strukturierte Ausgaben: Übergib ein JSON-Schema in output_config.format, und die Antwort wird darauf beschränkt. Über einen OpenAI-kompatiblen Endpunkt sendest du es als response_format mit type json_schema; Kunavo übersetzt dies in output_config.format. Anthropic führt Message-Prefilling grundsätzlich als inkompatibel mit JSON-Ausgaben auf.
Warum erhalte ich diesen Fehler, obwohl ich nie ein Prefill verwendet habe?
Etwas in deinem Stack hat eine Assistant-Nachricht als letzte Nachricht hinterlassen – etwa ein Memory- oder Sitzungsmanager, eine Agentenschleife, die nach einem Durchlauf erneut anfordert, eine Agentenübergabe oder eine leere Assistant-Nachricht, die niemand entfernt hat. Protokolliere das messages-Array exakt so, wie es gesendet wird; sein letztes Element hat role: "assistant".
Kann ich weiterhin Assistant-Nachrichten in die Unterhaltung aufnehmen?
Ja. Nur der letzte Durchlauf ist eingeschränkt; frühere Assistant-Nachrichten, einschließlich Few-Shot-Beispielen, sind nicht betroffen.
Warum passiert das auch über einen OpenAI-kompatiblen Endpunkt?
Weil das Gateway deine abschließende Nachricht mit role: "assistant" als abschließenden Claude-Assistant-Durchlauf weitergibt – dasselbe Prefill, nur umgeformt. Kunavos Chat-Übersetzer macht genau das, und dieselbe Nachricht wurde über andere OpenAI-kompatible Gateways gemeldet (opencode issue #13768). Die Lösung ist dieselbe: Beende mit einer User-Nachricht.
Verwandte Anleitungen
- Claude API 400 „tool_use ids were found without tool_result blocks“ — die Reihenfolgeregel
- „`temperature` und `top_p` können für dieses Modell nicht gleichzeitig angegeben werden“ — senden Sie einen der beiden Parameter; bei neueren Claude-Modellen keinen
- „Unsupported parameter: 'max_tokens' is not supported with this model“ — verwenden Sie max_completion_tokens
- Claude API — der vollständige Leitfaden für Aufrufe von Claude auf Kunavo
Weitere Informationen zur Fehlersemantik finden Sie unter Fehlerreferenz; einen Schlüssel erhalten Sie in einer Minute über Registrierung und die Authentifizierungsanleitung.