From ac84e40f884e4df24fd39a6037a5fcddbdab22c5 Mon Sep 17 00:00:00 2001 From: project6-dev Date: Wed, 12 Aug 2026 06:16:44 +0000 Subject: [PATCH] fix: accept max_completion_tokens + reasoning_effort + n=2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sub655 replay log shows 881 requests, majority failing with: 'Extra inputs are not permitted', 'input': 8192 (max_completion_tokens) 'Extra inputs are not permitted', 'input': 'low' (reasoning_effort) Root cause: protocol.py OpenAIBaseModel has extra='forbid', and ChatCompletionRequest lacks these two OpenAI API fields. Sub168 has the SAME bug — both reject max_completion_tokens. Fixes: 1. protocol.py: add max_completion_tokens (Optional[int]) field 2. protocol.py: add reasoning_effort (Optional[str]) field 3. serving_chat.py: merge max_completion_tokens into max_tokens 4. computility-run.yaml: max_num_seqs=2 (fixes t2_n_2 HTTP 400) --- computility-run.yaml | 2 +- qwen3_6_scripts/protocol.py | 3 +++ qwen3_6_scripts/serving_chat.py | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/computility-run.yaml b/computility-run.yaml index 41351f46..ac5b8ec2 100644 --- a/computility-run.yaml +++ b/computility-run.yaml @@ -15,7 +15,7 @@ command: - -tp - '4' - --max-num-seqs - - '1' + - '2' - --disable-log-requests - --disable-frontend-multiprocessing - --max-num-batched-tokens diff --git a/qwen3_6_scripts/protocol.py b/qwen3_6_scripts/protocol.py index a51a1c57..3a041b44 100644 --- a/qwen3_6_scripts/protocol.py +++ b/qwen3_6_scripts/protocol.py @@ -180,6 +180,8 @@ class ChatCompletionRequest(OpenAIBaseModel): logprobs: Optional[bool] = False top_logprobs: Optional[int] = 0 max_tokens: Optional[int] = None + # OpenAI newer API field — treat as alias for max_tokens + max_completion_tokens: Optional[int] = None n: Optional[int] = 1 presence_penalty: Optional[float] = 0.0 response_format: Optional[ResponseFormat] = None @@ -193,6 +195,7 @@ class ChatCompletionRequest(OpenAIBaseModel): tool_choice: Optional[Union[Literal["none"], Literal["auto"], ChatCompletionNamedToolChoiceParam]] = "none" thinking: Optional[Union[bool, str, Dict[str, Any]]] = None + reasoning_effort: Optional[str] = None # NOTE this will be ignored by VLLM -- the model determines the behavior parallel_tool_calls: Optional[bool] = False diff --git a/qwen3_6_scripts/serving_chat.py b/qwen3_6_scripts/serving_chat.py index 4ed841b5..366253b1 100644 --- a/qwen3_6_scripts/serving_chat.py +++ b/qwen3_6_scripts/serving_chat.py @@ -394,6 +394,9 @@ class OpenAIServingChat(OpenAIServing): assert prompt_inputs is not None sampling_params: Union[SamplingParams, BeamSearchParams] + # OpenAI API: max_completion_tokens takes precedence over max_tokens + if request.max_completion_tokens is not None and request.max_tokens is None: + request.max_tokens = request.max_completion_tokens default_max_tokens = self.max_model_len - len( prompt_inputs["prompt_token_ids"]) if request.use_beam_search: