Array messages Anda berakhir dengan giliran assistant, dan model Claude 4.6 serta yang lebih baru membacanya sebagai prefill lalu menolaknya. Akhiri percakapan dengan pesan user, lalu pindahkan fungsi prefill — memaksa JSON, melewati pembuka, mempertahankan persona, atau melanjutkan jawaban yang terputus — ke pengganti yang didokumentasikan Anthropic untuk fungsi tersebut.
Error
{
"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_..."
}Ringkasan penyebab dan perbaikan
| Penyebab | Perbaikan |
|---|---|
| Entri terakhir dalam messages memiliki role: "assistant" | Itu adalah prefill, dan model Claude 4.6 serta yang lebih baru menolaknya. Akhiri dengan pesan user. |
| Sebuah framework meninggalkan pesan assistant kosong sebagai pesan terakhir | Hapus pesan assistant terakhir yang tidak memiliki konten sebelum mengirim. |
| Anda melakukan prefill “{” untuk memaksa JSON | Gunakan structured outputs (output_config.format) sebagai gantinya. |
| Anda melakukan prefill untuk melewati pembuka, mempertahankan persona, atau melanjutkan jawaban yang terputus | Instruksi dalam system prompt, peran dalam system prompt, atau kelanjutan dalam giliran user. |
| Pengelola memori, loop agen, atau handoff meninggalkan giliran assistant sebagai pesan terakhir | Normalkan bagian akhir sekali, tepat sebelum permintaan, bukan di setiap jalur kode. |
Model Claude mana yang menolak prefill (per September 2026)
Referensi kesalahan Anthropic menyatakannya dengan tegas: model Claude 4.6 dan yang lebih baru tidak mendukung prefill pada pesan assistant terakhir, dan permintaan yang melakukannya mendapatkan 400 ini persis (https://platform.claude.com/docs/en/api/errors#prefill-not-supported). Berdasarkan nama, ini mencakup Claude Opus 4.6 dan setiap Opus setelahnya, termasuk Claude Opus 5.5 (https://platform.claude.com/docs/en/models/opus-5-5/migration-guide); Claude Sonnet 4.6 dan Claude Sonnet 5 (https://platform.claude.com/docs/en/models/sonnet-5/migration-guide); serta Claude Fable 5 dan Fable 5.1 (https://platform.claude.com/docs/en/models/fable-5-1/migration-guide). Claude Haiku 4.5 masih menerima prefill, begitu pula Claude Sonnet 4.5 dan Claude Opus 4.5 — itulah sebabnya kesalahan ini biasanya muncul bersama perubahan model-ID, bukan perubahan kode. Pesan assistant yang lebih awal dalam percakapan, termasuk contoh few-shot, tidak terpengaruh.
Akhiri dengan giliran user — termasuk perbaikan satu baris
Sering kali tidak ada yang sengaja menulis prefill: sesuatu dalam stack menempatkan pesan assistant sebagai pesan terakhir. Laporan publik menelusurinya ke pengelola memori yang menambahkan pesan (Strands issue #1694), loop agen yang meminta ulang setelah giliran yang keliru dianggap belum selesai (opencode issue #46415), balasan berurutan dan handoff agen (LiveKit issue #4907), serta pesan assistant kosong yang tertinggal di akhir (AutoGen PR #7931). Jika pesan terakhir kosong, hapus — itulah satu baris perbaikannya. Jika berisi teks yang ingin Anda lanjutkan, ikuti panduan migrasi Anthropic untuk kelanjutan: letakkan kelanjutan tersebut dalam pesan user yang mengutip bagian tempat jawaban berhenti. Satu pengecualian terdokumentasi yang harus dibiarkan: pause_turn dari alat server seperti penelusuran web dilanjutkan dengan mengirim kembali konten assistant yang dijeda apa adanya (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)Gantikan fungsi prefill
Panduan prompting Anthropic memetakan setiap penggunaan prefill lama ke pengganti (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#migrating-away-from-prefilled-responses). Memaksa JSON: structured outputs, yang membatasi respons pada skema Anda dan tersedia di Claude Haiku 4.5, Sonnet 4.5, Opus 4.5, serta setiap model setelahnya (https://platform.claude.com/docs/en/build-with-claude/structured-outputs); untuk YAML atau format lain, saran panduan tersebut adalah meminta strukturnya dan mencoba lagi jika formatnya meleset. Klasifikasi: gunakan tool dengan enum label yang valid atau structured outputs. Melewati pembuka: instruksi system prompt seperti “Respond directly without preamble.” Mempertahankan persona: tetapkan perannya di system prompt (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#give-claude-a-role), dan letakkan pengingat berkala di giliran pengguna, bukan di giliran assistant yang telah diprefill. Jawaban yang terpotong: gunakan kelanjutan pada giliran pengguna di atas. Memaksa pemanggilan tool bukan pengganti langsung di semua tempat — Claude Fable 5.1 dan Claude Opus 5.5 menolak tool_choice any dan tool dengan 400 mereka sendiri (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
}
}
}
}'Jika Anda melakukan panggilan melalui Kunavo
Kunavo meneruskan giliran assistant terakhir; Kunavo tidak memperbaikinya. /v1/messages meneruskan array messages Anda ke upstream tanpa perubahan, dan pada /v1/chat/completions penerjemah membawa pesan role: "assistant" terakhir sebagai giliran assistant terakhir dalam permintaan Claude — termasuk yang kosong, jadi hapus sendiri pesan kosong tersebut. Anthropic menolak giliran terakhir yang diprefill pada setiap model claude-* yang kami layani kecuali claude-haiku-4-5, dan 400 tersebut diteruskan kepada Anda dengan teks pesan tetap utuh, diikuti request id dari upstream: berbentuk Anthropic pada /v1/messages, bertipe invalid_request_error seperti pada API Anthropic (hingga 24 September 2026 tertulis api_error), dan berbentuk OpenAI pada /v1/chat/completions (type upstream_error, code upstream_400). 400 tidak pernah dicoba ulang melalui kanal lain, dan panggilan yang gagal dicatat dengan biaya nol. Untuk JSON, kirim skema, bukan prefill: /v1/messages meneruskan output_config persis seperti yang Anda kirim, dan pada /v1/chat/completions response_format bertipe json_schema diterjemahkan menjadi output_config.format. Pada 2026-09-24, field tersebut membatasi balasan pada skema di setiap model claude-* yang kami layani. response_format json_object tidak memiliki padanan Claude dan tidak diberlakukan, dan skema yang dikirim bersama giliran terakhir yang diprefill juga menghasilkan 400 tersendiri, termasuk claude-haiku-4-5: "When using output format, pre-filling the `assistant` response is not supported." Endpoint native dan bentuk permintaan yang diteruskannya didokumentasikan dalam dokumentasi Messages API.
Pertanyaan umum
Model Claude mana yang tidak mendukung prefill pesan assistant?
Menurut dokumentasi Anthropic per September 2026, setiap model Claude mulai 4.6: Claude Opus 4.6 dan setiap Opus setelahnya, Claude Sonnet 4.6 dan Sonnet 5, Claude Fable 5 dan 5.1, serta model Mythos. Claude Haiku 4.5, Sonnet 4.5, dan Opus 4.5 masih menerimanya.
Bagaimana cara memaksa output JSON dari Claude tanpa prefill?
Gunakan structured outputs: teruskan skema JSON dalam output_config.format dan respons akan dibatasi olehnya. Melalui endpoint yang kompatibel dengan OpenAI, kirim sebagai response_format dengan type json_schema; Kunavo menerjemahkannya menjadi output_config.format. Anthropic menyatakan bahwa message prefilling tidak kompatibel dengan output JSON dalam kondisi apa pun.
Mengapa saya mendapatkan error ini padahal tidak pernah melakukan prefill?
Sesuatu dalam stack Anda meninggalkan pesan assistant sebagai pesan terakhir — memory atau session manager, loop agent yang meminta ulang setelah suatu giliran, handoff agent, atau pesan assistant kosong yang tidak dihapus siapa pun. Catat array messages persis seperti saat dikirim; elemennya yang terakhir akan memiliki role: "assistant".
Apakah saya masih dapat menyertakan pesan assistant dalam percakapan?
Ya. Hanya giliran terakhir yang dibatasi; pesan assistant sebelumnya, termasuk contoh few-shot, tidak terpengaruh.
Mengapa ini juga terjadi melalui endpoint yang kompatibel dengan OpenAI?
Karena gateway membawa pesan role: "assistant" terakhir Anda sebagai giliran assistant terakhir Claude — prefill yang sama, hanya dibentuk ulang. Penerjemah chat Kunavo melakukan hal tersebut, dan pesan yang sama telah dilaporkan melalui gateway kompatibel OpenAI lainnya (opencode issue #13768). Perbaikannya sama: akhiri dengan pesan pengguna.
Panduan terkait
- Claude API 400 “tool_use ids were found without tool_result blocks” — aturan pengurutan
- “`temperature` dan `top_p` tidak dapat ditentukan secara bersamaan untuk model ini” — kirim salah satunya, dan pada model Claude yang lebih baru jangan kirim keduanya
- “Unsupported parameter: 'max_tokens' is not supported with this model” — gunakan max_completion_tokens
- Claude API — panduan lengkap untuk memanggil Claude di Kunavo
Detail semantik error lainnya tersedia di referensi error; mendapatkan kunci hanya perlu satu menit melalui pendaftaran dan panduan autentikasi.