renderers 0.1.13.dev5__tar.gz → 0.1.13.dev8__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.dev5 → renderers-0.1.13.dev8}/PKG-INFO +2 -2
  2. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/README.md +1 -1
  3. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/docs/renderer-config.md +2 -0
  4. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/__init__.py +4 -0
  5. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/_version.py +2 -2
  6. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/base.py +4 -0
  7. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/client.py +6 -3
  8. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/configs.py +31 -0
  9. renderers-0.1.13.dev8/renderers/muse_glimmer.py +887 -0
  10. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/fixtures/prefix_stability.json +10 -0
  11. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/parity.py +6 -0
  12. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_build_helpers.py +8 -0
  13. renderers-0.1.13.dev8/tests/test_muse_glimmer.py +740 -0
  14. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_reasoning_boundaries.py +14 -0
  15. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/.github/workflows/publish-dev.yml +0 -0
  16. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/.github/workflows/publish.yml +0 -0
  17. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/.github/workflows/style.yml +0 -0
  18. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/.github/workflows/test.yml +0 -0
  19. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/.gitignore +0 -0
  20. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/.pre-commit-config.yaml +0 -0
  21. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/LICENSE +0 -0
  22. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/examples/README.md +0 -0
  23. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/examples/sglang/multiturn_generate_sglang.py +0 -0
  24. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/examples/sglang/online_multiturn_sglang.py +0 -0
  25. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/examples/tinker/multiturn_generate_tinker.py +0 -0
  26. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/examples/transformers/multiturn_generate_transformers.py +0 -0
  27. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/examples/vllm/multiturn_generate_vllm.py +0 -0
  28. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/pyproject.toml +0 -0
  29. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/custom.py +0 -0
  30. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/deepseek_r1.py +0 -0
  31. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/deepseek_v3.py +0 -0
  32. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/deepseek_v4.py +0 -0
  33. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/default.py +0 -0
  34. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/gemma4.py +0 -0
  35. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/glm45.py +0 -0
  36. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/glm5.py +0 -0
  37. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/gpt_oss.py +0 -0
  38. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/hy3.py +0 -0
  39. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/inkling.py +0 -0
  40. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/kimi_k2.py +0 -0
  41. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/kimi_k25.py +0 -0
  42. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/laguna_s21.py +0 -0
  43. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/laguna_xs2.py +0 -0
  44. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/llama_3.py +0 -0
  45. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/minimax_m2.py +0 -0
  46. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/nemotron3.py +0 -0
  47. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/parsers.py +0 -0
  48. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/parsing.py +0 -0
  49. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/prime_qwen3.py +0 -0
  50. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/qwen3.py +0 -0
  51. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/qwen35.py +0 -0
  52. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/qwen36.py +0 -0
  53. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/qwen38.py +0 -0
  54. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/qwen3_vl.py +0 -0
  55. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/reasoning.py +0 -0
  56. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/renderers/tagged.py +0 -0
  57. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/audit_prefix_stability.py +0 -0
  58. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/conftest.py +0 -0
  59. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/reference_continuations.py +0 -0
  60. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/reference_rendering.py +0 -0
  61. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/replay.py +0 -0
  62. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_bridge.py +0 -0
  63. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_client.py +0 -0
  64. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_custom.py +0 -0
  65. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_deepseek_r1.py +0 -0
  66. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_deepseek_v4.py +0 -0
  67. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_disabled_thinking_stability.py +0 -0
  68. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_gemma4.py +0 -0
  69. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_glm53_flash.py +0 -0
  70. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_glm_tool_name_validation.py +0 -0
  71. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_hy3.py +0 -0
  72. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_incremental.py +0 -0
  73. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_inkling.py +0 -0
  74. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_is_content.py +0 -0
  75. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_kimi_k25_tool_schema.py +0 -0
  76. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_laguna_m1.py +0 -0
  77. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_laguna_xs21.py +0 -0
  78. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_llama_3.py +0 -0
  79. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_load_tokenizer.py +0 -0
  80. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_message_indices.py +0 -0
  81. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_message_tool_names.py +0 -0
  82. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_multimodal.py +0 -0
  83. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_nemotron35_vlm.py +0 -0
  84. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_nemotron3_ultra.py +0 -0
  85. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_offsetless_tokenizers.py +0 -0
  86. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_parity.py +0 -0
  87. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_parse_response.py +0 -0
  88. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_parse_response_robustness.py +0 -0
  89. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_parsers.py +0 -0
  90. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_preserve_thinking.py +0 -0
  91. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_qwen35_size_coverage.py +0 -0
  92. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_qwen38.py +0 -0
  93. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_renderer_config.py +0 -0
  94. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_roundtrip.py +0 -0
  95. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_sampled_mask.py +0 -0
  96. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_tagged_rollout.py +0 -0
  97. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_tokens_per_message.py +0 -0
  98. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/tests/test_tool_arg_type_preservation.py +0 -0
  99. {renderers-0.1.13.dev5 → renderers-0.1.13.dev8}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: renderers
