renderers 0.1.10.dev15__tar.gz → 0.1.11.dev1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/PKG-INFO +1 -1
  2. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/_version.py +2 -2
  3. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/base.py +2 -0
  4. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/qwen35.py +1 -0
  5. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/conftest.py +1 -0
  6. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_bridge.py +1 -0
  7. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_client.py +2 -1
  8. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_disabled_thinking_stability.py +4 -0
  9. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_qwen38.py +18 -12
  10. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_renderer_config_parity.py +1 -0
  11. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_roundtrip.py +1 -0
  12. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/.github/workflows/publish-dev.yml +0 -0
  13. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/.github/workflows/publish.yml +0 -0
  14. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/.github/workflows/style.yml +0 -0
  15. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/.github/workflows/test.yml +0 -0
  16. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/.gitignore +0 -0
  17. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/.pre-commit-config.yaml +0 -0
  18. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/LICENSE +0 -0
  19. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/README.md +0 -0
  20. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/docs/renderer-config.md +0 -0
  21. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/examples/README.md +0 -0
  22. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/examples/sglang/multiturn_generate_sglang.py +0 -0
  23. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/examples/sglang/online_multiturn_sglang.py +0 -0
  24. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/examples/tinker/multiturn_generate_tinker.py +0 -0
  25. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/examples/transformers/multiturn_generate_transformers.py +0 -0
  26. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/examples/vllm/multiturn_generate_vllm.py +0 -0
  27. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/pyproject.toml +0 -0
  28. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/__init__.py +0 -0
  29. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/client.py +0 -0
  30. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/configs.py +0 -0
  31. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/deepseek_r1.py +0 -0
  32. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/deepseek_v3.py +0 -0
  33. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/default.py +0 -0
  34. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/gemma4.py +0 -0
  35. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/glm45.py +0 -0
  36. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/glm5.py +0 -0
  37. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/gpt_oss.py +0 -0
  38. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/hy3.py +0 -0
  39. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/inkling.py +0 -0
  40. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/kimi_k2.py +0 -0
  41. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/kimi_k25.py +0 -0
  42. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/laguna_s21.py +0 -0
  43. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/laguna_xs2.py +0 -0
  44. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/llama_3.py +0 -0
  45. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/minimax_m2.py +0 -0
  46. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/nemotron3.py +0 -0
  47. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/parsers.py +0 -0
  48. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/parsing.py +0 -0
  49. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/prime_qwen3.py +0 -0
  50. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/qwen3.py +0 -0
  51. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/qwen36.py +0 -0
  52. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/qwen38.py +0 -0
  53. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/renderers/qwen3_vl.py +0 -0
  54. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_build_helpers.py +0 -0
  55. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_deepseek_r1.py +0 -0
  56. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_gemma4.py +0 -0
  57. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_glm_tool_name_validation.py +0 -0
  58. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_gpt_oss_harmony_parity.py +0 -0
  59. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_hy3.py +0 -0
  60. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_incremental.py +0 -0
  61. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_inkling.py +0 -0
  62. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_is_content.py +0 -0
  63. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_kimi_k25_tool_schema.py +0 -0
  64. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_laguna_m1.py +0 -0
  65. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_laguna_s21.py +0 -0
  66. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_laguna_xs21.py +0 -0
  67. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_llama_3.py +0 -0
  68. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_load_tokenizer.py +0 -0
  69. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_message_indices.py +0 -0
  70. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_message_tool_names.py +0 -0
  71. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_multimodal.py +0 -0
  72. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_nemotron3_parity.py +0 -0
  73. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_nemotron3_ultra.py +0 -0
  74. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_parse_response.py +0 -0
  75. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_parse_response_robustness.py +0 -0
  76. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_parsers.py +0 -0
  77. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_preserve_thinking.py +0 -0
  78. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_prime_qwen3_parity.py +0 -0
  79. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_qwen35_size_coverage.py +0 -0
  80. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_render_ids.py +0 -0
  81. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_renderer_config.py +0 -0
  82. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_sampled_mask.py +0 -0
  83. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_tokens_per_message.py +0 -0
  84. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/tests/test_tool_arg_type_preservation.py +0 -0
  85. {renderers-0.1.10.dev15 → renderers-0.1.11.dev1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: renderers
3
- Version: 0.1.10.dev15
3
+ Version: 0.1.11.dev1
4
4
  Summary: Chat template renderers — deterministic message-to-token conversion for LLM training
5
5
  License-Expression: Apache-2.0
6
6
  License-File: LICENSE
@@ -18,7 +18,7 @@ version_tuple: tuple[int | str, ...]
18
18
  commit_id: str | None
19
19
  __commit_id__: str | None
20
20
 
21
- __version__ = version = '0.1.10.dev15'
22
- __version_tuple__ = version_tuple = (0, 1, 10, 'dev15')
21
+ __version__ = version = '0.1.11.dev1'
22
+ __version_tuple__ = version_tuple = (0, 1, 11, 'dev1')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1033,6 +1033,7 @@ MODEL_RENDERER_MAP: dict[str, str] = {
1033
1033
  "Qwen/Qwen3.6-35B-A3B": "qwen3.6",
1034
1034
  # Qwen3.8.
1035
1035
  "Qwen/Qwen3.8-27B": "qwen3.8",
1036
+ "Qwen/Qwen3.8-Flash-Next": "qwen3.8",
1036
1037
  # Qwen3-VL.
1037
1038
  "Qwen/Qwen3-VL-4B-Instruct": "qwen3-vl",
1038
1039
  "Qwen/Qwen3-VL-8B-Instruct": "qwen3-vl",
@@ -1140,6 +1141,7 @@ MULTIMODAL_MODELS: dict[str, set[str]] = {
1140
1141
  "Qwen/Qwen3.6-35B-A3B": {"image"},
1141
1142
  # Qwen3.8 adds reasoning-effort control and preserves thinking by default.
1142
1143
  "Qwen/Qwen3.8-27B": {"image"},
1144
+ "Qwen/Qwen3.8-Flash-Next": {"image"},
1143
1145
  # Kimi K2.5 / K2.6 are unified VLMs (HF tag ``image-text-to-text``)
1144
1146
  # with custom processor (``KimiK25Processor`` + ``KimiK25VisionProcessor``).
1145
1147
  # Vision wrap is different from Qwen-VL:
@@ -104,6 +104,7 @@ _ENABLE_THINKING_DEFAULTS: dict[str, bool] = {
104
104
  "Qwen/Qwen3.6-35B-A3B": True,
105
105
  # Qwen3.8 keeps thinking enabled by default.
106
106
  "Qwen/Qwen3.8-27B": True,
107
+ "Qwen/Qwen3.8-Flash-Next": True,
107
108
  }
108
109
 
109
110
 
@@ -23,6 +23,7 @@ RENDERER_MODELS = [
23
23
  ("Qwen/Qwen3.5-9B", "auto"),
24
24
  ("Qwen/Qwen3.6-35B-A3B", "auto"),
25
25
  ("Qwen/Qwen3.8-27B", "auto"),
26
+ ("Qwen/Qwen3.8-Flash-Next", "auto"),
26
27
  ("Qwen/Qwen3-VL-4B-Instruct", "auto"),
27
28
  ("google/gemma-4-31B-it", "auto"),
28
29
  ("zai-org/GLM-5", "auto"),
@@ -27,6 +27,7 @@ _BRIDGE_MODELS = [
27
27
  ("Qwen/Qwen3.5-9B", "auto"),
28
28
  ("Qwen/Qwen3.6-35B-A3B", "auto"),
29
29
  ("Qwen/Qwen3.8-27B", "auto"),
30
+ ("Qwen/Qwen3.8-Flash-Next", "auto"),
30
31
  ("google/gemma-4-31B-it", "auto"),
31
32
  ("thinkingmachines/Inkling", "auto"),
32
33
  ("thinkingmachines/Inkling-Small", "auto"),
@@ -385,8 +385,9 @@ def test_generate_threads_prompt_attribution_through_prebuilt_prompt_path():
385
385
  ("Qwen/Qwen3-VL-4B-Instruct", "renderers.qwen3_vl:Qwen3VLRenderer"),
386
386
  ("Qwen/Qwen3.5-2B", "renderers.qwen35:Qwen35Renderer"),
387
387
  ("Qwen/Qwen3.8-27B", "renderers.qwen38:Qwen38Renderer"),
388
+ ("Qwen/Qwen3.8-Flash-Next", "renderers.qwen38:Qwen38Renderer"),
388
389
  ],
389
- ids=["qwen3_vl", "qwen35", "qwen38"],
390
+ ids=["qwen3_vl", "qwen35", "qwen38", "qwen38_flash_next"],
390
391
  )
391
392
  def test_generate_serializes_multimodal_features_for_qwen_vl_family(
392
393
  model_id, renderer_class_path
@@ -45,6 +45,10 @@ _MODELS = [
45
45
  "Qwen/Qwen3.8-27B",
46
46
  Qwen38RendererConfig(enable_thinking=False),
47
47
  ),
48
+ (
49
+ "Qwen/Qwen3.8-Flash-Next",
50
+ Qwen38RendererConfig(enable_thinking=False),
51
+ ),
48
52
  (
49
53
  "google/gemma-4-26B-A4B-it",
50
54
  Gemma4RendererConfig(enable_thinking=False),
@@ -31,10 +31,12 @@ TOOLS = [
31
31
  }
32
32
  ]
33
33
 
34
+ QWEN38_MODELS = ["Qwen/Qwen3.8-27B", "Qwen/Qwen3.8-Flash-Next"]
34
35
 
35
- @lru_cache(maxsize=1)
36
- def _qwen38():
37
- tokenizer = load_tokenizer("Qwen/Qwen3.8-27B")
36
+
37
+ @lru_cache(maxsize=None)
38
+ def _qwen38(model_name):
39
+ tokenizer = load_tokenizer(model_name)
38
40
  return tokenizer, create_renderer(tokenizer)
39
41
 
40
42
 
@@ -48,10 +50,11 @@ def _expected(tokenizer, messages, **kwargs):
48
50
  return list(result)
49
51
 
50
52
 
51
- def test_qwen38_is_registered_with_native_defaults():
52
- tokenizer, renderer = _qwen38()
53
+ @pytest.mark.parametrize("qwen38_model", QWEN38_MODELS)
54
+ def test_qwen38_is_registered_with_native_defaults(qwen38_model):
55
+ tokenizer, renderer = _qwen38(qwen38_model)
53
56
 
54
- assert tokenizer.name_or_path == "Qwen/Qwen3.8-27B"
57
+ assert tokenizer.name_or_path == qwen38_model
55
58
  assert MODEL_RENDERER_MAP[tokenizer.name_or_path] == "qwen3.8"
56
59
  assert MULTIMODAL_MODELS[tokenizer.name_or_path] == {"image"}
57
60
  assert isinstance(renderer, Qwen38Renderer)
@@ -86,8 +89,9 @@ def test_qwen38_config_discriminator():
86
89
  pytest.param({"preserve_thinking": False}, id="drop-history-thinking"),
87
90
  ],
88
91
  )
89
- def test_qwen38_text_and_tool_parity(config_kwargs):
90
- tokenizer, _ = _qwen38()
92
+ @pytest.mark.parametrize("qwen38_model", QWEN38_MODELS)
93
+ def test_qwen38_text_and_tool_parity(config_kwargs, qwen38_model):
94
+ tokenizer, _ = _qwen38(qwen38_model)
91
95
  renderer = Qwen38Renderer(tokenizer, Qwen38RendererConfig(**config_kwargs))
92
96
  cases = [
93
97
  (
@@ -152,8 +156,9 @@ def test_qwen38_text_and_tool_parity(config_kwargs):
152
156
  assert renderer.render_ids(messages, **render_kwargs) == expected
153
157
 
154
158
 
155
- def test_qwen38_keeps_inline_think_markup_in_visible_content():
156
- tokenizer, renderer = _qwen38()
159
+ @pytest.mark.parametrize("qwen38_model", QWEN38_MODELS)
160
+ def test_qwen38_keeps_inline_think_markup_in_visible_content(qwen38_model):
161
+ tokenizer, renderer = _qwen38(qwen38_model)
157
162
  messages = [
158
163
  {"role": "user", "content": "Echo this."},
159
164
  {
@@ -165,8 +170,9 @@ def test_qwen38_keeps_inline_think_markup_in_visible_content():
165
170
  assert renderer.render_ids(messages) == _expected(tokenizer, messages)
166
171
 
167
172
 
168
- def test_qwen38_requires_a_real_user_query():
169
- _, renderer = _qwen38()
173
+ @pytest.mark.parametrize("qwen38_model", QWEN38_MODELS)
174
+ def test_qwen38_requires_a_real_user_query(qwen38_model):
175
+ _, renderer = _qwen38(qwen38_model)
170
176
 
171
177
  with pytest.raises(ValueError, match="No user query found"):
172
178
  renderer.render_ids([{"role": "system", "content": "System only."}])
@@ -48,6 +48,7 @@ _RENDERER_MODELS = [
48
48
  ("Qwen/Qwen3.5-9B", "auto"),
49
49
  ("Qwen/Qwen3.6-35B-A3B", "auto"),
50
50
  ("Qwen/Qwen3.8-27B", "auto"),
51
+ ("Qwen/Qwen3.8-Flash-Next", "auto"),
51
52
  ("google/gemma-4-31B-it", "auto"),
52
53
  ("zai-org/GLM-5", "auto"),
53
54
  ("zai-org/GLM-5.1", "auto"),
@@ -33,6 +33,7 @@ _ROUNDTRIP_MODELS = [
33
33
  ("Qwen/Qwen3.5-9B", "auto"),
34
34
  ("Qwen/Qwen3.6-35B-A3B", "auto"),
35
35
  ("Qwen/Qwen3.8-27B", "auto"),
36
+ ("Qwen/Qwen3.8-Flash-Next", "auto"),
36
37
  ("Qwen/Qwen3-VL-4B-Instruct", "auto"),
37
38
  ("google/gemma-4-31B-it", "auto"),
38
39
  ("thinkingmachines/Inkling", "auto"),