renderers 0.1.8.dev39__tar.gz → 0.1.8.dev41__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 (67) hide show
  1. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/PKG-INFO +1 -1
  2. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/__init__.py +4 -0
  3. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/_version.py +2 -2
  4. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/base.py +16 -1
  5. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/configs.py +57 -0
  6. renderers-0.1.8.dev41/renderers/llama_3.py +516 -0
  7. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/nemotron3.py +68 -9
  8. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/parsing.py +67 -0
  9. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/conftest.py +34 -0
  10. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_bridge.py +1 -0
  11. renderers-0.1.8.dev41/tests/test_llama_3.py +407 -0
  12. renderers-0.1.8.dev41/tests/test_nemotron3_ultra.py +59 -0
  13. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_preserve_thinking.py +6 -0
  14. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_renderer_config_parity.py +3 -0
  15. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_roundtrip.py +10 -0
  16. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.github/workflows/publish-dev.yml +0 -0
  17. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.github/workflows/publish.yml +0 -0
  18. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.github/workflows/style.yml +0 -0
  19. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.github/workflows/test.yml +0 -0
  20. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.gitignore +0 -0
  21. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.pre-commit-config.yaml +0 -0
  22. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/LICENSE +0 -0
  23. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/README.md +0 -0
  24. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/docs/renderer-config.md +0 -0
  25. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/README.md +0 -0
  26. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/sglang/multiturn_generate_sglang.py +0 -0
  27. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/sglang/online_multiturn_sglang.py +0 -0
  28. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/tinker/multiturn_generate_tinker.py +0 -0
  29. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/transformers/multiturn_generate_transformers.py +0 -0
  30. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/vllm/multiturn_generate_vllm.py +0 -0
  31. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/pyproject.toml +0 -0
  32. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/client.py +0 -0
  33. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/deepseek_v3.py +0 -0
  34. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/default.py +0 -0
  35. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/glm45.py +0 -0
  36. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/glm5.py +0 -0
  37. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/gpt_oss.py +0 -0
  38. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/kimi_k2.py +0 -0
  39. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/kimi_k25.py +0 -0
  40. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/laguna_xs2.py +0 -0
  41. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/minimax_m2.py +0 -0
  42. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/parsers.py +0 -0
  43. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/qwen3.py +0 -0
  44. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/qwen35.py +0 -0
  45. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/qwen36.py +0 -0
  46. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/qwen3_vl.py +0 -0
  47. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_build_helpers.py +0 -0
  48. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_client.py +0 -0
  49. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_gpt_oss_harmony_parity.py +0 -0
  50. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_incremental.py +0 -0
  51. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_is_content.py +0 -0
  52. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_kimi_k25_tool_schema.py +0 -0
  53. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_load_tokenizer.py +0 -0
  54. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_load_tokenizer_fastokens.py +0 -0
  55. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_message_indices.py +0 -0
  56. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_message_tool_names.py +0 -0
  57. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_multimodal.py +0 -0
  58. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_parse_response.py +0 -0
  59. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_parse_response_robustness.py +0 -0
  60. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_parsers.py +0 -0
  61. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_qwen35_size_coverage.py +0 -0
  62. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_render_ids.py +0 -0
  63. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_renderer_config.py +0 -0
  64. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_sampled_mask.py +0 -0
  65. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_tokens_per_message.py +0 -0
  66. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_tool_arg_type_preservation.py +0 -0
  67. {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: renderers
3
- Version: 0.1.8.dev39
3
+ Version: 0.1.8.dev41
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
@@ -52,6 +52,7 @@ from renderers.configs import (
52
52
  KimiK25RendererConfig,
53
53
  KimiK2RendererConfig,
54
54
  LagunaXS2RendererConfig,
55
+ Llama3RendererConfig,
55
56
  MiniMaxM2RendererConfig,
56
57
  Nemotron3RendererConfig,
57
58
  Qwen35RendererConfig,
@@ -82,6 +83,7 @@ _LAZY_RENDERERS: dict[str, str] = {
82
83
  "KimiK25Renderer": "renderers.kimi_k25",
83
84
  "KimiK2Renderer": "renderers.kimi_k2",
84
85
  "LagunaXS2Renderer": "renderers.laguna_xs2",
86
+ "Llama3Renderer": "renderers.llama_3",
85
87
  "MiniMaxM2Renderer": "renderers.minimax_m2",
86
88
  "Nemotron3Renderer": "renderers.nemotron3",
87
89
  "Qwen35Renderer": "renderers.qwen35",
@@ -130,6 +132,8 @@ __all__ = [
130
132
  "KimiK2RendererConfig",
131
133
  "LagunaXS2Renderer",
132
134
  "LagunaXS2RendererConfig",
135
+ "Llama3Renderer",
136
+ "Llama3RendererConfig",
133
137
  "MULTIMODAL_MODELS",
134
138
  "Message",
135
139
  "MiniMaxM2Renderer",
@@ -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.8.dev39'
22
- __version_tuple__ = version_tuple = (0, 1, 8, 'dev39')
21
+ __version__ = version = '0.1.8.dev41'
22
+ __version_tuple__ = version_tuple = (0, 1, 8, 'dev41')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1037,9 +1037,22 @@ MODEL_RENDERER_MAP: dict[str, str] = {
1037
1037
  "moonshotai/Kimi-K2-Instruct": "kimi-k2",
1038
1038
  "moonshotai/Kimi-K2.5": "kimi-k2.5",
1039
1039
  "moonshotai/Kimi-K2.6": "kimi-k2.5",
1040
- # Nemotron 3.
1040
+ # Nemotron 3. Nano / Super share one chat-template variant; the Ultra
1041
+ # checkpoints use the Ultra variant — the renderer auto-selects it from
1042
+ # the model name (see ``nemotron3._ULTRA_DEFAULTS``). BF16 and FP8 share the
1043
+ # same tokenizer and template.
1041
1044
  "nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16": "nemotron-3",
1042
1045
  "nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16": "nemotron-3",
1046
+ "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-BF16": "nemotron-3",
1047
+ "nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-FP8": "nemotron-3",
1048
+ # Llama 3.2 (Instruct). Tested against the gated meta-llama repos and
1049
+ # the unrestricted unsloth/... mirror, which ships a byte-identical
1050
+ # chat template. ``Llama3Renderer`` defaults ``date_string`` to
1051
+ # "26 Jul 2024" — matching the chat template's strftime fallback —
1052
+ # so the renderer is reproducible. Pass ``date_string=...`` at
1053
+ # construction to pin a different date.
1054
+ "meta-llama/Llama-3.2-1B-Instruct": "llama-3",
1055
+ "meta-llama/Llama-3.2-3B-Instruct": "llama-3",
1043
1056
  # Poolside Laguna.
1044
1057
  "poolside/Laguna-XS.2": "laguna-xs.2",
1045
1058
  # GPT-OSS.
@@ -1329,6 +1342,7 @@ def _populate_registry():
1329
1342
  from renderers.kimi_k2 import KimiK2Renderer
1330
1343
  from renderers.kimi_k25 import KimiK25Renderer
1331
1344
  from renderers.laguna_xs2 import LagunaXS2Renderer
1345
+ from renderers.llama_3 import Llama3Renderer
1332
1346
  from renderers.minimax_m2 import MiniMaxM2Renderer
1333
1347
  from renderers.nemotron3 import Nemotron3Renderer
1334
1348
  from renderers.qwen3 import Qwen3Renderer
@@ -1351,6 +1365,7 @@ def _populate_registry():
1351
1365
  "kimi-k2": KimiK2Renderer,
1352
1366
  "kimi-k2.5": KimiK25Renderer,
1353
1367
  "laguna-xs.2": LagunaXS2Renderer,
1368
+ "llama-3": Llama3Renderer,
1354
1369
  "nemotron-3": Nemotron3Renderer,
1355
1370
  "gpt-oss": GptOssRenderer,
1356
1371
  }
@@ -318,6 +318,31 @@ class LagunaXS2RendererConfig(BaseRendererConfig):
318
318
  chat template's ``render_assistant_messages_raw`` gate."""
319
319
 
320
320
 
321
+ class Llama3RendererConfig(BaseRendererConfig):
322
+ """Llama-3.x Instruct renderer config.
323
+
324
+ Llama-3 ships no reasoning channel, so the base ``preserve_*_thinking``
325
+ flags don't apply: ``Llama3Renderer`` raises ``NotImplementedError``
326
+ if either is set (matching ``DefaultRenderer``'s contract for the
327
+ same case). Both fields below mirror real ``apply_chat_template``
328
+ kwargs.
329
+ """
330
+
331
+ name: Literal["llama-3"] = "llama-3"
332
+
333
+ date_string: str = "26 Jul 2024"
334
+ """``Today Date`` value injected into the system preamble. Pinned to
335
+ the chat template's ``strftime`` fallback by default so output stays
336
+ deterministic; override per instance for production runs that want
337
+ today's date. Mirrors the chat template's ``date_string`` kwarg."""
338
+
339
+ tools_in_user_message: bool = True
340
+ """When ``True`` (default), tool descriptions + JSON signatures inject
341
+ into the first user message; ``False`` routes them into the system
342
+ block instead. Mirrors the chat template's ``tools_in_user_message``
343
+ kwarg."""
344
+
345
+
321
346
  class MiniMaxM2RendererConfig(BaseRendererConfig):
322
347
  """MiniMax M2 / M2.5 renderer config."""
323
348
 
@@ -337,6 +362,26 @@ class Nemotron3RendererConfig(BaseRendererConfig):
337
362
  """When ``True``, the generation prompt includes ``<think>``. Mirrors
338
363
  the chat template's ``enable_thinking`` kwarg."""
339
364
 
365
+ ultra: bool | None = None
366
+ """Select the Nemotron-3 **Ultra** chat-template variant.
367
+
368
+ ``None`` (default) auto-detects from the model name (see
369
+ ``renderers.nemotron3._ULTRA_DEFAULTS``): the Ultra checkpoints resolve
370
+ to ``True``; Nano / Super and unknown checkpoints to ``False``. Set
371
+ explicitly to force a variant — e.g. an Ultra fine-tune or a
372
+ locally-pathed checkpoint whose ``name_or_path`` isn't in the table.
373
+
374
+ Ultra's template differs from Nano/Super: the reasoning block is glued
375
+ as ``<think>\\n{reasoning}</think>{content}`` (no ``\\n`` around
376
+ ``</think>``), truncated historical turns collapse to
377
+ ``<think></think>{content}`` (no ``\\n``), and the thinking-truncation
378
+ boundary follows the template's ``loop.index0 < last_user_idx`` rule
379
+ (drop thinking on every assistant turn before the last user message).
380
+
381
+ Not a chat-template kwarg — it picks which template the renderer
382
+ mirrors, not a variable passed into one — so it's listed in
383
+ ``_internal_fields`` and excluded from ``template_field_names()``."""
384
+
340
385
  truncate_history_thinking: bool = True
341
386
  """When ``False``, keep ``<think>{reasoning}</think>`` on past-cycle
342
387
  assistant turns instead of dropping them. Mirrors the chat
@@ -344,6 +389,15 @@ class Nemotron3RendererConfig(BaseRendererConfig):
344
389
  ``preserve_all_thinking`` / ``preserve_thinking_between_tool_calls``
345
390
  — see :class:`BaseRendererConfig` for the contract."""
346
391
 
392
+ # ``ultra`` is a template-variant SELECTOR — it picks which template the
393
+ # renderer mirrors (Ultra vs Nano/Super), not a variable passed into one;
394
+ # there is no ``ultra`` Jinja variable. Marked internal so the parity
395
+ # matrix doesn't cross it as a template field. Same ``_internal_fields``
396
+ # mechanism DeepSeek-V3 uses for its no-op ``enable_thinking``, for a
397
+ # different underlying reason (theirs is an ignored kwarg, this is a
398
+ # variant switch).
399
+ _internal_fields = frozenset({"ultra"})
400
+
347
401
 
348
402
  class DeepSeekV3RendererConfig(BaseRendererConfig):
349
403
  """DeepSeek V3 renderer config.
@@ -381,6 +435,7 @@ RendererConfig = Annotated[
381
435
  KimiK2RendererConfig,
382
436
  KimiK25RendererConfig,
383
437
  LagunaXS2RendererConfig,
438
+ Llama3RendererConfig,
384
439
  MiniMaxM2RendererConfig,
385
440
  Nemotron3RendererConfig,
386
441
  DeepSeekV3RendererConfig,
@@ -415,6 +470,7 @@ _CONFIG_BY_NAME: dict[str, type[BaseRendererConfig]] = {
415
470
  "kimi-k2": KimiK2RendererConfig,
416
471
  "kimi-k2.5": KimiK25RendererConfig,
417
472
  "laguna-xs.2": LagunaXS2RendererConfig,
473
+ "llama-3": Llama3RendererConfig,
418
474
  "minimax-m2": MiniMaxM2RendererConfig,
419
475
  "nemotron-3": Nemotron3RendererConfig,
420
476
  "deepseek-v3": DeepSeekV3RendererConfig,
@@ -457,6 +513,7 @@ __all__ = [
457
513
  "KimiK25RendererConfig",
458
514
  "KimiK2RendererConfig",
459
515
  "LagunaXS2RendererConfig",
516
+ "Llama3RendererConfig",
460
517
  "MiniMaxM2RendererConfig",
461
518
  "Nemotron3RendererConfig",
462
519
  "Qwen35RendererConfig",