Quay lại hướng dẫn
Khắc phục sự cố·23 tháng 9, 2026·Đọc 6 phút

“Mô hình này không hỗ trợ điền trước tin nhắn assistant” — những mô hình Claude nào đã bỏ điền trước và tính năng nào thay thế nó

Mảng messages của bạn kết thúc bằng một lượt assistant, và các mô hình Claude 4.6 trở lên xem đó là thao tác điền trước rồi từ chối. Hãy kết thúc cuộc hội thoại bằng tin nhắn user, sau đó chuyển chức năng mà thao tác điền trước đang thực hiện — buộc dùng JSON, bỏ qua phần mở đầu, duy trì persona hoặc tiếp tục câu trả lời bị ngắt — sang cơ chế thay thế được Anthropic tài liệu hóa.

Được xem xét lần cuối vào .

Mảng messages của bạn kết thúc bằng một lượt assistant, và các mô hình Claude 4.6 trở lên xem đó là thao tác điền trước rồi từ chối. Hãy kết thúc cuộc hội thoại bằng tin nhắn user, sau đó chuyển chức năng mà thao tác điền trước đang thực hiện — buộc dùng JSON, bỏ qua phần mở đầu, duy trì persona hoặc tiếp tục câu trả lời bị ngắt — sang cơ chế thay thế được Anthropic tài liệu hóa.

Lỗi

Phản hồi Anthropic API (HTTP 400)
{
  "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_..."
}

Tổng quan nguyên nhân và cách khắc phục

Nguyên nhânCách khắc phục
Mục cuối cùng trong messages có role: "assistant"Đó là thao tác điền trước, và các mô hình Claude 4.6 trở lên từ chối nó. Hãy kết thúc bằng tin nhắn user.
Một framework đã để lại tin nhắn assistant trống ở cuốiXóa tin nhắn assistant ở cuối nếu nó không có nội dung trước khi gửi.
Bạn đã điền trước “{” để buộc dùng JSONThay vào đó, hãy dùng structured outputs (output_config.format).
Bạn đã điền trước để bỏ qua phần mở đầu, duy trì persona hoặc tiếp tục câu trả lời bị ngắtMột chỉ thị trong system prompt, một vai trò trong system prompt hoặc một lượt tiếp nối của user.
Trình quản lý bộ nhớ, vòng lặp agent hoặc quá trình bàn giao đã để lại lượt assistant ở cuốiChuẩn hóa phần cuối một lần ngay trước yêu cầu, thay vì thực hiện trong mọi đường dẫn mã.

Những mô hình Claude nào từ chối điền trước (tính đến tháng 9 năm 2026)

Tài liệu tham khảo lỗi của Anthropic nêu rõ: các mô hình Claude 4.6 trở lên không hỗ trợ điền trước tin nhắn assistant cuối cùng, và yêu cầu thực hiện việc đó sẽ nhận chính xác lỗi 400 này (https://platform.claude.com/docs/en/api/errors#prefill-not-supported). Cụ thể, đó là Claude Opus 4.6 và mọi Opus về sau, bao gồm Claude Opus 5.5 (https://platform.claude.com/docs/en/models/opus-5-5/migration-guide); Claude Sonnet 4.6 và Claude Sonnet 5 (https://platform.claude.com/docs/en/models/sonnet-5/migration-guide); cùng Claude Fable 5 và Fable 5.1 (https://platform.claude.com/docs/en/models/fable-5-1/migration-guide). Claude Haiku 4.5 vẫn chấp nhận điền trước, cũng như Claude Sonnet 4.5 và Claude Opus 4.5 — đó là lý do lỗi này thường xuất hiện cùng thay đổi model-ID thay vì thay đổi mã. Các tin nhắn assistant xuất hiện trước đó trong cuộc hội thoại, bao gồm cả ví dụ few-shot, không bị ảnh hưởng.

Kết thúc bằng một lượt user — bao gồm cả bản sửa một dòng

Thường thì không ai cố ý viết thao tác điền trước: một thành phần nào đó trong ngăn xếp đã đặt tin nhắn assistant ở cuối. Các báo cáo công khai quy nguyên nhân cho trình quản lý bộ nhớ tự thêm một tin nhắn (Strands issue #1694), vòng lặp agent gửi lại yêu cầu sau một lượt mà nó nhầm là chưa hoàn tất (opencode issue #46415), các phản hồi liên tiếp và quá trình bàn giao agent (LiveKit issue #4907), cùng một tin nhắn assistant trống bị để lại ở cuối (AutoGen PR #7931). Nếu tin nhắn cuối trống, hãy xóa nó — đó là dòng mã duy nhất cần sửa. Nếu nó chứa văn bản bạn muốn tiếp tục, hãy làm theo hướng dẫn di chuyển của Anthropic cho việc tiếp nối: đặt phần tiếp nối trong một tin nhắn user, trích dẫn vị trí câu trả lời đã dừng. Một ngoại lệ được tài liệu hóa cần giữ nguyên: pause_turn từ các công cụ máy chủ như tìm kiếm web được tiếp tục bằng cách gửi lại nguyên trạng nội dung assistant đã tạm dừng (https://platform.claude.com/docs/en/agents-and-tools/tool-use/server-tools).

end_on_user.py
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)

Thay thế chức năng mà thao tác điền trước đang thực hiện

Hướng dẫn prompting của Anthropic ánh xạ từng cách sử dụng điền trước cũ sang một phương án thay thế (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#migrating-away-from-prefilled-responses). Buộc dùng JSON: structured outputs, giới hạn phản hồi theo schema của bạn và có trên Claude Haiku 4.5, Sonnet 4.5, Opus 4.5 và mọi mô hình về sau (https://platform.claude.com/docs/en/build-with-claude/structured-outputs); với YAML hoặc định dạng khác, hướng dẫn khuyên yêu cầu cấu trúc và thử lại khi kết quả không đúng. Phân loại: một tool có enum chứa các nhãn hợp lệ của bạn hoặc structured outputs. Bỏ qua phần mở đầu: một chỉ thị trong system prompt như “Trả lời trực tiếp, không có phần mở đầu.” Duy trì persona: đặt vai trò trong system prompt (https://platform.claude.com/docs/en/build-with-claude/prompt-engineering/claude-prompting-best-practices#give-claude-a-role), và đặt các lời nhắc định kỳ trong lượt user thay vì lượt assistant được điền trước. Câu trả lời bị ngắt: dùng cách tiếp nối trong lượt user ở trên. Buộc gọi tool không phải là phương án thay thế trực tiếp trong mọi trường hợp — Claude Fable 5.1 và Claude Opus 5.5 từ chối tool_choice any và tool bằng lỗi 400 riêng của chúng (https://platform.claude.com/docs/en/api/errors#forced-tool-use-not-supported).

structured-output.sh
# 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
        }
      }
    }
  }'

Nếu bạn gọi qua Kunavo

Kunavo chuyển tiếp lượt assistant ở cuối; nó không tự sửa lượt đó. /v1/messages chuyển nguyên vẹn mảng messages của bạn đến upstream, còn trên /v1/chat/completions, trình chuyển đổi giữ nguyên tin nhắn cuối có role: "assistant" thành lượt assistant cuối trong yêu cầu Claude — kể cả tin nhắn trống, vì vậy bạn phải tự xóa các tin nhắn trống. Anthropic từ chối lượt cuối được điền trước trên mọi mô hình claude-* mà chúng tôi cung cấp, ngoại trừ claude-haiku-4-5, và lỗi 400 đó được gửi đến bạn với nguyên văn nội dung thông báo, theo sau là request id của upstream: dạng Anthropic trên /v1/messages, có type invalid_request_error như API Anthropic (cho đến ngày 24 tháng 9 năm 2026, type này là api_error), và dạng OpenAI trên /v1/chat/completions (type upstream_error, code upstream_400). Lỗi 400 không bao giờ được thử lại trên kênh khác, và lượt gọi thất bại được ghi nhận với chi phí bằng 0. Với JSON, hãy gửi schema thay vì điền trước: /v1/messages chuyển tiếp output_config như bạn đã gửi, còn trên /v1/chat/completions, response_format có type json_schema được chuyển thành output_config.format. Vào ngày 2026-09-24, trường đó giới hạn phản hồi theo schema trên mọi mô hình claude-* mà chúng tôi cung cấp. response_format kiểu json_object không có đối tác tương ứng trong Claude và không được áp dụng, đồng thời schema gửi cùng lượt cuối được điền trước cũng tự tạo ra lỗi 400, kể cả claude-haiku-4-5: "When using output format, pre-filling the `assistant` response is not supported." Endpoint gốc và hình dạng yêu cầu mà nó chuyển tiếp được tài liệu hóa trong tài liệu Messages API.

Câu hỏi thường gặp

Những mô hình Claude nào không hỗ trợ điền trước tin nhắn assistant?

Theo tài liệu Anthropic tính đến tháng 9 năm 2026, mọi mô hình Claude từ 4.6 trở lên: Claude Opus 4.6 và mọi Opus về sau, Claude Sonnet 4.6 và Sonnet 5, Claude Fable 5 và 5.1, cùng các mô hình Mythos. Claude Haiku 4.5, Sonnet 4.5 và Opus 4.5 vẫn chấp nhận thao tác này.

Làm cách nào để buộc Claude xuất JSON mà không dùng điền trước?

Hãy dùng structured outputs: truyền schema JSON trong output_config.format và phản hồi sẽ bị giới hạn theo schema đó. Qua endpoint tương thích với OpenAI, gửi dưới dạng response_format với type json_schema; Kunavo chuyển đổi thành output_config.format. Anthropic liệt kê việc điền trước tin nhắn là không tương thích với đầu ra JSON trong mọi trường hợp.

Tại sao tôi nhận được lỗi này khi chưa từng dùng điền trước?

Một thành phần nào đó trong ngăn xếp đã để lại tin nhắn assistant ở cuối — trình quản lý bộ nhớ hoặc phiên, vòng lặp agent gửi lại yêu cầu sau một lượt, quá trình bàn giao agent hoặc tin nhắn assistant trống chưa được ai xóa. Hãy ghi lại chính xác mảng messages như lúc được gửi; phần tử cuối sẽ có role: "assistant".

Tôi vẫn có thể đưa tin nhắn assistant vào cuộc hội thoại không?

Có. Chỉ lượt cuối bị hạn chế; các tin nhắn assistant trước đó, bao gồm cả ví dụ few-shot, không bị ảnh hưởng.

Tại sao lỗi này cũng xảy ra qua endpoint tương thích với OpenAI?

Vì gateway chuyển tiếp tin nhắn cuối có role: "assistant" của bạn thành lượt assistant cuối của Claude — cùng một thao tác điền trước nhưng được định dạng lại. Trình chuyển đổi chat của Kunavo thực hiện chính xác điều đó, và cùng một tin nhắn đã được báo cáo qua các gateway tương thích với OpenAI khác (opencode issue #13768). Cách sửa vẫn giống nhau: kết thúc bằng tin nhắn user.

Hướng dẫn liên quan

Thông tin chi tiết hơn về ý nghĩa lỗi có trong tài liệu tham chiếu lỗi; bạn chỉ mất một phút để lấy khóa qua đăng ký và hướng dẫn xác thực.