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.
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/PKG-INFO +1 -1
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/__init__.py +4 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/_version.py +2 -2
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/base.py +16 -1
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/configs.py +57 -0
- renderers-0.1.8.dev41/renderers/llama_3.py +516 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/nemotron3.py +68 -9
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/parsing.py +67 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/conftest.py +34 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_bridge.py +1 -0
- renderers-0.1.8.dev41/tests/test_llama_3.py +407 -0
- renderers-0.1.8.dev41/tests/test_nemotron3_ultra.py +59 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_preserve_thinking.py +6 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_renderer_config_parity.py +3 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_roundtrip.py +10 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.github/workflows/publish-dev.yml +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.github/workflows/publish.yml +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.github/workflows/style.yml +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.github/workflows/test.yml +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.gitignore +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/.pre-commit-config.yaml +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/LICENSE +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/README.md +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/docs/renderer-config.md +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/README.md +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/sglang/multiturn_generate_sglang.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/sglang/online_multiturn_sglang.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/tinker/multiturn_generate_tinker.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/transformers/multiturn_generate_transformers.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/examples/vllm/multiturn_generate_vllm.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/pyproject.toml +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/client.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/deepseek_v3.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/default.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/glm45.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/glm5.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/gpt_oss.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/kimi_k2.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/kimi_k25.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/laguna_xs2.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/minimax_m2.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/parsers.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/qwen3.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/qwen35.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/qwen36.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/renderers/qwen3_vl.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_build_helpers.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_client.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_gpt_oss_harmony_parity.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_incremental.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_is_content.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_kimi_k25_tool_schema.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_load_tokenizer.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_load_tokenizer_fastokens.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_message_indices.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_message_tool_names.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_multimodal.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_parse_response.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_parse_response_robustness.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_parsers.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_qwen35_size_coverage.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_render_ids.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_renderer_config.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_sampled_mask.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_tokens_per_message.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/tests/test_tool_arg_type_preservation.py +0 -0
- {renderers-0.1.8.dev39 → renderers-0.1.8.dev41}/uv.lock +0 -0
|
@@ -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.
|
|
22
|
-
__version_tuple__ = version_tuple = (0, 1, 8, '
|
|
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",
|