A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 14, 05:30 UTC
Fix wrong truncate_prompt_tokens type hint (#22761)
Signed-off-by: Gabriel Marinho <gmarinho@ibm.com> Signed-off-by: Gabriel Marinho <104592062+gmarinho2@users.noreply.github.com> Signed-off-by: Max de Bayser <mbayser@br.ibm.com> Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Max de Bayser <mbayser@br.ibm.com>
Gabriel Marinho committed
Aug 30, 2025 at 17:39 UTC
5b8077b8ac42625a3465ad1f885e409d33e0e42e
14 files changed
+101
-102
vllm/entrypoints/llm.py
+18
-23
@@ -51,7 +51,7 @@ from vllm.tasks import PoolingTask
51
from vllm.transformers_utils.tokenizer import (AnyTokenizer, MistralTokenizer,
52
get_cached_tokenizer)
53
from vllm.usage.usage_lib import UsageContext
54
-from vllm.utils import Counter, Device, is_list_of
54
+from vllm.utils import Counter, Device, as_iter, is_list_of
55
from vllm.v1.sample.logits_processor import LogitsProcessor
56
57
if TYPE_CHECKING:
@@ -364,14 +364,6 @@ class LLM:
364
# Use default sampling params.
365
sampling_params = self.get_default_sampling_params()
366
367
- tokenization_kwargs: dict[str, Any] = {}
368
- truncate_prompt_tokens = None
369
- if isinstance(sampling_params, SamplingParams):
370
- truncate_prompt_tokens = sampling_params.truncate_prompt_tokens
371
-
372
- _validate_truncation_size(model_config.max_model_len,
373
- truncate_prompt_tokens, tokenization_kwargs)
374
-
367
# Add any modality specific loras to the corresponding prompts
368
lora_request = self._get_modality_specific_lora_reqs(
369
prompts, lora_request)
@@ -381,7 +373,6 @@ class LLM:
373
params=sampling_params,
374
use_tqdm=use_tqdm,
375
lora_request=lora_request,
384
- tokenization_kwargs=tokenization_kwargs,
376
priority=priority,
377
)
378
@@ -871,6 +862,8 @@ class LLM:
862
If `False`, no progress bar is created.
863
lora_request: LoRA request to use for generation, if any.
864
pooling_task: Override the pooling task to use.
865
+ tokenization_kwargs: overrides tokenization_kwargs set in
866
+ pooling_params
867
868
Returns:
869
A list of `PoolingRequestOutput` objects containing the
@@ -916,24 +909,17 @@ class LLM:
909
# Use default pooling params.
910
pooling_params = PoolingParams()
911
919
- if isinstance(pooling_params, PoolingParams):
920
- pooling_params.verify(pooling_task, model_config)
921
- else:
922
- for pooling_param in pooling_params:
923
- pooling_param.verify(pooling_task, model_config)
924
-
925
- if tokenization_kwargs is None:
926
- tokenization_kwargs = dict[str, Any]()
927
- _validate_truncation_size(model_config.max_model_len,
928
- truncate_prompt_tokens,
929
- tokenization_kwargs)
912
+ for param in as_iter(pooling_params):
913
+ param.verify(pooling_task, model_config)
914
+ # for backwards compatibility
915
+ if truncate_prompt_tokens is not None:
916
+ param.truncate_prompt_tokens = truncate_prompt_tokens
917
918
self._validate_and_add_requests(
919
prompts=prompts,
920
params=pooling_params,
921
use_tqdm=use_tqdm,
922
lora_request=lora_request,
936
- tokenization_kwargs=tokenization_kwargs,
923
)
924
925
outputs = self._run_engine(use_tqdm=use_tqdm)
@@ -1385,7 +1371,6 @@ class LLM:
1371
*,
1372
use_tqdm: Union[bool, Callable[..., tqdm]] = True,
1373
lora_request: Optional[Union[Sequence[LoRARequest], LoRARequest]],
1388
- tokenization_kwargs: Optional[dict[str, Any]] = None,
1374
priority: Optional[list[int]] = None,
1375
) -> None:
1376
if isinstance(prompts, (str, dict)):
@@ -1412,7 +1397,17 @@ class LLM:
1397
tqdm_func = use_tqdm if callable(use_tqdm) else tqdm
1398
it = tqdm_func(it, desc="Adding requests")
1399
1400
+ model_config = self.llm_engine.model_config
1401
+
1402
for i, prompt in enumerate(it):
1403
+
1404
+ param = params[i] if isinstance(params, Sequence) else params
1405
+
1406
+ tokenization_kwargs: dict[str, Any] = {}
1407
+ _validate_truncation_size(model_config.max_model_len,
1408
+ param.truncate_prompt_tokens,
1409
+ tokenization_kwargs)
1410
+
1411
self._add_request(
1412
prompt,
1413
params[i] if isinstance(params, Sequence) else params,
vllm/entrypoints/openai/protocol.py
+19
-9
@@ -452,7 +452,7 @@ class ChatCompletionRequest(OpenAIBaseModel):
452
min_tokens: int = 0
453
skip_special_tokens: bool = True
454
spaces_between_special_tokens: bool = True
455
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=1)]] = None
455
+ truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None
456
prompt_logprobs: Optional[int] = None
457
allowed_token_ids: Optional[list[int]] = None
458
bad_words: list[str] = Field(default_factory=list)
@@ -995,7 +995,7 @@ class CompletionRequest(OpenAIBaseModel):
995
min_tokens: int = 0
996
skip_special_tokens: bool = True
997
spaces_between_special_tokens: bool = True
998
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=1)]] = None
998
+ truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None
999
allowed_token_ids: Optional[list[int]] = None
1000
prompt_logprobs: Optional[int] = None
1001
# --8<-- [end:completion-sampling-params]
@@ -1325,8 +1325,10 @@ class EmbeddingCompletionRequest(OpenAIBaseModel):
1325
# --8<-- [end:embedding-extra-params]
1326
1327
def to_pooling_params(self):
1328
- return PoolingParams(dimensions=self.dimensions,
1329
- normalize=self.normalize)
1328
+ return PoolingParams(
1329
+ truncate_prompt_tokens=self.truncate_prompt_tokens,
1330
+ dimensions=self.dimensions,
1331
+ normalize=self.normalize)
1332
1333
1334
class EmbeddingChatRequest(OpenAIBaseModel):
@@ -1393,8 +1395,10 @@ class EmbeddingChatRequest(OpenAIBaseModel):
1395
return data
1396
1397
def to_pooling_params(self):
1396
- return PoolingParams(dimensions=self.dimensions,
1397
- normalize=self.normalize)
1398
+ return PoolingParams(
1399
+ truncate_prompt_tokens=self.truncate_prompt_tokens,
1400
+ dimensions=self.dimensions,
1401
+ normalize=self.normalize)
1402
1403
1404
EmbeddingRequest = Union[EmbeddingCompletionRequest, EmbeddingChatRequest]
@@ -1430,7 +1434,9 @@ class ScoreRequest(OpenAIBaseModel):
1434
# --8<-- [end:score-extra-params]
1435
1436
def to_pooling_params(self):
1433
- return PoolingParams(activation=self.activation)
1437
+ return PoolingParams(
1438
+ truncate_prompt_tokens=self.truncate_prompt_tokens,
1439
+ activation=self.activation)
1440
1441
1442
class RerankRequest(OpenAIBaseModel):
@@ -1460,7 +1466,9 @@ class RerankRequest(OpenAIBaseModel):
1466
# --8<-- [end:rerank-extra-params]
1467
1468
def to_pooling_params(self):
1463
- return PoolingParams(activation=self.activation)
1469
+ return PoolingParams(
1470
+ truncate_prompt_tokens=self.truncate_prompt_tokens,
1471
+ activation=self.activation)
1472
1473
1474
class RerankDocument(BaseModel):
@@ -1618,7 +1626,9 @@ class ClassificationRequest(OpenAIBaseModel):
1626
# --8<-- [end:classification-extra-params]
1627
1628
def to_pooling_params(self):
1621
- return PoolingParams(activation=self.activation)
1629
+ return PoolingParams(
1630
+ truncate_prompt_tokens=self.truncate_prompt_tokens,
1631
+ activation=self.activation)
1632
1633
1634
class ClassificationData(OpenAIBaseModel):
vllm/entrypoints/openai/serving_chat.py
-1
@@ -237,7 +237,6 @@ class OpenAIServingChat(OpenAIServing):
237
documents=request.documents,
238
chat_template_kwargs=request.chat_template_kwargs,
239
tool_parser=tool_parser,
240
- truncate_prompt_tokens=request.truncate_prompt_tokens,
240
add_special_tokens=request.add_special_tokens,
241
)
242
else:
vllm/entrypoints/openai/serving_classification.py
-13
@@ -61,7 +61,6 @@ class ClassificationMixin(OpenAIServing):
61
ctx.request,
62
ctx.tokenizer,
63
ctx.request.input,
64
- truncate_prompt_tokens=ctx.request.truncate_prompt_tokens,
64
)
65
66
return None
@@ -157,18 +156,6 @@ class ServingClassification(ClassificationMixin):
156
157
return await super().handle(ctx) # type: ignore
158
160
- @override
161
- def _validate_request(
162
- self,
163
- ctx: ClassificationServeContext,
164
- ) -> Optional[ErrorResponse]:
165
- if error := super()._validate_request(ctx):
166
- return error
167
-
168
- ctx.truncate_prompt_tokens = ctx.request.truncate_prompt_tokens
169
-
170
- return None
171
-
159
@override
160
def _create_pooling_params(
161
self,
vllm/entrypoints/openai/serving_completion.py
-1
@@ -137,7 +137,6 @@ class OpenAIServingCompletion(OpenAIServing):
137
request,
138
tokenizer,
139
request.prompt,
140
- truncate_prompt_tokens=request.truncate_prompt_tokens,
140
add_special_tokens=request.add_special_tokens,
141
)
142
except ValueError as e:
vllm/entrypoints/openai/serving_embedding.py
-14
@@ -97,7 +97,6 @@ class EmbeddingMixin(OpenAIServing):
97
# so there is no need to append extra tokens to the input
98
add_generation_prompt=False,
99
continue_final_message=False,
100
- truncate_prompt_tokens=ctx.truncate_prompt_tokens,
100
add_special_tokens=ctx.request.add_special_tokens,
101
)
102
else:
@@ -106,7 +105,6 @@ class EmbeddingMixin(OpenAIServing):
105
ctx.request,
106
tokenizer,
107
ctx.request.input,
109
- truncate_prompt_tokens=ctx.truncate_prompt_tokens,
108
add_special_tokens=ctx.request.add_special_tokens,
109
)
110
return None
@@ -631,18 +629,6 @@ class OpenAIServingEmbedding(EmbeddingMixin):
629
630
return await super().handle(ctx) # type: ignore
631
634
- @override
635
- def _validate_request(
636
- self,
637
- ctx: ServeContext[EmbeddingRequest],
638
- ) -> Optional[ErrorResponse]:
639
- if error := super()._validate_request(ctx):
640
- return error
641
-
642
- ctx.truncate_prompt_tokens = ctx.request.truncate_prompt_tokens
643
-
644
- return None
645
-
632
@override
633
def _create_pooling_params(
634
self,
vllm/entrypoints/openai/serving_engine.py
+19
-28
@@ -165,7 +165,6 @@ class ServeContext(RequestProcessingMixin, ResponseGenerationMixin, BaseModel,
165
166
# Shared across most requests
167
tokenizer: Optional[AnyTokenizer] = None
168
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=1)]] = None
168
169
# `protected_namespaces` resolves Pydantic v2's warning
170
# on conflict with protected namespace "model_"
@@ -297,14 +296,12 @@ class OpenAIServing:
296
truncate_prompt_tokens = getattr(ctx.request, "truncate_prompt_tokens",
297
None)
298
300
- if truncate_prompt_tokens is not None:
301
- if truncate_prompt_tokens <= self.max_model_len:
302
- ctx.truncate_prompt_tokens = truncate_prompt_tokens
303
- else:
304
- return self.create_error_response(
305
- "truncate_prompt_tokens value is "
306
- "greater than max_model_len."
307
- " Please, select a smaller truncation size.")
299
+ if truncate_prompt_tokens is not None and \
300
+ truncate_prompt_tokens > self.max_model_len:
301
+ return self.create_error_response(
302
+ "truncate_prompt_tokens value is "
303
+ "greater than max_model_len."
304
+ " Please, select a smaller truncation size.")
305
return None
306
307
def _create_pooling_params(
@@ -528,7 +525,6 @@ class OpenAIServing:
525
request: AnyRequest,
526
prompt: str,
527
tokenizer: AnyTokenizer,
531
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]],
528
add_special_tokens: bool,
529
) -> TextTokensPrompt:
530
async_tokenizer = self._get_async_tokenizer(tokenizer)
@@ -538,6 +534,9 @@ class OpenAIServing:
534
"do_lower_case", False)):
535
prompt = prompt.lower()
536
537
+ truncate_prompt_tokens = getattr(request, "truncate_prompt_tokens",
538
+ None)
539
+
540
if truncate_prompt_tokens is None:
541
encoded = await async_tokenizer(
542
prompt, add_special_tokens=add_special_tokens)
@@ -565,8 +564,10 @@ class OpenAIServing:
564
request: AnyRequest,
565
prompt_ids: list[int],
566
tokenizer: Optional[AnyTokenizer],
568
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=1)]],
567
) -> TextTokensPrompt:
568
+ truncate_prompt_tokens = getattr(request, "truncate_prompt_tokens",
569
+ None)
570
+
571
if truncate_prompt_tokens is None:
572
input_ids = prompt_ids
573
elif truncate_prompt_tokens < 0:
@@ -652,7 +653,6 @@ class OpenAIServing:
653
request: AnyRequest,
654
tokenizer: AnyTokenizer,
655
prompt_input: Union[str, list[int]],
655
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None,
656
add_special_tokens: bool = True,
657
) -> TextTokensPrompt:
658
"""
@@ -664,7 +664,6 @@ class OpenAIServing:
664
request,
665
tokenizer,
666
[prompt_input],
667
- truncate_prompt_tokens=truncate_prompt_tokens,
667
add_special_tokens=add_special_tokens,
668
):
669
return result
@@ -675,7 +674,6 @@ class OpenAIServing:
674
request: AnyRequest,
675
tokenizer: AnyTokenizer,
676
prompt_inputs: Iterable[Union[str, list[int]]],
678
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None,
677
add_special_tokens: bool = True,
678
) -> AsyncGenerator[TextTokensPrompt, None]:
679
"""
@@ -689,7 +687,6 @@ class OpenAIServing:
687
request,
688
prompt=prompt,
689
tokenizer=tokenizer,
692
- truncate_prompt_tokens=truncate_prompt_tokens,
690
add_special_tokens=add_special_tokens,
691
)
692
else:
@@ -697,7 +694,6 @@ class OpenAIServing:
694
request,
695
prompt_ids=prompt,
696
tokenizer=tokenizer,
700
- truncate_prompt_tokens=truncate_prompt_tokens,
697
)
698
699
async def _tokenize_prompt_input_or_inputs_async(
@@ -706,7 +702,6 @@ class OpenAIServing:
702
tokenizer: Optional[AnyTokenizer],
703
input_or_inputs: Optional[Union[str, list[str], list[int],
704
list[list[int]]]],
709
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None,
705
add_special_tokens: bool = True,
706
) -> tuple[list[TextTokensPrompt], list[EmbedsPrompt]]:
707
"""
@@ -719,6 +714,12 @@ class OpenAIServing:
714
inputs_embeds = list[EmbedsPrompt]()
715
inputs_text = list[TextTokensPrompt]()
716
717
+ truncate_prompt_tokens = getattr(request, "truncate_prompt_tokens",
718
+ None)
719
+
720
+ if (truncate_prompt_tokens or 0) < 0:
721
+ truncate_prompt_tokens = self.max_model_len
722
+
723
if (isinstance(request, CompletionRequest)
724
and request.prompt_embeds is not None):
725
inputs_embeds.extend(
@@ -748,14 +749,10 @@ class OpenAIServing:
749
request,
750
prompt_input["content"],
751
tokenizer=tokenizer,
751
- truncate_prompt_tokens=truncate_prompt_tokens,
752
add_special_tokens=add_special_tokens)
753
else:
754
task = self._normalize_prompt_tokens_to_input(
755
- request,
756
- prompt_input["content"],
757
- tokenizer=tokenizer,
758
- truncate_prompt_tokens=truncate_prompt_tokens)
755
+ request, prompt_input["content"], tokenizer=tokenizer)
756
tasks.append(task)
757
758
# Wait for all tokenization tasks to complete
@@ -772,7 +769,6 @@ class OpenAIServing:
769
TokenizeCompletionRequest],
770
tokenizer: Optional[AnyTokenizer],
771
input_or_inputs: Union[str, list[str], list[int], list[list[int]]],
775
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = ...,
772
add_special_tokens: bool = ...,
773
) -> tuple[list[TextTokensPrompt], list[EngineTokensPrompt]]:
774
...
@@ -784,7 +780,6 @@ class OpenAIServing:
780
tokenizer: Optional[AnyTokenizer],
781
input_or_inputs: Optional[Union[str, list[str], list[int],
782
list[list[int]]]],
787
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = ...,
783
add_special_tokens: bool = ...,
784
) -> tuple[list[Union[TextTokensPrompt, EmbedsPrompt]], list[Union[
785
EngineTokensPrompt, EngineEmbedsPrompt]]]:
@@ -796,7 +791,6 @@ class OpenAIServing:
791
tokenizer: Optional[AnyTokenizer],
792
input_or_inputs: Optional[Union[str, list[str], list[int],
793
list[list[int]]]],
799
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=-1)]] = None,
794
add_special_tokens: bool = True,
795
) -> tuple[Union[list[TextTokensPrompt], list[Union[
796
TextTokensPrompt, EmbedsPrompt]]], Union[
@@ -813,7 +807,6 @@ class OpenAIServing:
807
request,
808
tokenizer,
809
input_or_inputs,
816
- truncate_prompt_tokens=truncate_prompt_tokens,
810
add_special_tokens=add_special_tokens,
811
)
812
@@ -866,7 +859,6 @@ class OpenAIServing:
859
documents: Optional[list[dict[str, str]]] = None,
860
chat_template_kwargs: Optional[dict[str, Any]] = None,
861
tool_parser: Optional[Callable[[AnyTokenizer], ToolParser]] = None,
869
- truncate_prompt_tokens: Optional[Annotated[int, Field(ge=1)]] = None,
862
add_special_tokens: bool = False,
863
) -> tuple[list[ConversationMessage], Sequence[RequestPrompt],
864
list[EngineTokensPrompt]]:
@@ -941,7 +933,6 @@ class OpenAIServing:
933
request,
934
tokenizer,
935
request_prompt,
944
- truncate_prompt_tokens=truncate_prompt_tokens,
936
add_special_tokens=add_special_tokens,
937
)
938
else:
vllm/entrypoints/openai/serving_pooling.py
-2
@@ -120,7 +120,6 @@ class OpenAIServingPooling(OpenAIServing):
120
# so there is no need to append extra tokens to the input
121
add_generation_prompt=False,
122
continue_final_message=False,
123
- truncate_prompt_tokens=truncate_prompt_tokens,
123
add_special_tokens=request.add_special_tokens,
124
)
125
else:
@@ -129,7 +128,6 @@ class OpenAIServingPooling(OpenAIServing):
128
request,
129
tokenizer,
130
request.input,
132
- truncate_prompt_tokens=truncate_prompt_tokens,
131
add_special_tokens=request.add_special_tokens,
132
)
133
except (ValueError, TypeError, jinja2.TemplateError) as e:
vllm/entrypoints/openai/serving_score.py
+3
-3
@@ -266,12 +266,14 @@ class ServingScores(OpenAIServing):
266
request: Union[ScoreRequest, RerankRequest],
267
request_id: str,
268
raw_request: Optional[Request] = None,
269
- truncate_prompt_tokens: Optional[int] = None,
269
) -> Union[list[PoolingRequestOutput], ErrorResponse]:
270
lora_request = self._maybe_get_adapters(request)
271
272
tokenizer = await self.engine_client.get_tokenizer(lora_request)
273
274
+ truncate_prompt_tokens = getattr(request, "truncate_prompt_tokens",
275
+ None)
276
+
277
tokenization_kwargs: dict[str, Any] = {}
278
_validate_truncation_size(self.max_model_len, truncate_prompt_tokens,
279
tokenization_kwargs)
@@ -343,7 +345,6 @@ class ServingScores(OpenAIServing):
345
request,
346
request_id,
347
raw_request,
346
- request.truncate_prompt_tokens,
348
)
349
if isinstance(final_res_batch, ErrorResponse):
350
return final_res_batch
@@ -391,7 +392,6 @@ class ServingScores(OpenAIServing):
392
request,
393
request_id,
394
raw_request,
394
- request.truncate_prompt_tokens,
395
)
396
if isinstance(final_res_batch, ErrorResponse):
397
return final_res_batch
vllm/inputs/preprocess.py
+20
-2
@@ -346,6 +346,22 @@ class InputPreprocessor:
346
) -> EmbedsInputs:
347
return self._process_embeds(parsed_content)
348
349
+ def _truncate_inputs(
350
+ self,
351
+ inputs: list[int],
352
+ tokenization_kwargs: Optional[dict[str, Any]] = None) -> list[int]:
353
+
354
+ if not tokenization_kwargs or "truncation" not in \
355
+ tokenization_kwargs or self.tokenizer is None:
356
+ return inputs
357
+
358
+ max_length = tokenization_kwargs["max_length"]
359
+
360
+ if self.tokenizer.truncation_side == "left":
361
+ return inputs[-max_length:]
362
+ else:
363
+ return inputs[:max_length]
364
+
365
def _process_tokens(
366
self,
367
parsed_content: TokensPrompt,
@@ -354,7 +370,8 @@ class InputPreprocessor:
370
*,
371
mm_hash_overrides: Optional[dict[str, list[str]]] = None,
372
) -> Union[TokenInputs, MultiModalInputs]:
357
- prompt_token_ids = parsed_content["prompt_token_ids"]
373
+ prompt_token_ids = self._truncate_inputs(
374
+ parsed_content["prompt_token_ids"], tokenization_kwargs)
375
376
inputs: Union[TokenInputs, MultiModalInputs]
377
if multi_modal_data := parsed_content.get("multi_modal_data"):
@@ -382,7 +399,8 @@ class InputPreprocessor:
399
*,
400
mm_hash_overrides: Optional[dict[str, list[str]]] = None,
401
) -> Union[TokenInputs, MultiModalInputs]:
385
- prompt_token_ids = parsed_content["prompt_token_ids"]
402
+ prompt_token_ids = self._truncate_inputs(
403
+ parsed_content["prompt_token_ids"], tokenization_kwargs)
404
405
inputs: Union[TokenInputs, MultiModalInputs]
406
if multi_modal_data := parsed_content.get("multi_modal_data"):
vllm/pooling_params.py
+6
-1
@@ -2,7 +2,7 @@
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
from copy import deepcopy
5
-from typing import TYPE_CHECKING, Any, Optional
5
+from typing import TYPE_CHECKING, Annotated, Any, Optional
6
7
import msgspec
8
@@ -27,6 +27,11 @@ class PoolingParams(
27
the classification outputs.
28
softmax: Whether to apply softmax to the reward outputs.
29
"""
30
+ truncate_prompt_tokens: Optional[Annotated[int,
31
+ msgspec.Meta(ge=-1)]] = None
32
+ """If set to -1, will use the truncation size supported by the model. If
33
+ set to an integer k, will use only the last k tokens from the prompt
34
+ (i.e., left truncation). If set to `None`, truncation is disabled."""
35
36
## for embeddings models
37
dimensions: Optional[int] = None
vllm/sampling_params.py
+9
-5
@@ -182,7 +182,8 @@ class SamplingParams(
182
optionally prompt tokens as a first argument."""
183
include_stop_str_in_output: bool = False
184
"""Whether to include the stop strings in output text."""
185
- truncate_prompt_tokens: Optional[Annotated[int, msgspec.Meta(ge=1)]] = None
185
+ truncate_prompt_tokens: Optional[Annotated[int,
186
+ msgspec.Meta(ge=-1)]] = None
187
"""If set to -1, will use the truncation size supported by the model. If
188
set to an integer k, will use only the last k tokens from the prompt
189
(i.e., left truncation). If set to `None`, truncation is disabled."""
@@ -241,7 +242,8 @@ class SamplingParams(
242
spaces_between_special_tokens: bool = True,
243
logits_processors: Optional[list[LogitsProcessor]] = None,
244
truncate_prompt_tokens: Optional[Annotated[int,
244
- msgspec.Meta(ge=1)]] = None,
245
+ msgspec.Meta(
246
+ ge=-1)]] = None,
247
output_kind: RequestOutputKind = RequestOutputKind.CUMULATIVE,
248
guided_decoding: Optional[GuidedDecodingParams] = None,
249
logit_bias: Optional[Union[dict[int, float], dict[str, float]]] = None,
@@ -411,9 +413,11 @@ class SamplingParams(
413
raise ValueError(f"prompt_logprobs must be non-negative, got "
414
f"{self.prompt_logprobs}.")
415
if (self.truncate_prompt_tokens is not None
414
- and self.truncate_prompt_tokens < 1):
415
- raise ValueError(f"truncate_prompt_tokens must be >= 1, "
416
- f"got {self.truncate_prompt_tokens}")
416
+ and (self.truncate_prompt_tokens == 0
417
+ or self.truncate_prompt_tokens < -1)):
418
+ raise ValueError(
419
+ f"truncate_prompt_tokens must be an integer >= 1 or -1, "
420
+ f"got {self.truncate_prompt_tokens}")
421
assert isinstance(self.stop_token_ids, list)
422
if not all(isinstance(st_id, int) for st_id in self.stop_token_ids):
423
raise ValueError(f"stop_token_ids must contain only integers, "
vllm/transformers_utils/tokenizer_group.py
+1
@@ -23,6 +23,7 @@ class TokenizerGroup:
23
self.tokenizer_config = tokenizer_config
24
self.enable_lora = enable_lora
25
self.max_input_length = max_input_length
26
+ self.truncation_side = tokenizer_config.get("truncation_side", "left")
27
self.tokenizer = get_tokenizer(self.tokenizer_id, **tokenizer_config)
28
max_loras = tokenizer_config.get("max_loras", 0)
29
self.lora_tokenizers = LRUCache[int, AnyTokenizer](
vllm/utils/__init__.py
+6
@@ -1328,6 +1328,12 @@ def as_list(maybe_list: Iterable[T]) -> list[T]:
1328
return maybe_list if isinstance(maybe_list, list) else list(maybe_list)
1329
1330
1331
+def as_iter(obj: Union[T, Iterable[T]]) -> Iterable[T]:
1332
+ if isinstance(obj, str) or not isinstance(obj, Iterable):
1333
+ obj = [obj]
1334
+ return obj
1335
+
1336
+
1337
# `collections` helpers
1338
def is_list_of(
1339
value: object,