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

“Unsupported parameter: 'max_tokens' is not supported with this model” — hãy dùng max_completion_tokens

Đổi tên là phần dễ. Điều khiến nhiều người mắc phải là ý nghĩa của trường mới — max_completion_tokens bao gồm cả token suy luận và đầu ra hiển thị, nên ngân sách chỉ đủ cho câu trả lời có thể kết thúc trống với finish_reason "length", đồng thời vẫn bị tính phí.

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

Đổi tên là phần dễ. Điều khiến nhiều người mắc phải là ý nghĩa của trường mới — max_completion_tokens bao gồm cả token suy luận và đầu ra hiển thị, nên ngân sách chỉ đủ cho câu trả lời có thể kết thúc trống với finish_reason "length", đồng thời vẫn bị tính phí.

Lỗi

phản hồi (HTTP 400)
{
  "error": {
    "message": "Unsupported parameter: 'max_tokens' is not supported with this model. Use 'max_completion_tokens' instead.",
    "type": "invalid_request_error",
    "param": "max_tokens",
    "code": "unsupported_parameter"
  }
}

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

Nguyên nhânCách khắc phục
Các họ mô hình suy luận đã thay thế trường nàyGửi max_completion_tokens thay cho max_tokens trên các mô hình đó.
SDK hoặc wrapper vẫn cố định ở trường cũHãy nâng cấp, hoặc đặt trường này rõ ràng thay vì thông qua helper.
Một đường dẫn mã phân nhánh tới nhiều nhà cung cấpChuẩn hóa một lần ở lớp biên thay vì phân nhánh theo từng mô hình.
Câu trả lời trống sau khi sửaNgân sách bao gồm token suy luận — hãy tăng cao hơn đáng kể so với đầu ra dự kiến.

Đổi tên trường

Tại nơi gọi, đây là phép thay thế trực tiếp. Mọi phần khác của yêu cầu vẫn giữ nguyên.

fix.py
# Before
resp = client.chat.completions.create(
    model="gpt-5-6-sol", max_tokens=1024, messages=msgs)

# After
resp = client.chat.completions.create(
    model="gpt-5-6-sol", max_completion_tokens=1024, messages=msgs)

Tính cả phần suy luận bạn không nhìn thấy vào ngân sách

max_completion_tokens giới hạn tổng token suy luận và đầu ra hiển thị. Nếu mô hình dùng 900 token để suy nghĩ trong giới hạn 1.024, bạn chỉ nhận được 124 token câu trả lời — hoặc tin nhắn trống với finish_reason "length", và vẫn bị tính phí cho toàn bộ. Hãy đặt ngân sách cho cả hai phần và kiểm tra finish_reason trước khi tin một phản hồi trống.

Chuẩn hóa một lần thay vì phân nhánh theo mô hình

Một helper duy nhất ở lớp biên của mã giúp phần còn lại không phụ thuộc nhà cung cấp và ngăn họ mô hình tiếp theo trở thành một vòng chỉnh sửa nữa.

normalize.py
def token_budget(model: str, n: int) -> dict:
    """One place that knows which spelling a model wants."""
    if model.startswith("claude-"):
        return {"max_tokens": n}
    return {"max_completion_tokens": n}

resp = client.chat.completions.create(
    model=model, messages=msgs, **token_budget(model, 4096))

Dự đoán các lỗi từ chối tương tự

Các họ mô hình đã loại bỏ max_tokens thường cũng từ chối temperature và top_p. Sửa lỗi này thường làm lộ lỗi tiếp theo; hãy xóa các tham số lấy mẫu không được hỗ trợ thay vì đặt chúng về giá trị mặc định.

Nếu bạn gọi qua Kunavo

Endpoint /v1/chat/completions của Kunavo chấp nhận cả max_tokens lẫn max_completion_tokens, với mô hình GPT cũng như mô hình claude-*: bộ chuyển đổi của Kunavo đọc max_completion_tokens khi bạn gửi trường này, nếu không thì đọc max_tokens, rồi ánh xạ giá trị sang trường mà phía upstream yêu cầu. Vì vậy, trên endpoint này bạn không cần đổi tên trường nào cả. Tuy nhiên, có một điểm bất đối xứng: /v1/responses đọc max_output_tokens, tên mà Responses API dùng cho giới hạn đầu ra, và không đọc tên trường nào khác, bất kể bạn gọi mô hình nào. Trường max_tokens gửi tới /v1/responses không có tác dụng giới hạn, nên hãy gửi max_output_tokens tới endpoint đó.

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

max_completion_tokens chỉ là đổi tên thôi sao?

Ở nơi gọi thì đúng, nhưng về ý nghĩa thì không — nó giới hạn tổng token suy luận và đầu ra, trong khi max_tokens chỉ giới hạn đầu ra hiển thị.

Vì sao phản hồi của tôi trống sau khi sửa lỗi này?

Ngân sách đã được dùng cho suy luận. Kiểm tra finish_reason: "length"; nội dung trống có nghĩa là cần tăng giới hạn.

Tôi có phải phân nhánh theo từng mô hình không?

Trên /v1/chat/completions của Kunavo thì không cần, vì endpoint này chấp nhận cả max_tokens lẫn max_completion_tokens cho các mô hình GPT và claude-*. Thay vào đó, hãy rẽ nhánh theo endpoint: với mọi mô hình, /v1/responses chỉ đọc max_output_tokens làm giới hạn đầu ra.

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.