renderers 0.1.13.dev19__tar.gz → 0.1.13.dev21__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 (99) hide show
  1. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/PKG-INFO +1 -1
  2. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/_version.py +2 -2
  3. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/nemotron3.py +5 -5
  4. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/parity.py +7 -1
  5. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/.github/workflows/publish-dev.yml +0 -0
  6. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/.github/workflows/publish.yml +0 -0
  7. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/.github/workflows/style.yml +0 -0
  8. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/.github/workflows/test.yml +0 -0
  9. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/.gitignore +0 -0
  10. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/.pre-commit-config.yaml +0 -0
  11. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/LICENSE +0 -0
  12. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/README.md +0 -0
  13. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/docs/renderer-config.md +0 -0
  14. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/examples/README.md +0 -0
  15. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/examples/sglang/multiturn_generate_sglang.py +0 -0
  16. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/examples/sglang/online_multiturn_sglang.py +0 -0
  17. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/examples/tinker/multiturn_generate_tinker.py +0 -0
  18. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/examples/transformers/multiturn_generate_transformers.py +0 -0
  19. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/examples/vllm/multiturn_generate_vllm.py +0 -0
  20. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/pyproject.toml +0 -0
  21. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/__init__.py +0 -0
  22. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/base.py +0 -0
  23. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/client.py +0 -0
  24. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/configs.py +0 -0
  25. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/custom.py +0 -0
  26. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/deepseek_r1.py +0 -0
  27. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/deepseek_v3.py +0 -0
  28. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/deepseek_v4.py +0 -0
  29. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/default.py +0 -0
  30. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/gemma4.py +0 -0
  31. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/glm45.py +0 -0
  32. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/glm5.py +0 -0
  33. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/gpt_oss.py +0 -0
  34. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/hy3.py +0 -0
  35. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/inkling.py +0 -0
  36. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/kimi_k2.py +0 -0
  37. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/kimi_k25.py +0 -0
  38. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/laguna_s21.py +0 -0
  39. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/laguna_xs2.py +0 -0
  40. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/llama_3.py +0 -0
  41. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/minimax_m2.py +0 -0
  42. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/muse_glimmer.py +0 -0
  43. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/parsers.py +0 -0
  44. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/parsing.py +0 -0
  45. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/prime_qwen3.py +0 -0
  46. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/qwen3.py +0 -0
  47. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/qwen35.py +0 -0
  48. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/qwen36.py +0 -0
  49. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/qwen38.py +0 -0
  50. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/qwen3_vl.py +0 -0
  51. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/reasoning.py +0 -0
  52. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/renderers/tagged.py +0 -0
  53. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/audit_prefix_stability.py +0 -0
  54. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/conftest.py +0 -0
  55. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/fixtures/prefix_stability.json +0 -0
  56. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/reference_continuations.py +0 -0
  57. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/reference_rendering.py +0 -0
  58. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/replay.py +0 -0
  59. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_bridge.py +0 -0
  60. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_build_helpers.py +0 -0
  61. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_client.py +0 -0
  62. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_custom.py +0 -0
  63. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_deepseek_r1.py +0 -0
  64. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_deepseek_v4.py +0 -0
  65. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_disabled_thinking_stability.py +0 -0
  66. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_gemma4.py +0 -0
  67. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_glm53_flash.py +0 -0
  68. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_glm_tool_name_validation.py +0 -0
  69. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_hy3.py +0 -0
  70. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_incremental.py +0 -0
  71. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_inkling.py +0 -0
  72. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_is_content.py +0 -0
  73. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_kimi_k25_tool_schema.py +0 -0
  74. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_laguna_m1.py +0 -0
  75. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_laguna_xs21.py +0 -0
  76. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_llama_3.py +0 -0
  77. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_load_tokenizer.py +0 -0
  78. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_message_indices.py +0 -0
  79. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_message_tool_names.py +0 -0
  80. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_multimodal.py +0 -0
  81. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_muse_glimmer.py +0 -0
  82. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_nemotron35_vlm.py +0 -0
  83. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_nemotron3_ultra.py +0 -0
  84. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_offsetless_tokenizers.py +0 -0
  85. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_parity.py +0 -0
  86. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_parse_response.py +0 -0
  87. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_parse_response_robustness.py +0 -0
  88. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_parsers.py +0 -0
  89. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_preserve_thinking.py +0 -0
  90. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_qwen35_size_coverage.py +0 -0
  91. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_qwen38.py +0 -0
  92. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_reasoning_boundaries.py +0 -0
  93. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_renderer_config.py +0 -0
  94. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_roundtrip.py +0 -0
  95. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_sampled_mask.py +0 -0
  96. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_tagged_rollout.py +0 -0
  97. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_tokens_per_message.py +0 -0
  98. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/tests/test_tool_arg_type_preservation.py +0 -0
  99. {renderers-0.1.13.dev19 → renderers-0.1.13.dev21}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: renderers
3
- Version: 0.1.13.dev19
3
+ Version: 0.1.13.dev21
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.13.dev19'
22
- __version_tuple__ = version_tuple = (0, 1, 13, 'dev19')
21
+ __version__ = version = '0.1.13.dev21'
22
+ __version_tuple__ = version_tuple = (0, 1, 13, 'dev21')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -428,16 +428,16 @@ class Nemotron3Renderer:
428
428
  content = self._render_content(msg.get("content"))
429
429
  msg_orig_idx = orig_idx(i)
430
430
 
431
- if role == "system":
432
- if i != 0:
433
- raise ValueError("System message must be at the beginning.")
431
+ if role == "system" and i == 0:
434
432
  continue # Already handled above
435
433
 
436
- elif role == "user":
434
+ elif role in ("user", "system"):
435
+ # The template renders a later system message through the
436
+ # user branch, under its own role header.
437
437
  emit_special(
438
438
  self._im_start, msg_orig_idx, is_sampled=False, is_content=False
439
439
  )
440
- user_segments: list[tuple[str, bool]] = [("user\n", False)]
440
+ user_segments: list[tuple[str, bool]] = [(f"{role}\n", False)]
441
441
  if content:
442
442
  user_segments.append((content, True))
443
443
  # Reasoning-effort hint rides on the LAST user message only,
@@ -685,7 +685,13 @@ SCENARIOS = (
685
685
  {"role": "system", "content": "Late instruction"},
686
686
  {"role": "user", "content": "B"},
687
687
  ],
688
- only_renderers={"laguna-xs-2.1", "laguna-s-2.1"},
688
+ only_renderers={
689
+ "laguna-xs-2.1",
690
+ "laguna-s-2.1",
691
+ "nemotron-3",
692
+ "nemotron-3-ultra",
693
+ "nemotron-3.5",
694
+ },
689
695
  ),
690
696
  _scenario(
691
697
  "tool-declare-message",