Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 11 additions & 7 deletions renderers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
__version__ = "0+unknown"

from renderers.base import (
MULTIMODAL_MODELS,
Content,
ContentPart,
ImagePart,
MULTIMODAL_MODELS,
Message,
MultiModalData,
MultimodalRenderer,
Expand Down Expand Up @@ -43,29 +43,30 @@
from renderers.configs import (
AutoRendererConfig,
BaseRendererConfig,
config_from_name,
DefaultRendererConfig,
DeepSeekR1RendererConfig,
DeepSeekV3RendererConfig,
DefaultRendererConfig,
GLM5RendererConfig,
GLM45RendererConfig,
GLM51RendererConfig,
GLM5RendererConfig,
GptOssRendererConfig,
Hy3RendererConfig,
KimiK25RendererConfig,
KimiK2RendererConfig,
KimiK25RendererConfig,
LagunaXS2RendererConfig,
LagunaXS21RendererConfig,
Llama3RendererConfig,
MiniMaxM2RendererConfig,
Nemotron3RendererConfig,
Nemotron3UltraRendererConfig,
PrimeQwen3RendererConfig,
Qwen35RendererConfig,
Qwen36RendererConfig,
Qwen3RendererConfig,
Qwen3VLRendererConfig,
Qwen35RendererConfig,
Qwen36RendererConfig,
RendererConfig,
RlmRendererConfig,
config_from_name,
)

# Concrete renderer classes are lazy-loaded so that consumers needing
Expand Down Expand Up @@ -101,6 +102,7 @@
"Qwen36Renderer": "renderers.qwen36",
"Qwen3Renderer": "renderers.qwen3",
"Qwen3VLRenderer": "renderers.qwen3_vl",
"RlmRenderer": "renderers.rlm",
}


Expand Down Expand Up @@ -175,6 +177,8 @@ def __dir__() -> list[str]:
"Qwen3RendererConfig",
"Qwen3VLRenderer",
"Qwen3VLRendererConfig",
"RlmRenderer",
"RlmRendererConfig",
"RenderedConversation",
"RenderedTokens",
"RenderedTrainingSample",
Expand Down
4 changes: 4 additions & 0 deletions renderers/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -1066,6 +1066,8 @@ def bridge_to_next_turn(self, *args: Any, **kwargs: Any) -> "RenderedTokens | No
"meta-llama/Llama-3.2-3B-Instruct": "llama-3",
# Poolside Laguna. The two checkpoints ship different chat templates,
# each mirrored by its own renderer class.
# RLM chat format (minimal role tags, rlm harness).
"PrimeIntellect/RLM-Chat-Template": "rlm",
"poolside/Laguna-XS.2": "laguna-xs.2",
"poolside/Laguna-XS-2.1": "laguna-xs-2.1",
# GPT-OSS.
Expand Down Expand Up @@ -1324,6 +1326,7 @@ def _populate_registry():
from renderers.qwen3_vl import Qwen3VLRenderer
from renderers.qwen35 import Qwen35Renderer
from renderers.qwen36 import Qwen36Renderer
from renderers.rlm import RlmRenderer

RENDERER_REGISTRY.update(
{
Expand All @@ -1347,6 +1350,7 @@ def _populate_registry():
"llama-3": Llama3Renderer,
"nemotron-3": Nemotron3Renderer,
"nemotron-3-ultra": Nemotron3UltraRenderer,
"rlm": RlmRenderer,
"gpt-oss": GptOssRenderer,
}
)
Expand Down
25 changes: 25 additions & 0 deletions renderers/configs.py
Original file line number Diff line number Diff line change
Expand Up @@ -663,6 +663,29 @@ class DeepSeekR1RendererConfig(BaseRendererConfig):
name: Literal["deepseek-r1"] = "deepseek-r1"


class RlmRendererConfig(BaseRendererConfig):
"""RLM chat format (``PrimeIntellect/RLM-Chat-Template``) — minimal
role-tag-only format for the rlm harness.

One message, one tag block: ``<system> <user> <assistant> <output>``
plus the single inline tool call ``<ipython>...</ipython>``. Thinking is
structurally never dropped, so ``thinking_retention`` may only be left
unset or ``"all"``. Tool schemas are never rendered; ``tools=`` is
validation-only (exactly ``[ipython]`` is accepted).
"""

name: Literal["rlm"] = "rlm"

@model_validator(mode="after")
def _check_thinking_retention(self):
if self.thinking_retention not in (None, "all"):
raise ValueError(
"rlm never drops thinking; thinking_retention must be unset "
f"or 'all', got {self.thinking_retention!r}"
)
return self


RendererConfig = Annotated[
Union[
AutoRendererConfig,
Expand All @@ -687,6 +710,7 @@ class DeepSeekR1RendererConfig(BaseRendererConfig):
Nemotron3UltraRendererConfig,
DeepSeekV3RendererConfig,
DeepSeekR1RendererConfig,
RlmRendererConfig,
],
Field(discriminator="name"),
]
Expand Down Expand Up @@ -727,6 +751,7 @@ class DeepSeekR1RendererConfig(BaseRendererConfig):
"nemotron-3-ultra": Nemotron3UltraRendererConfig,
"deepseek-v3": DeepSeekV3RendererConfig,
"deepseek-r1": DeepSeekR1RendererConfig,
"rlm": RlmRendererConfig,
}


Expand Down
Loading
Loading