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
2 changes: 2 additions & 0 deletions renderers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -1033,6 +1033,7 @@ def bridge_to_next_turn(self, *args: Any, **kwargs: Any) -> "RenderedTokens | No
"Qwen/Qwen3.6-35B-A3B": "qwen3.6",
# Qwen3.8.
"Qwen/Qwen3.8-27B": "qwen3.8",
"Qwen/Qwen3.8-Flash-Next": "qwen3.8",
# Qwen3-VL.
"Qwen/Qwen3-VL-4B-Instruct": "qwen3-vl",
"Qwen/Qwen3-VL-8B-Instruct": "qwen3-vl",
Expand Down Expand Up @@ -1140,6 +1141,7 @@ def bridge_to_next_turn(self, *args: Any, **kwargs: Any) -> "RenderedTokens | No
"Qwen/Qwen3.6-35B-A3B": {"image"},
# Qwen3.8 adds reasoning-effort control and preserves thinking by default.
"Qwen/Qwen3.8-27B": {"image"},
"Qwen/Qwen3.8-Flash-Next": {"image"},
# Kimi K2.5 / K2.6 are unified VLMs (HF tag ``image-text-to-text``)
# with custom processor (``KimiK25Processor`` + ``KimiK25VisionProcessor``).
# Vision wrap is different from Qwen-VL:
Expand Down
1 change: 1 addition & 0 deletions renderers/qwen35.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
"Qwen/Qwen3.6-35B-A3B": True,
# Qwen3.8 keeps thinking enabled by default.
"Qwen/Qwen3.8-27B": True,
"Qwen/Qwen3.8-Flash-Next": True,
}


Expand Down
1 change: 1 addition & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
("Qwen/Qwen3.5-9B", "auto"),
("Qwen/Qwen3.6-35B-A3B", "auto"),
("Qwen/Qwen3.8-27B", "auto"),
("Qwen/Qwen3.8-Flash-Next", "auto"),
("Qwen/Qwen3-VL-4B-Instruct", "auto"),
("google/gemma-4-31B-it", "auto"),
("zai-org/GLM-5", "auto"),
Expand Down
1 change: 1 addition & 0 deletions tests/test_bridge.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
("Qwen/Qwen3.5-9B", "auto"),
("Qwen/Qwen3.6-35B-A3B", "auto"),
("Qwen/Qwen3.8-27B", "auto"),
("Qwen/Qwen3.8-Flash-Next", "auto"),
("google/gemma-4-31B-it", "auto"),
("thinkingmachines/Inkling", "auto"),
("thinkingmachines/Inkling-Small", "auto"),
Expand Down
3 changes: 2 additions & 1 deletion tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -385,8 +385,9 @@ def test_generate_threads_prompt_attribution_through_prebuilt_prompt_path():
("Qwen/Qwen3-VL-4B-Instruct", "renderers.qwen3_vl:Qwen3VLRenderer"),
("Qwen/Qwen3.5-2B", "renderers.qwen35:Qwen35Renderer"),
("Qwen/Qwen3.8-27B", "renderers.qwen38:Qwen38Renderer"),
("Qwen/Qwen3.8-Flash-Next", "renderers.qwen38:Qwen38Renderer"),
],
ids=["qwen3_vl", "qwen35", "qwen38"],
ids=["qwen3_vl", "qwen35", "qwen38", "qwen38_flash_next"],
)
def test_generate_serializes_multimodal_features_for_qwen_vl_family(
model_id, renderer_class_path
Expand Down
4 changes: 4 additions & 0 deletions tests/test_disabled_thinking_stability.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@
"Qwen/Qwen3.8-27B",
Qwen38RendererConfig(enable_thinking=False),
),
(
"Qwen/Qwen3.8-Flash-Next",
Qwen38RendererConfig(enable_thinking=False),
),
(
"google/gemma-4-26B-A4B-it",
Gemma4RendererConfig(enable_thinking=False),
Expand Down
30 changes: 18 additions & 12 deletions tests/test_qwen38.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,12 @@
}
]

