Skip to content

mistral_common.protocol.instruct.normalize

InstructRequestNormalizer(user_message_class, assistant_message_class, tool_message_class, system_message_class, instruct_request_class, model_settings_builder)

Bases: Generic[UserMessageType, AssistantMessageType, ToolMessageType, SystemMessageType, InstructRequestType]

Takes a ChatCompletionRequest and normalizes it into an InstructRequest.

The normalization process does several things such as: - Aggregate consecutive messages of the same role - Aggregate system prompts - Normalize json content - Normalize tool calls

Examples:

>>> normalizer = InstructRequestNormalizer.normalizer()

Prefer the normalizer() static methods over direct construction.

Parameters:

Name Type Description Default
user_message_class type[UserMessageType]

Class used to construct aggregated user messages.

required
assistant_message_class type[AssistantMessageType]

Class used to construct aggregated assistant messages.

required
tool_message_class type[ToolMessageType]

Class used to construct aggregated tool messages.

required
system_message_class type[SystemMessageType]

Class used to construct system messages. Currently unused, but kept for API symmetry.

required
instruct_request_class type[InstructRequestType]

Class used to construct the final InstructRequest.

required
model_settings_builder ModelSettingsBuilder | None

Builder for model settings, or None if the tokenizer version does not support model settings.

required
Source code in src/mistral_common/protocol/instruct/normalize.py
def __init__(
    self,
    user_message_class: type[UserMessageType],
    assistant_message_class: type[AssistantMessageType],
    tool_message_class: type[ToolMessageType],
    system_message_class: type[SystemMessageType],
    instruct_request_class: type[InstructRequestType],
    model_settings_builder: ModelSettingsBuilder | None,
):
    r"""Initialize the normalizer with the appropriate message classes.

    Prefer the normalizer() static methods over direct construction.

    Args:
       user_message_class: Class used to construct aggregated user messages.
       assistant_message_class: Class used to construct aggregated assistant messages.
       tool_message_class: Class used to construct aggregated tool messages.
       system_message_class: Class used to construct system messages. Currently
           unused, but kept for API symmetry.
       instruct_request_class: Class used to construct the final InstructRequest.
       model_settings_builder: Builder for model settings, or `None` if the
           tokenizer version does not support model settings.
    """
    self._user_message_class = user_message_class
    self._assistant_message_class = assistant_message_class
    self._tool_message_class = tool_message_class
    self._instruct_request_class = instruct_request_class
    # this is unused but makes creation nicer
    self._system_message_class = system_message_class
    self._model_settings_builder = model_settings_builder

build_settings(request)

Build model settings from a chat completion request.

For pre-v15 normalizers, model settings are all None.

Parameters:

Name Type Description Default
request ChatCompletionRequest

The chat completion request whose settings are built.

required

Returns:

Type Description
ModelSettings

Returns ModelSettings.none().

Raises:

Type Description
InvalidRequestException

If a model settings builder is configured for a normalizer that does not support model settings.

Source code in src/mistral_common/protocol/instruct/normalize.py
def build_settings(self, request: ChatCompletionRequest) -> ModelSettings:
    r"""Build model settings from a chat completion request.

    For pre-v15 normalizers, model settings are all `None`.

    Args:
        request: The chat completion request whose settings are built.

    Returns:
        Returns `ModelSettings.none()`.

    Raises:
        InvalidRequestException: If a model settings builder is configured
            for a normalizer that does not support model settings.
    """
    if self._model_settings_builder is not None:
        raise InvalidRequestException(
            f"model_settings_builder should be None for {type(self).__name__}, got {self._model_settings_builder}"
        )
    return ModelSettings.none()

from_chat_completion_request(request)

Convert a chat completion request to an instruct request.

Aggregates system prompts into a single system_prompt string, merges consecutive same-role messages, and normalizes tool call arguments. Requires model settings to be empty for this normalizer version.

Parameters:

Name Type Description Default
request ChatCompletionRequest[UATS]

The chat completion request to convert.

required

Returns:

Type Description
InstructRequestType

The converted instruct request, ready for tokenization.

Raises:

Type Description
InvalidRequestException

If the request carries model settings that this normalizer version does not support.

Examples:

