renderers 0.1.13.dev17__tar.gz → 0.1.13.dev19__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.dev17 → renderers-0.1.13.dev19}/PKG-INFO +1 -1
  2. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/_version.py +2 -2
  3. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/glm45.py +4 -2
  4. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/parity.py +27 -2
  5. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/.github/workflows/publish-dev.yml +0 -0
  6. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/.github/workflows/publish.yml +0 -0
  7. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/.github/workflows/style.yml +0 -0
  8. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/.github/workflows/test.yml +0 -0
  9. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/.gitignore +0 -0
  10. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/.pre-commit-config.yaml +0 -0
  11. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/LICENSE +0 -0
  12. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/README.md +0 -0
  13. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/docs/renderer-config.md +0 -0
  14. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/examples/README.md +0 -0
  15. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/examples/sglang/multiturn_generate_sglang.py +0 -0
  16. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/examples/sglang/online_multiturn_sglang.py +0 -0
  17. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/examples/tinker/multiturn_generate_tinker.py +0 -0
  18. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/examples/transformers/multiturn_generate_transformers.py +0 -0
  19. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/examples/vllm/multiturn_generate_vllm.py +0 -0
  20. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/pyproject.toml +0 -0
  21. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/__init__.py +0 -0
  22. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/base.py +0 -0
  23. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/client.py +0 -0
  24. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/configs.py +0 -0
  25. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/custom.py +0 -0
  26. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/deepseek_r1.py +0 -0
  27. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/deepseek_v3.py +0 -0
  28. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/deepseek_v4.py +0 -0
  29. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/default.py +0 -0
  30. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/gemma4.py +0 -0
  31. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/glm5.py +0 -0
  32. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/gpt_oss.py +0 -0
  33. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/hy3.py +0 -0
  34. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/inkling.py +0 -0
  35. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/kimi_k2.py +0 -0
  36. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/kimi_k25.py +0 -0
  37. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/laguna_s21.py +0 -0
  38. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/laguna_xs2.py +0 -0
  39. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/llama_3.py +0 -0
  40. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/minimax_m2.py +0 -0
  41. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/muse_glimmer.py +0 -0
  42. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/nemotron3.py +0 -0
  43. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/parsers.py +0 -0
  44. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/parsing.py +0 -0
  45. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/prime_qwen3.py +0 -0
  46. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/qwen3.py +0 -0
  47. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/qwen35.py +0 -0
  48. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/qwen36.py +0 -0
  49. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/qwen38.py +0 -0
  50. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/qwen3_vl.py +0 -0
  51. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/reasoning.py +0 -0
  52. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/renderers/tagged.py +0 -0
  53. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/audit_prefix_stability.py +0 -0
  54. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/conftest.py +0 -0
  55. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/fixtures/prefix_stability.json +0 -0
  56. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/reference_continuations.py +0 -0
  57. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/reference_rendering.py +0 -0
  58. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/replay.py +0 -0
  59. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_bridge.py +0 -0
  60. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_build_helpers.py +0 -0
  61. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_client.py +0 -0
  62. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_custom.py +0 -0
  63. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_deepseek_r1.py +0 -0
  64. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_deepseek_v4.py +0 -0
  65. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_disabled_thinking_stability.py +0 -0
  66. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_gemma4.py +0 -0
  67. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_glm53_flash.py +0 -0
  68. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_glm_tool_name_validation.py +0 -0
  69. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_hy3.py +0 -0
  70. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_incremental.py +0 -0
  71. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_inkling.py +0 -0
  72. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_is_content.py +0 -0
  73. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_kimi_k25_tool_schema.py +0 -0
  74. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_laguna_m1.py +0 -0
  75. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_laguna_xs21.py +0 -0
  76. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_llama_3.py +0 -0
  77. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_load_tokenizer.py +0 -0
  78. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_message_indices.py +0 -0
  79. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_message_tool_names.py +0 -0
  80. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_multimodal.py +0 -0
  81. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_muse_glimmer.py +0 -0
  82. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_nemotron35_vlm.py +0 -0
  83. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_nemotron3_ultra.py +0 -0
  84. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_offsetless_tokenizers.py +0 -0
  85. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_parity.py +0 -0
  86. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_parse_response.py +0 -0
  87. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_parse_response_robustness.py +0 -0
  88. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_parsers.py +0 -0
  89. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_preserve_thinking.py +0 -0
  90. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_qwen35_size_coverage.py +0 -0
  91. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_qwen38.py +0 -0
  92. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_reasoning_boundaries.py +0 -0
  93. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_renderer_config.py +0 -0
  94. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_roundtrip.py +0 -0
  95. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_sampled_mask.py +0 -0
  96. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_tagged_rollout.py +0 -0
  97. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_tokens_per_message.py +0 -0
  98. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/tests/test_tool_arg_type_preservation.py +0 -0
  99. {renderers-0.1.13.dev17 → renderers-0.1.13.dev19}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: renderers