QWEN38_MODELS = ["Qwen/Qwen3.8-27B", "Qwen/Qwen3.8-Flash-Next"]

@lru_cache(maxsize=1)
def _qwen38():
tokenizer = load_tokenizer("Qwen/Qwen3.8-27B")

@lru_cache(maxsize=None)
def _qwen38(model_name):
tokenizer = load_tokenizer(model_name)
return tokenizer, create_renderer(tokenizer)


Expand All @@ -48,10 +50,11 @@ def _expected(tokenizer, messages, **kwargs):
return list(result)


def test_qwen38_is_registered_with_native_defaults():
tokenizer, renderer = _qwen38()
@pytest.mark.parametrize("qwen38_model", QWEN38_MODELS)
def test_qwen38_is_registered_with_native_defaults(qwen38_model):
tokenizer, renderer = _qwen38(qwen38_model)

assert tokenizer.name_or_path == "Qwen/Qwen3.8-27B"
assert tokenizer.name_or_path == qwen38_model
assert MODEL_RENDERER_MAP[tokenizer.name_or_path] == "qwen3.8"
assert MULTIMODAL_MODELS[tokenizer.name_or_path] == {"image"}
assert isinstance(renderer, Qwen38Renderer)
Expand Down Expand Up @@ -86,8 +89,9 @@ def test_qwen38_config_discriminator():
pytest.param({"preserve_thinking": False}, id="drop-history-thinking"),
],
)
def test_qwen38_text_and_tool_parity(config_kwargs):
tokenizer, _ = _qwen38()
@pytest.mark.parametrize("qwen38_model", QWEN38_MODELS)
def test_qwen38_text_and_tool_parity(config_kwargs, qwen38_model):
tokenizer, _ = _qwen38(qwen38_model)
renderer = Qwen38Renderer(tokenizer, Qwen38RendererConfig(**config_kwargs))
cases = [
(
Expand Down Expand Up @@ -152,8 +156,9 @@ def test_qwen38_text_and_tool_parity(config_kwargs):
assert renderer.render_ids(messages, **render_kwargs) == expected


def test_qwen38_keeps_inline_think_markup_in_visible_content():
tokenizer, renderer = _qwen38()
@pytest.mark.parametrize("qwen38_model", QWEN38_MODELS)
def test_qwen38_keeps_inline_think_markup_in_visible_content(qwen38_model):
tokenizer, renderer = _qwen38(qwen38_model)
messages = [
{"role": "user", "content": "Echo this."},
{
Expand All @@ -165,8 +170,9 @@ def test_qwen38_keeps_inline_think_markup_in_visible_content():
assert renderer.render_ids(messages) == _expected(tokenizer, messages)


def test_qwen38_requires_a_real_user_query():
_, renderer = _qwen38()
@pytest.mark.parametrize("qwen38_model", QWEN38_MODELS)
def test_qwen38_requires_a_real_user_query(qwen38_model):
_, renderer = _qwen38(qwen38_model)

with pytest.raises(ValueError, match="No user query found"):
renderer.render_ids([{"role": "system", "content": "System only."}])
1 change: 1 addition & 0 deletions tests/test_renderer_config_parity.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
("Qwen/Qwen3.5-9B", "auto"),
("Qwen/Qwen3.6-35B-A3B", "auto"),
("Qwen/Qwen3.8-27B", "auto"),
("Qwen/Qwen3.8-Flash-Next", "auto"),
("google/gemma-4-31B-it", "auto"),
("zai-org/GLM-5", "auto"),
("zai-org/GLM-5.1", "auto"),
Expand Down
1 change: 1 addition & 0 deletions tests/test_roundtrip.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
("Qwen/Qwen3.5-9B", "auto"),
("Qwen/Qwen3.6-35B-A3B", "auto"),
("Qwen/Qwen3.8-27B", "auto"),
("Qwen/Qwen3.8-Flash-Next", "auto"),
("Qwen/Qwen3-VL-4B-Instruct", "auto"),
("google/gemma-4-31B-it", "auto"),
("thinkingmachines/Inkling", "auto"),
Expand Down
Loading