>>> from mistral_common.protocol.instruct.messages import UserMessage, AssistantMessage
>>> request = ChatCompletionRequest(
...     messages=[
...         UserMessage(content="Hello"),
...         AssistantMessage(content="Hi"),
...     ],
... )
>>> normalizer = InstructRequestNormalizer.normalizer()
>>> instruct_request = normalizer.from_chat_completion_request(request)
Source code in src/mistral_common/protocol/instruct/normalize.py
def from_chat_completion_request(self, request: ChatCompletionRequest[UATS]) -> InstructRequestType:
    r"""Convert a chat completion request to an instruct request.

    Aggregates system prompts into a single `system_prompt` string, merges
    consecutive same-role messages, and normalizes tool call arguments.
    Requires model settings to be empty for this normalizer version.

    Args:
        request: The chat completion request to convert.

    Returns:
        The converted instruct request, ready for tokenization.

    Raises:
        InvalidRequestException: If the request carries model settings that
            this normalizer version does not support.

    Examples:
        >>> from mistral_common.protocol.instruct.messages import UserMessage, AssistantMessage
        >>> request = ChatCompletionRequest(
        ...     messages=[
        ...         UserMessage(content="Hello"),
        ...         AssistantMessage(content="Hi"),
        ...     ],
        ... )
        >>> normalizer = InstructRequestNormalizer.normalizer()
        >>> instruct_request = normalizer.from_chat_completion_request(request)
    """
    system_prompt = self._aggregate_system_prompts(request.messages)
    messages = self._aggregate_messages(request.messages)

    settings = self.build_settings(request)
    if settings != ModelSettings.none():
        raise InvalidRequestException(f"Model settings are not supported for {type(self).__name__}, got {settings}")

    return self._build_instruct_request(
        messages=messages,
        system_prompt=system_prompt,
        request=request,
        settings=settings,
    )

normalizer(model_settings_builder=None) staticmethod

Return a normalizer for the default instruct request.

Parameters:

Name Type Description Default
model_settings_builder ModelSettingsBuilder | None

Must be None for this normalizer version.

None

Returns:

Type Description
InstructRequestNormalizer

A normalizer for the default instruct request.

Raises:

Type Description
ValueError

If model_settings_builder is not None.

Examples:

>>> normalizer = InstructRequestNormalizer.normalizer()
Source code in src/mistral_common/protocol/instruct/normalize.py
@staticmethod
def normalizer(model_settings_builder: ModelSettingsBuilder | None = None) -> "InstructRequestNormalizer":
    r"""Return a normalizer for the default instruct request.

    Args:
        model_settings_builder: Must be `None` for this normalizer version.

    Returns:
        A normalizer for the default instruct request.

    Raises:
        ValueError: If `model_settings_builder` is not `None`.

    Examples:
        >>> normalizer = InstructRequestNormalizer.normalizer()
    """
    if model_settings_builder is not None:
        raise ValueError(
            f"model_settings_builder must be None for InstructRequestNormalizer, got {model_settings_builder}"
        )
    return InstructRequestNormalizer(
        UserMessage, AssistantMessage, ToolMessage, SystemMessage, InstructRequest[UATS, Tool], None
    )

InstructRequestNormalizerV13(user_message_class, assistant_message_class, tool_message_class, system_message_class, instruct_request_class, model_settings_builder)

Bases: InstructRequestNormalizerV7[UserMessageType, AssistantMessageType, ToolMessageType, SystemMessageType, InstructRequestType]

Normalizer for the v13 tokenizer.

It reorders tool messages based on the tool call order.

Examples:

>>> normalizer = InstructRequestNormalizerV13.normalizer()
Source code in src/mistral_common/protocol/instruct/normalize.py
def __init__(
    self,
    user_message_class: type[UserMessageType],
    assistant_message_class: type[AssistantMessageType],
    tool_message_class: type[ToolMessageType],
    system_message_class: type[SystemMessageType],
    instruct_request_class: type[InstructRequestType],
    model_settings_builder: ModelSettingsBuilder | None,
):
    r"""Initialize the normalizer with the appropriate message classes.

    Prefer the normalizer() static methods over direct construction.

    Args:
       user_message_class: Class used to construct aggregated user messages.
       assistant_message_class: Class used to construct aggregated assistant messages.
       tool_message_class: Class used to construct aggregated tool messages.
       system_message_class: Class used to construct system messages. Currently
           unused, but kept for API symmetry.
       instruct_request_class: Class used to construct the final InstructRequest.
       model_settings_builder: Builder for model settings, or `None` if the
           tokenizer version does not support model settings.
    """
    self._user_message_class = user_message_class
    self._assistant_message_class = assistant_message_class
    self._tool_message_class = tool_message_class
    self._instruct_request_class = instruct_request_class
    # this is unused but makes creation nicer
    self._system_message_class = system_message_class
    self._model_settings_builder = model_settings_builder