3
- Version: 0.1.13.dev17
3
+ Version: 0.1.13.dev19
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.dev17'
22
- __version_tuple__ = version_tuple = (0, 1, 13, 'dev17')
21
+ __version__ = version = '0.1.13.dev19'
22
+ __version_tuple__ = version_tuple = (0, 1, 13, 'dev19')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -517,12 +517,14 @@ class GLM45Renderer:
517
517
  elif content.strip():
518
518
  emit_text("\n" + content.strip(), msg_idx, is_sampled=True, is_content=True)
519
519
 
520
- for tc in tool_calls:
520
+ for tc_idx, tc in enumerate(tool_calls):
521
521
  func = tc.get("function") or tc
522
522
  name = func.get("name", "")
523
523
  arguments = func.get("arguments", {})
524
524
 
525
- if not content.strip():
525
+ # The template opens every call with "\n<tool_call>"; only the
526
+ # first call's "\n" is already carried by the content text above.
527
+ if tc_idx > 0 or not content.strip():
526
528
  emit_text("\n", msg_idx, is_sampled=True, is_content=True)
527
529
  emit_special(self._tool_call_tok, msg_idx, is_sampled=True, is_content=True)
528
530
  emit_text(name + "\n", msg_idx, is_sampled=True, is_content=True)
@@ -202,6 +202,7 @@ MODEL_CATALOG = (
202
202
  "tool-call-content",
203
203
  "tool-call-none",
204
204
  "multiple-tool-calls",
205
+ "multiple-tool-calls-content",
205
206
  "tool-response",
206
207
  "named-tool-response",
207
208
  "consecutive-tool-responses",
@@ -217,6 +218,7 @@ MODEL_CATALOG = (
217
218
  "tool-call-content",
218
219
  "tool-call-none",
219
220
  "multiple-tool-calls",
221
+ "multiple-tool-calls-content",
220
222
  "tool-response",
221
223
  "named-tool-response",
222
224
  "consecutive-tool-responses",
@@ -246,7 +248,11 @@ MODEL_CATALOG = (
246
248
  _model(
247
249
  "meta-llama/Llama-3.2-1B-Instruct",
248
250
  bridge=True,
249
- excluded={"multiple-tool-calls", "consecutive-tool-responses"},
251
+ excluded={
252
+ "multiple-tool-calls",
253
+ "multiple-tool-calls-content",
254
+ "consecutive-tool-responses",
255
+ },
250
256
  oracle_defaults={"date_string": "26 Jul 2024"},
251
257
  extra_suites={"llama-checkpoints"},
252
258
  ),
@@ -254,7 +260,11 @@ MODEL_CATALOG = (
254
260
  "meta-llama/Llama-3.2-3B-Instruct",
255
261
  shared=False,
256
262
  roundtrip=False,
257
- excluded={"multiple-tool-calls", "consecutive-tool-responses"},
263
+ excluded={
264
+ "multiple-tool-calls",
265
+ "multiple-tool-calls-content",
266
+ "consecutive-tool-responses",
267
+ },
258
268
  oracle_defaults={"date_string": "26 Jul 2024"},
259
269
  extra_suites={"llama-checkpoints"},
260
270
  ),
@@ -486,6 +496,21 @@ SCENARIOS = (
486
496
  ],
487
497
  tools=TOOLS,
488
498
  ),
499
+ _scenario(
500
+ "multiple-tool-calls-content",
501
+ [
502
+ {"role": "user", "content": "Weather in Paris and London?"},
503
+ {
504
+ "role": "assistant",
505
+ "content": "Let me check both.",
506
+ "tool_calls": [
507
+ _call("Paris", id="call_1"),
508
+ _call("London", id="call_2"),
509
+ ],
510
+ },
511
+ ],
512
+ tools=TOOLS,
513
+ ),
489
514
  _scenario(
490
515
  "tool-response",
491
516
  [