Skip to content

mistral_common.tokens.tokenizers.instruct

InstructTokenizerBase(tokenizer, image_encoder=None, audio_encoder=None)

Bases: InstructTokenizer, Generic[InstructRequestType, FIMRequestType, TokenizedType]

Base instruct tokenizer implementing version-independent encoding.

Concrete versioned tokenizers (V1, V2, ...) inherit from this class and implement the version-specific message encodings.

Parameters:

Name Type Description Default
tokenizer Tokenizer

The text tokenizer to use.

required
image_encoder ImageEncoder | None

The image encoder to use, or None if image support is not configured.

None
audio_encoder AudioEncoder | None

The audio encoder to use, or None if audio support is not configured.

None
Source code in src/mistral_common/tokens/tokenizers/instruct.py
def __init__(
    self,
    tokenizer: Tokenizer,
    image_encoder: ImageEncoder | None = None,
    audio_encoder: AudioEncoder | None = None,
):
    r"""Initialize the instruct tokenizer.

    Args:
        tokenizer: The text tokenizer to use.
        image_encoder: The image encoder to use, or `None` if image support is
            not configured.
        audio_encoder: The audio encoder to use, or `None` if audio support is
            not configured.
    """
    self.tokenizer = tokenizer
    self.image_encoder = image_encoder
    self.audio_encoder = audio_encoder
    super().__init__(tokenizer, image_encoder, audio_encoder)

mm_encoder property

Deprecated alias for image_encoder.

Returns:

Type Description
ImageEncoder | None

The image encoder, or None if image support is not configured.

decode(tokens, special_token_policy=SpecialTokenPolicy.IGNORE)

Decode tokens to a string.

Parameters:

Name Type Description Default
tokens list[int]

The token IDs to decode.

required
special_token_policy SpecialTokenPolicy

The policy to use for special tokens (IGNORE, KEEP, or RAISE).

IGNORE

Returns:

Type Description
str

The decoded string.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def decode(self, tokens: list[int], special_token_policy: SpecialTokenPolicy = SpecialTokenPolicy.IGNORE) -> str:
    r"""Decode tokens to a string.

    Args:
        tokens: The token IDs to decode.
        special_token_policy: The policy to use for special tokens
            (IGNORE, KEEP, or RAISE).

    Returns:
        The decoded string.
    """
    return self.tokenizer.decode(tokens, special_token_policy=special_token_policy)

encode_assistant_message(message, is_before_last_user_message) abstractmethod

Encode an assistant message.

Parameters:

Name Type Description Default
message AssistantMessage

The assistant message to encode.

required
is_before_last_user_message bool

True if this message comes before the last user message of the conversation.

required

Returns:

Type Description
list[int]

The encoded token IDs for this message.

Raises:

Type Description
NotImplementedError

The assistant message is not implemented for the base tokenizer.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
@abstractmethod
def encode_assistant_message(self, message: AssistantMessage, is_before_last_user_message: bool) -> list[int]:
    r"""Encode an assistant message.

    Args:
        message: The assistant message to encode.
        is_before_last_user_message: `True` if this message comes before the
            last user message of the conversation.

    Returns:
        The encoded token IDs for this message.

    Raises:
        NotImplementedError: The assistant message is not implemented for the base tokenizer.
    """
    raise NotImplementedError("Assistant message not implemented")

encode_instruct(request)

Encode an instruct request.

Walks the message list, encoding each message with its version-specific encoder, and aggregates the resulting tokens, images, and audio into a single Tokenized object. Applies truncation when request.truncate_at_max_tokens is set.

Parameters:

Name Type Description Default
request InstructRequest[ChatMessage, Tool]

The request to encode.

required

Returns:

Type Description
Tokenized

The tokenized request, with all images and audio collected across

Tokenized

the messages.

Raises:

Type Description
TokenizerException

If a message has an unknown type.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_instruct(
    self,
    request: InstructRequest[ChatMessage, Tool],
) -> Tokenized:
    r"""Encode an instruct request.

    Walks the message list, encoding each message with its version-specific
    encoder, and aggregates the resulting tokens, images, and audio into a
    single Tokenized object. Applies truncation when
    `request.truncate_at_max_tokens` is set.

    Args:
        request: The request to encode.

    Returns:
        The tokenized request, with all images and audio collected across
        the messages.

    Raises:
        TokenizerException: If a message has an unknown type.
    """
    # init at bos
    images: list[np.ndarray] = []
    audios: list[Audio] = []
    prefix_ids: list[int] | None = None
    tokens_list: list[list[int] | None] = []

    # validate messages
    self.validate_messages(request.messages)

    # find last user message
    first_user_idx, last_user_idx = self.find_first_last_user(request)
    for msg_idx, msg in enumerate(request.messages):
        if isinstance(msg, UserMessage):
            new_tokens, new_images, new_audios = self.encode_user_message(
                msg,
                request.available_tools,
                msg_idx == last_user_idx,
                msg_idx == first_user_idx,
                system_prompt=request.system_prompt,
                force_img_first=True,  # img is always first when providing text/img chunk pair
                settings=request.settings,
            )
            images.extend(new_images)
            audios.extend(new_audios)
        elif isinstance(msg, ToolMessage):
            new_tokens, new_images, new_audios = self.encode_tool_message(msg, msg_idx < last_user_idx)
            images.extend(new_images)
            audios.extend(new_audios)
        elif isinstance(msg, AssistantMessage):
            new_tokens = self.encode_assistant_message(
                message=msg, is_before_last_user_message=msg_idx < last_user_idx
            )
            if msg.prefix:
                assert msg_idx == len(request.messages) - 1
                prefix_ids = new_tokens
        elif isinstance(msg, SystemMessage):
            new_tokens, new_audios = self.encode_system_message(msg)
            audios.extend(new_audios)
        else:
            raise TokenizerException(f"Unknown message type {type(msg)}")

        tokens_list.append(new_tokens)

    if request.truncate_at_max_tokens is not None:
        self._truncate_for_max_tokens(
            tokens_list,
            request.messages,
            request.truncate_at_max_tokens,
            last_user_idx,
        )
    tokens = self.start()

    for tok in tokens_list:
        if tok is not None:
            tokens.extend(tok)

    tokenized = Tokenized(
        tokens=tokens,
        prefix_ids=prefix_ids,
        images=images,
        audios=audios,
    )
    # TODO: remove once 1.13.0 lands.
    tokenized._text = self.decode(tokens=tokens, special_token_policy=SpecialTokenPolicy.KEEP)
    return tokenized