normalizer(model_settings_builder=None) staticmethod

Return a normalizer for the default instruct request.

Parameters:

Name Type Description Default
model_settings_builder ModelSettingsBuilder | None

Must be None for this normalizer version.

None

Returns:

Type Description
InstructRequestNormalizerV13

A normalizer for the V13 instruct request.

Raises:

Type Description
ValueError

If model_settings_builder is not None.

Source code in src/mistral_common/protocol/instruct/normalize.py
@staticmethod
def normalizer(model_settings_builder: ModelSettingsBuilder | None = None) -> "InstructRequestNormalizerV13":
    r"""Return a normalizer for the default instruct request.

    Args:
        model_settings_builder: Must be `None` for this normalizer version.

    Returns:
        A normalizer for the V13 instruct request.

    Raises:
        ValueError: If `model_settings_builder` is not `None`.
    """
    if model_settings_builder is not None:
        raise ValueError(
            f"model_settings_builder must be None for InstructRequestNormalizerV13, got {model_settings_builder}"
        )
    return InstructRequestNormalizerV13(
        UserMessage, AssistantMessage, ToolMessage, SystemMessage, InstructRequest[UATS, Tool], None
    )

InstructRequestNormalizerV15(user_message_class, assistant_message_class, tool_message_class, system_message_class, instruct_request_class, model_settings_builder)

Bases: InstructRequestNormalizerV13[UserMessageType, AssistantMessageType, ToolMessageType, SystemMessageType, InstructRequestType]

Normalizer for the v15 tokenizer.

It reorders tool messages based on the tool call order and builds model settings.

Examples:

>>> normalizer = InstructRequestNormalizerV15.normalizer()
Source code in src/mistral_common/protocol/instruct/normalize.py
def __init__(
    self,
    user_message_class: type[UserMessageType],
    assistant_message_class: type[AssistantMessageType],
    tool_message_class: type[ToolMessageType],
    system_message_class: type[SystemMessageType],
    instruct_request_class: type[InstructRequestType],
    model_settings_builder: ModelSettingsBuilder | None,
):
    r"""Initialize the normalizer with the appropriate message classes.

    Prefer the normalizer() static methods over direct construction.

    Args:
       user_message_class: Class used to construct aggregated user messages.
       assistant_message_class: Class used to construct aggregated assistant messages.
       tool_message_class: Class used to construct aggregated tool messages.
       system_message_class: Class used to construct system messages. Currently
           unused, but kept for API symmetry.
       instruct_request_class: Class used to construct the final InstructRequest.
       model_settings_builder: Builder for model settings, or `None` if the
           tokenizer version does not support model settings.
    """
    self._user_message_class = user_message_class
    self._assistant_message_class = assistant_message_class
    self._tool_message_class = tool_message_class
    self._instruct_request_class = instruct_request_class
    # this is unused but makes creation nicer
    self._system_message_class = system_message_class
    self._model_settings_builder = model_settings_builder

build_settings(request)

Build model settings using the configured model settings builder.

Parameters:

Name Type Description Default
request ChatCompletionRequest

The chat completion request.

required

Returns:

Type Description
ModelSettings

The built model settings.

Raises:

Type Description
InvalidRequestException

If no model settings builder is configured.

Source code in src/mistral_common/protocol/instruct/normalize.py
def build_settings(self, request: ChatCompletionRequest) -> ModelSettings:
    r"""Build model settings using the configured model settings builder.

    Args:
        request: The chat completion request.

    Returns:
        The built model settings.

    Raises:
        InvalidRequestException: If no model settings builder is configured.
    """
    if self._model_settings_builder is None:
        raise InvalidRequestException(f"model_settings_builder must not be None for {type(self).__name__}")
    return self._model_settings_builder.build_settings(request)

