+12








7c6729b769
Signed-off-by: zjy0516 <riverclouds.zhu@qq.com> Signed-off-by: Isotr0py <Isotr0py@outlook.com> Signed-off-by: Bugen Zhao <i@bugenzhao.com> Signed-off-by: Yongye Zhu <zyy1102000@gmail.com> Co-authored-by: Isotr0py <Isotr0py@outlook.com> Co-authored-by: Thien Tran <gau.nernst@yahoo.com.sg> Co-authored-by: Bugen Zhao <i@bugenzhao.com> Co-authored-by: Yongye Zhu <zyy1102000@gmail.com> Co-authored-by: Ziming Huang <zelda.huanghuang@gmail.com> Co-authored-by: Roger Wang <hey@rogerw.io> Co-authored-by: Isotr0py <mozf@inferact.ai> Co-authored-by: aoshen02 <aoshen02@users.noreply.github.com> Co-authored-by: Woosuk Kwon <woosuk@inferact.ai> Co-authored-by: Jee Jee Li <jeejeelee@inferact.ai> Co-authored-by: aoshen02 <aoshen@inferact.ai> Co-authored-by: Summer Yang <girasoleyang@gmail.com> Co-authored-by: Kevin H. Luu <khluu000@gmail.com> Co-authored-by: Bowen Wang <abmfy@icloud.com> Co-authored-by: gnovack <novackgm@gmail.com> Co-authored-by: Nick Hill <nickhill123@gmail.com> Co-authored-by: Yifan Qiao <yifanqiao@inferact.ai> Co-authored-by: xiaozhoupy <peiyuanzhou1994@gmail.com> Co-authored-by: Roy Wang <yasong.wang@inferact.ai> Co-authored-by: Jeff (Junze) Ma <93145857+majunze2001@users.noreply.github.com> Co-authored-by: Codex <codex@openai.com>
62 lines
2.1 KiB
Python
62 lines
2.1 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
|
from transformers import BaseImageProcessor, BatchFeature, TensorType
|
|
from transformers.processing_utils import ProcessorMixin
|
|
|
|
from vllm.tokenizers.hf import HfTokenizer
|
|
|
|
|
|
class KimiK3Processor(ProcessorMixin):
|
|
"""HF-style processor wrapper for the image-only Kimi-K3 model.
|
|
|
|
K3 exposes the standard ``image`` modality, so vLLM calls this processor
|
|
with ``images=[PIL, ...]``. The underlying checkpoint image processor
|
|
(``KimiK3VisionProcessor``) works on ``{"type": "image", "image": PIL}``
|
|
media dicts, so this wrapper adapts bare PIL images into that shape before
|
|
delegating to ``preprocess``.
|
|
|
|
Text is only tokenized here; the single ``<|kimi_image_placeholder|>``
|
|
token per image is expanded into the resolution-aware media block by the
|
|
model's ``_get_prompt_updates`` on the vLLM side.
|
|
"""
|
|
|
|
attributes = ["image_processor", "tokenizer"]
|
|
|
|
def __init__(
|
|
self,
|
|
image_processor: BaseImageProcessor,
|
|
tokenizer: HfTokenizer,
|
|
) -> None:
|
|
self.image_processor = image_processor
|
|
self.tokenizer = tokenizer
|
|
|
|
def __call__(
|
|
self,
|
|
text: str | list[str] | None = None,
|
|
images: object | list[object] | None = None,
|
|
return_tensors: str | TensorType | None = None,
|
|
**kwargs,
|
|
) -> BatchFeature:
|
|
if images is not None:
|
|
if not isinstance(images, list):
|
|
images = [images]
|
|
medias = [{"type": "image", "image": image} for image in images]
|
|
mm_inputs = self.image_processor.preprocess(
|
|
medias,
|
|
return_tensors=return_tensors,
|
|
)
|
|
else:
|
|
mm_inputs = {}
|
|
|
|
if text is not None:
|
|
if not isinstance(text, list):
|
|
text = [text]
|
|
text_inputs = self.tokenizer(text)
|
|
else:
|
|
text_inputs = {}
|
|
|
|
return BatchFeature(
|
|
data={**text_inputs, **mm_inputs},
|
|
tensor_type=return_tensors,
|
|
)
|