renderers 0.1.13.dev19__tar.gz → 0.2.0__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.2.0}/PKG-INFO +1 -1
  2. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/_version.py +2 -2
  3. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/nemotron3.py +5 -5
  4. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/parity.py +7 -1
  5. {renderers-0.1.13.dev19 → renderers-0.2.0}/.github/workflows/publish-dev.yml +0 -0
  6. {renderers-0.1.13.dev19 → renderers-0.2.0}/.github/workflows/publish.yml +0 -0
  7. {renderers-0.1.13.dev19 → renderers-0.2.0}/.github/workflows/style.yml +0 -0
  8. {renderers-0.1.13.dev19 → renderers-0.2.0}/.github/workflows/test.yml +0 -0
  9. {renderers-0.1.13.dev19 → renderers-0.2.0}/.gitignore +0 -0
  10. {renderers-0.1.13.dev19 → renderers-0.2.0}/.pre-commit-config.yaml +0 -0
  11. {renderers-0.1.13.dev19 → renderers-0.2.0}/LICENSE +0 -0
  12. {renderers-0.1.13.dev19 → renderers-0.2.0}/README.md +0 -0
  13. {renderers-0.1.13.dev19 → renderers-0.2.0}/docs/renderer-config.md +0 -0
  14. {renderers-0.1.13.dev19 → renderers-0.2.0}/examples/README.md +0 -0
  15. {renderers-0.1.13.dev19 → renderers-0.2.0}/examples/sglang/multiturn_generate_sglang.py +0 -0
  16. {renderers-0.1.13.dev19 → renderers-0.2.0}/examples/sglang/online_multiturn_sglang.py +0 -0
  17. {renderers-0.1.13.dev19 → renderers-0.2.0}/examples/tinker/multiturn_generate_tinker.py +0 -0
  18. {renderers-0.1.13.dev19 → renderers-0.2.0}/examples/transformers/multiturn_generate_transformers.py +0 -0
  19. {renderers-0.1.13.dev19 → renderers-0.2.0}/examples/vllm/multiturn_generate_vllm.py +0 -0
  20. {renderers-0.1.13.dev19 → renderers-0.2.0}/pyproject.toml +0 -0
  21. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/__init__.py +0 -0
  22. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/base.py +0 -0
  23. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/client.py +0 -0
  24. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/configs.py +0 -0
  25. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/custom.py +0 -0
  26. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/deepseek_r1.py +0 -0
  27. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/deepseek_v3.py +0 -0
  28. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/deepseek_v4.py +0 -0
  29. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/default.py +0 -0
  30. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/gemma4.py +0 -0
  31. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/glm45.py +0 -0
  32. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/glm5.py +0 -0
  33. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/gpt_oss.py +0 -0
  34. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/hy3.py +0 -0
  35. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/inkling.py +0 -0
  36. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/kimi_k2.py +0 -0
  37. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/kimi_k25.py +0 -0
  38. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/laguna_s21.py +0 -0
  39. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/laguna_xs2.py +0 -0
  40. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/llama_3.py +0 -0
  41. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/minimax_m2.py +0 -0
  42. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/muse_glimmer.py +0 -0
  43. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/parsers.py +0 -0
  44. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/parsing.py +0 -0
  45. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/prime_qwen3.py +0 -0
  46. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/qwen3.py +0 -0
  47. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/qwen35.py +0 -0
  48. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/qwen36.py +0 -0
  49. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/qwen38.py +0 -0
  50. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/qwen3_vl.py +0 -0
  51. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/reasoning.py +0 -0
  52. {renderers-0.1.13.dev19 → renderers-0.2.0}/renderers/tagged.py +0 -0
  53. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/audit_prefix_stability.py +0 -0
  54. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/conftest.py +0 -0
  55. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/fixtures/prefix_stability.json +0 -0
  56. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/reference_continuations.py +0 -0
  57. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/reference_rendering.py +0 -0
  58. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/replay.py +0 -0
  59. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_bridge.py +0 -0
  60. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_build_helpers.py +0 -0
  61. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_client.py +0 -0
  62. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_custom.py +0 -0
  63. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_deepseek_r1.py +0 -0
  64. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_deepseek_v4.py +0 -0
  65. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_disabled_thinking_stability.py +0 -0
  66. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_gemma4.py +0 -0
  67. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_glm53_flash.py +0 -0
  68. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_glm_tool_name_validation.py +0 -0
  69. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_hy3.py +0 -0
  70. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_incremental.py +0 -0
  71. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_inkling.py +0 -0
  72. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_is_content.py +0 -0
  73. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_kimi_k25_tool_schema.py +0 -0
  74. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_laguna_m1.py +0 -0
  75. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_laguna_xs21.py +0 -0
  76. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_llama_3.py +0 -0
  77. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_load_tokenizer.py +0 -0
  78. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_message_indices.py +0 -0
  79. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_message_tool_names.py +0 -0
  80. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_multimodal.py +0 -0
  81. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_muse_glimmer.py +0 -0
  82. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_nemotron35_vlm.py +0 -0
  83. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_nemotron3_ultra.py +0 -0
  84. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_offsetless_tokenizers.py +0 -0
  85. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_parity.py +0 -0
  86. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_parse_response.py +0 -0
  87. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_parse_response_robustness.py +0 -0
  88. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_parsers.py +0 -0
  89. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_preserve_thinking.py +0 -0
  90. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_qwen35_size_coverage.py +0 -0
  91. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_qwen38.py +0 -0
  92. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_reasoning_boundaries.py +0 -0
  93. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_renderer_config.py +0 -0
  94. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_roundtrip.py +0 -0
  95. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_sampled_mask.py +0 -0
  96. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_tagged_rollout.py +0 -0
  97. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_tokens_per_message.py +0 -0
  98. {renderers-0.1.13.dev19 → renderers-0.2.0}/tests/test_tool_arg_type_preservation.py +0 -0
  99. {renderers-0.1.13.dev19 → renderers-0.2.0}/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.2.0
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.2.0'
22
+ __version_tuple__ = version_tuple = (0, 2, 0)
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",
File without changes
File without changes
File without changes
File without changes