from_chat_completion_request(request)

Converts a chat completion request to an instruct request.

Parameters:

Name Type Description Default
request ChatCompletionRequest[UATS]

The chat completion request to convert.

required

Returns:

Type Description
InstructRequestType

The converted instruct request.

Source code in src/mistral_common/protocol/instruct/normalize.py
def from_chat_completion_request(self, request: ChatCompletionRequest[UATS]) -> InstructRequestType:
    r"""Converts a chat completion request to an instruct request.

    Args:
        request: The chat completion request to convert.

    Returns:
        The converted instruct request.
    """
    messages = self._aggregate_messages(request.messages)
    settings = self.build_settings(request)
    return self._build_instruct_request(
        messages=messages,
        system_prompt=None,
        request=request,
        settings=settings,
    )

normalizer(model_settings_builder=None) staticmethod

Return a normalizer for the V15 instruct request.

Parameters:

Name Type Description Default
model_settings_builder ModelSettingsBuilder | None

The builder for model settings.

None

Returns:

Type Description
InstructRequestNormalizerV15

A normalizer for the V15 instruct request.

Source code in src/mistral_common/protocol/instruct/normalize.py
@staticmethod
def normalizer(model_settings_builder: ModelSettingsBuilder | None = None) -> "InstructRequestNormalizerV15":
    r"""Return a normalizer for the V15 instruct request.

    Args:
        model_settings_builder: The builder for model settings.

    Returns:
        A normalizer for the V15 instruct request.
    """
    return InstructRequestNormalizerV15(
        UserMessage,
        AssistantMessage,
        ToolMessage,
        SystemMessage,
        InstructRequest,
        model_settings_builder,
    )

InstructRequestNormalizerV7(user_message_class, assistant_message_class, tool_message_class, system_message_class, instruct_request_class, model_settings_builder)

Bases: InstructRequestNormalizer[UserMessageType, AssistantMessageType, ToolMessageType, SystemMessageType, InstructRequestType]

Normalizer for the v7 tokenizer.

Examples:

>>> normalizer = InstructRequestNormalizerV7.normalizer()
Source code in src/mistral_common/protocol/instruct/normalize.py
def __init__(
    self,
    user_message_class: type[UserMessageType],
    assistant_message_class: type[AssistantMessageType],
    tool_message_class: type[ToolMessageType],
    system_message_class: type[SystemMessageType],
    instruct_request_class: type[InstructRequestType],
    model_settings_builder: ModelSettingsBuilder | None,
):
    r"""Initialize the normalizer with the appropriate message classes.

    Prefer the normalizer() static methods over direct construction.

    Args:
       user_message_class: Class used to construct aggregated user messages.
       assistant_message_class: Class used to construct aggregated assistant messages.
       tool_message_class: Class used to construct aggregated tool messages.
       system_message_class: Class used to construct system messages. Currently
           unused, but kept for API symmetry.
       instruct_request_class: Class used to construct the final InstructRequest.
       model_settings_builder: Builder for model settings, or `None` if the
           tokenizer version does not support model settings.
    """
    self._user_message_class = user_message_class
    self._assistant_message_class = assistant_message_class
    self._tool_message_class = tool_message_class
    self._instruct_request_class = instruct_request_class
    # this is unused but makes creation nicer
    self._system_message_class = system_message_class
    self._model_settings_builder = model_settings_builder

from_chat_completion_request(request)

Converts a chat completion request to an instruct request.

Parameters:

Name Type Description Default
request ChatCompletionRequest[UATS]

The chat completion request to convert.

required

Returns:

Type Description
InstructRequestType

The converted instruct request.

Examples:

