diff --git a/examples/online_serving/openai_chat_completion_client_for_multimodal.py b/examples/online_serving/openai_chat_completion_client_for_multimodal.py index 37f46b3696a2..c4407923ed2d 100644 --- a/examples/online_serving/openai_chat_completion_client_for_multimodal.py +++ b/examples/online_serving/openai_chat_completion_client_for_multimodal.py @@ -20,9 +20,9 @@ python openai_chat_completion_client_for_multimodal.py --chat-type audio """ -import base64 import os +import pybase64 as base64 import requests from openai import OpenAI from utils import get_first_model diff --git a/examples/online_serving/openai_realtime_client.py b/examples/online_serving/openai_realtime_client.py index 17335bd238b7..2bd3c7e60d55 100644 --- a/examples/online_serving/openai_realtime_client.py +++ b/examples/online_serving/openai_realtime_client.py @@ -24,11 +24,11 @@ import argparse import asyncio -import base64 import json import librosa import numpy as np +import pybase64 as base64 import websockets from vllm.assets.audio import AudioAsset diff --git a/examples/online_serving/openai_realtime_microphone_client.py b/examples/online_serving/openai_realtime_microphone_client.py index 9a48f1466cc8..a3c07673ffbe 100644 --- a/examples/online_serving/openai_realtime_microphone_client.py +++ b/examples/online_serving/openai_realtime_microphone_client.py @@ -18,13 +18,13 @@ import argparse import asyncio -import base64 import json import queue import threading import gradio as gr import numpy as np +import pybase64 as base64 import websockets SAMPLE_RATE = 16_000 diff --git a/examples/pooling/embed/embedding_requests_base64_online.py b/examples/pooling/embed/embedding_requests_base64_online.py index e85af4b858a1..dfbd87267b11 100644 --- a/examples/pooling/embed/embedding_requests_base64_online.py +++ b/examples/pooling/embed/embedding_requests_base64_online.py @@ -7,8 +7,8 @@ """ import argparse -import base64 +import pybase64 as base64 import requests import torch diff --git a/examples/pooling/embed/vision_embedding_online.py b/examples/pooling/embed/vision_embedding_online.py index 522ce1fcbc42..fb9e09ead491 100644 --- a/examples/pooling/embed/vision_embedding_online.py +++ b/examples/pooling/embed/vision_embedding_online.py @@ -7,10 +7,10 @@ """ import argparse -import base64 import io from typing import Literal +import pybase64 as base64 from openai import OpenAI from openai._types import NOT_GIVEN, NotGiven from openai.types.chat import ChatCompletionMessageParam diff --git a/examples/pooling/plugin/prithvi_geospatial_mae_io_processor.py b/examples/pooling/plugin/prithvi_geospatial_mae_io_processor.py index db634d8be760..7e4efed50823 100644 --- a/examples/pooling/plugin/prithvi_geospatial_mae_io_processor.py +++ b/examples/pooling/plugin/prithvi_geospatial_mae_io_processor.py @@ -1,8 +1,8 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import os +import pybase64 as base64 import torch from vllm import LLM diff --git a/examples/pooling/plugin/prithvi_geospatial_mae_online.py b/examples/pooling/plugin/prithvi_geospatial_mae_online.py index 5d914a165752..36d6f0990f7d 100644 --- a/examples/pooling/plugin/prithvi_geospatial_mae_online.py +++ b/examples/pooling/plugin/prithvi_geospatial_mae_online.py @@ -1,9 +1,9 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import os +import pybase64 as base64 import requests # This example shows how to perform an online inference that generates diff --git a/examples/pooling/score/colqwen3_rerank_online.py b/examples/pooling/score/colqwen3_rerank_online.py index c7ab6e2372a6..0e61531bfd34 100644 --- a/examples/pooling/score/colqwen3_rerank_online.py +++ b/examples/pooling/score/colqwen3_rerank_online.py @@ -15,9 +15,9 @@ python colqwen3_rerank_online.py """ -import base64 from io import BytesIO +import pybase64 as base64 import requests from PIL import Image diff --git a/examples/pooling/token_embed/colqwen3_token_embed_online.py b/examples/pooling/token_embed/colqwen3_token_embed_online.py index 20445742f35f..cac11188e87e 100644 --- a/examples/pooling/token_embed/colqwen3_token_embed_online.py +++ b/examples/pooling/token_embed/colqwen3_token_embed_online.py @@ -21,10 +21,10 @@ """ import argparse -import base64 from io import BytesIO import numpy as np +import pybase64 as base64 import requests from PIL import Image diff --git a/tests/benchmarks/test_random_multimodal_dataset_video.py b/tests/benchmarks/test_random_multimodal_dataset_video.py index db19a169e359..bd37a520d016 100644 --- a/tests/benchmarks/test_random_multimodal_dataset_video.py +++ b/tests/benchmarks/test_random_multimodal_dataset_video.py @@ -1,12 +1,12 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import os from tempfile import NamedTemporaryFile from typing import Any, cast import cv2 +import pybase64 as base64 import pytest from transformers import AutoTokenizer, PreTrainedTokenizerBase diff --git a/tests/distributed/test_weight_transfer.py b/tests/distributed/test_weight_transfer.py index 1309edf5aed8..1c9bc766ab1d 100644 --- a/tests/distributed/test_weight_transfer.py +++ b/tests/distributed/test_weight_transfer.py @@ -6,10 +6,10 @@ Integration tests for NCCL and IPC weight transfer between processes using Ray. """ -import base64 import pickle from unittest.mock import MagicMock +import pybase64 as base64 import pytest import ray import torch diff --git a/tests/entrypoints/openai/chat_completion/test_audio_in_video.py b/tests/entrypoints/openai/chat_completion/test_audio_in_video.py index 769390309dc0..9e56b03027a5 100644 --- a/tests/entrypoints/openai/chat_completion/test_audio_in_video.py +++ b/tests/entrypoints/openai/chat_completion/test_audio_in_video.py @@ -1,10 +1,10 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import json import openai +import pybase64 as base64 import pytest import pytest_asyncio diff --git a/tests/entrypoints/openai/chat_completion/test_vision_embeds.py b/tests/entrypoints/openai/chat_completion/test_vision_embeds.py index 82cb84bcca83..574a8f1c86a9 100644 --- a/tests/entrypoints/openai/chat_completion/test_vision_embeds.py +++ b/tests/entrypoints/openai/chat_completion/test_vision_embeds.py @@ -1,9 +1,8 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 - import numpy as np +import pybase64 as base64 import pytest import requests import torch diff --git a/tests/entrypoints/openai/completion/test_completion_with_prompt_embeds.py b/tests/entrypoints/openai/completion/test_completion_with_prompt_embeds.py index 374e77245cda..5ca907b89f33 100644 --- a/tests/entrypoints/openai/completion/test_completion_with_prompt_embeds.py +++ b/tests/entrypoints/openai/completion/test_completion_with_prompt_embeds.py @@ -1,11 +1,11 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import io import json import openai # use the official client for correctness check +import pybase64 as base64 import pytest import pytest_asyncio import torch diff --git a/tests/entrypoints/openai/test_realtime_validation.py b/tests/entrypoints/openai/test_realtime_validation.py index 9092aac5b693..83ecc4ac13cb 100644 --- a/tests/entrypoints/openai/test_realtime_validation.py +++ b/tests/entrypoints/openai/test_realtime_validation.py @@ -2,12 +2,12 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import asyncio -import base64 import json import warnings import librosa import numpy as np +import pybase64 as base64 import pytest import websockets diff --git a/tests/entrypoints/pooling/embed/test_cohere_online.py b/tests/entrypoints/pooling/embed/test_cohere_online.py index fc313819fc94..4964d99e0c66 100644 --- a/tests/entrypoints/pooling/embed/test_cohere_online.py +++ b/tests/entrypoints/pooling/embed/test_cohere_online.py @@ -7,10 +7,10 @@ response structure, batching, normalisation, and semantic similarity. """ -import base64 import struct import numpy as np +import pybase64 as base64 import pytest import requests diff --git a/tests/entrypoints/pooling/embed/test_cohere_online_vision.py b/tests/entrypoints/pooling/embed/test_cohere_online_vision.py index ab874e4e27bd..5ec57db7f806 100644 --- a/tests/entrypoints/pooling/embed/test_cohere_online_vision.py +++ b/tests/entrypoints/pooling/embed/test_cohere_online_vision.py @@ -6,11 +6,11 @@ conversions through the /v2/embed endpoint. """ -import base64 import struct import zlib import numpy as np +import pybase64 as base64 import pytest import requests diff --git a/tests/entrypoints/pooling/embed/test_online.py b/tests/entrypoints/pooling/embed/test_online.py index adec6233414f..56ab09bc7afc 100644 --- a/tests/entrypoints/pooling/embed/test_online.py +++ b/tests/entrypoints/pooling/embed/test_online.py @@ -1,11 +1,11 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import json import numpy as np import openai +import pybase64 as base64 import pytest import pytest_asyncio import requests diff --git a/tests/entrypoints/pooling/embed/test_protocol.py b/tests/entrypoints/pooling/embed/test_protocol.py index f2bd5d2ccc36..9d3416b772d1 100644 --- a/tests/entrypoints/pooling/embed/test_protocol.py +++ b/tests/entrypoints/pooling/embed/test_protocol.py @@ -3,10 +3,10 @@ """Unit tests for Cohere embed protocol: build_typed_embeddings and its underlying packing helpers, plus Cohere-specific serving helpers.""" -import base64 import struct import numpy as np +import pybase64 as base64 import pytest from vllm.entrypoints.pooling.embed.protocol import ( diff --git a/tests/entrypoints/pooling/pooling/test_online.py b/tests/entrypoints/pooling/pooling/test_online.py index c6a62c196884..2878c8684e4d 100644 --- a/tests/entrypoints/pooling/pooling/test_online.py +++ b/tests/entrypoints/pooling/pooling/test_online.py @@ -1,10 +1,10 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import json import numpy as np +import pybase64 as base64 import pytest import requests import torch diff --git a/tests/models/multimodal/generation/vlm_utils/model_utils.py b/tests/models/multimodal/generation/vlm_utils/model_utils.py index 311c78545a02..b8e31e274de4 100644 --- a/tests/models/multimodal/generation/vlm_utils/model_utils.py +++ b/tests/models/multimodal/generation/vlm_utils/model_utils.py @@ -1235,9 +1235,9 @@ def voxtral_patch_hf_runner(hf_model: "HfRunner") -> "HfRunner": generated). """ - import base64 import io + import pybase64 as base64 import soundfile as sf processor = hf_model.processor diff --git a/tests/models/multimodal/pooling/test_colpali.py b/tests/models/multimodal/pooling/test_colpali.py index e7c373d10933..321e9fb60756 100644 --- a/tests/models/multimodal/pooling/test_colpali.py +++ b/tests/models/multimodal/pooling/test_colpali.py @@ -7,9 +7,9 @@ It produces per-token embeddings for both text and image inputs. """ -import base64 from io import BytesIO +import pybase64 as base64 import pytest import torch from PIL import Image diff --git a/tests/models/multimodal/pooling/test_colqwen3.py b/tests/models/multimodal/pooling/test_colqwen3.py index 0cc4c343b3d5..50f0108c3701 100644 --- a/tests/models/multimodal/pooling/test_colqwen3.py +++ b/tests/models/multimodal/pooling/test_colqwen3.py @@ -7,9 +7,9 @@ embeddings for both text and image inputs. """ -import base64 from io import BytesIO +import pybase64 as base64 import pytest import torch from PIL import Image diff --git a/tests/models/multimodal/pooling/test_llama_nemotron_vl.py b/tests/models/multimodal/pooling/test_llama_nemotron_vl.py index 84cae19ee8be..4c92d41c31db 100644 --- a/tests/models/multimodal/pooling/test_llama_nemotron_vl.py +++ b/tests/models/multimodal/pooling/test_llama_nemotron_vl.py @@ -9,10 +9,10 @@ Both variants share a SigLIP vision encoder with a bidirectional LLaMA backbone. """ -import base64 from io import BytesIO from pathlib import Path +import pybase64 as base64 import pytest import torch from transformers import AutoModel, AutoModelForSequenceClassification, AutoProcessor diff --git a/tests/multimodal/media/test_audio.py b/tests/multimodal/media/test_audio.py index d7fe891dd6d8..18f142008c31 100644 --- a/tests/multimodal/media/test_audio.py +++ b/tests/multimodal/media/test_audio.py @@ -1,11 +1,11 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 from pathlib import Path from unittest.mock import patch import librosa import numpy as np +import pybase64 as base64 import pytest from vllm.multimodal.media import AudioMediaIO diff --git a/tests/multimodal/media/test_connector.py b/tests/multimodal/media/test_connector.py index b1f232995a58..c771cc9a3fdf 100644 --- a/tests/multimodal/media/test_connector.py +++ b/tests/multimodal/media/test_connector.py @@ -2,13 +2,13 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import asyncio -import base64 import mimetypes import os from tempfile import NamedTemporaryFile, TemporaryDirectory import aiohttp import numpy as np +import pybase64 as base64 import pytest import requests import torch diff --git a/tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py b/tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py index b22239fcc267..a1262c28b976 100644 --- a/tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py +++ b/tests/plugins/prithvi_io_processor_plugin/prithvi_io_processor/prithvi_processor.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import datetime import os import tempfile @@ -11,6 +10,7 @@ import albumentations import numpy as np +import pybase64 as base64 import rasterio import regex as re import torch diff --git a/tests/plugins_tests/test_terratorch_io_processor_plugins.py b/tests/plugins_tests/test_terratorch_io_processor_plugins.py index e1b2cbba8120..34799b3c42c0 100644 --- a/tests/plugins_tests/test_terratorch_io_processor_plugins.py +++ b/tests/plugins_tests/test_terratorch_io_processor_plugins.py @@ -1,9 +1,9 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 import io import imagehash +import pybase64 as base64 import pytest import requests from PIL import Image diff --git a/tests/renderers/test_sparse_tensor_validation.py b/tests/renderers/test_sparse_tensor_validation.py index a90eac4782f7..6b570f3c99b2 100644 --- a/tests/renderers/test_sparse_tensor_validation.py +++ b/tests/renderers/test_sparse_tensor_validation.py @@ -5,9 +5,9 @@ out-of-bounds memory writes during to_dense() operations. """ -import base64 import io +import pybase64 as base64 import pytest import torch diff --git a/tools/pre_commit/check_forbidden_imports.py b/tools/pre_commit/check_forbidden_imports.py index 786610138351..ac7d8b096ec4 100644 --- a/tools/pre_commit/check_forbidden_imports.py +++ b/tools/pre_commit/check_forbidden_imports.py @@ -59,6 +59,14 @@ class ForbiddenImport: "vllm/v1/serial_utils.py", }, ), + "base64": ForbiddenImport( + pattern=r"^\s*(?:import\s+base64(?:$|\s|,)|from\s+base64\s+import)", + tip=( + "Replace 'import base64' with 'import pybase64' " + "or 'import pybase64 as base64'." + ), + allowed_pattern=re.compile(r"^\s*import\s+pybase64(\s*|\s+as\s+base64\s*)$"), + ), "re": ForbiddenImport( pattern=r"^\s*(?:import\s+re(?:$|\s|,)|from\s+re\s+import)", tip="Replace 'import re' with 'import regex as re' or 'import regex'.", diff --git a/vllm/benchmarks/datasets.py b/vllm/benchmarks/datasets.py index 21ebeb9069bb..7e7e56dc6d44 100644 --- a/vllm/benchmarks/datasets.py +++ b/vllm/benchmarks/datasets.py @@ -14,7 +14,6 @@ import argparse import ast -import base64 import io import json import logging @@ -31,6 +30,7 @@ from typing import Any, cast import numpy as np +import pybase64 as base64 from huggingface_hub import snapshot_download from PIL import Image from typing_extensions import deprecated diff --git a/vllm/distributed/weight_transfer/ipc_engine.py b/vllm/distributed/weight_transfer/ipc_engine.py index 9b72cfe71aa8..43b23be544c1 100644 --- a/vllm/distributed/weight_transfer/ipc_engine.py +++ b/vllm/distributed/weight_transfer/ipc_engine.py @@ -2,12 +2,12 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project """IPC-based weight transfer engine using CUDA IPC for communication.""" -import base64 import pickle from collections.abc import Callable, Iterator from dataclasses import asdict, dataclass from typing import Any +import pybase64 as base64 import requests import torch from torch.multiprocessing.reductions import reduce_tensor diff --git a/vllm/entrypoints/openai/realtime/connection.py b/vllm/entrypoints/openai/realtime/connection.py index ffe871aa8170..c958004bbebd 100644 --- a/vllm/entrypoints/openai/realtime/connection.py +++ b/vllm/entrypoints/openai/realtime/connection.py @@ -2,13 +2,13 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import asyncio -import base64 import json from collections.abc import AsyncGenerator from http import HTTPStatus from uuid import uuid4 import numpy as np +import pybase64 as base64 from fastapi import WebSocket from starlette.websockets import WebSocketDisconnect diff --git a/vllm/entrypoints/openai/run_batch.py b/vllm/entrypoints/openai/run_batch.py index d4121e710dde..1aed3aa249a6 100644 --- a/vllm/entrypoints/openai/run_batch.py +++ b/vllm/entrypoints/openai/run_batch.py @@ -2,7 +2,6 @@ # SPDX-FileCopyrightText: Copyright contributors to the vLLM project import asyncio -import base64 import sys import tempfile from argparse import Namespace @@ -13,6 +12,7 @@ from urllib.parse import urlparse import aiohttp +import pybase64 as base64 import torch from fastapi import UploadFile from prometheus_client import start_http_server diff --git a/vllm/entrypoints/pooling/embed/protocol.py b/vllm/entrypoints/pooling/embed/protocol.py index b02f91dfaabd..9b39b41df286 100644 --- a/vllm/entrypoints/pooling/embed/protocol.py +++ b/vllm/entrypoints/pooling/embed/protocol.py @@ -6,13 +6,13 @@ Cohere: https://docs.cohere.com/reference/embed """ -import base64 import builtins import struct import time from collections.abc import Sequence from typing import Literal, TypeAlias +import pybase64 as base64 from pydantic import BaseModel, Field from vllm import PoolingParams diff --git a/vllm/multimodal/media/audio.py b/vllm/multimodal/media/audio.py index 4f101bced1b1..88dcb0b0186a 100644 --- a/vllm/multimodal/media/audio.py +++ b/vllm/multimodal/media/audio.py @@ -1,6 +1,5 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 from io import BytesIO from pathlib import Path @@ -138,7 +137,7 @@ def load_base64( media_type: str, data: str, ) -> tuple[npt.NDArray, float]: - return self.load_bytes(base64.b64decode(data)) + return self.load_bytes(pybase64.b64decode(data)) def load_file(self, filepath: Path) -> tuple[npt.NDArray, float]: return librosa.load(filepath, sr=None) @@ -155,7 +154,7 @@ def encode_base64( soundfile.write(buffer, audio, sr, format=audio_format) data = buffer.getvalue() - return base64.b64encode(data).decode("utf-8") + return pybase64.b64encode(data).decode("utf-8") class AudioEmbeddingMediaIO(MediaIO[torch.Tensor]): diff --git a/vllm/multimodal/media/video.py b/vllm/multimodal/media/video.py index 2af25cca19f6..9784a156073d 100644 --- a/vllm/multimodal/media/video.py +++ b/vllm/multimodal/media/video.py @@ -1,12 +1,12 @@ # SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project -import base64 from functools import partial from pathlib import Path from typing import Any import numpy as np import numpy.typing as npt +import pybase64 from PIL import Image from vllm import envs @@ -84,7 +84,7 @@ def load_base64( [np.asarray(load_frame(frame_data)) for frame_data in data.split(",")] ), {} - return self.load_bytes(base64.b64decode(data)) + return self.load_bytes(pybase64.b64decode(data)) def load_file(self, filepath: Path) -> tuple[npt.NDArray, dict[str, Any]]: with filepath.open("rb") as f: