messages diziniz bir assistant dönüşüyle bitiyor ve Claude 4.6 ile sonraki modeller bunu prefill olarak okuyup reddediyor. Konuşmayı bir user mesajıyla bitirin; ardından prefill'in yaptığı işi — JSON'u zorlamak, başlangıç metnini atlamak, persona'yı korumak veya yarıda kesilmiş bir yanıtı sürdürmek — Anthropic'in bunun için belgelediği alternatif yönteme taşıyın.
Hata
{
"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_..."
}Nedenler ve çözümler özeti
| Neden | Çözüm |
|---|---|
| messages içindeki son girdinin role değeri: "assistant" | Bu bir prefill'dir ve Claude 4.6 ile sonraki modeller bunu reddeder. User mesajıyla bitirin. |
| Bir framework son sırada boş bir assistant mesajı bıraktı | Göndermeden önce içeriği olmayan son assistant mesajını kaldırın. |
| JSON'u zorlamak için “{” ile prefill yaptınız | Bunun yerine yapılandırılmış çıktıları (output_config.format) kullanın. |
| Başlangıç metnini atlamak, persona'yı korumak veya yarıda kesilmiş bir yanıtı sürdürmek için prefill yaptınız | Bir system-prompt talimatı, system prompt içindeki bir rol veya bir user dönüşü devamı kullanın. |
| Bir bellek yöneticisi, agent döngüsü veya devir mekanizması son sırada bir assistant dönüşü bıraktı | Her kod yolunda yapmak yerine, isteğin hemen öncesinde kuyruğu bir kez normalleştirin. |
Hangi Claude modelleri prefill'i reddediyor (Eylül 2026 itibarıyla)
Anthropic'in hata referansı açıkça belirtir: Claude 4.6 ve sonraki modeller son assistant mesajının prefill edilmesini desteklemez ve bunu yapan bir istek tam olarak bu 400 hatasını alır (https://platform.claude.com/docs/en/api/errors#prefill-not-supported). Adlarıyla bunlar Claude Opus 4.6 ve sonraki tüm Opus modelleridir; buna Claude Opus 5.5 de dahildir (https://platform.claude.com/docs/en/models/opus-5-5/migration-guide); Claude Sonnet 4.6 ve Claude Sonnet 5 (https://platform.claude.com/docs/en/models/sonnet-5/migration-guide); ayrıca Claude Fable 5 ve Fable 5.1 (https://platform.claude.com/docs/en/models/fable-5-1/migration-guide). Claude Haiku 4.5 hâlâ prefill'i kabul eder; Claude Sonnet 4.5 ve Claude Opus 4.5 de öyle — bu nedenle hata genellikle kod değişikliğinden ziyade model-ID değişikliğiyle ortaya çıkar. Konuşmanın önceki assistant mesajları, few-shot örnekleri dahil, etkilenmez.
Bir user dönüşüyle bitirin — tek satırlık düzeltme dahil
Çoğu zaman hiç kimse bilerek prefill yazmamıştır: yığındaki bir şey son sıraya assistant mesajı koymuştur. Herkese açık raporlar bunu, bir tane ekleyen bir bellek yöneticisine (Strands issue #1694), yanlışlıkla tamamlanmamış sandığı bir dönüşten sonra yeniden istek yapan bir agent döngüsüne (opencode issue #46415), art arda yanıtlara ve agent devirlerine (LiveKit issue #4907) ve sonda bırakılmış boş bir assistant mesajına (AutoGen PR #7931) bağlar. Sondaki mesaj boşsa kaldırın — düzeltme tek satırdır. Devam ettirmek istediğiniz metni içeriyorsa Anthropic'in devamlar için geçiş kılavuzunda söylediğini uygulayın: yanıtın nerede durduğunu alıntılayan bir user mesajına devamı koyun. Değiştirmeden bırakılması gereken belgelenmiş bir istisna vardır: web araması gibi sunucu araçlarından gelen pause_turn, duraklatılmış assistant içeriğinin olduğu gibi yeniden gönderilmesiyle sürdürülür (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)Prefill'in yaptığı şeyin yerine ne kullanılır
Anthropic'in istem kılavuzu, prefill'in her eski kullanımını bir alternatifle eşleştirir (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#migrating-away-from-prefilled-responses). JSON'u zorunlu kılma: yanıtı şemanızla sınırlandıran ve Claude Haiku 4.5, Sonnet 4.5, Opus 4.5 ile bunlardan sonraki tüm modellerde kullanılabilen yapılandırılmış çıktılar (https://platform.claude.com/docs/en/build-with-claude/structured-outputs); YAML veya başka bir format için kılavuzun önerisi, yapıyı istemek ve eksik olduğunda yeniden denemektir. Sınıflandırma: geçerli etiketlerinizden oluşan bir enum'a sahip araç veya yapılandırılmış çıktılar. Önsözü atlama: “Önsöz olmadan doğrudan yanıt ver.” gibi bir sistem istemi talimatı. Persona'yı koruma: rolü sistem isteminde ayarlayın (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#give-claude-a-role) ve önceden doldurulmuş bir assistant mesajı yerine kullanıcı dönüşüne periyodik hatırlatıcılar ekleyin. Yarım kalan yanıt: yukarıdaki kullanıcı dönüşüyle devam etme. Araç çağrısını zorlamak her yerde doğrudan kullanılabilir bir alternatif değildir — Claude Fable 5.1 ve Claude Opus 5.5, tool_choice any ve tool kullanımını kendi 400 hatalarıyla reddeder (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
}
}
}
}'Kunavo üzerinden çağrı yapıyorsanız
Kunavo sondaki asistan turunu iletir; onu düzeltmez. /v1/messages, messages dizinizi üst akışa değiştirmeden gönderir; /v1/chat/completions üzerinde çevirici, son role: "assistant" mesajını Claude isteğinde son asistan turu olarak taşır — boş olan da buna dahildir; bu nedenle boş mesajları kendiniz kaldırın. Anthropic, sunduğumuz claude-* modellerinin tümünde, claude-haiku-4-5 hariç, önceden doldurulmuş son turu reddeder ve bu 400 hatası mesaj metni değiştirilmeden, ardından üst akışın istek kimliğiyle size ulaşır: /v1/messages üzerinde Anthropic biçiminde, Anthropic API'sindeki gibi invalid_request_error türünde (24 Eylül 2026'ya kadar api_error olarak görünüyordu) ve /v1/chat/completions üzerinde OpenAI biçiminde (type upstream_error, code upstream_400). 400 hatası başka bir kanalda asla yeniden denenmez ve başarısız çağrı sıfır maliyetle kaydedilir. JSON için ön doldurma yerine şema gönderin: /v1/messages, output_config alanını gönderdiğiniz şekilde iletir; /v1/chat/completions üzerinde json_schema türündeki bir response_format, output_config.format'a çevrilir. 2026-09-24 tarihinde bu alan, sunduğumuz her claude-* modelinde yanıtı şemayla sınırlandırıyordu. json_object türündeki response_format'ın Claude karşılığı yoktur ve uygulanmaz; ayrıca bir şemanın önceden doldurulmuş son turla birlikte gönderilmesi, claude-haiku-4-5 dahil, başlı başına 400 hatasına yol açar: "When using output format, pre-filling the `assistant` response is not supported." Anthropic'e özgü uç nokta ve ilettiği istek biçimi şu belgede açıklanmıştır: Messages API belgeleri.
Sık sorulan sorular
Hangi Claude modelleri assistant mesajı prefill'ini desteklemiyor?
Eylül 2026 itibarıyla Anthropic belgelerine göre 4.6'dan sonraki tüm Claude modelleri: Claude Opus 4.6 ve sonraki tüm Opus modelleri, Claude Sonnet 4.6 ve Sonnet 5, Claude Fable 5 ve 5.1 ile Mythos modelleri. Claude Haiku 4.5, Sonnet 4.5 ve Opus 4.5 hâlâ bir tane kabul eder.
Claude'dan prefill olmadan JSON çıktısını nasıl zorunlu kılarım?
Yapılandırılmış çıktıları kullanın: output_config.format içine bir JSON şeması geçin; yanıt bu şemayla sınırlandırılır. OpenAI uyumlu bir uç nokta üzerinden bunu type json_schema ile response_format olarak gönderin; Kunavo bunu output_config.format'a çevirir. Anthropic, mesaj önceden doldurmayı her durumda JSON çıktılarıyla uyumsuz olarak listeler.
Hiç prefill yapmadığım hâlde neden bu hatayı alıyorum?
Yığınınızdaki bir şey son sıraya bir assistant mesajı bırakmış olabilir — bellek veya oturum yöneticisi, bir dönüşten sonra yeniden istek gönderen bir agent döngüsü, bir agent aktarımı ya da kimsenin kaldırmadığı boş bir assistant mesajı. messages dizisini gönderildiği hâliyle aynen kaydedin; son öğenin role: "assistant" olduğunu göreceksiniz.
Konuşmaya assistant mesajlarını yine de ekleyebilir miyim?
Evet. Yalnızca son dönüş kısıtlanır; birkaç örnekli örnekler de dahil olmak üzere önceki assistant mesajları etkilenmez.
OpenAI uyumlu bir uç nokta üzerinden de neden gerçekleşiyor?
Çünkü ağ geçidi, son role: "assistant" mesajınızı son Claude assistant dönüşü olarak taşır — yeniden biçimlendirilmiş aynı prefill. Kunavo'nun chat çeviricisi tam olarak bunu yapar ve aynı mesajın diğer OpenAI uyumlu ağ geçitleri üzerinden de iletildiği bildirilmiştir (opencode issue #13768). Çözüm aynıdır: son mesaj bir user mesajı olsun.
İlgili kılavuzlar
- Claude API 400 “tool_use ids were found without tool_result blocks” — sıralama kuralı
- “`temperature` ve `top_p` bu model için birlikte belirtilemez” — birini gönderin; daha yeni Claude modellerinde ikisini de göndermeyin
- “Unsupported parameter: 'max_tokens' is not supported with this model” — max_completion_tokens kullanın
- Claude API — Kunavo'da Claude çağırmak için eksiksiz rehber
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.