3
- Version: 0.1.13.dev5
3
+ Version: 0.1.13.dev8
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
@@ -114,7 +114,7 @@ next_prompt_ids = r.bridge_to_next_turn(
114
114
  )
115
115
  ```
116
116
 
117
- Hand-coded renderers ship for `qwen3`, `qwen3-vl`, `qwen3.5`, `qwen3.6`, `qwen3.8`, `gemma4`, `glm-5`, `glm-5.1`, `glm-5.3`, `glm-5.3-flash`, `glm-4.5`, `minimax-m2`, `deepseek-v3`, `deepseek-r1`, `deepseek-v4` (V4 Flash 0731), `kimi-k2`, `kimi-k2.5` / `kimi-k2.6`, `laguna-xs.2`, `laguna-xs-2.1`, `laguna-s-2.1`, `laguna-m.1`, `nemotron-3`, `nemotron-3-ultra`, `nemotron-3.5`, `llama-3`, `gpt-oss`, `hy3`, `inkling` / `inkling-small`, and `prime-qwen3`. Anything else falls back to `DefaultRenderer`, a generic `apply_chat_template` wrapper. `qwen3-vl`, `qwen3.5`, `qwen3.6`, `qwen3.8`, `gemma4`, `glm-5.3-flash`, `kimi-k2.5` / `kimi-k2.6`, and the Inkling checkpoints are multimodal (Inkling handles both image **and** audio; `glm-5.3-flash` renders images only with `process_multimodal=False`).
117
+ Hand-coded renderers ship for `qwen3`, `qwen3-vl`, `qwen3.5`, `qwen3.6`, `qwen3.8`, `gemma4`, `glm-5`, `glm-5.1`, `glm-5.3`, `glm-5.3-flash`, `glm-4.5`, `minimax-m2`, `deepseek-v3`, `deepseek-r1`, `deepseek-v4` (V4 Flash 0731), `kimi-k2`, `kimi-k2.5` / `kimi-k2.6`, `laguna-xs.2`, `laguna-xs-2.1`, `laguna-s-2.1`, `laguna-m.1`, `nemotron-3`, `nemotron-3-ultra`, `nemotron-3.5`, `llama-3`, `gpt-oss`, `muse-glimmer`, `hy3`, `inkling` / `inkling-small`, and `prime-qwen3`. Anything else falls back to `DefaultRenderer`, a generic `apply_chat_template` wrapper. `qwen3-vl`, `qwen3.5`, `qwen3.6`, `qwen3.8`, `gemma4`, `glm-5.3-flash`, `muse-glimmer`, `kimi-k2.5` / `kimi-k2.6`, and the Inkling checkpoints are multimodal (Inkling handles both image **and** audio; `glm-5.3-flash` and `muse-glimmer` render images only with `process_multimodal=False`).
118
118
 
119
119
  ## API
120
120
 
@@ -94,7 +94,7 @@ next_prompt_ids = r.bridge_to_next_turn(
94
94
  )
95
95
  ```
96
96
 
