Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ runtime_common = [
"psutil",
"pydantic",
"pynvml",
"pybase64",
"python-multipart",
"pyzmq>=25.1.2",
"soundfile==0.13.1",
Expand Down
4 changes: 2 additions & 2 deletions python/sglang/bench_serving.py
Original file line number Diff line number Diff line change
Expand Up @@ -814,9 +814,9 @@ def sample_mmmu_requests(
List of tuples (prompt, prompt_token_len, output_token_len).
"""
try:
import base64
import io

import pybase64
from datasets import load_dataset
except ImportError:
raise ImportError("Please install datasets: pip install datasets")
Expand Down Expand Up @@ -867,7 +867,7 @@ def sample_mmmu_requests(
# Encode image to base64
buffered = io.BytesIO()
image.save(buffered, format="JPEG")
img_str = base64.b64encode(buffered.getvalue()).decode("utf-8")
img_str = pybase64.b64encode(buffered.getvalue()).decode("utf-8")
image_data = f"data:image/jpeg;base64,{img_str}"
else:
continue
Expand Down
2 changes: 1 addition & 1 deletion python/sglang/srt/entrypoints/http_server_engine.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import base64
import copy
import dataclasses
import multiprocessing
Expand All @@ -7,6 +6,7 @@
import time
from typing import Any, Dict, List, Optional, Tuple, Union

import pybase64
import requests
import torch
import torch.distributed as dist
Expand Down
4 changes: 2 additions & 2 deletions python/sglang/srt/multimodal/mm_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@

"""
import ast
import base64
import math
import re
from io import BytesIO

import numpy as np
import pybase64
from PIL import Image

from sglang.srt.utils import flatten_nested_list
Expand Down Expand Up @@ -252,7 +252,7 @@ def process_anyres_image(image, processor, grid_pinpoints):


def load_image_from_base64(image):
return Image.open(BytesIO(base64.b64decode(image)))
return Image.open(BytesIO(pybase64.b64decode(image, validate=True)))


def expand2square(pil_img, background_color):
Expand Down
16 changes: 9 additions & 7 deletions python/sglang/srt/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@

from __future__ import annotations

import base64
import builtins
import ctypes
import dataclasses
Expand Down Expand Up @@ -68,6 +67,7 @@

import numpy as np
import psutil
import pybase64
import requests
import torch
import torch.distributed
Expand Down Expand Up @@ -621,7 +621,7 @@ def decode_video_base64(video_base64):
from PIL import Image

# Decode the base64 string
video_bytes = base64.b64decode(video_base64)
video_bytes = pybase64.b64decode(video_base64, validate=True)

# Placeholder for the start indices of each PNG image
img_starts = []
Expand Down Expand Up @@ -707,7 +707,9 @@ def load_audio(audio_file: str, sr: int = 16000, mono: bool = True) -> np.ndarra
audio, original_sr = sf.read(BytesIO(audio_file))
elif audio_file.startswith("data:"):
audio_file = audio_file.split(",")[1]
audio, original_sr = sf.read(BytesIO(base64.b64decode(audio_file)))
audio, original_sr = sf.read(
BytesIO(pybase64.b64decode(audio_file, validate=True))
)
elif audio_file.startswith("http://") or audio_file.startswith("https://"):
timeout = int(os.getenv("REQUEST_TIMEOUT", "5"))
response = requests.get(audio_file, stream=True, timeout=timeout)
Expand Down Expand Up @@ -776,12 +778,12 @@ def load_image(
image = Image.open(image_file)
elif image_file.startswith("data:"):
image_file = image_file.split(",")[1]
image = Image.open(BytesIO(base64.b64decode(image_file)))
image = Image.open(BytesIO(pybase64.b64decode(image_file, validate=True)))
elif image_file.startswith("video:"):
image_file = image_file.replace("video:", "")
image, image_size = decode_video_base64(image_file)
elif isinstance(image_file, str):
image = Image.open(BytesIO(base64.b64decode(image_file)))
image = Image.open(BytesIO(pybase64.b64decode(image_file, validate=True)))
else:
raise ValueError(f"Invalid image: {image}")

Expand Down Expand Up @@ -1848,7 +1850,7 @@ def serialize(obj, output_str: bool = False):

if output_str:
# Convert bytes to base64-encoded string
output = base64.b64encode(output).decode("utf-8")
output = pybase64.b64encode(output).decode("utf-8")

return output

Expand All @@ -1865,7 +1867,7 @@ def deserialize(data):
"""
if isinstance(data, str):
# Decode base64 string to bytes
data = base64.b64decode(data)
data = pybase64.b64decode(data, validate=True)

return ForkingPickler.loads(data)

Expand Down
10 changes: 5 additions & 5 deletions python/sglang/utils.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
"""Common utilities"""

import base64
import importlib
import json
import logging
Expand All @@ -20,6 +19,7 @@
from typing import Any, Callable, List, Optional, Tuple, Type, Union

import numpy as np
import pybase64
import requests
from IPython.display import HTML, display
from pydantic import BaseModel
Expand Down Expand Up @@ -148,15 +148,15 @@ def encode_image_base64(image_path: Union[str, bytes]):
if isinstance(image_path, str):
with open(image_path, "rb") as image_file:
data = image_file.read()
return base64.b64encode(data).decode("utf-8")
return pybase64.b64encode(data).decode("utf-8")
elif isinstance(image_path, bytes):
return base64.b64encode(image_path).decode("utf-8")
return pybase64.b64encode(image_path).decode("utf-8")
else:
# image_path is PIL.WebPImagePlugin.WebPImageFile
image = image_path
buffered = BytesIO()
image.save(buffered, format="PNG")
return base64.b64encode(buffered.getvalue()).decode("utf-8")
return pybase64.b64encode(buffered.getvalue()).decode("utf-8")


def encode_frame(frame):
Expand Down Expand Up @@ -223,7 +223,7 @@ def encode_video_base64(video_path: str, num_frames: int = 16):
video_bytes = b"".join(encoded_frames)

# Encode the concatenated bytes to base64
video_base64 = "video:" + base64.b64encode(video_bytes).decode("utf-8")
video_base64 = "video:" + pybase64.b64encode(video_bytes).decode("utf-8")

return video_base64

Expand Down
1 change: 0 additions & 1 deletion test/srt/test_vision_openai_server_common.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import base64
import copy
import io
import json
import os
Expand Down
Loading