encode_think(chunk) abstractmethod

Encode a think chunk.

Parameters:

Name Type Description Default
chunk ThinkChunk

The think chunk to encode.

required

Returns:

Type Description
list[int]

The encoded token IDs for this chunk.

Raises:

Type Description
NotImplementedError

The think chunk is not implemented for the base tokenizer.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
@abstractmethod
def encode_think(self, chunk: ThinkChunk) -> list[int]:
    r"""Encode a think chunk.

    Args:
        chunk: The think chunk to encode.

    Returns:
        The encoded token IDs for this chunk.

    Raises:
        NotImplementedError: The think chunk is not implemented for the base tokenizer.
    """
    raise NotImplementedError("Think chunk not implemented")

encode_tool_message(message, is_before_last_user_message) abstractmethod

Encode a tool message.

Parameters:

Name Type Description Default
message ToolMessage

The tool message to encode.

required
is_before_last_user_message bool

True if this message comes before the last user message of the conversation.

required

Returns:

Type Description
A tuple of (tokens, images, audios

the encoded token IDs, images,

list[ndarray]

and audio for this message.

Raises:

Type Description
NotImplementedError

The tool message is not implemented for the base tokenizer.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
@abstractmethod
def encode_tool_message(
    self, message: ToolMessage, is_before_last_user_message: bool
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a tool message.

    Args:
        message: The tool message to encode.
        is_before_last_user_message: `True` if this message comes before the
            last user message of the conversation.

    Returns:
        A tuple of (tokens, images, audios): the encoded token IDs, images,
        and audio for this message.

    Raises:
        NotImplementedError: The tool message is not implemented for the base tokenizer.
    """
    raise NotImplementedError("Tool message not implemented")

find_first_last_user(request) staticmethod

Find the first and last user message in the request.

Parameters:

Name Type Description Default
request InstructRequest

The request to search for user messages.

required

Returns:

Type Description
int

A tuple of (first_user_idx, last_user_idx), the message indexes of

int

the first and last UserMessage. Both are -1 if the request has no

tuple[int, int]

user messages.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
@staticmethod
def find_first_last_user(request: InstructRequest) -> tuple[int, int]:
    r"""Find the first and last user message in the request.

    Args:
        request: The request to search for user messages.

    Returns:
        A tuple of (`first_user_idx`, `last_user_idx`), the message indexes of
        the first and last UserMessage. Both are -1 if the request has no
        user messages.
    """
    last_user_idx = -1
    first_user_idx = -1
    for i, msg in list(enumerate(request.messages)):
        if isinstance(msg, UserMessage):
            if first_user_idx == -1:
                first_user_idx = i
            last_user_idx = i
    return first_user_idx, last_user_idx

start()

Return the start tokens of every encoded request.

Returns:

Type Description
list[int]

The token IDs prepended to every encoded conversation (the BOS token).

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def start(self) -> list[int]:
    r"""Return the start tokens of every encoded request.

    Returns:
        The token IDs prepended to every encoded conversation (the BOS token).
    """
    return [self.tokenizer.bos_id]

validate_messages(messages) classmethod

Validate messages before tokenization.

No-op for this tokenizer version; message validation starts at v7.

Parameters:

Name Type Description Default
messages list[UATS]

The messages that were validated.

required
Source code in src/mistral_common/tokens/tokenizers/instruct.py
@classmethod
def validate_messages(cls, messages: list[UATS]) -> None:
    r"""Validate messages before tokenization.

    No-op for this tokenizer version; message validation starts at v7.

    Args:
        messages: The messages that were validated.
    """
    # We start validating messages for v7
    return

InstructTokenizerV1(tokenizer, image_encoder=None, audio_encoder=None)

Bases: InstructTokenizerBase, Generic[InstructRequestType, FIMRequestType, TokenizedType]

Instruct tokenizer V1.

Basic message encoding wrapping content in [INST]/[/INST] markers. Does not support tools, images, audio, FIM, or system messages as separate messages (the system prompt is merged into the first user message).

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def __init__(
    self,
    tokenizer: Tokenizer,
    image_encoder: ImageEncoder | None = None,
    audio_encoder: AudioEncoder | None = None,
):
    r"""Initialize the instruct tokenizer.

    Args:
        tokenizer: The text tokenizer to use.
        image_encoder: The image encoder to use, or `None` if image support is
            not configured.
        audio_encoder: The audio encoder to use, or `None` if audio support is
            not configured.
    """
    self.tokenizer = tokenizer
    self.image_encoder = image_encoder
    self.audio_encoder = audio_encoder
    super().__init__(tokenizer, image_encoder, audio_encoder)

encode_assistant_message(message, is_before_last_user_message)

Encode an assistant message.

Parameters:

Name Type Description Default
message AssistantMessage

The message to encode.

required
is_before_last_user_message bool

Not used.

required

Returns: The encoded tokens.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_assistant_message(self, message: AssistantMessage, is_before_last_user_message: bool) -> list[int]:
    r"""Encode an assistant message.

    Args:
        message: The message to encode.
        is_before_last_user_message: Not used.
    Returns:
        The encoded tokens.
    """
    assert isinstance(message, AssistantMessage), message
    if message.tool_calls is not None and len(message.tool_calls) > 0:
        raise TokenizerException("Tools not implemented for tokenizer V1")
    elif message.content:
        assert isinstance(message.content, str), "Message content must be a string for tokenizer < V13"
        curr_tokens = self.tokenizer.encode(message.content, bos=False, eos=False)
    else:
        raise TokenizerException(f"{message.content} // {message.tool_calls}")
    if not message.prefix:
        curr_tokens.append(self.tokenizer.eos_id)
    return curr_tokens

encode_fim(request)

Encode a FIM request.

Raises:

Type Description
TokenizerException

The FIM request is not implemented for this version.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_fim(self, request: FIMRequest) -> Tokenized:
    r"""Encode a FIM request.

    Raises:
       TokenizerException: The FIM request is not implemented for this version.
    """
    raise TokenizerException(f"FIM not available for {self.tokenizer.version}")

encode_speech_request(request)

Encode a speech synthesis request.

Raises:

Type Description
TokenizerException

Always; speech requests are not supported by this version.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_speech_request(self, request: SpeechRequest) -> Tokenized:
    r"""Encode a speech synthesis request.

    Raises:
        TokenizerException: Always; speech requests are not supported by this version.
    """
    raise TokenizerException(f"Speech request not available for tokenizer {self.tokenizer.version.value}")

encode_system_message(message)

Encode a system message.

Raises:

Type Description
NotImplementedError

Always; system messages are not supported by this version.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_system_message(self, message: SystemMessage) -> tuple[list[int], list[Audio]]:
    r"""Encode a system message.

    Raises:
        NotImplementedError: Always; system messages are not supported by this version.
    """
    raise NotImplementedError(f"System message encoding not implemented for {self.__class__.__name__}")

encode_think(chunk)

Encode a think chunk.

Raises:

Type Description
TokenizerException

The think chunk is not implemented for this version.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_think(self, chunk: ThinkChunk) -> list[int]:
    r"""Encode a think chunk.

    Raises:
        TokenizerException: The think chunk is not implemented for this version.
    """
    raise TokenizerException("Think not implemented for tokenizer < V13.")

encode_tool_message(message, is_before_last_user_message)

Encode a tool message.

Raises:

Type Description
TokenizerException

The tool message is not implemented for this version.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_tool_message(
    self, message: ToolMessage, is_before_last_user_message: bool
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a tool message.

    Raises:
        TokenizerException: The tool message is not implemented for this version.
    """
    raise TokenizerException("Tools not implemented for tokenizer V1")

encode_transcription(request)

Encode a transcription request.

Raises:

Type Description
TokenizerException

Always; transcription is not supported by this version.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_transcription(self, request: TranscriptionRequest) -> Tokenized:
    r"""Encode a transcription request.

    Raises:
        TokenizerException: Always; transcription is not supported by this version.
    """
    raise TokenizerException(f"Transcription not available for {self.tokenizer.version}")

encode_user_content(content, is_last, system_prompt=None, force_img_first=False)

Encode a user content.

Parameters:

Name Type Description Default
content str | list[ContentChunk]

The content to encode.

required
is_last bool

Whether the message is the last one.

required
system_prompt str | None

The system prompt.

None
force_img_first bool

Not used.

False

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens and empty list.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_user_content(
    self,
    content: str | list[ContentChunk],
    is_last: bool,
    system_prompt: str | None = None,
    force_img_first: bool = False,
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a user content.

    Args:
        content: The content to encode.
        is_last: Whether the message is the last one.
        system_prompt: The system prompt.
        force_img_first: Not used.

    Returns:
        The encoded tokens and empty list.
    """
    assert isinstance(content, str)

    if is_last and system_prompt:
        content = system_prompt + "\n\n" + content

    tokens = self.tokenizer.encode(content, bos=False, eos=False)
    return tokens, [], []

encode_user_message(message, available_tools, is_last, is_first, system_prompt=None, force_img_first=False, settings=ModelSettings.none())

Encode a user message.

Parameters:

Name Type Description Default
message UserMessage

The message to encode.

required
available_tools list[Tool] | None

Not used.

required
is_last bool

Not used.

required
is_first bool

Whether the message is the first one.

required
system_prompt str | None

The system prompt.

None
force_img_first bool

Not used.

False
settings ModelSettings

Not used.

none()

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens and empty list.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_user_message(
    self,
    message: UserMessage,
    available_tools: list[Tool] | None,
    is_last: bool,
    is_first: bool,
    system_prompt: str | None = None,
    force_img_first: bool = False,
    settings: ModelSettings = ModelSettings.none(),
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a user message.

    Args:
        message: The message to encode.
        available_tools: Not used.
        is_last: Not used.
        is_first: Whether the message is the first one.
        system_prompt: The system prompt.
        force_img_first: Not used.
        settings: Not used.

    Returns:
        The encoded tokens and empty list.
    """
    assert isinstance(message.content, str), "Message content must be normalized"
    assert self.image_encoder is None, "InstructTokenizerV1 cannot encode images"

    content = ""
    if is_first and system_prompt:
        content = system_prompt + "\n\n" + message.content
    else:
        content = message.content

    message_txt = f"[INST] {content} [/INST]"
    curr_tokens, image, audio = self.encode_user_content(content=message_txt, is_last=False, system_prompt=None)
    return curr_tokens, image, audio

InstructTokenizerV11(tokenizer, image_encoder=None, audio_encoder=None)

Bases: InstructTokenizerV7

Instruct tokenizer V11.

The difference with V7 tokenizer is that it encodes tool calls differently: Tool call results are encoded as : - [begin tool call] call_name_tokens [call id] call_id_tokens [args] content tokens

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def __init__(
    self,
    tokenizer: Tokenizer,
    image_encoder: ImageEncoder | None = None,
    audio_encoder: AudioEncoder | None = None,
) -> None:
    super().__init__(tokenizer, image_encoder, audio_encoder)
    self.ARGS = self.tokenizer.get_special_token(SpecialTokens.args.value)
    self.CALL_ID = self.tokenizer.get_special_token(SpecialTokens.call_id.value)

InstructTokenizerV13(tokenizer, image_encoder=None, audio_encoder=None)

Bases: InstructTokenizerV11

Instruct tokenizer V13.

The difference with V11 tokenizer is that it encodes tool calls differently
  • available tools are tokenized at the first user message.
  • call id is no longer tokenized for tool calls or results.
Source code in src/mistral_common/tokens/tokenizers/instruct.py
def __init__(
    self,
    tokenizer: Tokenizer,
    image_encoder: ImageEncoder | None = None,
    audio_encoder: AudioEncoder | None = None,
) -> None:
    super().__init__(tokenizer, image_encoder, audio_encoder)
    assert isinstance(tokenizer, Tekkenizer), f"Tokenizer must be a Tekkenizer. Got {type(tokenizer)}"
    if (
        SpecialTokens.begin_think.value in tokenizer._special_tokens_reverse_vocab
        and SpecialTokens.end_think.value in tokenizer._special_tokens_reverse_vocab
    ):
        self.BEGIN_THINK: int | None = tokenizer.get_special_token(SpecialTokens.begin_think.value)
        self.END_THINK: int | None = tokenizer.get_special_token(SpecialTokens.end_think.value)
    else:
        self.BEGIN_THINK = None
        self.END_THINK = None

encode_think(chunk)

Encode a thinking chunk.

Parameters:

Name Type Description Default
chunk ThinkChunk

The thinking chunk to encode.

required

Returns: The encoded tokens.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_think(self, chunk: ThinkChunk) -> list[int]:
    r"""Encode a thinking chunk.

    Args:
        chunk: The thinking chunk to encode.
    Returns:
        The encoded tokens.
    """
    assert self.BEGIN_THINK is not None, "think tokens are not available for this tokenizer."
    assert self.END_THINK is not None, "think tokens are not available for this tokenizer."
    tokens = self.tokenizer.encode(chunk.thinking, bos=False, eos=False)
    think_tokens = [self.BEGIN_THINK, *tokens]
    if chunk.closed:
        think_tokens.append(self.END_THINK)
    return think_tokens

encode_tool_message(message, is_before_last_user_message)

Encode a tool message.

Parameters:

Name Type Description Default
message ToolMessage

The message to encode.

required
is_before_last_user_message bool

Not used.

required

Returns: The encoded tokens, images, and audios.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_tool_message(
    self, message: ToolMessage, is_before_last_user_message: bool
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a tool message.

    Args:
        message: The message to encode.
        is_before_last_user_message: Not used.
    Returns:
        The encoded tokens, images, and audios.
    """
    assert message.tool_call_id is not None, "Tool call id must be provided for tokenizer >= v13"

    if isinstance(message.content, str):
        content_tokens = self.tokenizer.encode(message.content, bos=False, eos=False)
        images: list[np.ndarray] = []
        audios: list[Audio] = []
    else:
        content_tokens, images, audios = self._encode_content_chunks(message.content)

    curr_tokens = [
        self.BEGIN_TOOL_RESULTS,
        *content_tokens,
        self.END_TOOL_RESULTS,
    ]
    return curr_tokens, images, audios

validate_messages(messages) classmethod

Validate messages before tokenization.

No-op: unlike v7, this version allows system prompts and audio chunks to coexist.

Parameters:

Name Type Description Default
messages list[UATS]

The messages that were validated.

required
Source code in src/mistral_common/tokens/tokenizers/instruct.py
@classmethod
def validate_messages(cls, messages: list[UATS]) -> None:
    r"""Validate messages before tokenization.

    No-op: unlike v7, this version allows system prompts and audio chunks
    to coexist.

    Args:
        messages: The messages that were validated.
    """
    return

InstructTokenizerV15(tokenizer, image_encoder=None, audio_encoder=None)

Bases: InstructTokenizerV13

Instruct tokenizer V15.

Extends V13 with model settings encoding. Inherits V13's tool call behavior (no call ID in tool calls/results, first-position tools, think support).

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def __init__(
    self,
    tokenizer: Tokenizer,
    image_encoder: ImageEncoder | None = None,
    audio_encoder: AudioEncoder | None = None,
) -> None:
    super().__init__(tokenizer, image_encoder=image_encoder, audio_encoder=audio_encoder)
    self.BEGIN_MODEL_SETTINGS = self.tokenizer.get_special_token(SpecialTokens.begin_model_settings.value)
    self.END_MODEL_SETTINGS = self.tokenizer.get_special_token(SpecialTokens.end_model_settings.value)

encode_system_message(message)

Encode a system message, rejecting ThinkChunk content.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_system_message(self, message: SystemMessage) -> tuple[list[int], list[Audio]]:
    r"""Encode a system message, rejecting ThinkChunk content."""
    if isinstance(message.content, list):
        if any(isinstance(chunk, ThinkChunk) for chunk in message.content):
            raise TokenizerException("ThinkChunk in system message is not supported for this model")
    return super().encode_system_message(message)

InstructTokenizerV2(tokenizer, image_encoder=None, audio_encoder=None)

Bases: InstructTokenizerV1, Generic[InstructRequestType, FIMRequestType, TokenizedType]

Instruct tokenizer V2.

Adds support for images, tools, and FIM requests on top of V1. Tool definitions are encoded in the last user message.

Parameters:

Name Type Description Default
tokenizer Tokenizer

The tokenizer to use.

required
image_encoder ImageEncoder | None

The image encoder to use.

None
audio_encoder AudioEncoder | None

The audio encoder to use.

None
Source code in src/mistral_common/tokens/tokenizers/instruct.py
def __init__(
    self,
    tokenizer: Tokenizer,
    image_encoder: ImageEncoder | None = None,
    audio_encoder: AudioEncoder | None = None,
):
    r"""Initialize the tokenizer.

    Args:
        tokenizer: The tokenizer to use.
        image_encoder: The image encoder to use.
        audio_encoder: The audio encoder to use.
    """
    super().__init__(tokenizer, image_encoder, audio_encoder)
    self.BEGIN_INST = self.tokenizer.get_special_token(SpecialTokens.begin_inst.value)
    self.END_INST = self.tokenizer.get_special_token(SpecialTokens.end_inst.value)
    self.BEGIN_AVAILABLE_TOOLS = self.tokenizer.get_special_token(SpecialTokens.begin_tools.value)
    self.END_AVAILABLE_TOOLS = self.tokenizer.get_special_token(SpecialTokens.end_tools.value)
    self.BEGIN_TOOL_RESULTS = self.tokenizer.get_special_token(SpecialTokens.begin_tool_results.value)
    self.END_TOOL_RESULTS = self.tokenizer.get_special_token(SpecialTokens.end_tool_results.value)
    self.TOOL_CALLS = self.tokenizer.get_special_token(SpecialTokens.tool_calls.value)
    self.BOS = self.tokenizer.get_special_token(SpecialTokens.bos.value)
    self.PREFIX = self.tokenizer.get_special_token(SpecialTokens.prefix.value)
    self.SUFFIX = self.tokenizer.get_special_token(SpecialTokens.suffix.value)

encode_assistant_message(message, is_before_last_user_message)

Encode an assistant message.

Parameters:

Name Type Description Default
message AssistantMessage

The message to encode.

required
is_before_last_user_message bool

Whether the message is before the last user message. If has tools and true, the message is not encoded.

required

Returns: The encoded tokens.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_assistant_message(self, message: AssistantMessage, is_before_last_user_message: bool) -> list[int]:
    r"""Encode an assistant message.

    Args:
        message: The message to encode.
        is_before_last_user_message: Whether the message is before the last user message. If has tools and true, the
            message is not encoded.
    Returns:
        The encoded tokens.
    """
    if message.tool_calls and message.content:
        raise ValueError(f"Cannot have tool calls and content defined in the same assistant message {message}")
    if message.tool_calls:
        if is_before_last_user_message:
            # don't tokenize tool call before last user message
            return []
        curr_tokens = self._encode_tool_calls_in_assistant_message(message)
    elif message.content:
        assert isinstance(message.content, str), "Message content must be a string for tokenizer < V7"
        curr_tokens = self._encode_normal_content_assistant_message(message)
    else:
        raise TokenizerException(f"Invalid assistant message: {message.content}")
    if not message.prefix:
        curr_tokens.append(self.tokenizer.eos_id)
    return curr_tokens

encode_fim(request)

Encode a FIM request.

Parameters:

Name Type Description Default
request FIMRequest

The request to encode.

required

Returns:

Type Description
Tokenized

The encoded tokens.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_fim(self, request: FIMRequest) -> Tokenized:
    r"""Encode a FIM request.

    Args:
        request: The request to encode.

    Returns:
        The encoded tokens.
    """
    prefix_tokens = self.tokenizer.encode(request.prompt, bos=False, eos=False)
    suffix_tokens = self._encode_infilling(request.suffix) if request.suffix else []
    tokens = [
        self.BOS,
        self.SUFFIX,
        *suffix_tokens,
        self.PREFIX,
        *prefix_tokens,
    ]
    tokenized = Tokenized(tokens=tokens)
    # TODO: remove once 1.13.0 lands.
    tokenized._text = self.decode(tokens=tokens, special_token_policy=SpecialTokenPolicy.KEEP)
    return tokenized

encode_instruct(request)

Encode a request after validating tool-result limitations.

Parameters:

Name Type Description Default
request InstructRequest[ChatMessage, Tool]

The instruct request to encode.

required

Returns:

Type Description
Tokenized

The tokenized request.

Raises:

Type Description
UnsupportedTokenizerFeatureException

If an assistant turn has multiple tool results.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_instruct(self, request: InstructRequest[ChatMessage, Tool]) -> Tokenized:
    r"""Encode a request after validating tool-result limitations.

    Args:
        request: The instruct request to encode.

    Returns:
        The tokenized request.

    Raises:
        UnsupportedTokenizerFeatureException: If an assistant turn has
            multiple tool results.
    """
    self._validate_tool_results(request=request)
    return super().encode_instruct(request)

encode_tool_message(message, is_before_last_user_message)

Encode a tool message.

Parameters:

Name Type Description Default
message ToolMessage

The message to encode.

required
is_before_last_user_message bool

Whether the message is before the last user message. If true, the message is not encoded.

required

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens, images, and audios.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_tool_message(
    self, message: ToolMessage, is_before_last_user_message: bool
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a tool message.

    Args:
        message: The message to encode.
        is_before_last_user_message: Whether the message is before the last user message. If true, the message is
            not encoded.

    Returns:
        The encoded tokens, images, and audios.
    """
    if is_before_last_user_message:
        # don't tokenize last tool response before last user msg
        return [], [], []

    # Currently only supports single tool results
    tool_result_str = json.dumps([self._prepare_tool_result(message)], ensure_ascii=False)
    curr_tokens = [
        self.BEGIN_TOOL_RESULTS,
        *self.tokenizer.encode(tool_result_str, bos=False, eos=False),
        self.END_TOOL_RESULTS,
    ]
    return curr_tokens, [], []

encode_user_message(message, available_tools, is_last, is_first, system_prompt=None, force_img_first=False, settings=ModelSettings.none())

Encode a user message.

Parameters:

Name Type Description Default
message UserMessage

The message to encode.

required
available_tools list[Tool] | None

The list of available tools if any.

required
is_last bool

Whether the message is the last one.

required
is_first bool

Not used.

required
system_prompt str | None

The system prompt.

None
force_img_first bool

Whether to force the image to be first.

False
settings ModelSettings

Not used.

none()

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens and the list of images.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_user_message(
    self,
    message: UserMessage,
    available_tools: list[Tool] | None,
    is_last: bool,
    is_first: bool,
    system_prompt: str | None = None,
    force_img_first: bool = False,
    settings: ModelSettings = ModelSettings.none(),
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a user message.

    Args:
        message: The message to encode.
        available_tools: The list of available tools if any.
        is_last: Whether the message is the last one.
        is_first: Not used.
        system_prompt: The system prompt.
        force_img_first: Whether to force the image to be first.
        settings: Not used.

    Returns:
        The encoded tokens and the list of images.
    """
    do_encode_tools_settings = False
    do_encode_tools_settings |= is_first and (
        self._message_position_to_encode_tools_settings == UserMessagePosition.first
    )
    do_encode_tools_settings |= is_last and (
        self._message_position_to_encode_tools_settings == UserMessagePosition.last
    )
    tools_settings_tokens: list[int] = []

    if do_encode_tools_settings and available_tools:
        tools = [tool.model_dump(exclude={"function": {"strict": True}}) for tool in available_tools]
        tools_json_tokens = self.tokenizer.encode(json.dumps(tools, ensure_ascii=False), bos=False, eos=False)
        tools_settings_tokens.extend(
            [
                self.BEGIN_AVAILABLE_TOOLS,
                *tools_json_tokens,
                self.END_AVAILABLE_TOOLS,
            ]
        )

    if do_encode_tools_settings:
        tools_settings_tokens.extend(self._encode_settings(settings=settings))

    tokens, image, audio = self.encode_user_content(
        content=message.content,
        is_last=is_last,
        system_prompt=system_prompt,
        force_img_first=force_img_first,
    )

    prefix_tokens = [*tools_settings_tokens, self.BEGIN_INST]
    suffix_tokens = [self.END_INST]

    curr_tokens = prefix_tokens + tokens + suffix_tokens

    return curr_tokens, image, audio

InstructTokenizerV3(tokenizer, image_encoder=None, audio_encoder=None)

Bases: InstructTokenizerV2, Generic[InstructRequestType, FIMRequestType, TokenizedType]

Instruct tokenizer V3.

The only difference with V2 tokenizer is that it encodes the tool messages differently.

Parameters:

Name Type Description Default
tokenizer Tokenizer

The tokenizer to use.

required
image_encoder ImageEncoder | None

The image encoder to use.

None
audio_encoder AudioEncoder | None

The audio encoder to use.

None
Source code in src/mistral_common/tokens/tokenizers/instruct.py
def __init__(
    self,
    tokenizer: Tokenizer,
    image_encoder: ImageEncoder | None = None,
    audio_encoder: AudioEncoder | None = None,
):
    r"""Initialize the tokenizer.

    Args:
        tokenizer: The tokenizer to use.
        image_encoder: The image encoder to use.
        audio_encoder: The audio encoder to use.
    """
    super().__init__(tokenizer, image_encoder=image_encoder, audio_encoder=audio_encoder)

encode_assistant_message(message, is_before_last_user_message)

Encode an assistant message.

Note

Same as V2 but always encode the tool history.

Parameters:

Name Type Description Default
message AssistantMessage

The message to encode.

required
is_before_last_user_message bool

Not used.

required

Returns:

Type Description
list[int]

The encoded tokens.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_assistant_message(self, message: AssistantMessage, is_before_last_user_message: bool) -> list[int]:
    r"""Encode an assistant message.

    Note:
        Same as [V2][mistral_common.tokens.tokenizers.instruct.InstructTokenizerV2.encode_assistant_message] but
        always encode the tool history.

    Args:
        message: The message to encode.
        is_before_last_user_message: Not used.

    Returns:
        The encoded tokens.
    """
    return super().encode_assistant_message(message=message, is_before_last_user_message=False)

encode_tool_message(message, is_before_last_user_message)

Encode a tool message.

Note

Same as V2 but tools are not wrapped in a list and the history is also tokenized.

Parameters:

Name Type Description Default
message ToolMessage

The message to encode.

required
is_before_last_user_message bool

Whether the message is before the last user message. If true, the message is not encoded.

required

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens, images, and audios.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_tool_message(
    self, message: ToolMessage, is_before_last_user_message: bool
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a tool message.

    Note:
        Same as [V2][mistral_common.tokens.tokenizers.instruct.InstructTokenizerV2.encode_tool_message] but tools
        are not wrapped in a list and the history is also tokenized.

    Args:
        message: The message to encode.
        is_before_last_user_message: Whether the message is before the last user message. If true, the message is
            not encoded.

    Returns:
        The encoded tokens, images, and audios.
    """
    tool_result_str = json.dumps(self._prepare_tool_result(message), ensure_ascii=False)
    curr_tokens = [
        self.BEGIN_TOOL_RESULTS,
        *self.tokenizer.encode(tool_result_str, bos=False, eos=False),
        self.END_TOOL_RESULTS,
    ]
    return curr_tokens, [], []

encode_user_content(content, is_last, system_prompt=None, force_img_first=False)

Encode a user content.

Parameters:

Name Type Description Default
content str | list[ContentChunk]

The content to encode.

required
is_last bool

Whether the message is the last one.

required
system_prompt str | None

The system prompt.

None
force_img_first bool

Whether to force the image to be first.

False

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens and the images.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_user_content(
    self,
    content: str | list[ContentChunk],
    is_last: bool,
    system_prompt: str | None = None,
    force_img_first: bool = False,
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a user content.

    Args:
        content: The content to encode.
        is_last: Whether the message is the last one.
        system_prompt: The system prompt.
        force_img_first: Whether to force the image to be first.

    Returns:
        The encoded tokens and the images.
    """
    if isinstance(content, str):
        return super().encode_user_content(content, is_last, system_prompt)

    tokens: list[int] = []
    images: list[np.ndarray] = []
    audio: list[Audio] = []

    if force_img_first:
        content = self._maybe_put_image_first(content)

    first_chunk = True
    for chunk in content:
        content_str = ""
        if first_chunk and is_last and system_prompt:
            first_chunk = False
            content_str = system_prompt + "\n\n"
            tokens += self.tokenizer.encode(content_str, bos=False, eos=False)

        if isinstance(chunk, (AudioChunk, AudioURLChunk)):
            assert not content_str, (
                f"It is not possible that `content` is non-empty when chunk is of type {type(chunk)}."
            )
            chunk_tokens, maybe_image, chunk_audio = self._encode_content_chunk(chunk)
            assert maybe_image is None, f"Unexpected image for audio chunk {type(chunk).__name__}."
            audio.append(chunk_audio)
        elif isinstance(chunk, (ImageChunk, ImageURLChunk)):
            chunk_tokens, chunk_image, maybe_audio = self._encode_content_chunk(chunk)
            assert maybe_audio is None, f"Unexpected audio for image chunk {type(chunk).__name__}."
            images.append(chunk_image)
        else:
            chunk_tokens, maybe_image, maybe_audio = self._encode_content_chunk(chunk)
            assert maybe_image is None and maybe_audio is None, (
                f"Unexpected image/audio for chunk {type(chunk).__name__}."
            )
        tokens.extend(chunk_tokens)

    return tokens, images, audio

InstructTokenizerV7(tokenizer, image_encoder=None, audio_encoder=None)

Bases: InstructTokenizerV3

Instruct tokenizer V7.

The difference with V3 tokenizer is that it encodes the system prompts differently: - in V7 the system prompts are treated as separate SystemMessages - they are no longer prepended to the last user message - they are printed between special tokens

Parameters:

Name Type Description Default
tokenizer Tokenizer

The tokenizer to use.

required
image_encoder ImageEncoder | None

The image encoder to use.

None
audio_encoder AudioEncoder | None

The audio encoder to use.

None
Source code in src/mistral_common/tokens/tokenizers/instruct.py
def __init__(
    self,
    tokenizer: Tokenizer,
    image_encoder: ImageEncoder | None = None,
    audio_encoder: AudioEncoder | None = None,
) -> None:
    r"""Initialize the tokenizer.

    Args:
        tokenizer: The tokenizer to use.
        image_encoder: The image encoder to use.
        audio_encoder: The audio encoder to use.
    """

    super().__init__(tokenizer, image_encoder, audio_encoder)
    self.BEGIN_SYSTEM = self.tokenizer.get_special_token(SpecialTokens.begin_system.value)
    self.END_SYSTEM = self.tokenizer.get_special_token(SpecialTokens.end_system.value)
    self.BEGIN_TOOL_CONTENT = self.tokenizer.get_special_token(SpecialTokens.begin_tool_content.value)

    self.TRANSCRIBE = None
    if audio_encoder is not None and not audio_encoder.audio_config.is_streaming:
        self.TRANSCRIBE = self.tokenizer.get_special_token(SpecialTokens.transcribe.value)

encode_assistant_message(message, is_before_last_user_message)

Encode an assistant message.

Parameters:

Name Type Description Default
message AssistantMessage

The message to encode.

required
is_before_last_user_message bool

Not used.

required

Returns: The encoded tokens.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_assistant_message(self, message: AssistantMessage, is_before_last_user_message: bool) -> list[int]:
    r"""Encode an assistant message.

    Args:
        message: The message to encode.
        is_before_last_user_message: Not used.
    Returns:
        The encoded tokens.
    """
    if not message.content and not message.tool_calls:
        raise TokenizerException(f"Invalid assistant message: {message}")
    curr_tokens: list = []
    if message.content:
        if isinstance(message.content, str):
            curr_tokens = self._encode_normal_content_assistant_message(message)
        elif isinstance(message.content, list):
            content_tokens, images, audios = self._encode_content_chunks(message.content)
            assert not images and not audios, (
                f"Assistant messages cannot contain images or audios, got {len(images)} images "
                f"and {len(audios)} audios."
            )
            curr_tokens += content_tokens
    if message.tool_calls:
        curr_tokens += self._encode_tool_calls_in_assistant_message(message)
    if not message.prefix:
        curr_tokens.append(self.tokenizer.eos_id)

    return curr_tokens

encode_speech_request(request)

Encode a speech synthesis request into a tokenized sequence.

Produces: [BOS] + audio_tokens + [TEXT_TO_AUDIO] + text_tokens + [AUDIO_TO_TEXT] + [BEGIN_AUDIO].

Parameters:

Name Type Description Default
request SpeechRequest

The speech request containing input text and voice/audio data.

required

Returns:

Type Description
Tokenized

Tokenized object with the full token sequence and optional audio data.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_speech_request(self, request: SpeechRequest) -> Tokenized:
    r"""Encode a speech synthesis request into a tokenized sequence.

    Produces: [BOS] + `audio_tokens` + [TEXT_TO_AUDIO] + `text_tokens` + [AUDIO_TO_TEXT] + [BEGIN_AUDIO].

    Args:
        request: The speech request containing input text and voice/audio data.

    Returns:
        Tokenized object with the full token sequence and optional audio data.
    """
    assert self.audio_encoder is not None, (
        f"Audio encoder must be defined to encode audio, got {self.audio_encoder=}"
    )
    init_tokens = self.start()
    tokenized = Tokenized(tokens=init_tokens)
    tokenized_audio = self._encode_audio_for_speech_request(request.ref_audio, request.voice)
    tokenized.tokens.extend(tokenized_audio.tokens)
    tokenized.audios.extend(tokenized_audio.audios)
    tokens: list[int] = tokenized.tokens
    tokens.append(self.audio_encoder.text_to_audio_token)
    tokens.extend(self.tokenizer.encode(request.input, bos=False, eos=False))
    tokens.append(self.audio_encoder.audio_to_text_token)
    tokens.append(self.audio_encoder.begin_audio_token)
    tokenized.tokens = tokens

    return tokenized

encode_system_message(message)

Encode a system message.

Parameters:

Name Type Description Default
message SystemMessage

The message to encode.

required

Returns:

Type Description
tuple[list[int], list[Audio]]

The encoded tokens and audios.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_system_message(self, message: SystemMessage) -> tuple[list[int], list[Audio]]:
    r"""Encode a system message.

    Args:
        message: The message to encode.

    Returns:
        The encoded tokens and audios.
    """
    tokens = [self.BEGIN_SYSTEM]
    if isinstance(content := message.content, str):
        content = [TextChunk(text=content)]
    content_tokens, images, audios = self._encode_content_chunks(content)
    assert not images, f"System messages cannot contain images, got {len(images)}."
    tokens += content_tokens
    tokens.append(self.END_SYSTEM)
    return tokens, audios

encode_tool_message(message, is_before_last_user_message)

Encode a tool message.

Note

Same as V3 but tools are not wrapped in a list and history is also tokenized

Parameters:

Name Type Description Default
message ToolMessage

The message to encode.

required
is_before_last_user_message bool

Not used.

required

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens, images, and audios.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_tool_message(
    self, message: ToolMessage, is_before_last_user_message: bool
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a tool message.

    Note:
        Same as [V3][mistral_common.tokens.tokenizers.instruct.InstructTokenizerV3.encode_tool_message]
        but tools are not wrapped in a list and history is also tokenized

    Args:
        message: The message to encode.
        is_before_last_user_message: Not used.

    Returns:
        The encoded tokens, images, and audios.
    """
    assert message.tool_call_id is not None
    assert isinstance(message.content, str), "Message content must be normalized"
    tool_call_id_tokens = self.tokenizer.encode(message.tool_call_id, bos=False, eos=False)
    tokens = self.tokenizer.encode(message.content, bos=False, eos=False)

    prefix_tokens = [
        self.BEGIN_TOOL_RESULTS,
        *tool_call_id_tokens,
        self.BEGIN_TOOL_CONTENT,
    ]
    curr_tokens = [
        *prefix_tokens,
        *tokens,
        self.END_TOOL_RESULTS,
    ]
    return curr_tokens, [], []

encode_transcription(request)

Encodes an audio transcription request into a tokenized format.

This method processes a transcription request containing audio data, encodes the user message, and returns the tokenized output.

Parameters:

Name Type Description Default
request TranscriptionRequest

The transcription request object containing the audio data to be encoded.

required

Returns:

Type Description
Tokenized

The tokenized representation of the audio data, including processed audio and tokens

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_transcription(self, request: TranscriptionRequest) -> Tokenized:
    r"""
    Encodes an audio transcription request into a tokenized format.

    This method processes a transcription request containing audio data,
    encodes the user message, and returns the tokenized output.

    Args:
        request: The transcription request object containing
            the audio data to be encoded.

    Returns:
        Tokenized: The tokenized representation of the audio data, including processed audio and tokens
    """
    assert self.audio_encoder is not None, f"Audio encoder must be defined, got {self.audio_encoder=}"
    if self.audio_encoder.audio_config.transcription_format == TranscriptionFormat.INSTRUCT:
        return self._encode_instruct_transcription(request)
    elif self.audio_encoder.audio_config.transcription_format == TranscriptionFormat.STREAMING:
        return self._encode_streaming_transcription(request)

    raise InvalidRequestException(
        "Transcription format should be one of 'instruct', 'streaming', got "
        f"{self.audio_encoder.audio_config.transcription_format=}."
    )

encode_user_content(content, is_last, system_prompt=None, force_img_first=False)

Encode a user content.

Parameters:

Name Type Description Default
content str | list[ContentChunk]

The content to encode.

required
is_last bool

Whether the message is the last one.

required
system_prompt str | None

The system prompt.

None
force_img_first bool

Whether to force the image to be first.

False

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens and the images.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_user_content(
    self,
    content: str | list[ContentChunk],
    is_last: bool,
    system_prompt: str | None = None,
    force_img_first: bool = False,
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a user content.

    Args:
        content: The content to encode.
        is_last: Whether the message is the last one.
        system_prompt: The system prompt.
        force_img_first: Whether to force the image to be first.

    Returns:
        The encoded tokens and the images.
    """
    assert system_prompt is None, "in Tokenizer V7 we don't encode system prompts in user messages"

    if isinstance(content, str):
        return super().encode_user_content(content, is_last, system_prompt)

    if force_img_first:
        content = self._maybe_put_image_first(content)

    tokens, images, audio = self._encode_content_chunks(content)
    return tokens, images, audio

encode_user_message(message, available_tools, is_last, is_first, system_prompt=None, force_img_first=False, settings=ModelSettings.none())

Encode a user message.

Parameters:

Name Type Description Default
message UserMessage

The message to encode.

required
available_tools list[Tool] | None

The list of available tools if any.

required
is_last bool

Whether the message is the last one.

required
is_first bool

Whether the message is the first one.

required
system_prompt str | None

Not used.

None
force_img_first bool

Whether to force the image to be first.

False
settings ModelSettings

Not used.

none()

Returns:

Type Description
tuple[list[int], list[ndarray], list[Audio]]

The encoded tokens and the list of images.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
def encode_user_message(
    self,
    message: UserMessage,
    available_tools: list[Tool] | None,
    is_last: bool,
    is_first: bool,
    system_prompt: str | None = None,
    force_img_first: bool = False,
    settings: ModelSettings = ModelSettings.none(),
) -> tuple[list[int], list[np.ndarray], list[Audio]]:
    r"""Encode a user message.

    Args:
        message: The message to encode.
        available_tools: The list of available tools if any.
        is_last: Whether the message is the last one.
        is_first: Whether the message is the first one.
        system_prompt: Not used.
        force_img_first: Whether to force the image to be first.
        settings: Not used.

    Returns:
        The encoded tokens and the list of images.
    """
    assert system_prompt is None, "in Tokenizer V7 we don't encode system prompts in user messages"

    tokens, images, audio = super().encode_user_message(
        message,
        available_tools,
        is_last=is_last,
        is_first=is_first,
        system_prompt=None,
        force_img_first=force_img_first,
        settings=settings,
    )

    return tokens, images, audio

validate_messages(messages) classmethod

Validate that system prompts and audio chunks are not used together in v7.

Parameters:

Name Type Description Default
messages list[UATS]

The messages to validate.

required

Raises:

Type Description
ValueError

If audio chunks are present alongside a system message.

Source code in src/mistral_common/tokens/tokenizers/instruct.py
@classmethod
def validate_messages(cls, messages: list[UATS]) -> None:
    r"""Validate that system prompts and audio chunks are not used together in v7.

    Args:
        messages: The messages to validate.

    Raises:
        ValueError: If audio chunks are present alongside a system message.
    """
    if cls._has_audio(messages):
        if any(isinstance(message, SystemMessage) for message in messages):
            raise ValueError("System messages are not yet allowed when audio is present")