>>> from mistral_common.protocol.instruct.messages import UserMessage, AssistantMessage
>>> request = ChatCompletionRequest(
...     messages=[
...         UserMessage(content="Hello"),
...         AssistantMessage(content="Hi"),
...     ],
... )
>>> normalizer = InstructRequestNormalizerV7.normalizer()
>>> instruct_request = normalizer.from_chat_completion_request(request)
Source code in src/mistral_common/protocol/instruct/normalize.py
def from_chat_completion_request(self, request: ChatCompletionRequest[UATS]) -> InstructRequestType:
    r"""Converts a chat completion request to an instruct request.

    Args:
        request: The chat completion request to convert.

    Returns:
        The converted instruct request.

    Examples:
        >>> from mistral_common.protocol.instruct.messages import UserMessage, AssistantMessage
        >>> request = ChatCompletionRequest(
        ...     messages=[
        ...         UserMessage(content="Hello"),
        ...         AssistantMessage(content="Hi"),
        ...     ],
        ... )
        >>> normalizer = InstructRequestNormalizerV7.normalizer()
        >>> instruct_request = normalizer.from_chat_completion_request(request)
    """
    messages = self._aggregate_messages(request.messages)
    settings = self.build_settings(request)
    if settings != ModelSettings.none():
        raise InvalidRequestException(f"Model settings are not supported for {type(self).__name__}, got {settings}")
    return self._build_instruct_request(
        messages=messages,
        system_prompt=None,
        request=request,
        settings=settings,
    )

normalizer(model_settings_builder=None) staticmethod

Return a normalizer for the default instruct request.

Parameters:

Name Type Description Default
model_settings_builder ModelSettingsBuilder | None

Must be None for this normalizer version.

None

Returns:

Type Description
InstructRequestNormalizerV7

A normalizer for the V7 instruct request.

Raises:

Type Description
ValueError

If model_settings_builder is not None.

Examples:

>>> normalizer = InstructRequestNormalizerV7.normalizer()
Source code in src/mistral_common/protocol/instruct/normalize.py
@staticmethod
def normalizer(model_settings_builder: ModelSettingsBuilder | None = None) -> "InstructRequestNormalizerV7":
    r"""Return a normalizer for the default instruct request.

    Args:
        model_settings_builder: Must be `None` for this normalizer version.

    Returns:
        A normalizer for the V7 instruct request.

    Raises:
        ValueError: If `model_settings_builder` is not `None`.

    Examples:
        >>> normalizer = InstructRequestNormalizerV7.normalizer()
    """
    if model_settings_builder is not None:
        raise ValueError(
            f"model_settings_builder must be None for InstructRequestNormalizerV7, got {model_settings_builder}"
        )
    return InstructRequestNormalizerV7(
        UserMessage, AssistantMessage, ToolMessage, SystemMessage, InstructRequest[UATS, Tool], None
    )

get_normalizer(version, model_settings_builder=None)

Get the appropriate normalizer for the given tokenizer version.

Parameters:

Name Type Description Default
version TokenizerVersion

The tokenizer version to get the normalizer for.

required
model_settings_builder ModelSettingsBuilder | None

The builder for model settings, or None if the tokenizer version does not support model settings (pre-v15).

None

Returns:

Type Description
InstructRequestNormalizer

The appropriate normalizer for the given tokenizer version.

Raises:

Type Description
ValueError

If model_settings_builder is not None but the version's normalizer does not support it.

Examples:

>>> normalizer = get_normalizer(TokenizerVersion.v1)
Source code in src/mistral_common/protocol/instruct/normalize.py
def get_normalizer(
    version: TokenizerVersion, model_settings_builder: ModelSettingsBuilder | None = None
) -> InstructRequestNormalizer:
    r"""Get the appropriate normalizer for the given tokenizer version.

    Args:
        version: The tokenizer version to get the normalizer for.
        model_settings_builder: The builder for model settings, or `None` if the
            tokenizer version does not support model settings (pre-v15).

    Returns:
        The appropriate normalizer for the given tokenizer version.

    Raises:
        ValueError: If `model_settings_builder` is not `None` but the version's
            normalizer does not support it.

    Examples:
        >>> normalizer = get_normalizer(TokenizerVersion.v1)
    """
    match version:
        case TokenizerVersion.v1 | TokenizerVersion.v2 | TokenizerVersion.v3:
            normalizer_cls = InstructRequestNormalizer
        case TokenizerVersion.v7:
            normalizer_cls = InstructRequestNormalizerV7
        case TokenizerVersion.v11 | TokenizerVersion.v13:
            normalizer_cls = InstructRequestNormalizerV13
        case TokenizerVersion.v15:
            normalizer_cls = InstructRequestNormalizerV15
        case _:
            assert_never(version)

    return normalizer_cls.normalizer(model_settings_builder=model_settings_builder)