From dec083630260b239cd49e4735846ae168be2c37a Mon Sep 17 00:00:00 2001 From: Sam Shleifer Date: Wed, 15 Jul 2026 00:21:31 -0700 Subject: [PATCH] Fix processor config loading for object-storage model paths (#31211) Co-authored-by: Alex Nails --- .../srt/utils/hf_transformers/processor.py | 2 + .../unit/utils/test_hf_transformers.py | 42 ++++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/python/sglang/srt/utils/hf_transformers/processor.py b/python/sglang/srt/utils/hf_transformers/processor.py index 7dd000c3a..38dfa7f0f 100644 --- a/python/sglang/srt/utils/hf_transformers/processor.py +++ b/python/sglang/srt/utils/hf_transformers/processor.py @@ -153,6 +153,8 @@ def get_processor( revision = kwargs.pop("revision", tokenizer_revision) tokenizer_name = resolve_runai_obj_uri(tokenizer_name) + if model_name is not None: + model_name = resolve_runai_obj_uri(model_name) if is_mistral_model(tokenizer_name): config = load_mistral_config( diff --git a/test/registered/unit/utils/test_hf_transformers.py b/test/registered/unit/utils/test_hf_transformers.py index 61cea60b2..e466970b5 100644 --- a/test/registered/unit/utils/test_hf_transformers.py +++ b/test/registered/unit/utils/test_hf_transformers.py @@ -8,11 +8,12 @@ import inspect import tempfile import unittest from types import SimpleNamespace -from unittest.mock import patch +from unittest.mock import MagicMock, patch from transformers import PretrainedConfig from transformers.image_processing_utils import BaseImageProcessor +import sglang.srt.utils.hf_transformers.processor as processor_utils from sglang.srt.utils import hf_transformers_patches from sglang.srt.utils.hf_transformers.common import ( _is_deepseek_ocr2_model, @@ -31,6 +32,45 @@ from sglang.test.ci.ci_register import register_cpu_ci register_cpu_ci(est_time=6, suite="base-a-test-cpu") +# --------------------------------------------------------------------------- +# get_processor +# --------------------------------------------------------------------------- + + +class TestGetProcessor(unittest.TestCase): + def test_resolves_model_name_before_loading_config(self): + remote_model = "s3://bucket/model" + local_model = "/cache/model" + config = SimpleNamespace(model_type="clip", auto_map={}) + loaded_processor = MagicMock() + loaded_processor.tokenizer.chat_template = "template" + auto_config = MagicMock() + auto_config.from_pretrained.return_value = config + auto_processor = MagicMock() + auto_processor.from_pretrained.return_value = loaded_processor + + def resolve_uri(path): + return local_model if path == remote_model else path + + with patch.multiple( + processor_utils, + resolve_runai_obj_uri=MagicMock(side_effect=resolve_uri), + AutoConfig=auto_config, + AutoProcessor=auto_processor, + ): + processor = processor_utils.get_processor( + "local-tokenizer", + model_name=remote_model, + ) + + self.assertIs(processor, loaded_processor) + auto_config.from_pretrained.assert_called_once_with( + local_model, + trust_remote_code=False, + revision=None, + ) + + # --------------------------------------------------------------------------- # _patch_image_processor_kwargs # ---------------------------------------------------------------------------