97
- Hand-coded renderers ship for `qwen3`, `qwen3-vl`, `qwen3.5`, `qwen3.6`, `qwen3.8`, `gemma4`, `glm-5`, `glm-5.1`, `glm-5.3`, `glm-5.3-flash`, `glm-4.5`, `minimax-m2`, `deepseek-v3`, `deepseek-r1`, `deepseek-v4` (V4 Flash 0731), `kimi-k2`, `kimi-k2.5` / `kimi-k2.6`, `laguna-xs.2`, `laguna-xs-2.1`, `laguna-s-2.1`, `laguna-m.1`, `nemotron-3`, `nemotron-3-ultra`, `nemotron-3.5`, `llama-3`, `gpt-oss`, `hy3`, `inkling` / `inkling-small`, and `prime-qwen3`. Anything else falls back to `DefaultRenderer`, a generic `apply_chat_template` wrapper. `qwen3-vl`, `qwen3.5`, `qwen3.6`, `qwen3.8`, `gemma4`, `glm-5.3-flash`, `kimi-k2.5` / `kimi-k2.6`, and the Inkling checkpoints are multimodal (Inkling handles both image **and** audio; `glm-5.3-flash` renders images only with `process_multimodal=False`).
97
+ Hand-coded renderers ship for `qwen3`, `qwen3-vl`, `qwen3.5`, `qwen3.6`, `qwen3.8`, `gemma4`, `glm-5`, `glm-5.1`, `glm-5.3`, `glm-5.3-flash`, `glm-4.5`, `minimax-m2`, `deepseek-v3`, `deepseek-r1`, `deepseek-v4` (V4 Flash 0731), `kimi-k2`, `kimi-k2.5` / `kimi-k2.6`, `laguna-xs.2`, `laguna-xs-2.1`, `laguna-s-2.1`, `laguna-m.1`, `nemotron-3`, `nemotron-3-ultra`, `nemotron-3.5`, `llama-3`, `gpt-oss`, `muse-glimmer`, `hy3`, `inkling` / `inkling-small`, and `prime-qwen3`. Anything else falls back to `DefaultRenderer`, a generic `apply_chat_template` wrapper. `qwen3-vl`, `qwen3.5`, `qwen3.6`, `qwen3.8`, `gemma4`, `glm-5.3-flash`, `muse-glimmer`, `kimi-k2.5` / `kimi-k2.6`, and the Inkling checkpoints are multimodal (Inkling handles both image **and** audio; `glm-5.3-flash` and `muse-glimmer` render images only with `process_multimodal=False`).
98
98
 
99
99
  ## API
100
100
 
@@ -37,6 +37,7 @@ product in `tests/test_parity.py`.
37
37
  | GLM-5.3 / 5.3 Flash | `GLM53RendererConfig` / `GLM53FlashRendererConfig` | `clear_thinking`, `reasoning_effort` | - |
38
38
  | GLM-4.5 | `GLM45RendererConfig` | `enable_thinking` | - |
39
39
  | gpt-oss | `GptOssRendererConfig` | `reasoning_effort`, `conversation_start_date` | `use_system_prompt`, `knowledge_cutoff`, `model_identity`, `auto_drop_analysis` |
40
+ | Muse Glimmer | `MuseGlimmerRendererConfig` | `reasoning_strength`, `knowledge_cutoff`, `current_date` | - |
40
41
  | Hy3 | `Hy3RendererConfig` | `reasoning_effort`, `preserved_thinking`, `is_training`, `raw_last_assistant`, `fallback_strategy` | - |
41
42
  | Kimi K2 | `KimiK2RendererConfig` | - | `enable_thinking` |
42
43
  | Kimi K2.5 / 2.6 | `KimiK25RendererConfig` | `thinking` | `image_cache_max` |
@@ -144,6 +145,7 @@ the knobs its template actually exposes:
144
145
  | GLM-5.3 / 5.3 Flash | `clear_thinking=False -> all`, else `tool_cycle` |
145
146
  | GLM-4.5 | `enable_thinking=False -> all`, else `tool_cycle` |
146
147
  | gpt-oss | `auto_drop_analysis=False -> all`, else `tool_cycle` |
