Skip to Content
Current Implementation

Current Implementation

Overview

The Modelfile parser is implemented in src/core/modelfile.rs using the nom parser combinator library. It parses a text-based configuration format for defining model configurations, parameters, templates, and system prompts.

Grammar

The Modelfile grammar follows this structure:

command -> Instruction arguments* Instruction -> "FROM" | "PARAMETER" | "TEMPLATE" | "SYSTEM" | "ADAPTER" | "LICENSE" | "MESSAGE" | "#" arguments -> WORD | quoted_string | multiline_string quoted_string -> "<str>" multiline_string -> """<str>"""

Supported Instructions

FROM (Required)

The FROM instruction specifies the base model to use. This is the only required instruction in a Modelfile.

Syntax:

FROM <model_name>

Examples:

FROM llama3.2 FROM llama3.2:latest FROM /path/to/model.gguf FROM mlx-community/dolphin3.0-llama3.2-1B-4Bit

Validation:

  • Only one FROM instruction is allowed per Modelfile
  • A Modelfile without a FROM instruction will fail validation

PARAMETER

The PARAMETER instruction sets model inference parameters. Multiple parameters can be specified.

Syntax:

PARAMETER <parameter_name> <value>

Supported Parameters:

Integer Parameters:

  • num_ctx - Context window size
  • repeat_last_n - Number of tokens to consider for repeat penalty
  • seed - Random seed for generation
  • num_predict - Maximum number of tokens to predict
  • top_k - Top-k sampling parameter

Float Parameters:

  • temperature - Sampling temperature (0.0 to 1.0+)
  • repeat_penalty - Penalty for repeating tokens
  • top_p - Nucleus sampling parameter
  • min_p - Minimum probability threshold

String Parameters:

  • stop - Stop sequence (can be specified multiple times)

Examples:

PARAMETER num_ctx 4096 PARAMETER temperature 0.7 PARAMETER stop "<|eot_id|>" PARAMETER stop "</s>" PARAMETER top_p 0.9 PARAMETER seed 42

Validation:

  • Parameter names are case-insensitive
  • Integer parameters must parse as valid i32 values
  • Float parameters must parse as valid f32 values
  • Invalid parameter types will result in an error

TEMPLATE

The TEMPLATE instruction defines the prompt template for the model. Only one template is allowed.

Syntax:

TEMPLATE <template_string>

Examples:

TEMPLATE """{{ if .System }}<|start_header_id|>system<|end_header_id|> {{ .System }}<|eot_id|>{{ end }}{{ if .Prompt }}<|start_header_id|>user<|end_header_id|> {{ .Prompt }}<|eot_id|>{{ end }}<|start_header_id|>assistant<|end_header_id|> {{ .Response }}<|eot_id|>"""

Validation:

  • Only one TEMPLATE instruction is allowed per Modelfile
  • Template can be specified as a single-line string, quoted string, or multiline string

SYSTEM

The SYSTEM instruction sets the system prompt for the model. Only one system prompt is allowed.

Syntax:

SYSTEM <system_prompt>

Examples:

SYSTEM "You are a helpful assistant." SYSTEM """ You are a bot You also not a bot """

Validation:

  • Only one SYSTEM instruction is allowed per Modelfile
  • System prompt can be specified as a single-line string, quoted string, or multiline string

ADAPTER

The ADAPTER instruction specifies a path to a LoRA adapter file. Only one adapter is allowed.

Syntax:

ADAPTER <adapter_path>

Examples:

ADAPTER /path/to/adapter.bin ADAPTER ./adapters/my_adapter.safetensors

Validation:

  • Only one ADAPTER instruction is allowed per Modelfile

LICENSE

The LICENSE instruction specifies the license text for the model. Only one license is allowed.

Syntax:

LICENSE <license_text>

Examples:

LICENSE "MIT" LICENSE """ Apache License Version 2.0, January 2004 ... """

Validation:

  • Only one LICENSE instruction is allowed per Modelfile
  • License text can be specified as a single-line string, quoted string, or multiline string

MESSAGE

The MESSAGE instruction defines example messages for few-shot learning or conversation examples. Multiple messages can be specified.

Syntax:

MESSAGE <role> <message_content>

Supported Roles:

  • system - System message
  • user - User message
  • assistant - Assistant message

Examples:

MESSAGE user """Is Toronto in Canada? or Is cologne in france""" MESSAGE assistant yes MESSAGE user Is Sacramento in Canada? MESSAGE assistant no

Validation:

  • Role must be one of: system, user, or assistant (case-insensitive)
  • Invalid roles will result in an error

Comments

Comments are supported using the # character. Comments are preserved in the parsed Modelfile.

Syntax:

# <comment_text>

Examples:

# Modelfile generated by "ollama show" # To build a new Modelfile based on this one, replace the FROM line with: FROM llama3.2 # This is a comment

String Formats

The parser supports three string formats for instruction arguments:

  1. Single-line strings: Plain text until end of line

    FROM llama3.2
  2. Quoted strings: Text enclosed in double quotes "

    SYSTEM "You are a helpful assistant."
  3. Multiline strings: Text enclosed in triple quotes """

    SYSTEM """ You are a bot You also not a bot """
Last updated on