2026-09-03 03:32:56 +08:00
|
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM-Omni project
|
|
|
|
|
|
2025-12-16 15:19:40 +08:00
|
|
|
from typing import Any
|
2025-10-22 15:16:25 +08:00
|
|
|
|
2026-09-09 22:25:05 +08:00
|
|
|
from vllm.renderers import BaseRenderer
|
2025-11-17 14:44:10 +08:00
|
|
|
|
2025-10-22 15:16:25 +08:00
|
|
|
|
2026-09-09 22:25:05 +08:00
|
|
|
class OmniRenderer:
|
|
|
|
|
"""Delegate tokenization/chat rendering while extending engine-input routing.
|
2026-09-03 03:32:56 +08:00
|
|
|
|
2026-09-09 22:25:05 +08:00
|
|
|
Keep the original renderer's tokenizer, executors, and multimodal caches.
|
|
|
|
|
The upstream pipeline methods run on this adapter so both sync and async
|
|
|
|
|
entrypoints reach the Omni singleton processing below.
|
2026-09-03 03:32:56 +08:00
|
|
|
"""
|
|
|
|
|
|
2026-09-09 22:25:05 +08:00
|
|
|
render_cmpl = BaseRenderer.render_cmpl
|
|
|
|
|
render_cmpl_async = BaseRenderer.render_cmpl_async
|
|
|
|
|
render_chat = BaseRenderer.render_chat
|
|
|
|
|
render_chat_async = BaseRenderer.render_chat_async
|
|
|
|
|
process_for_engine = BaseRenderer.process_for_engine
|
|
|
|
|
process_for_engine_async = BaseRenderer.process_for_engine_async
|
|
|
|
|
_process_enc_dec = BaseRenderer._process_enc_dec
|
|
|
|
|
_process_enc_dec_async = BaseRenderer._process_enc_dec_async
|
2026-09-03 03:32:56 +08:00
|
|
|
|
2026-09-09 22:25:05 +08:00
|
|
|
def __init__(self, renderer: BaseRenderer) -> None:
|
|
|
|
|
self._renderer = renderer
|
2026-09-03 03:32:56 +08:00
|
|
|
|
2026-09-09 22:25:05 +08:00
|
|
|
def __getattr__(self, name: str) -> Any:
|
|
|
|
|
return getattr(self._renderer, name)
|
2026-09-03 03:32:56 +08:00
|
|
|
|
2026-09-09 22:25:05 +08:00
|
|
|
@staticmethod
|
|
|
|
|
def _with_omni_extras(inputs, prompt):
|
|
|
|
|
for key in ("prompt", "cache_salt", "additional_information", "model_intermediate_buffer"):
|
|
|
|
|
if key in prompt:
|
|
|
|
|
inputs[key] = prompt[key]
|
2026-09-03 03:32:56 +08:00
|
|
|
return inputs
|
|
|
|
|
|
2026-09-09 22:25:05 +08:00
|
|
|
def _process_singleton(self, prompt, *, skip_mm_cache: bool = False):
|
|
|
|
|
if "prompt_embeds" not in prompt and "mm_processor_kwargs" in prompt and not prompt.get("multi_modal_data"):
|
|
|
|
|
inputs = self._renderer._process_multimodal(
|
|
|
|
|
prompt["prompt_token_ids"],
|
2026-03-09 17:29:38 +08:00
|
|
|
{},
|
2026-09-09 22:25:05 +08:00
|
|
|
mm_processor_kwargs=prompt["mm_processor_kwargs"],
|
|
|
|
|
mm_uuids=prompt.get("multi_modal_uuids"),
|
|
|
|
|
skip_mm_cache=skip_mm_cache,
|
2026-02-27 10:29:14 +08:00
|
|
|
)
|
2026-01-22 16:57:37 +08:00
|
|
|
else:
|
2026-09-09 22:25:05 +08:00
|
|
|
inputs = self._renderer._process_singleton(prompt, skip_mm_cache=skip_mm_cache)
|
|
|
|
|
return self._with_omni_extras(inputs, prompt)
|
|
|
|
|
|
|
|
|
|
async def _process_singleton_async(self, prompt, *, skip_mm_cache: bool = False):
|
|
|
|
|
if "prompt_embeds" not in prompt and "mm_processor_kwargs" in prompt and not prompt.get("multi_modal_data"):
|
|
|
|
|
inputs = await self._renderer._process_multimodal_async(
|
|
|
|
|
prompt["prompt_token_ids"],
|
|
|
|
|
{},
|
|
|
|
|
mm_processor_kwargs=prompt["mm_processor_kwargs"],
|
|
|
|
|
mm_uuids=prompt.get("multi_modal_uuids"),
|
|
|
|
|
skip_mm_cache=skip_mm_cache,
|
2026-01-22 16:57:37 +08:00
|
|
|
)
|
2025-10-22 15:16:25 +08:00
|
|
|
else:
|
2026-09-09 22:25:05 +08:00
|
|
|
inputs = await self._renderer._process_singleton_async(prompt, skip_mm_cache=skip_mm_cache)
|
|
|
|
|
return self._with_omni_extras(inputs, prompt)
|