148
+ | Muse Glimmer | `all` (the template keeps every assistant's reasoning) |
147
149
  | Hy3 | `preserved_thinking=True -> all`, else `tool_cycle` |
148
150
  | Kimi K2.5 / 2.6 | `thinking=False -> all`, else `tool_cycle` |
149
151
  | Nemotron-3 / 3.5 | `truncate_history_thinking=False -> all`; else `enable_thinking=False -> all`; else `tool_cycle` |
@@ -68,6 +68,7 @@ from renderers.configs import (
68
68
  LagunaXS21RendererConfig,
69
69
  Llama3RendererConfig,
70
70
  MiniMaxM2RendererConfig,
71
+ MuseGlimmerRendererConfig,
71
72
  Nemotron3RendererConfig,
72
73
  Nemotron3UltraRendererConfig,
73
74
  Nemotron35RendererConfig,
@@ -111,6 +112,7 @@ _LAZY_RENDERERS: dict[str, str] = {
111
112
  "LagunaXS2Renderer": "renderers.laguna_xs2",
112
113
  "Llama3Renderer": "renderers.llama_3",
113
114
  "MiniMaxM2Renderer": "renderers.minimax_m2",
115
+ "MuseGlimmerRenderer": "renderers.muse_glimmer",
114
116
  "Nemotron35Renderer": "renderers.nemotron3",
115
117
  "Nemotron3Renderer": "renderers.nemotron3",
116
118
  "Nemotron3UltraRenderer": "renderers.nemotron3",
@@ -193,6 +195,8 @@ __all__ = [
193
195
  "MiniMaxM2RendererConfig",
194
196
  "MultiModalData",
195
197
  "MultimodalRenderer",
198
+ "MuseGlimmerRenderer",
199
+ "MuseGlimmerRendererConfig",
196
200
  "Nemotron35Renderer",
197
201
  "Nemotron35RendererConfig",
198
202
  "Nemotron3Renderer",
@@ -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.dev5'
22
- __version_tuple__ = version_tuple = (0, 1, 13, 'dev5')
21
+ __version__ = version = '0.1.13.dev8'
22
+ __version_tuple__ = version_tuple = (0, 1, 13, 'dev8')
23
23
 
24
24
  __commit_id__ = commit_id = None
@@ -1063,6 +1063,8 @@ MODEL_RENDERER_MAP: dict[str, str] = {
1063
1063
  # GPT-OSS.
1064
1064
  "openai/gpt-oss-20b": "gpt-oss",
1065
1065
  "openai/gpt-oss-120b": "gpt-oss",
1066
+ # Muse Glimmer (ATEM channel format; images as one <|patch|> each).
1067
+ "meta-models/Muse-Glimmer-30B": "muse-glimmer",
1066
1068
  # Thinking Machines Inkling checkpoints share byte-identical tokenizer,
1067
1069
  # chat-template, and processor assets (vision + audio; transformers >= 5.14).
1068
1070
  "thinkingmachines/Inkling": "inkling",
@@ -1375,6 +1377,7 @@ def _populate_registry():
1375
1377
  )
1376
1378
  from renderers.llama_3 import Llama3Renderer
1377
1379
  from renderers.minimax_m2 import MiniMaxM2Renderer
1380
+ from renderers.muse_glimmer import MuseGlimmerRenderer
1378
1381
  from renderers.nemotron3 import (
1379
1382
  Nemotron3Renderer,
1380
1383
  Nemotron3UltraRenderer,
@@ -1419,6 +1422,7 @@ def _populate_registry():
1419
1422
  "nemotron-3-ultra": Nemotron3UltraRenderer,
1420
1423
  "nemotron-3.5": Nemotron35Renderer,
1421
1424
  "gpt-oss": GptOssRenderer,
1425
+ "muse-glimmer": MuseGlimmerRenderer,
1422
1426
  }
1423
1427
  )
1424
1428
 
@@ -261,9 +261,11 @@ async def generate(
261
261
  Returns a dict with: request_id, prompt_ids, renderer_prompt_ids,
262
262
  mm_placeholders, completion_ids, completion_logprobs, content,
263
263
  reasoning_content, tool_calls, finish_reason, routed_experts,
264
- multi_modal_data, prompt_attribution. ``renderer_prompt_ids`` is the
265
- unexpanded logical prompt when ``process_multimodal=False`` and ``None``
266
- otherwise.
264
+ weight_versions, multi_modal_data, prompt_attribution.
265
+ ``renderer_prompt_ids`` is the unexpanded logical prompt when
266
+ ``process_multimodal=False`` and ``None`` otherwise. ``weight_versions``
267
+ is vLLM's (>= 0.32) list of ``{version, start, end}`` spans over
268
+ completion-token indexes, or ``None`` when the engine labels none.
267
269
 
268
270
  ``prompt_attribution`` is the renderer's :class:`RenderedTokens` for
269
271
  the prompt — either the one this call computed via
@@ -431,6 +433,7 @@ async def generate(
431
433
  "reasoning_complete": parsed.reasoning_complete,
432
434
  "routed_experts": routed_experts,
433
435
  "sampling_mask": sampling_mask,
436
+ "weight_versions": choice.get("weight_versions"),
434
437
  # The mm sidecar consumed on the request side, surfaced back so
435
438
  # callers can persist it on the trajectory step for downstream
436
439
  # multi-turn bridging and training-sample construction.
@@ -647,6 +647,34 @@ class GptOssRendererConfig(BaseRendererConfig):
647
647
  return self
648
648
 
649
649
 
650
+ class MuseGlimmerRendererConfig(BaseRendererConfig):
651
+ """Muse Glimmer (ATEM) renderer config.
652
+
653
+ The chat template never drops historical reasoning, so bridges keep all
654
+ reasoning by default (``thinking_retention`` resolves to ``"all"``).
655
+ """
656
+
657
+ name: Literal["muse-glimmer"] = "muse-glimmer"
658
+ _template_fields = frozenset(
659
+ {"reasoning_strength", "knowledge_cutoff", "current_date"}
660
+ )
661
+
662
+ reasoning_strength: Literal["low", "medium", "high", "xhigh"] = "high"
663
+ """``Reasoning strength: <value>.`` line in the system preamble. Mirrors
664
+ the template's ``reasoning_strength`` kwarg (template default ``high``).
665
+ A system message that already states a reasoning strength (or effort)
666
+ keeps its own line instead."""
667
+
668
+ knowledge_cutoff: str = "2026-01-04"
669
+ """Knowledge-cutoff date in the default preamble (used only when the
670
+ conversation has no system message). Mirrors ``knowledge_cutoff``."""
671
+
672
+ current_date: str | None = None
673
+ """``Current date`` in the default preamble, as ``YYYY-MM-DD``. ``None``
674
+ uses today's date (the template's ``strftime_now`` fallback), fixed when
675
+ the renderer is constructed. Pin it for reproducible training renders."""
676
+
677
+
650
678
  class KimiK2RendererConfig(BaseRendererConfig):
651
679
  """Kimi K2 renderer config.
652
680
 
@@ -1051,6 +1079,7 @@ RendererConfig = Annotated[
1051
1079
  GLM53FlashRendererConfig,
1052
1080
  GLM45RendererConfig,
1053
1081
  GptOssRendererConfig,
1082
+ MuseGlimmerRendererConfig,
1054
1083
  Hy3RendererConfig,
1055
1084
  InklingRendererConfig,
1056
1085
  KimiK2RendererConfig,
@@ -1101,6 +1130,7 @@ _CONFIG_BY_NAME: dict[str, type[BaseRendererConfig]] = {
1101
1130
  "glm-5.3-flash": GLM53FlashRendererConfig,
1102
1131
  "glm-4.5": GLM45RendererConfig,
1103
1132
  "gpt-oss": GptOssRendererConfig,
1133
+ "muse-glimmer": MuseGlimmerRendererConfig,
1104
1134
  "hy3": Hy3RendererConfig,
1105
1135
  "inkling": InklingRendererConfig,
1106
1136
  "kimi-k2": KimiK2RendererConfig,
@@ -1168,6 +1198,7 @@ __all__ = [
1168
1198
  "LagunaXS21RendererConfig",
1169
1199
  "Llama3RendererConfig",
1170
1200
  "MiniMaxM2RendererConfig",
1201
+ "MuseGlimmerRendererConfig",
1171
1202
  "Nemotron35RendererConfig",
1172
1203
  "Nemotron3RendererConfig",
1173
1204
  "Nemotron3UltraRendererConfig",