From feb6dab2cbb71d48cf09d61c6787086b393d104c Mon Sep 17 00:00:00 2001 From: laulauraluo <12486304+laulauraluo@users.noreply.github.com> Date: Wed, 14 Oct 2026 21:50:09 -0700 Subject: [PATCH 1/2] fix(server): accept max_completion_tokens in chat requests --- CHANGELOG.md | 2 ++ llama_cpp/server/types.py | 3 ++- tests/test_server_types.py | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 tests/test_server_types.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c34e2729e..cf634002f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +- fix(server): accept max_completion_tokens in chat requests by @laulauraluo + ## [0.3.36] - feat: update llama.cpp to ggml-org/llama.cpp@0c1e57098 diff --git a/llama_cpp/server/types.py b/llama_cpp/server/types.py index eda2b92801..055d39ef5d 100644 --- a/llama_cpp/server/types.py +++ b/llama_cpp/server/types.py @@ -3,7 +3,7 @@ from typing import List, Optional, Union, Dict from typing_extensions import TypedDict, Literal -from pydantic import BaseModel, Field +from pydantic import AliasChoices, BaseModel, Field import llama_cpp @@ -212,6 +212,7 @@ class CreateChatCompletionRequest(BaseModel): ) # TODO: verify max_tokens: Optional[int] = Field( default=None, + validation_alias=AliasChoices("max_tokens", "max_completion_tokens"), description="The maximum number of tokens to generate. Defaults to inf", ) min_tokens: int = min_tokens_field diff --git a/tests/test_server_types.py b/tests/test_server_types.py new file mode 100644 index 0000000000..bf765cefb4 --- /dev/null +++ b/tests/test_server_types.py @@ -0,0 +1,33 @@ +import pytest +from pydantic import ValidationError + +from llama_cpp.server.types import CreateChatCompletionRequest + + +@pytest.mark.parametrize( + ("limits", "expected"), + [ + ({}, None), + ({"max_tokens": 3}, 3), + ({"max_completion_tokens": 3}, 3), + ({"max_tokens": None}, None), + ({"max_completion_tokens": None}, None), + ({"max_tokens": 7, "max_completion_tokens": 3}, 7), + ({"max_tokens": None, "max_completion_tokens": 3}, None), + ], +) +def test_chat_completion_token_limit(limits, expected): + request = CreateChatCompletionRequest( + messages=[{"role": "user", "content": "Hello"}], **limits + ) + + assert request.max_tokens == expected + payload = request.model_dump() + assert payload["max_tokens"] == expected + assert "max_completion_tokens" not in payload + + +@pytest.mark.parametrize("field", ["max_tokens", "max_completion_tokens"]) +def test_chat_completion_token_limit_validation(field): + with pytest.raises(ValidationError): + CreateChatCompletionRequest(**{field: "invalid"}) From e055c3f359850f586d96f7ee735b236a6d6d1c85 Mon Sep 17 00:00:00 2001 From: laulauraluo <12486304+laulauraluo@users.noreply.github.com> Date: Wed, 14 Oct 2026 21:51:28 -0700 Subject: [PATCH 2/2] docs: link token limit fix in changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf634002f2..2d859fe0d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -- fix(server): accept max_completion_tokens in chat requests by @laulauraluo +- fix(server): accept max_completion_tokens in chat requests by @laulauraluo in #2386 ## [0.3.36]